Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

8 for 반복문

Updated: 18 mrt 2026

프로그래밍에서는 특정 명령을 여러 번 반복 실행해야 하는 경우가 많다. 이를 위해 반복 명령문(loop statement)을 사용한다.

파이썬은 크게 세 가지 방식으로 반복을 지원한다.

  • for 반복문

  • while 반복문

  • 재귀 함수(recursion)

이 중에서 문자열, 리스트, 튜플, 사전 등 모음 자료형에 포함된 항목들을 대상으로 반복 작업을 수행할 때 바로 for 반복문이 가장 많이 활용된다.

for 반복문의 기본 형식은 다음과 같다.

for 변수 in 리스트 또는 문자열:
    명령문
  • 변수는 문자열, 리스트, 사전에 포함된 항목을 차례대로 가리킨다.

  • 첫 번째 항목(인덱스 0)부터 시작하여 오른쪽으로 이동하며 각 항목을 순서대로 처리한다.

  • 변수가 현재 가리키는 항목을 대상으로 지정된 명령문을 실행한다.

  • 실행이 끝나면 변수는 다음 항목을 가리키게 되고, 더 이상 항목이 없을 때까지 이 과정을 반복한다.

for 반복문은 데이터 분석에서도 매우 자주 사용된다.

  • 데이터프레임의 행이나 열을 순회할 때

  • 텍스트 데이터의 단어를 하나씩 처리할 때

  • 여러 파일을 순차적으로 읽어올 때

따라서 for 반복문을 충분히 이해하고 연습하는 것은 데이터 과학 입문 단계에서 꼭 필요한 기초 학습이다.

8.1문자열과 for 반복문

문자열에 포함된 문자 각각을 출력하는 코드는 다음과 같다. for 반복문이 실행되는 동안 char 변수가 차례대로 '안', '녕', '하', '세', '요' 를 가리키며, 명령문으로 작성된 print(char)에 의해 각 글자가 출력된다. print() 함수가 실행될 때마다 줄바꿈이 발생함에 주의한다.

hello = "안녕하세요"

for char in hello:
    print(char)
안
녕
하
세
요

예제: 영어 모음 알파벳 확인

다음과 같이 영어 알파벳으로 구성된 문자열이 주어졌다.

text = 'Python_Data-Analysis!'

text 문자열에 포함된 모음으로만 구성된 문자열을 다음과 같이 출력하는 코드를 작성하고자 한다.

P는 모음 아님
y는 모음 아님
t는 모음 아님
h는 모음 아님
n는 모음 아님
_는 모음 아님
D는 모음 아님
t는 모음 아님
-는 모음 아님
n는 모음 아님
l는 모음 아님
y는 모음 아님
s는 모음 아님
s는 모음 아님
!는 모음 아님

모음만 모아서 출력: oaaAai

단, 모음 알파벳은 아래 문자열에 포함되어 있다.

vowels='AEIOUaeiou'

답:

아래 코드는text에 포함된 모음만 모으기 위해 for 반복문을 이용한다.

vowels='AEIOUaeiou'

vowel_strings = ''
for char in text:
    if char in vowels:
        vowel_strings += char
        continue
        
    print(f"{char}는 모음 아님")

print()
print(f"모음만 모아서 출력:", vowel_strings)
P는 모음 아님
y는 모음 아님
t는 모음 아님
h는 모음 아님
n는 모음 아님
_는 모음 아님
D는 모음 아님
t는 모음 아님
-는 모음 아님
n는 모음 아님
l는 모음 아님
y는 모음 아님
s는 모음 아님
s는 모음 아님
!는 모음 아님

모음만 모아서 출력: oaaAai

8.2리스트와 for 반복문

아래 코드는 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 = sum_list + item

print("1부터 5까지 정수의 합:", sum_list)
1부터 5까지 정수의 합: 15

코드에 포함된 아래 for 반복분이 실행되면 item 변수는 먼저 0번 인덱스의 항목인 1을 가리킨다.

for item in one2five:
    sum_list += item

따라서 sum_list가 1을 가리키게 되고 다시 반복문의 본문의 처음으로 돌아간다. 이제 item은 1번 인덱스 항목인 2를 가리키고 반복문의 본문을 다시 실행한다.

