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