파이썬35번4 MIN
루프의 else: break 없이 완주했을 때만 실행되는 블록
Python for/while else 구문의 정확한 동작 원리, 검색 실패 감지 패턴, 플래그 변수 대체, while else 재시도 패턴, 가독성 트레이드오프를 정리합니다.
이 글은 PALDYN Tech Blog의 글입니다.원문 보기
지난 글에서 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 구조적 패턴 매칭
읽어주셔서 감사합니다. 😊