이 과정을 item이 리스트의 마지막 항목은 5를 가리키고 반복문의 본문을 실행할 때까지 반복하면 for 반복문의 실행을 종료하고 다음 명령문으로 넘어가서 그때까지의 누적합을 가리키는 sum_list를 출력한다.

Python Tutor 활용 for 반복문 설명

아래 그림은 위 코드의 for 반복문이 실행되는 순간 선언된 변수들이 가리키는 값을 보여준다. sum_list는 아직 초기화 상태이고 item은 1을 가리키고 있다.

<그림 출처: Python Tutor>

반면에 아래 그림은 for 반복문이 2번 실행되어 sum_list는 3을, item은 2를 가리키고 있음을 보여준다.

<그림 출처: Python Tutor>

반복문이 계속 실행되어 item이 리스트의 마지막 항목인 5를 가리키면 sum_list는 15를 가리키며 반복문이 종료된다. 그러면 다음 명령문인 print(sum_list)가 실행되어 15가 출력된다(아래 그림 참고).

<그림 출처: Python Tutor>

8.3range() 함수와 for 반복문

8.3.1range() 함수

range() 함수는 리스트와 매우 유사한 값을 생성한다. 예를 들어, range(10)는 0부터 10 이전까지 정수, 즉 0부터 9까지의 정수를 포함하는 리스트와 유사한 값을 생성한다.

range(10)
range(0, 10)

0을 첫째 인자로, 10을 둘째 인자로 사용해도 동일한 모양의 값을 생성한다.

range(0, 10)
range(0, 10)

8.3.2range 자료형

range(10)의 내부를 바로 보여주지는 않는다.

print(range(10))
range(0, 10)

대신 리스트로의 형변환을 통해 range() 함수에 의해 생성되는 값에 포함되는 항목들을 확인할 수 있다.

list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range() 함수가 생성하는 값의 자료형은 range 이다. range 자료형의 값이 내부를 바로 보여주지 않는 이유는 여기서는 설명하지 않는다. 대신 (코딩알지) 이터러블, 이터레이터, 제너레이터를 읽어볼 것을 권장한다.

type(range(10))
range

8.3.3range() 함수의 인자

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]

위 사실을 이용하면 1부터 10까지의 정수의 합을 계산하는 코드를 아래처럼 for 반복문과 range() 함수를 이용하여 간단하게 구현할 수 있다.

sum = 0
for num in range(1, 11):
    sum += num
    
print("1부터 10까지 정수의 합:", sum)
1부터 10까지 정수의 합: 55

경우 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]

8.3.4range 자료형과 for 반복문

range() 함수가 생성하는 range 자료형의 값은 for 반복문에서 리스트 대신에 매우 유용하게 활용된다. 예를 들어 아래 코드는 range(10)에 의해 생성된 값이 리스트 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 대신 사용될 수 있음을 보여준다. 이유는 item 변수에 0부터 9까지의 정수가 차례대로 할당되기 때문이다.

for item in range(10):
    print("item에 할당된 값:", item)
item에 할당된 값: 0
item에 할당된 값: 1
item에 할당된 값: 2
item에 할당된 값: 3
item에 할당된 값: 4
item에 할당된 값: 5
item에 할당된 값: 6
item에 할당된 값: 7
item에 할당된 값: 8
item에 할당된 값: 9

range() 함수의 인자에 따라 반복문 내에서 지정된 변수가 움직이는 방식이 달라진다. 예를 들어 아래 코드는 보폭이 2로 지정되어 item 변수는 0, 2, 4, 6, 8을 차례대로 가리킨다.

for item in range(0, 10, 2):
    print("item에 할당된 값:", item)
item에 할당된 값: 0
item에 할당된 값: 2
item에 할당된 값: 4
item에 할당된 값: 6
item에 할당된 값: 8

음의 보폭을 갖는 경우에도 for 반복문을 적용하는 방식은 달라지지 않는다. 아래 코드는 11부터 0까지의 홀수를 역순으로 출력한다. 이유는 item 변수가 처음에 11을 가리키고 반복이 진행될 때마다 2씩 줄어들어 9, 7, 5, 3, 1까지 가리키기 때문이다.

for item in range(11, 0, -2):
    print(f"{item}: 홀수")
11: 홀수
9: 홀수
7: 홀수
5: 홀수
3: 홀수
1: 홀수

8.3.5리스트 대 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("2부터 10까지 짝수들의 합:", sum)
2부터 10까지 짝수들의 합: 30

