특정 명령문을 여러 번 실행해야 할 때 반복문을 활용한다. 파이썬에서는 주로 세 가지 방식으로 명령문을 반복시킬 수 있다.
for반복문while반복문재귀 함수
여기서는 for 반복문을, 이어지는 장에서는 while 반복문의 기초 활용법을 소개한다. 반면에 재귀 함수는 여기서 다루지 않으므로, 관심 있는 독자는 (코딩알지) 재귀 함수를 읽어볼 것을 추천한다.
for 반복문은 문자열이나 리스트 등 여러 항목을 포함하는 자료형을 대상으로, 각 항목을 차례대로 꺼내며 동일한 작업을 실행하고자 할 때 유용하다. 기본 형식은 다음과 같다.
for 변수 in 문자열_또는_리스트:
본문for ...로 시작하는 행의 끝에는 반드시 콜론(:)이 위치해야 하고, 그 아래에 반복 실행할 명령문이 일정한 들여쓰기와 함께 작성되어야 함에 주의한다. 이렇게 들여쓰기 된 명령문을 for 반복문의 '본문(body)'이라고 부른다.
6.1리스트와 for 반복문¶
for 반복문이 리스트에 대해 작동하는 과정을 간단히 정리하면 다음과 같다.
변수는 주어진 리스트의 첫 번째(0번 인덱스) 항목부터 오른쪽으로 차례대로 하나씩 가리킨다.현재
변수가 가리키는 항목을 대상으로 지정된명령문을 실행한다.한 번의
명령문실행이 끝나면,변수는 자리를 이동하여 바로 다음 항목을 가리킨다.더 이상 가리킬 항목이 남지 않을 때까지 이 과정을 반복한다.
아래 코드에서 for 반복문이 실행될 때 item 변수가 가리키는 값이 어떻게 변하는지 잘 보여준다.
for item in [1, 2, 3, 4, 5]:
print(f"item에 할당된 값: {item}")item에 할당된 값: 1
item에 할당된 값: 2
item에 할당된 값: 3
item에 할당된 값: 4
item에 할당된 값: 5
아래 코드는 one2five에 포함된 항목을 차례대로 출력한다.
one2five = [1, 2, 3, 4, 5]
for item in one2five:
print(item)1
2
3
4
5
반면에 아래 코드는 one2five에 포함된 항목을 차례대로 더한 결과를 계산하여 출력한다.
one2five = [1, 2, 3, 4, 5]
sum_list = 0
for item in one2five:
sum_list += item
print(sum_list)15
아래 이미지는 위 코드의 for 반복문이 실행되는 순간 선언된 변수들이 가리키는 값을 보여준다.
sum_list는 아직 0으로 초기화된 상태이고 item은 1을 가리키고 있다.

위 상태에서 반복문의 본문 코드인 sum_list += item이 실행되면 sum_list는 1을 가리키게 된다.
그런 다음 다시 for 반복문의 처음으로 돌아가는데, 다음 이미지는 이때 item이 리스트의 두 번째 항목인 2를 가리키게 된 상태를 보여준다.
이 상태에서 sum_list += item이 실행되면 sum_list는 3을 가리키도록 업데이트된다.

앞서 설명한 과정이 네 번 반복되면 item이 리스트의 마지막 항목인 5를 가리키게 되고,
그때 sum_list는 15로 업데이트 된다.
이후 다시 for 반복의 처음으로 돌아가지만 리스트에 더 이상 가리킬 값이 없기에 반복문이 종료된다.
이제 마지막 명령문인 print(sum_list)가 실행되어 15가 출력되며 코드 실행이 종료된다 (아래 이미지 참고).

