파이썬 for문(반복 루프) 사용법 12가지
- 코딩 팁
- 2019. 5. 16.
Python for문을 활용한 루프 처리 방법을 설명합니다.
- 기본적인 문법
- Python for문 기본 사용법
- 조건에 따라 중간 종료 : break
- 특정 요소 처리를 생략 : continue
- for 루프 완료 후 처리 : else
- for 문에서 사용하면 편리한 기능
- 인덱스 (카운터) : range()함수
- LIST 요소와 인덱스 : enumerate()함수
- LIST의 요소(복수 변수) : zip()함수
- LIST의 요소와 인덱스 : enumerate(), zip()함수
- 역순 : reversed()함수
- 다중 루프 : itertools.product()함수
- 다른 주제
- DICTIONARY for 루프
- List 내포
Python for문 기본 사용법
C언어 계열 프로그래밍 언어의 for문 (for 루프)은 카운터 변수(인덱스)와 조건을 사용하여 작성합니다.
1 2 | for (int i = 0; i < 10; i++) 처리 | cs |
Python for문은 C언어 계열과 달리 카운터 변수(인덱스)를 사용하지 않습니다.
1 2 | for 변수 이름 in 이터레이터 오브젝트 : 처리 | cs |
다른 언어의 foreach 문에 해당합니다. 리스트(배열) 등 개체 요소가 차례로 변수에 할당되어 처리됩니다.
구체적인 예는 다음과 같습니다.
1 2 3 4 5 6 7 | l = ['Alice', 'Bob', 'Charlie'] for name in l: print(name) # Alice # Bob # Charlie | cs |
조건에 따라 중간 종료 : break
for 문 중간에 프로세스를 종료하려면 break를 사용합니다.
1 2 3 4 5 6 7 8 9 | l = ['Alice', 'Bob', 'Charlie'] for name in l: if name == 'Bob': print('!!BREAK!!') break print(name) # Alice # !!BREAK!! | cs |
특정 요소 처리를 생략 : continue
특정 요소에 대한 처리를 생략하려면 continue를 사용합니다.
break는 for 루프 전체가 종료되지만, continue는 해당 요소에 대해서만 처리가 생략되므로 for 루프는 끝까지 실행됩니다.
1 2 3 4 5 6 7 8 9 10 | l = ['Alice', 'Bob', 'Charlie'] for name in l: if name == 'Bob': print('!!SKIP!!') continue print(name) # Alice # !!SKIP!! # Charlie | cs |
for 루프 완료 후 처리 : else
for문 루프가 종료된 후 어떤 작업을 수행하려면 else를 사용합니다.
1 2 3 4 5 6 7 8 9 10 | l = ['Alice', 'Bob', 'Charlie'] for name in l: print(name) else: print('!!FINISH!!') # Alice # Bob # Charlie # !!FINISH!! | cs |
break에 의해 중간에 종료된다면 else는 실행되지 않습니다.
1 2 3 4 5 6 7 8 9 | for name in l: if name == 'Bob': print('!!BREAK!!') break print(name) else: print('!!FINISH!!') # Alice # !!BREAK!! | cs |
continue의 경우 for 루프가 끝까지 실행되므로 else가 실행됩니다.
1 2 3 4 5 6 7 8 9 10 11 | for name in l: if name == 'Bob': print('!!SKIP!!') continue print(name) else: print('!!FINISH!!') # Alice # !!SKIP!! # Charlie # !!FINISH!! | cs |
인덱스 (카운터) : range () 함수
Python for 문에서 인덱스(카운터)를 얻고 싶을 때 range()함수를 사용합니다.
1 2 3 4 5 | for i in range(3): print(i) # 0 # 1 # 2 | cs |
range() 함수가 range 클래스의 생성자입니다.
1 2 3 4 | print(range(3)) print(type(range(3))) # range(0, 3) # <class 'range'> | cs |
설명을 위해 list() 요소를 출력하여 표시해 보겠습니다.
range(stop)에서 0 <= i < stop 인덱스 번호를 반환합니다.
1 2 3 4 5 | print(list(range(3))) # [0, 1, 2] print(list(range(6))) # [0, 1, 2, 3, 4, 5] | cs |
0부터 시작이 아니라 범위를 지정하고 싶다면, range(start, stop)와 같이 2개의 인수를 지정합니다.
start <= i < stop을 통해 인덱스를 반환합니다.
1 2 | print(list(range(10, 13))) # [10, 11, 12] | cs |
또한, 1이 아니라 다른 숫자만큼 증가하고 싶다면 range(start, stop, step)와 같이 3개의 인수를 지정합니다.
start <= i < stop 범위에서 스텝(3)에 맞는 정수를 출력합니다.
1 2 | print(list(range(0, 10, 3))) # [0, 3, 6, 9] | cs |
step에는 음수 값을 지정할 수도 있습니다.
1 2 | print(list(range(10, 0, -3))) # [10, 7, 4, 1] | cs |
for 문에서 실행하면 다음과 같습니다.
1 2 3 4 5 6 | for i in range(10, 0, -3): print(i) # 10 # 7 # 4 # 1 | cs |
LIST 요소와 인덱스 : enumerate () 함수
리스트(배열) 등의 요소를 인덱스(카운터)와 함께 얻으려면 enumerate()함수를 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | l = ['Alice', 'Bob', 'Charlie'] for name in l: print(name) # Alice # Bob # Charlie for i, name in enumerate(l): print(i, name) # 0 Alice # 1 Bob # 2 Charlie | cs |
enumerate() 함수의 두 번째 인수는 시작 값입니다. 0 부터가 아니라 시작이 임의의 정수 값부터 시작합니다.
1 2 3 4 5 6 7 8 9 10 11 | for i, name in enumerate(l, 1): print(i, name) # 1 Alice # 2 Bob # 3 Charlie for i, name in enumerate(l, 42): print(i, name) # 42 Alice # 43 Bob # 44 Charlie | cs |
enumerate() 함수에 step을 지정하는 인수는 없지만, 다음과 같이하면 코딩하면 똑같이 흉내낼 수 있습니다.
1 2 3 4 5 6 | step = 3 for i, name in enumerate(l): print(i * step, name) # 0 Alice # 3 Bob # 6 Charlie | cs |
LIST의 요소 (복수 변수) : zip () 함수
LIST 개체(목록)의 요소를 여러 변수로 정리하고 싶다면 zip()함수를 사용합니다.
1 2 3 4 5 6 7 8 | names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 | cs |
변수 2개에 한정하지 않고, 3개 이상의 개체로 정리할 수도 있습니다.
1 2 3 4 5 6 7 | points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90 | cs |
예제처럼 zip() 함수를 통해 여러 요소를 순차적으로 얻을 수 있습니다.
LIST 요소와 인덱스 : enumerate(), zip() 함수
LIST의 여러 개체(목록)에서 요소와 인덱스(카운터)를 동시에 얻으려면 enumerate(), zip() 함수를 함께 사용합니다.
1 2 3 4 5 6 7 8 | names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for i, (name, age) in enumerate(zip(names, ages)): print(i, name, age) # 0 Alice 24 # 1 Bob 50 # 2 Charlie 18 | cs |
역순 : reversed () 함수
요소를 역순으로 얻으려면 reversed() 함수를 사용합니다.
1 2 3 4 5 6 7 | l = ['Alice', 'Bob', 'Charlie'] for name in reversed(l): print(name) # Charlie # Bob # Alice | cs |
range 개체도 역순으로 얻을 수 있습니다. reversed() 함수를 사용하지 않고 step에 음수 값을 지정합니다.
1 2 3 4 5 6 7 8 9 10 11 | for i in reversed(range(3)): print(i) # 2 # 1 # 0 for i in range(2, -1, -1): print(i) # 2 # 1 # 0 | cs |
enumerate 객체는 반전이 안 됩니다. 그래서 list()로 변경합니다.
1 2 3 4 5 6 7 8 9 | # for i, name in reversed(enumerate(l)): # print(i, name) # TypeError: 'enumerate' object is not reversible for i, name in reversed(list(enumerate(l))): print(i, name) # 2 Charlie # 1 Bob # 0 Alice | cs |
인덱스(카운터)를 뒤집지 않으려면 enumerate() 가운데 reversed()를 추가하여 사용합니다.
1 2 3 4 5 | for i, name in enumerate(reversed(l)): print(i, name) # 0 Charlie # 1 Bob # 2 Alice | cs |
zip 개체도 반전이 안 됩니다. 그래서 list로 변경하여 출력해 봅니다.
1 2 3 4 5 6 7 8 9 10 11 | l2 = [24, 50, 18] # for name, age in reversed(zip(l, l2)): # print(name, age) # TypeError: 'zip' object is not reversible for name, age in reversed(list(zip(l, l2))): print(name, age) # Charlie 18 # Bob 50 # Alice 24 | cs |
다중 루프 : itertools.product()함수
Python에서 다중 루프는 다음과 같이 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | l1 = [1, 2, 3] l2 = [10, 20, 30] for i in l1: for j in l2: print(i, j) # 1 10 # 1 20 # 1 30 # 2 10 # 2 20 # 2 30 # 3 10 # 3 20 # 3 30 | cs |
표준 라이브러리 itertools 모듈의 itertools.product() 함수를 사용합니다. for문을 중첩하여 사용하지 않고 다중 루프와 비슷한 결과를 얻을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import itertools l1 = [1, 2, 3] l2 = [10, 20, 30] for i, j in itertools.product(l1, l2): print(i, j) # 1 10 # 1 20 # 1 30 # 2 10 # 2 20 # 2 30 # 3 10 # 3 20 # 3 30 | cs |
DICTIONARY for 루프
딕셔너리 dict의 개체를 for 루프로 돌려 키를 얻을 수 있습니다.
1 2 3 4 5 6 7 | d = {'key1': 1, 'key2': 2, 'key3': 3} for k in d: print(k) # key1 # key2 # key3 | cs |
값, 키, 둘 다 등을 원한다면 values() 메소드, items() 메소드를 사용합니다.
1 2 3 4 5 | for v in d.values(): print(v) # 1 # 2 # 3 | cs |
1 2 3 4 5 | for k, v in d.items(): print(k, v) # key1 1 # key2 2 # key3 3 | cs |
List 내포
LIST(배열) 등의 요소를 통해 새로운 리스트를 생성한다면, for문보다 내포를 사용하세요.
LIST 내포 표기는 다음과 같습니다.
1 | [식 for 변수 이름 in 개체 ] | cs |
for 반복문을 통해 예제를 소개합니다.
1 2 3 4 5 6 7 8 9 10 | squares = [i**2 for i in range(5)] print(squares) # [0, 1, 4, 9, 16] squares = [] for i in range(5): squares.append(i**2) print(squares) # [0, 1, 4, 9, 16] | cs |
LIST 내포를 사용하면 내부 요소를 처리할 수 있습니다. 또한, 조건에 따라 요소를 추출해 새로운 LIST를 생성할 수 있습니다.