코딩 팁

파이썬 for문(반복 루프) 사용법 12가지

코딩 기록 vicddory 2019. 5. 16. 15:54

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
= ['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
= ['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
= ['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
= ['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(1013)))
# [10, 11, 12]
cs


또한, 1이 아니라 다른 숫자만큼 증가하고 싶다면 range(start, stop, step)와 같이 3개의 인수를 지정합니다.


start <= i < stop 범위에서 스텝(3)에 맞는 정수를 출력합니다.


1
2
print(list(range(0103)))
# [0, 3, 6, 9]
cs


step에는 음수 값을 지정할 수도 있습니다.


1
2
print(list(range(100-3)))
# [10, 7, 4, 1]
cs


for 문에서 실행하면 다음과 같습니다.


1
2
3
4
5
6
for i in range(100-3):
    print(i)
# 10
# 7
# 4
# 1
cs


LIST 요소와 인덱스 : enumerate () 함수

리스트(배열) 등의 요소를 인덱스(카운터)와 함께 얻으려면 enumerate()함수를 사용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
= ['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 = [245018]
 
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 = [1008590]
 
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 = [245018]
 
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
= ['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 = [245018]
 
# 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 = [123]
l2 = [102030]
 
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 = [123]
l2 = [102030]
 
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
= {'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를 생성할 수 있습니다.

반응형
그리드형(광고전용)