2. for 반복문 Last updated: 2023-10-17 10:29:31

반복문은 for 문과 while 문이 있다. for 반복문은 for 반복 조건의 횟수만큼 for문 안의 코드를 반복하여 실행할 수 있는 문법이다. 반복 조건은 횟수가 될 수도 있고, 목록의 갯수 만큼 반복될 수도 있다. 다른 언어에서는 for 문의 반복 조건을 위해 숫자형 변수의 수식을 주로 사용한다는 점이 차이점이다.

2.1 for 문 형식

파이썬에서 for 반복문은 for ~ in 문 한 가지만 지원한다. 다른 언어에서는 for문, for each 등 다양한 방법을 지원하지만 파이썬은 for ~ in 한 가지만 지원한다. 파이썬에서 사용하는 for 문의 형식은 다음과 같다.

형식

for item in iterable:
    # do something

파라미터

• iterable (iterable) : 반복자 혹은 반복자로 변환 가능한 집합 객체
• item (object) : 반복자에 의해 생성된 각 항목

여기서 iterable은 반복 가능한 개체를 의미한다. 리스트, 튜플, 세트, 딕셔너리, 문자열, 바이트과 같은 시퀀스 데이터 집합도 가능하고, iterator 객체도 가능하다. range도 사용할 수 있다.

2.1.1 숫자 리스트를 이용한 for 문 실행

기본적인 for문의 예제를 확인해보자. 다음은 숫자 리스트를 반복자(iterator)로 사용하여 for 반복문을 실행한 예제이다.

[예제 4- 15] 리스트로 for 문 반복하기

numbers = [10, 20, 30, 40, 50]
for num in numbers:
    print(num)

[결과]

10
20
30
40
50

위 코드에서 numbers 리스트는 10 ~50까지 5개의 숫자로 구성되어 있다. 따라서 numbers 리스트를 for 문의 반복자(iterator)로 사용하면 for 문이 5번 실행되고, 실행될 때마다 현재의 숫자 값이 num 변수에 저장된다. 이렇게 넘어온 num 값은 for 문 안에서 활용할 수 있다.


Hint! C++에서 for 문

예제 4-15와 동일한 결과를 갖는 for 문을 C++ 문법으로 작성하면 다음과 같다. C++에서는 for문에 주로 리스트가 아니라 수식을 사용한다.

for num=10 ; num < 60 ; num+=10: {
    print(num);
}

혹은 리스트를 이용하면 다음과 같다.

Int arr[] = [10, 20, 30, 40, 50]
for (int num : arr) {
    print(num);
}



2.1.2 문자열 리스트를 이용한 for 문 실행

물론 숫자형이 아니더라도 for 문을 실행하는데 문제는 없다. 다음은 문자열 리스트를 사용하여 for 반복문을 실행한 예제이다.

[예제 4- 16] 문자열 리스트로 for 문 실행하기

fruits = ['apple', 'orange', 'banana', 'melon', 'mango']
for fruit in fruits:
    print(fruit)

[결과]

Apple
orange
banana
melon
mango

위와 같이 문자열 리스트를 사용해 5번의 반복문을 수행하였고 매번 넘어오는 문자열 값을 fruit 변수에 담아 사용하였다.



2.1.3 문자열 리스트와 enumerate를 이용해 for문 실행

문자열 리스트를 for 문의 반복자로 사용하는 경우 현재 몇 번째 순서인지 알 수가 없다. 이러한 경우 앞에서 배운 enumerate( ) 메서드를 사용하면 현재 인덱스를 얻어올 수 있다.

형식

for index, item in enumerate(iterable):
    # do something

파라미터

• iterable (iterable) : 반복자 혹은 반복자로 변환 가능한 집합 객체
• index (int) : 0부터 시작되는 인덱스 숫자
• item (object) : 반복자에 의해 생성된 각 항목

[예제 4- 17] for 문에 리스트와 enumerate( ) 함수 사용하기

fruits = ['apple', 'orange', 'banana', 'melon', 'mango']
for idx, fruit in enumerate(fruits):
    print(idx, fruit)

