Python 반복문은 "몇 번 도느냐"보다 무엇을 순회하는가, 언제 멈추는가, 중간에 건너뛰거나 끊어야 하는가로 읽는 편이 빠릅니다.
값을 순회하는지, 횟수를 세는지, 조건이 풀릴 때까지 도는지부터 나누면 for, range(), while 선택이 훨씬 쉬워집니다.
숏컷 코드
# 값만 순회
for name in names:
print(name)
# 숫자 범위를 반복
for retry in range(3):
print("retry", retry)
# 조건이 바뀔 때까지 반복
while queue:
item = queue.pop(0)
process(item)문법
기본형은 값 순회, 범위 반복, 조건 반복, for-else까지 함께 보면 됩니다.
for item in items:
...
for i in range(3):
...
while condition:
...
for item in items:
if is_target(item):
break
else:
...Python의 for는 숫자를 세기보다 iterable에서 값을 하나씩 꺼내 읽는 문법에 가깝습니다.
for ch in "abc":
print(ch)
for row in rows:
print(row)이미 값이 있는 컬렉션을 도는데 인덱스가 꼭 필요하지 않다면, 원본을 그대로 순회하는 쪽이 보통 더 자연스럽고 오프바이원 실수도 줄어듭니다.
반복문 선택
for, range(), while를 언제 고르는가
값을 하나씩 순회하면 for, 횟수나 숫자 범위가 대상이면 range()를 붙인 for를 고르면 됩니다.
for i in range(3):
print(i)
for page in range(1, 6):
print(page)이미 값이 있는 리스트를 돌면서 번호도 같이 필요하다면 range(len(items))보다 enumerate()가 더 직접적입니다.
for index, item in enumerate(items):
print(index, item)종료 시점이 데이터 끝이 아니라 상태 변화라면 while이 맞습니다.
attempt = 0
while attempt < 3:
if try_connect():
break
attempt += 1재시도, 입력 검증, 큐 비우기처럼 "조건이 풀릴 때까지"가 핵심이면 while이 자연스럽지만, 종료 조건 업데이트가 빠지면 무한 루프로 이어지기 쉬워서 더 주의해야 합니다.
반복 제어
break, continue, else를 어떻게 읽는가
continue는 이번 항목만 건너뛰고, break는 루프 자체를 끝냅니다.
for row in rows:
if row.is_empty():
continue
if row.is_fatal():
break
handle(row)continue는 필터에 가깝고, break는 탐색 종료나 실패 전파에 가깝다고 읽으면 빠릅니다.
for-else와 while-else의 else는 break 없이 끝났을 때만 실행됩니다.
for item in items:
if item.is_target():
result = item
break
else:
result = None찾으면 중단하고, 못 찾았을 때만 후처리하는 패턴에서 flag 변수를 따로 두지 않아도 된다는 점이 핵심입니다.
주의할 점
순회 중인 리스트를 바로 수정하면 항목을 건너뛰거나 예상과 다른 결과가 나옵니다. Python은 C#처럼 즉시 예외가 나지 않아 더 헷갈릴 수 있습니다.
# ❌ 순회하면서 원본을 수정
numbers = [1, 2, 3, 4]
for n in numbers:
if n % 2 == 0:
numbers.remove(n)
# ✅ 새 리스트를 만든다
numbers = [1, 2, 3, 4]
numbers = [n for n in numbers if n % 2 != 0]
# ✅ 또는 복사본을 순회한다
numbers = [1, 2, 3, 4]
for n in numbers[:]:
if n % 2 == 0:
numbers.remove(n)# ❌ while인데 상태 업데이트가 없어 무한 루프 위험
while items:
print("still running")
# ✅ 종료 조건에 영향을 주는 상태를 같이 갱신
while items:
item = items.pop()
print(item)# ❌ 번호만 필요해서 range(len(...))를 썼는데 값 접근이 번거로워짐
for i in range(len(items)):
print(i, items[i])
# ✅ 값과 번호를 같이 읽을 때는 enumerate()
for i, item in enumerate(items):
print(i, item)참고 링크
2 sources