그런데 2부터 1만까지, 아니 2부터 1억까지의 짝수들의 합을 계산하려면 one2ten_even과 유사한 변수를 선언하기 위해 항목을 5천 개 또는 5천만 개를 갖는 리스트를 먼저 표현해야 한다. 하지만 이런 일을 사람이 직접 타이핑하기에는 매우 지난하거나 불가능하다.

파이썬을 포함한 대부분의 프로그래밍 언어는 이런 경우를 간단하게 처리할 수 있는 기능을 제공한다. 파이썬의 경우엔 range() 함수를 활용한다. 예를 들어 2부터 10까지의 짝수들의 합을 아래와 같이 계산할 수 있다.

sum = 0
for item in range(2, 11, 2):
    sum = sum + item
    
print("2부터 10까지 짝수들의 합:", sum)
2부터 10까지 짝수들의 합: 30

그리고 위 코드에서 하나의 숫자만 수정해서 2부터 1억까지의 짝수들의 합을 계산할 수 있다.

sum = 0
for item in range(2, 100_000_001, 2):
    sum = sum + item
    
print("2부터 1억까지 짝수들의 합:", sum)
2부터 1억까지 짝수들의 합: 2500000050000000

이처럼 임의의 정수 n에 대해 range(n), range(2, n), range(10, n, 3) 등은 일정한 규칙에 따라 특정 구간에 속하는 값들의 간략하게 모음을 나타낸다는 점에서 리스트와 많이 다르다.

8.4사전과 for 반복문

사전에 대한 반복문은 키key에 대해 실행된다. 설명을 위해 6명의 개인정보를 담고 있는 아래 사전을 이용한다.

info_dict = {
              '김강현': ['010-1234-5678', 20, 172.5, '제주'],
              '황현': ['02-9871-1234', 19, 163.5, '서울'],
              '남궁수현': ['01-3456-7891', 21, 156.7, '경기'],
              '최흥선': ['070-4321-1111', 21, 187.2, '부산'],
              '김선주': ['010-3333-8888', 22, 164.6, '광주'],
              '함중아': ['010-7654-2345', 18, 178.3, '강원']
            }

아래 코드에서 key 변수는 info_dict 변수가 가리키는 사전의 키를 차례대로 가리킨다.

for key in info_dict:
    print(key)
김강현
황현
남궁수현
최흥선
김선주
함중아

key 변수가 가리키는 키의 순서는 사실 중요하지 않다. 사전 자료형은 비순차 자료형이기에 키의 순서 또한 상관없기 때문이다. 다만 파이썬 자체의 기준에 맞춰 일정한 순서대로 key 변수가 가리키는 값을 지정할 뿐이다.

키와 값의 쌍에 대해 반복문을 실행하려면 items() 메서드를 이용한다.

for item in info_dict.items():
    print(f"{item[0]}: {item[1]}")
김강현: ['010-1234-5678', 20, 172.5, '제주']
황현: ['02-9871-1234', 19, 163.5, '서울']
남궁수현: ['01-3456-7891', 21, 156.7, '경기']
최흥선: ['070-4321-1111', 21, 187.2, '부산']
김선주: ['010-3333-8888', 22, 164.6, '광주']
함중아: ['010-7654-2345', 18, 178.3, '강원']

위 코드에서 item 변수가 가리키는 값은 키와 키의 값으로 구성된 튜플이다.

for item in info_dict.items():
    print(item)
('김강현', ['010-1234-5678', 20, 172.5, '제주'])
('황현', ['02-9871-1234', 19, 163.5, '서울'])
('남궁수현', ['01-3456-7891', 21, 156.7, '경기'])
('최흥선', ['070-4321-1111', 21, 187.2, '부산'])
('김선주', ['010-3333-8888', 22, 164.6, '광주'])
('함중아', ['010-7654-2345', 18, 178.3, '강원'])