[결과]

0 apple
1 orange
2 banana
3 melon
4 mango


2.1.4 range를 이용해 for 문 실행 (1)

다음은 range( ) 메서드를 이용해 for 문을 실행하는 예제이다. range( ) 메서드에 반복할 숫자를 입력한다.

[예제 4- 18] range( ) 함수로 for문 실행하기

for idx in range(10):
    print(idx)

[결과]

0
1
2
3
4
5
6
7
8
9

위 코드에서 range( ) 메서드에 10을 입력하였으므로 0부터 9까지 10회에 걸쳐 반복문이 실행되었다.



2.1.5 range를 이용해 for 문 실행 (2)

물론 range( ) 메서드의 인자를 수정해 횟수와 값을 조절할 수도 있다.

형식

for index in range(start, stop, step):
    # do something

파라미터

• start (int) : 인덱스 시작
• stop (int) : 인덱스 종료
• step (int) : 인덱스 증감량
• index (int) : 반복 인덱스

[예제 4- 19] range( ) 함수로 for문 홀수 출력하기

for idx in range(1, 10, 2):
    print(idx)

[결과]

1
3
5
7
9

위 코드는 1부터 2씩 커지고 10보다 작은 숫자를 대상으로 for 문을 실행한 결과이다.



2.1.6 문자열을 이용한 for 문 실행

문자열을 for 문의 반복자로 사용하면 문자열은 각 문자 하나씩을 반환한다.

[예제 4- 20] 문자열의 for문 실행하기

fruit_name = 'apple'
for c in fruit_name:
    print(c)

[결과]

a
p
p
l
e

위 코드에서 "apple" 문자열이 for 문의 반복자로 사용되면 각 문자 "a", "p", "p", "l", "e" 가 각각 for 문에서 변수 c에 저장되어 각각 실행된다.



2.2 break로 for 문 멈추기

for 문은 반복자(iterator)에서 입력되는 항목의 횟수만큼 반복 실행된다. 하지만 경우에 따라 임의로 반복문을 중단 시키고 싶을 수 있다. 이러한 경우 break 문을 사용한다.

형식

for item in iterator:
    # do something

    if condition:
        break

파라미터

• iterator (iterable) : 반복 가능한 객체
• item (object) : iterator에서 for 문 단계마다 반환되는 항목
• condition : True 혹은 False를 결과로 출력하는 조건문

다음 그림을 보면 이해가 쉽다. for 문은 iterator 횟수만큼 for 문에 포함된 코드를 반복 실행한다. 만일 if 조건이 True여서 if 문 안의 break 문을 만난다면 iterator의 남은 횟수와 상관없이 for 문을 종료한다. break로 종료되는 for 문의 실행 순서는 다음과 같다.


image

[그림 4-2-1] for 문의 break 실행 순서


다음은 입력 숫자가 3보다 크다면 for 문을 종료하는 예시이다.


[예제 4- 21] if 조건문에 따른 for 문 break 사용하기

for idx in range(1, 10, 2):
    print(idx)
    if 3 < idx:
        break

[결과]

1
3
5

위 코드에서 for 문의 반복문은 [1, 3, 5, 7, 9]의 5번 호출된다. 하지만 if 조건문에서 3보다 값이 큰 5를 만나게 될 경우 if 조건문이 True가 되어 break 문을 만나 for 문 실행이 종료된다. 단, 여기서 주의할 점은 print(idx) 문이 조건문 앞에 있다는 것이다. 만일 3보다 크면 for 문 내용을 실행하지 않고 종료하기 원한다면 if 조건문을 for 문 맨 위에 두어야 한다.



2.3 continue로 for 문 지나가기

continue는 반복 문에서 남은 내용을 실행하지 말고 다음 반복문으로 넘긴다는 의미이다.

형식

for item in iterator:
    # [A] do something

    if condition:
        continue

    # [B] do something

파라미터

