BETTER WAY 9) for나 while 루프 뒤에 else 블록을 사용하지 말라

✅for & while 사용할수 있는 else의 문제점

파이썬은 루프가 반복 수행하는 내부 블록 바로 다음에 else 문을 추가할 수 있다.

for i n range(3):
    print("Loop", i)
else:
    print("else Block")
->
Loop 0
Loop 1
Loop 2
Else Block

반복문에 반복이 끝나면 else가 실행된다. 코드를 읽기에는 부자연스러운 표현이다. if/else문은 if문에 조건이 안 맞으면 else문을 실행하라는 의미이다. try/except는 try를 하다가 except가 발생하면 except가 실행하라는 의미이다.

for문에 else는 실행 방식이 의미랑 많이 다르다. 파이썬을 처음 접한 프로그래머가 이러한 문자를 보면 "루프가 정상적으로 완료되지 않으면 이 블록이 실행하라"라고 가정할 수 있다. 하지만 여기서 사용되는 else 블록은 완전히 반대로 동작한다. break가 동작하면 else문은 실행되지 않는다.

for i in range(3):
    if i == 2:
        break
    print("Loop", i)
else:
    print("Else block")
->
Loop 0
Loop 1

빈 시퀀스에 대한 루프를 실행하면 else 블록이 바로 실행된다.

for i in []:
    if i == 2:
        break
    print("Loop", i)
else:
    print("Else block")
->
Else block

if/else문과 try/except는 의미에 맞게 동작하지만 반복문은 그렇지 않다.

while 루프의 조건을 False로 설정하면 루프가 실행은 안되지만 else문이 바로 실행된다.

while False:
    print("실행 안됨")
else:
    print("While Else block")
->
While Else block

이런 식으로 동작하는 이유는 루프를 사용해 검색을 수행할 경우이다. 예를 들어 어떤 검색을 통해서 값을 참, 거짓을 판별하는 코드를 짠다고 했을 때 이 코드 참이면 참이라고 알려주는 코드를 보여주고 싶을 때가 있다. 그때 else문을 사용하면 된다.

lst = [s for s in range(2,10,2)]


for i in lst:
    if i%2 != 0:
        print("짝수가 아닙니다.")
        break
else:
    print("짝수입니다.")

하지만 이런 식으로 코드를 작성하는 것보다 도우미 함수를 작성하는 것이 훨씬 좋다. 도우미 함수를 작성하는 2가지 방법이 있다.

✅ else보다 도우미함수를 작성하라

✍🏻 첫번째 방법 - 원하는 조건을 찾자마자 빠르게 함수를 반환하는 방식

def check(lst:list)->bool:
    for i in lst:
        if i % 2 != 0:
            return False
    return True

두번째 방법 - 원하는 대상을 찾으면 결과 변수를 반환하는 방법

def check(lst:list)->bool:
    check_var = True
    for i in lst:
        if i % 2 != 0:
            check_var = False
            break
    return check_var
        

두 접근 방법 모두 코드를 처음 보는 사람에게는 훨씬 더 명확하다.

굳지 else를 사용해서 이해하는데 시간 낭비할 필요는 없다.
파이썬에서 루프와 같은 간단한 구성 요소는 그 자체로 의미가 명확해야 한다.

✍🏻절대로 루프 뒤에 else블록을 사용하지 말아야 한다.

좋은 웹페이지 즐겨찾기