루프의 else: break 없이 완주했을 때만 실행되는 블록
Python for/while else 구문의 정확한 동작 원리, 검색 실패 감지 패턴, 플래그 변수 대체, while else 재시도 패턴, 가독성 트레이드오프를 정리합니다.
지난 글에서 break와 continue를 다뤘다. Python에는 다른 언어에 없는 독특한 구문이 있다. 바로 루프의 else — for와 while 뒤에 else 블록을 붙일 수 있다. 처음 보는 사람 대부분이 “조건문의 else랑 같은 건가?” 하고 오해한다. 전혀 다르다.
핵심 규칙 한 줄
else블록은break없이 루프가 완주됐을 때만 실행된다.
break로 탈출하면 else는 건너뛴다. break 없이 모든 반복을 마치면 else가 실행된다.
for i in range(5):
if i == 3:
break
else:
print("완주!") # break가 있으므로 실행 안 됨
for i in range(5):
pass
else:
print("완주!") # break 없음 → 실행됨 → "완주!"
검색 실패 감지 — 가장 흔한 사용처
리스트에서 특정 조건을 찾다가 못 찾은 경우를 처리할 때 유용하다.
플래그 방식 (전통적)
found = False
for user in users:
if user == "Carol":
print("찾음")
found = True
break
if not found:
print("Carol 없음")
for-else 방식
for user in users:
if user == "Carol":
print("찾음")
break
else:
print("Carol 없음") # break 없이 완주 = 못 찾음
else를 쓰면 found 변수가 필요 없다. “break가 발생하지 않았다”는 의미가 코드 구조에 직접 표현된다.
소수 판별 — 교과서적 예제
def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False # 약수 발견 → 소수 아님
else:
return True # 약수 없이 완주 → 소수
print(is_prime(7)) # True
print(is_prime(6)) # False
range(2, n)을 break 없이 완주하면 약수가 없다는 뜻이므로 else에서 True를 반환한다.
while-else
while 루프에도 else를 붙일 수 있다. 조건이 False가 되어 자연 종료됐을 때 실행된다.
attempts = 0
while attempts < 3:
attempts += 1
if connect():
print("연결 성공")
break
else:
print("3회 시도 모두 실패") # break 없이 조건 소진
재시도 로직에서 “모두 실패했을 때”를 처리하는 데 깔끔하게 쓸 수 있다.
주의: 가독성 트레이드오프
루프의 else는 Python 특유의 문법이라 처음 접하는 팀원에게 낯설 수 있다. 의도가 명확하지 않은 컨텍스트에서는 주석을 달거나 플래그 방식을 택하는 것도 합리적 선택이다.
for item in collection:
if condition(item):
handle(item)
break
else:
# break 없이 완주 = condition을 만족하는 item 없음
handle_not_found()
중첩 루프에서 주의점
else는 직접 감싸는 루프에만 적용된다.
for i in range(3):
for j in range(3):
if j == 1:
break
# 안쪽 루프 else라면 여기
else:
# 바깥쪽 for가 break 없이 완주했으므로 실행됨!
print("바깥 루프 완주")
안쪽 루프의 break는 바깥 루프의 else에 영향을 주지 않는다.
정리
for/while else—break없이 루프 완주 시에만 실행 (“no-break 절”)break로 탈출하면else건너뜀- 검색 실패 감지, 소수 판별, 재시도 실패 처리에 유용
- 플래그 변수를 줄이고 의도를 코드 구조로 표현 가능
- 낯선 팀원을 위해 주석 추가 권장
지난 글: break와 continue: 루프 흐름 세밀하게 제어하기
다음 글: match 문: Python 3.10 구조적 패턴 매칭
읽어주셔서 감사합니다. 😊