• iterator (object) : 반복 가능한 객체
• item (object) : iterator에서 for 문 단계마다 반환되는 항목
• condition : True 혹은 False를 결과로 출력하는 조건 문이다. 조건문이 True인 경우 continue가 실행되어 [B] 블럭은 실행되지 않고 for 문의 다음 반복문이 실행된다.

아래 그림을 통해 설명한다. for 문이 시작되면 iterator 횟수에 따라 for 문 안의 Code A와 Code B를 실행된다. 이 때 if 조건절을 만나 조건이 True가 되는 경우 if 조건절 내의 continue 문을 만난다. continue 문을 만나면 for 문 안의 나머지 코드(Code B)를 실행하지 않고 즉시 다음 for 문을 위해 for 문 맨 위로 이동한다. break 문을 만나면 for 문이 모두 종료되는 것과는 다르게 continue 문은 현재 for 문 안에서만 종료하고 다음 반복문을 실행하는 것이 다르다.


image

[그림 4-2-2] for 문의 continue 실행 순서


다음 예시를 통해 설명한다.


[예제 4- 22] for 문에서 continue 사용하기

for idx in range(1, 5):
    print("#", idx)
    print("code A:")
    
    if (idx % 3) == 0:
        print("3의 배수")
        continue
    
    print("code C")

[결과]

# 1
code A:
code C
# 2
code A:
code C
# 3
code A:
3의 배수
# 4
code A:
code C

우선 for 문은 1~4까지 4번 반복된다. 매번 index를 "#" 문자와 함께 출력하여 #1 ~ #4까지 네번 출력 되었다. 3의 배수가 아닌 "#1", "#2", "#4"에서는 "Code A"와 "Code C"가 출력 되었다. 하지만 3의 배수인 "#3"에서는 if 조건문이 True가 되므로 "3의 배수" 문자열을 출력하고 continue 문을 만나 처음으로 이동한다. 이때 "Code C"는 출력 되지 않았다.



2.4 for ~ else 문

파이썬은 특이하게 for 문에서 else 구문을 지원한다. 보통 다른 언어에서 else문은 if와 함께 쓰이다. 하지만 파이썬에서는 특이하게 for 문이 종료되면 마지막으로 실행되는 else 문을 지원한다.

형식

for item in iterator:
    # [A] do something
else:
    # [B] do something

파라미터

• iterator (object) : 반복 가능한 객체
• item (object) : iterator에서 for 문 단계마다 반환 되는 항목

for 문이 반복되는 동안 [A]에 해당하는 블럭이 반복하여 실행되고 모든 반복문이 끝나면 마지막으로 else에 해당하는 [B] 블럭의 코드가 한번 실행된다.

else 예제를 살펴보자.


[예제 4- 23] for ~ else 문 사용하기

for idx in range(1, 5):
    print("#", idx)
else:
    print("statement ends!")

[결과]

# 1
# 2
# 3
# 4
statement ends!

위 코드에서 for 문은 1 ~ 4까지 네 번 반복된다. for 반복문이 끝나면 else 문 안의 내용이 마지막으로 실행된다.



2.4.1 for ~ else 문에서 break 사용

for ~ else 문이 사용된 경우 break를 만나면 else 문이 실행되지 않는다. 그 이유는 break문은 실행하던 for 문의 나머지 실행 영역을 중단하고 for 문을 벗어나기 때문이다. for ~ else문에서 else 문도 for 문의 일부로 보기 때문이다.

[예제 4- 24] for ~ else 문에서 break 사용하기

for idx in range(1, 5):
    print("#", idx)
    if idx > 2:
        # [1] idx가 2보다 큰 값일 때 break 한다
        break
else:
    print("for statement ends!")

[결과]

# 1
# 2
# 3

위 코드에서 idx가 3일 때 [1]에서 break를 만나 for 문을 종료하게 되고, else 문도 실행되지 않는다. 물론 break가 for 문 안에 있더라도 이를 만나지 않고 for 문이 모두 실행되고 종료한다면 else 문을 실행될 것이다.



2.5 이중 for 문

for 문은 안에 다른 for 문을 포함시킬 수 있다. 규칙은 간단한다. for 문 안에 for 문을 위치 시킨다. 단, break, continue 등은 바로 위에 있는 for 문에만 동작한다는 것을 기억해야 한다.

