Effective Python C1. Pythonic(9) - for, while 루프 뒤 else 블록 금지
Introduction
for, while문 뒤에 else 블록이 붙을 수 있다. 이 블록은 루프 내 break로 인해 루프를 빠져나올 때 실행된다.
Best WAY 9 : for나 while 루프 뒤에 else 블록을 사용하지 말라.
문제는 일반적인 else문의 사용과 다르게 동작한다는 것이다. 보통의 else문은 if-else 쌍으로 구성되어 if 내 조건문을 만족하지 못할 때 실행되나, 루프에 쓰이는 else는 오히려 루프를 break없이 모두 돌았을 때 실행된다.
아래와 같이 서로소를 찾는 로직을 보자.
a, b = 4, 9
for i in range(2, min(a, b) + 1):
print('검사 중', i)
if a % i == 0 and b % i == 0:
print('서로소 아님')
break
else:
print('서로소')
for-else 문을 이용해 작성할 수 있지만, 다음처럼 도우미 함수를 사용할 수 있다.
def coprime(a, b):
for i in range(2, min(a, b) + 1):
if a % i == 0 and b % 1 == 0:
return False
return True
assert coprime(4, 9)
assert coprime(3, 6)
else에 의한 표현력보다는 미래에 이 코드를 이해하려는 사람들에게 느끼게 될 부담이 더 크다.
Summary
- for이나 while 문 뒤에 나오는 else문은 break를 만나지 않은 경우에만 실행된다.
- 동작이 직관적이지 않고 혼동을 야기할 수 있으므로 루프 뒤에 else 블록을 사용하지 말라.
Reference
파이썬 코딩의 기술 제 2판. - 브렛 슬리킨 지음 / 오현석 옮김