파이썬은 루프가 반복 수행하는 내부 블록 바로 다음에 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가지 방법이 있다.
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블록을 사용하지 말아야 한다.