형식

for item1 in iterator1:
    # [A] do something

    for item2 in iterator2:
        # [B] do something

파라미터

• iterator1 (object) : 바깥쪽 for 문을 위해 반복 가능한 객체
• item1 (object) : iterator2에서 for 문 단계마다 반환 되는 항목
• iterator2 (object) : 안쪽 for 문을 위해 반복 가능한 객체
• item2 (object) : iterator2에서 for 문 단계마다 반환 되는 항목

안쪽 for 문은 바깥쪽 for 문이 1번 실행될 때마다 호출된다. 예를 들어 바깥쪽 for 문이 3번 반복되고, 안쪽 for 문이 4번 반복되는 구조라면, 결과적으로 바깥쪽은 코드 [A] 코드 블럭은 총 3번 호출되지만 안쪽은 3번 X 4번 호출 되므로 [B] 코드 블럭은 총 12번 호출된다.

우선 간단한 이중 for 문의 예제를 확인해 본다.


[예제 4- 25] 이중 for else 문 사용하기

for fruit in ['apple', 'banana', 'melon']:
    print(fruit)
    for idx in range(4):
        print(idx)
    else:
        print("inner for ends")
else:
    print("outer for ends")

[결과]

apple
0
1
2
3
inner for ends
banana
0
1
2
3
inner for ends
melon
0
1
2
3
inner for ends
outer for ends

위 코드를 보면 바깥쪽 for 문이 시작되고 fruit를 출력한다. 그리고 안쪽 for 문이 시작되고 4번의 반복을 마친다. 그리고 안쪽 for 문의 else로 이동해 ‘inner for ends’ 문을 출력한다. 이제 다시 바깥쪽 for 문으로 이동해 두 번째 fruit 변수값 ‘banana’를 출력한다. 이렇게 마지막 ‘melon’ 까지 실행되고 나면 바깥쪽 for 문의 else로 이동해 ‘outer for ends’ 문을 출력하고 끝난다.



2.5.1 이중 for 문에서 break 사용

for 문에서 break 문을 만나면 이후의 코드를 실행하지 않고 for 문 맨 앞의 반복절로 이동한다. 만일 안쪽 for 문에서 break 문을 만나면 안쪽 for 문의 실행을 종료하고 바깥쪽 for 문의 시작점으로 이동한다. 단, 안쪽 for 문의 else 문도 break 문 뒤쪽에 위치하므로 실행하지 않는다. 다음은 이중 for 문에서 안쪽 for 문에 break가 있는 예제이다.

[예제 4- 26] 이중 for문에 break 사용하기

# [1] 바깥쪽 for 문
for fruit in ['apple', 'banana', 'melon']:
    print(fruit)
    
    # [2] 바깥쪽 for 문
    for idx in range(4):
        print(idx)
        
        if idx > 1:
            # [3] 안쪽 for 문의 break
            break
    # [4] 안쪽 for 문의 else
    else:
        print("inner for ends")
# [5] 바깥쪽 for 문의 else
else:
    print("outer for ends")

[결과]

apple
0
1
2
banana
0
1
2
melon
0
1
2
outer for ends

위 예제에서 우선 [1] 바깥쪽 for 문이 실행된다. [2]에서 안쪽 for 문을 만나서 0~3까지 4번 for 문이 실행될 것이다. 하지만 idx 값이 2일 때 [3]에서 break문을 만나 [2]의 for 문은 종료되고 [1]의 바깥쪽 for 문으로 이동한다. 이 때 [4]의 안쪽 for 문 else는 실행하지 않고 지나간다.


이중 for 문의 특성을 정리하면 다음과 같다.

  1. 바깥쪽 for 문에서 시작하여 안쪽 for 문이 실행된다.

  2. 안쪽 for 문의 반복이 끝나면 바깥쪽 for 문의 다음 순서를 실행한다.

  3. for 반복문을 중첩 할 때 변수 이름은 중복되지 않도록 주의한다.