Effective Python C1. Pythonic(9) - for, while 루프 뒤 else 블록 금지

1 분 소요

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판. - 브렛 슬리킨 지음 / 오현석 옮김