6.1.1예제¶
예제 1
for 반복문을 이용하여 아래 실행결과가 나오는 프로그램을 작성하라.
단, "안녕하세요" 문자열이 코드에 단 한 번만 언급되어야 한다.
안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.힌트: 리스트 활용
답:
for num in [0, 1, 2, 3, 4]:
print("안녕하세요.")안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.
위 코드에서 num 변수는 반복문의 본문에서 활용되지 않는다.
이럴 때는 밑줄 기호를 써도 된다.
for _ in [0, 1, 2, 3, 4]:
print("안녕하세요.")안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.
안녕하세요.
예제 2
1에서 10까지의 정수 중에서 3의 배수 또는 7의 배수를 모두 출력하는 코드를 작성하라.
힌트: 리스트 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], for 반복문 활용, 논리/비교 연산자 활용
답:
num이 가리키는 값이 3의 배수 또는 7의 배수인 경우에만 num을 출력하고자 하면
아래 표현식을 이용한다.
num % 3 == 0 or num % 7 == 0이제 num을 1부터 10까지의 정수를 차례대로 가리키도록 하면서
if 조건문을 이용하면 3의 배수 또는 7의 배수를 모두 출력할 수 있다.
아래 코드가 위 내용을 정리한다.
one2ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in one2ten:
if num % 3 == 0 or num % 7 == 0:
print(num, end=' ')3 6 7 9 6.1.2연습문제¶
문제 1
1부터 10까지의 정수 중에서 홀수들의 합을 계산하라.
단, 1부터 10까지의 정수로 구성된 리스트에 for 반복문을 적용한다.
문제 2
거스름돈을 돌려주기 위해 필요한 최소한의 동전 개수를 알아내는 문제다.
단, 사용할 수 있는 동전은 500원, 250원, 100원, 50원, 10원 5 종류이다.
거슬러 줘야 하는 금액이 n 원일 때, 필요한 동전의 최소 개수를 반환하는
코드를 구현하라.
단, n 은 10의 배수이면서 5000보다 작은 정수이고,
모든 동전은 원하는 만큼 충분히 많이 있다고 가정한다.
예를 들어 1730원을 지불하는 방법을 다음처럼 출력해야 한다.
1730원 지불에 필요한 동전 수
500 원 동전: 3 개
250 원 동전: 0 개
100 원 동전: 2 개
50 원 동전: 0 개
10 원 동전: 3 개힌트: 거스름돈 지급에 사용되는 동전의 수를 최소화 하려면
큰 액수의 동전을 최대한 많이 사용하면 된다.
따라서 큰 액수의 동전부터 차례대로 최대한 많이 사용할 수 있는
동전의 개수를 for 반복문과 정수 나눗셈의 몫과 나머지 연산자를 활용한다.
참고: 앞서 설명한 힌트는 탐욕 알고리즘을 응용한다.
6.2range() 함수와 for 반복문¶
6.2.1range() 함수¶
range() 함수는 리스트와 매우 유사한 값을 생성한다.
예를 들어, range(10)는 0부터 10 이전까지 정수,
즉 0부터 9까지의 정수를 포함하는, 리스트와 유사한 성질을 갖는 값을 생성한다.
range(10)range(0, 10)0을 첫째 인자로, 10을 둘째 인자로 사용해도 동일한 모양의 값을 생성한다.
range(0, 10)range(0, 10)range() 함수가 생성하는 값의 자료형은 range 이다.
type(range(10))range그런데 range(10)의 내부를 구체적으로 보여주지는 않는다.
print(range(10))range(0, 10)
range 자료형의 값이 내부를 바로 보여주지 않는 이유는 메모리를 아끼기 위해 숫자들을 한꺼번에 미리 다 만들어두지 않고
필요할 때마다 꺼내어 사용할 수 있을 만큼만 준비 해두기 때문입니다.
보다 전문적인 설명은 (코딩알지) 이터러블, 이터레이터, 제너레이터에서 확인할 수 있습니다.
range 객체가 생성하는 값은 리스트로 형변환하여 확인할 수있다.
list(range(10))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]range() 함수의 인자
range() 함수는 최소 하나에서 최대 세 개의 위치 인자를 받으며,
인자의 개수에 따라 각 인자의 역할이 달라진다.
경우 1: 한 개의 인자
앞서 range(10)이 range(0, 10)과 동일한 값을 생성한다고 언급했듯이,
인자를 하나만 사용하면 첫째 인자가 0인 두 개의 인자를 사용하는 것과 동일하다.
경우 2: 두 개의 인자
range() 함수가 표현하는 구간의 시작을 0이 아닌 다른 정수로 하려면 반드시 두 개의 인자를 사용해야 한다.
예를 들어, 아래 코드는 1부터 10까지의 정수로 구성된 리스트에 해당하는 값을 계산한다.
one2ten_range = range(1, 11)실제로 리스트로 형변환하면 2부터 10까지의 정수를 포함한 리스트로 계산된다.
list(one2ten_range)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]경우 3: 세 개의 인자
range() 함수에 세 개의 인자를 사용하면
첫째, 둘째 인자의 의미는 이전과 동일하다.
반면에 셋째 인자는 보폭을 가리킨다.
예를 들어 아래 코드는 1부터 9까지의 정수 중에서 홀수만을
대상으로 하는 리스트를 생성한다.
이유는 보폭이 2로 지정되었기에 1부터 시작해서 1씩이 아닌 2씩 증가시켜 생성되는 값, 즉 홀수들만을
range 자료형의 값에 포함시키기 때문이다.
list(range(1, 10, 2))[1, 3, 5, 7, 9]보폭을 인자로 사용하려면 반드시 세 개의 인자를 사용해야 한다. 예를 들어 0부터 10까지의 짝수로 구성된 리스트에 포함시키려면 다음과 같이 한다.
list(range(0, 11, 2))[0, 2, 4, 6, 8, 10]두 개의 인자를 사용할 때와는 다르게 첫째 인자가 0이어도 반드시 명시해야 한다. 그렇지 않으면 다음과 같이 엉뚱한 결과를 얻게 된다.
list(range(11, 2))[]음의 보폭
바로 앞서 언급한 코드는 구간의 시작이 끝보다 크다. 이런 경우 보폭을 지정하지 않거나 양수로 지정하면 아무런 값도 포함되지 않는다.
list(range(11, 2)) # list(range(11, 2, 1)) 과 동일[]list(range(11, 2, 2))[]이유는 11에서부터 1씩 또는 2씩 커지면서 2 이전까지의 구간에 속하는 정수는 없기 때문이다. 하지만 음의 보폭을 지정하면 크기가 작아지는 정수들을 항목으로 갖는다.
예를 들어 아래 코드는 11에서부터 0 이전까지, 즉 1까지의 정수 중에서 홀수만을 항목으로 갖는 리스트를 반환한다. 단, 구간의 끝이 둘째 인자의 이전인데 이때 이전의 의미는 보폭이 양의 정수인지, 음의 정수인지에 따라 달라짐에 유의한다.
list(range(11, 0, -2))[11, 9, 7, 5, 3, 1]6.2.2range() 함수 활용¶
range() 함수는 for 반복문에서 리스트 대신 활용될 수 있다.
예를 들어 아래 코드는 range(10)이
리스트 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 대신 사용될 수 있음을 보여준다.
이유는 앞서 보았듯이 range(10)이 동일한 항목을 포함하는 값이기 때문이다.
아래 코드는 for 반복문이 range 값과 함께 실행될 때
item 변수에 할당되는 값의 변화를 잘 보여준다.
for item in range(10):
print(f"item에 할당된 값: {item}")item에 할당된 값: 0
item에 할당된 값: 1
item에 할당된 값: 2
item에 할당된 값: 3
item에 할당된 값: 4
item에 할당된 값: 5
item에 할당된 값: 6
item에 할당된 값: 7
item에 할당된 값: 8
item에 할당된 값: 9
아래 코드는 1부터 10까지의 정수의 합을 계산한다.
sum = 0
for num in range(1, 11):
sum += num
print(f"1부터 10까지 정수의 합: {sum}")1부터 10까지 정수의 합: 55
음의 보폭을 갖는 경우에도 for 반복문을 적용하는 방식은 달라지지 않는다.
아래 코드는 11부터 0까지의 홀수를 역순으로 출력한다.
for i in range(11, 0, -2):
print(f"{i} 은(는) 홀수")11 은(는) 홀수
9 은(는) 홀수
7 은(는) 홀수
5 은(는) 홀수
3 은(는) 홀수
1 은(는) 홀수
6.2.3리스트 대 range() 함수¶
리스트가 주어졌을 때 for 반복문을 이용하면
리스트의 각 항목에 대해 동일한 코드를 실행할 수 있다.
예를 들어, 아래 코드는 2부터 10까지의 짝수들의 합을 계산한다.
반복문이 실행되는 동안 리스트의 각 항목에 대해 아래 명령문이 반복된다.
sum = sum + item즉, sum 변수에 리스트의 각 항목을 더하여 재할당하는 과정을 반복하는 것이다.
two2ten_even = [2, 4, 6, 8, 10]
sum = 0
for item in two2ten_even:
sum = sum + item
print(f"2부터 10까지 짝수들의 합: {sum}")2부터 10까지 짝수들의 합: 30
그런데 2부터 1만, 아니 2부터 1억까지의 짝수들의 합을 계산하려면 어떻게 해야 할까? 위와 같은 방식을 쓰려면 5천 개나 5천만 개의 항목을 갖는 리스트를 먼저 변수로 선언해야 한다. 하지만 이런 많은 숫자를 사람이 직접 타이핑하여 입력하는 것은 매우 번거롭거나 사실상 불가능하다.
파이썬을 포함한 대부분의 프로그래밍 언어는 이런 경우를 빠르고 간단하게 처리할 수 있는 기능을 제공한다.
파이썬의 경우 range() 함수를 활용하면 된다.
아래 코드는 range()를 이용하여 2부터 10까지 짝수들의 합을 계산하는 예다.
sum = 0
for item in range(2, 11, 2):
sum = sum + item
print(f"2부터 10까지 짝수들의 합: {sum}")2부터 10까지 짝수들의 합: 30
그리고 위 코드에서 하나의 숫자만 수정해서 2부터 1억까지의 짝수들의 합을 계산할 수 있다.
sum = 0
for item in range(2, 100_000_001, 2):
sum = sum + item
print(f"2부터 1억까지 짝수들의 합: {sum}")2부터 1억까지 짝수들의 합: 2500000050000000
이처럼 임의의 정수 n에 대해 range(n), range(2, n), range(10, n, 3) 등은
수천, 수억 개의 숫자가 포함된 리스트를 일일이 다 써주는 것이 아니라
"어떤 구간의 숫자들을 일정한 규칙으로 생성할 규칙"만 담고 있다는 점에서 리스트와 크게 다르다.
6.2.4예제¶
예제 1
다음 모양을 출력하는 코드를 작성하라.
두 개의 별 기호 사이에 공백(space)가 사용됨에 주의한다.
공백도 하나의 기호로 취급된다.
단, print() 함수와 for 반복문은 한 번씩만 활용한다.
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
* 힌트: range() 함수 활용
답:
for 반복문을 num 변수가 1부터 9까지에 대해 실행하도록 한다.
이를 위해 range(1, 10) 함수 표현식을 이용한다.
for num in range(1, 10):
if num <= 5:
spaces = 5 - num
stars = num
else:
spaces = num - 5
stars = 10 - num
print(" " * spaces + "* " * stars) *
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
예제 2
range() 함수를 이용하여
2 보다 같거나 큰 양의 정수 n이 인자로 주어지면
2부터 n까지의 짝수들의 합을 반환하는 함수
addition_n()을 선언하라.
답:
아래 addition_n() 함수는 n이 인자로 들어오면
2부터 n까지의 정수를 포함하는 값 range(2, n+1)에 대해 for 반복문을 실행한다.
def addition_n(n):
sum = 0
for item in range(2, n+1, 2):
sum = sum + item
return sumprint(f"2부터 10까지 짝수들의 합: {addition_n(10)}")2부터 10까지 짝수들의 합: 30
print(f"2부터 100까지 짝수들의 합: {addition_n(100)}")2부터 100까지 짝수들의 합: 2550
print(f"2부터 1000까지 짝수들의 합: {addition_n(1000)}")2부터 1000까지 짝수들의 합: 250500
주의사항
range() 함수를 이용하지 않고 리스트를 이용하여 동일한 기능을 수행하는 함수를 구현할 수는 없다.
이유는 리스트 [2, 4, 6, ..., n] 의 길이가 n에 의존해서 달라지는데
변수 n이 가리키는 값을 모르면 리스트 자체를 선언할 수 없기 때문이다.
6.2.5연습문제¶
문제 1
11에서 20까지의 정수 중에서 3의 배수이거나 일의 자리수가 3인 정수만 출력하는 코드를 작성하라.
힌트: 리스트, for 반복문 활용, 논리/비교 연산자 활용
문제 2
369게임은 사용자로부터 양의 정수 n이 입력되었을 때 1부터 n까지의 자연수를
다음 규칙에 따라 출력한다.
3의 배수이거나 1의 자릿수가 3인 수일 경우, 해당하는 수를 출력하는 대신 문자열
짝을 출력나머지 수는 그대로 출력
예를 들어, n이 15인 경우 다음과 같이 출력된다.
1 2 짝 4 5 짝 7 8 짝 10 11 짝 짝 14 짝369게임을 진행하는 코드를 구현하여 n이 30일 때의 출력 결과를 확인하라.
힌트: range() 함수, for 반복문, % 연산자, print() 함수의 end 키워드 인자 활용
6.3문자열과 for 반복문¶
아래 코드는 문자열에 포함된 문자 각각을 화면에 출력한다.
이유는 for 반복문이 실행되는 동안 ichar 변수가 차례대로 '안', '녕', '하', '세', '요' 를 가리키며,
명령문으로 작성된 print(ichar)에 의해 각 글자가 출력되기 때문이다.
print() 함수가 실행될 때마다 줄바꿈이 발생함에 주의한다.
hello = "안녕하세요"
for ichar in hello:
print(ichar)안
녕
하
세
요
반면에 아래 코드는 text 변수가 가리키는 문구에 포함된 모음만 따로 모아 하나의 문자열을 생성한다.
셋째 줄에서 정의된 vowel_strings 변수는 빈 문자열을 가리키지만
for 반복문의 본문이 반복 실행될 때마다 text 변수에 포함되어 있던 모음이 추가된 문자열로 업데이트된다.
영어 알파벳의 모음은 모두 vowels 변수가 가리키는 문자열에 포함되어 있으며,
따라서 특정 문자의 모음 여부는 문자열 in 연산자로 판별됨에 주의한다.
text = 'Python_Data-Analysis!'
vowels='AEIOUaeiou'
vowel_strings = ''
for char in text:
if char in vowels:
vowel_strings += char
print()
print(f"문구에 포함된 모음: {vowel_strings}")
문구에 포함된 모음: oaaAai
6.3.1예제¶
예제 1
아래와 같이 문자열 리스트가 주어졌다.
words = ['I', 'love', 'python', 'programming']for 반복문을 이용하여 문자열에서 공백(" ")을 기준으로 단어의 개수를 세고,
동시에 가장 긴 단어를 찾아 다음과 같이 출력하는 코드를 작성하라.
단어 개수: 4
가장 긴 단어: programming힌트: len() 함수 활용
답:
for 반복문을 돌리며 단어 개수를 세고, 가장 긴 단어를 추적한다.
longest 변수는 현재까지 확인한 단어 중 가장 긴 것을 기억하는 역할을 한다.
words = ['I', 'love', 'python', 'programming']
count = 0
longest = ""
for word in words:
count += 1
if len(word) > len(longest):
longest = word
print(f"단어 개수: {count}")
print(f"가장 긴 단어: {longest}")단어 개수: 4
가장 긴 단어: programming
예제 2
다음과 같이 영어 알파벳으로 구성된 문자열이 주어졌다.
text = 'Python_Data-Analysis!'text 문자열에 포함된 자음으로만 구성된 문자열을 다음과 같이 출력하는 코드를 작성하라.
포함된 모음: o_aa-Aai!
포함된 자음: PythnDtnlyss단, 모음 알파벳은 아래 문자열에 포함되어 있다.
vowels='AEIOUaeiou'답:
아래 코드는text에 포함된 자음만 모으기 위해 for 반복문을 이용한다.
consonant_strings 변수가 반복문이 실행될 때마다 자음 알파벳인 경우 업데이트 된다.
자음이 아닌 문자는 other_strings에 누적 업데이트 된다.
consonant_strings = ''
other_strings = ''
for char in text:
if char not in vowels and char not in '_-':
consonant_strings += char
continue
else:
other_strings += char
print()
print(f"포함된 자음: {consonant_strings}")
print(f"포함된 기타 문자: {other_strings}")
포함된 자음: PythnDtnlyss!
포함된 기타 문자: o_aa-Aai
6.3.2연습문제¶
문제 1
아래 문자열을 뒤집는 for 반복문 코드를 작성하라.
text = "Python Programming is Fun"코드를 실행하면 다음과 같이 화면에 출력되어야 한다.
원본: Python Programming is Fun
뒤집기: nuF si gnimmargorP nohtyP문제 2
다음과 같이 영어 알파벳으로 구성된 문자열이 주어졌다.
text = 'Python_Data-Analysis!'
vowels = 'AEIOUaeiou'text에 포함된 모음만 모아서 출력하되, 같은 모음이 중복되지 않도록 하는 코드를 작성하라.
실행 결과는 다음과 같아야 한다.
문구에 포함된 모음: oaAi힌트: for 반복문, in 연산자 활용
6.4중첩 for 반복문¶
아래 코드는 구구단 중에서 3단을 화면에 출력한다
for j in range(1, 10):
print(f"3 * {j} = {3*j}")3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
그런데 3단과 함께 4단도 연속으로 출력하려 한다면 for 반복문을 중첩해서 활용하는 것이 편리하다.
for i in range(3, 5):
print(f"{i}단")
for j in range(1, 10):
print(f"{i} * {j} = {i*j}")
print()3단
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27
4단
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
4 * 7 = 28
4 * 8 = 32
4 * 9 = 36
중첩 for 반복문은 두 리스트의 모든 조합을 만들어낼 때도 유용하다.
아래 코드는 피자 토핑 3종과 사이즈 2종의 가능한 조합을 모두 출력한다.
바깥쪽 for 반복문이 토핑을, 안쪽 for 반복문이 사이즈를 차례대로 가리킨다.
toppings = ["치즈", "불고기", "새우"]
sizes = ["R", "L"]
for topping in toppings:
for size in sizes:
print(f"{topping} 피자 ({size})")
print()치즈 피자 (R)
치즈 피자 (L)
불고기 피자 (R)
불고기 피자 (L)
새우 피자 (R)
새우 피자 (L)
6.4.1예제¶
예제 1
중첩 for 반복문을 이용하여 아래 별(*) 삼각형 패턴을 출력하라.
*
**
***
****
*****답:
바깥쪽 반복문이 줄 번호를 정하고, 안쪽 반복문이 해당 줄에 출력할 별의 개수를 결정한다.
for i in range(1, 6):
for j in range(i):
print("*", end="")
print()*
**
***
****
*****
예제 2
아래 색상 리스트와 과일 리스트의 모든 조합으로 이모지 느낌의 메뉴를 출력하는 코드를 작성하라.
colors = ["빨간", "노란", "초록"]
fruits = ["사과", "바나나"]다음과 같이 출력되어야 한다.
1. 빨간 사과
2. 빨간 바나나
3. 노란 사과
4. 노란 바나나
5. 초록 사과
6. 초록 바나나
총 6가지 조합답:
바깥쪽 반복문이 색상을, 안쪽 반복문이 과일을 순회하며 조합된 문자열을 만든다.
count = 0
for color in colors:
for fruit in fruits:
count += 1
print(f"{count}. {color} {fruit}")
print()
print(f"총 {count}가지 조합")1. 빨간 사과
2. 빨간 바나나
3. 노란 사과
4. 노란 바나나
5. 초록 사과
6. 초록 바나나
총 6가지 조합
6.4.2연습문제¶
문제 1
중첩 for 반복문을 이용하여 아래와 같은 역삼각형 패턴을 출력하는 코드를 작성하라.
*****
****
***
**
*힌트: range() 함수의 인자를 적절히 조절한다.
문제 2
아래와 같이 음료 리스트와 온도 리스트가 주어졌다.
drinks = ["커피", "녹차", "주스"]
temps = ["HOT", "ICE"]중첩 for 반복문을 이용하여 다음과 같이 모든 조합의 메뉴판을 출력하는 코드를 작성하라.
=== 메뉴판 ===
1. HOT 커피
2. ICE 커피
3. HOT 녹차
4. ICE 녹차
5. HOT 주스
6. ICE 주스
총 6가지 메뉴힌트: 번호를 매기기 위한 변수를 하나 선언하여 활용한다.
6.5continue와 break¶
continue와 break 명령문은 for 반복문, 그리고 이어지는 장(chapter)에서 배울 while 반복문과 함께 사용되어
반복문의 기능을 조정한다.
| 명령문 | 기능 |
|---|---|
continue | 반복문의 처음으로 돌아가서 다음 반복으로 넘어가도록 함 |
break | 반복문의 실행을 중지시킴 |
6.5.1continue 명령문¶
continue 명령문은 실행되는 순간 자신을 감싸고 있는 for 반복문의 처음으로 돌아가서
반복되어야 할 다음 차례를 실행하도록 한다.
예를 들어 아래 코드는 홀수만 더한 결과를 출력한다.
char변수가 홀수인 경우: 해당 문자 출력한 후에 바로 반복문의 처음으로 돌아감. 따라서if조건문 아래에 있는print()명령문이 실행되지 않음.char변수가 짝수인 경우:if조건문이 실행되지 않고 바로print()명령문만 실행됨.
one2five = range(1, 6)
for item in one2five:
if item % 2 == 1:
print(item)
continue
print(f"{item} 는 짝수라서 무시")
print("짝수는 모두 무시됨")1
2 는 짝수라서 무시
3
4 는 짝수라서 무시
5
짝수는 모두 무시됨
아래 코드는 짝수를 무시하는 성질을 이용하여 홀수만 더한 결과를 출력한다.
item변수가 홀수인 경우:sum_list변수 업데이터item변수가 짝수인 경우: 무시
one2five = range(1, 6)
sum_list = 0
for item in one2five:
if item % 2 ==1:
sum_list += item
continue
print(f"{item} 는 짝수라서 무시")
print("짝수는 모두 무시됨")
print(f"1부터 5까지 홀수들의 합: {sum_list}")2 는 짝수라서 무시
4 는 짝수라서 무시
짝수는 모두 무시됨
1부터 5까지 홀수들의 합: 9
6.5.2break 명령문¶
break 명령문은 실행되는 순간 자신을 감싸고 있는 for 반복문을 중지시키고
반복문 다음의 명령문으로 넘어가도록 한다.
예를 들어, 아래 코드는 item 변수가 4를 가리키는 순간
for 반복문의 실행을 중단하고 이어지는 print() 명령문으로
바로 넘어간다.
즉, 반복문이 원래 5번 반복하도록 설정되었으니 네 번 반복하고 강제로 종료된다.
item변수가 4보다 작은 정수를 가리키는: 해당 문자 출력item변수가 4 이상인 정수를 가리키는 경우:break명령문이 실행되어for반복문의 실행을 중단시킴. 즉, 4와 5의 경우는 전혀 실행되지 않음.
one2five = range(1, 6)
for item in one2five:
if item >= 4:
break
print(item)
print(f"1부터 {item-1} 까지만 반복문이 실행됨!")1
2
3
1부터 3 까지만 반복문이 실행됨!
아래 코드는 4 이상인 정수는 취급되지 않는 성질을 이용하여 1부터 3까지의 정수만 더한 결과를 출력한다.
item변수가 4보다 작은 정수를 가리키는 경우:sum_list변수 업데이터item변수가 4 이상인 정수를 가리키는 경우: 취급되지 못함.
one2five = range(1, 6)
sum_list = 0
for item in one2five:
if item >= 4: # 4 이상이면 중단
break
sum_list += item
print(f"1부터 {item-1} 까지 정수의 합: {sum_list}")1부터 3 까지 정수의 합: 6
6.5.3continue와 break의 영향 범위¶
continue와 break 명령문은 자신을 직접 감싸고 있는 반복문에만 영향을 준다.
따라서 for 반복문이 중첩되어 있을 때, 안쪽 반복문에서 사용된 continue나 break는
바깥쪽 반복문에 전혀 영향을 주지 않는다.
아래 예제들은 여러 단어에서 글자를 하나씩 확인하는 상황을 통해 이 점을 보여준다.
아래 코드는 단어 리스트의 각 단어를 글자별로 확인하되, 모음(a, e, i, o, u)은 continue로 건너뛴다.
안쪽
for반복문의continue는 안쪽 반복문의 다음 글자로 넘어갈 뿐, 바깥쪽 반복문에는 영향을 주지 않는다.따라서 어떤 단어에 모음이 포함되어 있더라도 모든 단어가 빠짐없이 확인된다.
words = ["hello", "python", "code"]
for word in words:
print(f"[{word}] 자음만 출력: ", end="")
for char in word:
if char in "aeiou":
continue
print(char, end="")
print()[hello] 자음만 출력: hll
[python] 자음만 출력: pythn
[code] 자음만 출력: cd
반면에 아래 코드는 모음을 발견하는 순간 break로 해당 단어의 확인을 중단한다.
안쪽
for반복문의break는 안쪽 반복문만 중단시킬 뿐, 바깥쪽 반복문은 계속 실행된다.따라서 한 단어에서 모음이 발견되더라도 나머지 단어는 정상적으로 확인된다.
words = ["hello", "python", "code"]
for word in words:
print(f"[{word}] 자음만 출력: ", end="")
for char in word:
if char in "aeiou":
print(f" <- '{char}' 발견, 중단", sep="")
break
print(char, end="")
print()[hello] 자음만 출력: h <- 'e' 발견, 중단
[python] 자음만 출력: pyth <- 'o' 발견, 중단
[code] 자음만 출력: c <- 'o' 발견, 중단
6.5.4예제¶
예제 1
1부터 9까지의 정수를 항목으로 포함한 리스트가 다음과 같다.
one2nine = list(range(1, 10))1부터 9까지의 정수를 대상으로 3의 배수가 아니면 3의 배수가 아님을 출력하는 코드를 작성하라. 또한 7 이상의 정수는 무시해야 한다.
힌트: for 반복문, continue, break 명령문 활용
답:
one2nine 리스트를 대상으로 for 반복문을 실행한다.
그러면서 3의 배수 항목은 건너뛰도록 하기 위해 continue 명령문을,
7 항목을 가리키는 순간 break 명령문을 실행하도록 한다.
for item in one2nine:
if item % 3 == 0:
continue
print(f"{item} 은(는) 3의 배수 아님.")
if item == 7:
break
print()
print(f"item 변수가 1부터 {item} 까지만 반복문이 실행되었음!")1 은(는) 3의 배수 아님.
2 은(는) 3의 배수 아님.
4 은(는) 3의 배수 아님.
5 은(는) 3의 배수 아님.
7 은(는) 3의 배수 아님.
item 변수가 1부터 7 까지만 반복문이 실행되었음!
예제 2
다음과 같이 영어 알파벳으로 구성된 문자열이 주어졌다.
text = "python data analysis"(1) 문자열에 포함된 모음의 개수를 확인하는 코드를 작성하려 한다. 단, 모음 알파벳은 아래 문자열에 포함되어 있다.
vowels='AEIOUaeiou'예를 들어 다음과 같이 for 반복문을 이용할 수 있다.
count_vowels = 0
for char in text:
if char in vowels:
count_vowels += 1
print(f"모음 개수: {count_vowels}")모음 개수: 6
continue 명령문을 사용하여 위 코드를 수정하라.
단 동일한 결과가 나와야 한다.
답:
모음이 아닐 때 반복문의 다음 경우를 처리하도록 하면 된다.
count_vowels = 0
for char in text:
if char not in vowels:
continue
count_vowels += 1
print(count_vowels)6
(2) 문자열에 포함된 자음의 개수를 확인하는 코드를 작성하려 한다.
text 문자열은 공백을 포함하는데, 공백은 알파벳이 아니다.
따라서 모음과는 달리 자음만 추출하려면 공백도 제외시켜야 한다.
아래 코드는 주어진 영어 문장 text에 대해 모음이 아닌 알파벳이 사용된 횟수를
for 반복문을 이용하여 계산한다.
count_consonant = 0
for char in text:
if (char not in vowels) and char != ' ':
count_consonant += 1
print(f"자음 개수: {count_consonant}")자음 개수: 12
continue 명령문을 사용하도록 위 코드를 수정하라.
답:
기호가 모음 알파벳이거나 공백 문자열인 경우에 continue 명령문을 활용한다.
count_consonant = 0
for char in text:
if (char in vowels) or char == ' ':
continue
count_consonant += 1
print(f"자음 개수: {count_consonant}")자음 개수: 12
6.5.5연습문제¶
문제 1
아래와 같이 단어 리스트가 주어졌다.
words = ["apple", "banana", "cherry", "date", "elderberry"]for 반복문을 이용하여 각 단어의 글자를 하나씩 확인하면서 다음 조건을 만족하는 코드를 작성하라.
글자가 모음(
a, e, i, o, u)이면continue를 사용하여 건너뛴다.글자가
"r"이면break를 사용하여 해당 단어의 확인을 즉시 중단한다.그 외의 글자는 화면에 출력한다.
실행 결과는 다음과 같아야 한다.
[apple] p p l
[banana] b n n
[cherry] c h
[date] d t
[elderberry] l d 힌트: 중첩 for 반복문, continue, break 명령문 활용
문제 2
1부터 30까지의 정수를 대상으로 for 반복문을 실행하면서 다음 조건을 만족하는 코드를 작성하라.
3의 배수이면
"짝"을, 5의 배수이면"짝짝"을, 3과 5의 공배수이면"짝짝짝"을 출력한다.3의 배수도 5의 배수도 아닌 수는
continue를 사용하여 건너뛴다.숫자가 25 이상이면
break를 사용하여 반복을 중단한다.
실행 결과는 다음과 같아야 한다.
3 짝
5 짝짝
6 짝
9 짝
10 짝짝
12 짝
15 짝짝짝
18 짝
20 짝짝
21 짝
24 짝힌트: continue, break 명령문과 if ... elif ... else 조건문 활용