따라서 튜플 해체 기법을 활용하여 키와 키의 값을 분리해서 변수로 활용할 수 있다. 아래 코드에서 keyvalue는 각각 item 변수가 가리키는 튜플의 0번과 1번 인덱스 값을 가리킨다.`

for key, value in info_dict.items():
    print(f"{key}: {value}")
김강현: ['010-1234-5678', 20, 172.5, '제주']
황현: ['02-9871-1234', 19, 163.5, '서울']
남궁수현: ['01-3456-7891', 21, 156.7, '경기']
최흥선: ['070-4321-1111', 21, 187.2, '부산']
김선주: ['010-3333-8888', 22, 164.6, '광주']
함중아: ['010-7654-2345', 18, 178.3, '강원']

값에 대해 반복문을 실행하려면 values() 메서드를 이용한다.

for value in info_dict.values():
    print(value)
['010-1234-5678', 20, 172.5, '제주']
['02-9871-1234', 19, 163.5, '서울']
['01-3456-7891', 21, 156.7, '경기']
['070-4321-1111', 21, 187.2, '부산']
['010-3333-8888', 22, 164.6, '광주']
['010-7654-2345', 18, 178.3, '강원']

8.5continue와 break

continuebreak 명령문은 for 반복문과 나중에 배울 while 반복문과 함께 사용되어 반복 과정을 조절한다.

명령문기능
continue반복문의 처음으로 돌아가서 반복되어야 할 다음 차례를 실행
break반복문을 중지시키고 반복문 다음의 명령문 실행

8.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(f"짝수는 모두 무시됨")        
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 = sum_list + int(item)
        continue

    print(f"{item}는 짝수라서 무시")

print(f"짝수는 모두 무시됨")
print(f"1부터 5까지 홀수들의 합:", sum_list)
2는 짝수라서 무시
4는 짝수라서 무시
짝수는 모두 무시됨
1부터 5까지 홀수들의 합: 9

8.5.2break 명령문

break 명령문은 실행되는 순간 자신을 감싸고 있는 for 반복문을 중지시키고 반복문 다음의 명령문으로 넘어가도록 한다. 예를 들어 아래 코드는 item 변수가 4를 가리키는 순간 for 반복문의 실행을 중단하고 이어지는 print() 명령문으로 바로 넘어간다.

  • 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부터 {int(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 = sum_list + int(item)
    
print(f"1부터 {int(item)-1}까지 정수의 합:", sum_list)
1부터 3까지 정수의 합: 6

8.5.3continue와 break 영향 범위

continuebreak 명령문은 자신을 포함한 for 실행에만 영항을 준다.

예를 들어 아래 코드는 n이 12 또는 13을 가리킬 때 n의 소수 여부에 따라 소수면 소수임을 확인하는 문장을, 아니면 작은 수들의 곱으로 계산되는 여러 방식을 화면에 보여준다.

양의 정수가 소수가 되려면 2보다 크고 자신보다 작은 모든 정수에 대해 배수가 아니어야 하는데 이 사실을 확인하기 위해 for 반복문을 이용한다.

  • is_prime 변수: 처음에 True를 가리키다가 n을 나누는 2보다 큰 정수가 확인되는 순간 False로 변하게 되어 n이 소수가 아님을 기억한다. 이후 continue 명령문에 의해 n을 나누는 다른 경우를 확인한다.

  • for 반복문의 실행중에 is_prime이 가리키는 값이 변하지 않았다면 n이 소수임 밝힌다.

for n in [12, 13]:
    print(f"n={n}일때:")
    is_prime = True # 이 값이 계속 유지되면 소수임
    for x in range(2, n):
        if n % x == 0:
            is_prime = False
            print("-", n, "=", x, "*", n//x)
            continue

    if is_prime:
        print(n, "은(는) 소수다.")
    else:
        print(" ", n, "은(는) 소수가 아니다.")
        
    print()
n=12일때:
- 12 = 2 * 6
- 12 = 3 * 4
- 12 = 4 * 3
- 12 = 6 * 2
  12 은(는) 소수가 아니다.

n=13일때:
13 은(는) 소수다.

반면에 아래 코드는 소수가 아닐 때 하나의 곱셈식만 출력한다.

for n in [12, 13]:
    print(f"n={n}일때:")
    is_prime = True # 이 값이 계속 유지되면 소수임
    for x in range(2, n):
        if n % x == 0:
            is_prime = False
            print("-", n, "=", x, "*", n//x)
            break

    if is_prime:
        print(n, "은(는) 소수다.")
    else:
        print(" ", n, "은(는) 소수가 아니다.")
        
    print()
n=12일때:
- 12 = 2 * 6
  12 은(는) 소수가 아니다.

n=13일때:
13 은(는) 소수다.