본문 바로가기
Python

for 나 while 루프 뒤에 else 블록을 사용하지 말자

by 코딩하는 미토콘드리아 bioinformatics 2022. 1. 18.
반응형

파이썬에서는 루프나 반복 수행하는 내부 블록 바로 다음에

else 블록을 추가 할 수 있다. 

for i in range(10):
print('Loop', i)
else:
print('Else block!')

[output]

Loop 0
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Else block!

예제처럼 else 블록은 루프가 끝나자마자 실행된다. 

 

if/else 문에서 else 는

'이 블록 앞의 블록이 실행되지 않으면 이 블록을 실행하라' 라는 뜻이다

try/except 문에서 except 도

마찬가지로 '이 블록 앞의 블록을 시도하다가 예외가 발생하면 이 블록을 실행하라' 라는 뜻이다. 

try/finally 문에서도

' 앞의 블록을 실행한 다음에는 이 블록을 실행하라' 라는 뜻이다.

 

이런 방식으로 이해를 했다면, 

for/else의 else 부분의

'루프가 정상적으로 완료되지 않으면 이 블록을 실행하라' 라는

뜻으로 이해하기 쉽다.

하지만 실제 else 블록은 완전히 반대로 동작한다.

실제로 루프 안에서 break 문을 사용하면 else 블록이 실행 되지 않는다. 

 

for i in range(10):
print('Loop', i)
if i == 5:
break
else:
print('Else block!')

[output]

Loop 0
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
 

else 블록이 실행 되는 경우는, 

 

시퀸스에 대한 루프를 실행 하는 경우

for x in [ ]:
print('실행되지 않음')
else:
print('For Else block!')
[output]
For Else block!
 

while 루프 조건이 처음부터 false 인 경우

while False:
print('실행되지 않음')
else:
print('For Else block!')
[output]
For Else block!
 

이런 식으로 동작하는 이유는 루프를 사용해 검색을 수행할 경우이다.

루프 바로 뒤에 있는 else 블록이 그와 같이 동작해야 유용하기 때문이다.

 

예제로 알아보자.

두 수가 서로소( 두 수의 공약수가 1밖에 없음) 인지 알아보고 싶다고 하자.

이런 경우 공약수 일 가능성이 있는 모든 수를 이터레이션하면서 두 수를 나눌수 있는지 검사해야한다. 

모든 가능성을 검사하고 나면 루프가 끝난다. 루프가 break를 만나지 않으면 두 수가 서로소이므로

else 블록이 실행된다.

a = 4
b = 9
for i in range(2, min(a, b) + 1):
print('검사중', i)
if a % i == 0 and b % i == 0:
print('서로소 아님')
break
else:
print('서로소')
 

[output]

검사중 2
검사중 3
검사중 4
서로소
 

하지만 이보다도

도우미 함수들을 사용하는것이 추천한다.

 

첫번째 방법은,

원하는 조건을 찾자마자 빠르게 함수를 반환하는 방식이다.

def coprime(a,b):
for i in range(2, min(a,b) + 1):
if a % i == 0 and b % i == 0:
return False
return True
assert coprime(4 ,9)
assert not coprime(3, 6)

두번째 방법은,

루프 안에서 원하는 대상을 찾았는지 나타내는 결과 변수를 도입하는 것이다.

def coprime_alternate(a,b):
is_coprime = True
for i in range(2, min(a,b) + 1):
if a % i == 0 and b % i == 0:
is_coprime = False
break
return is_coprime
 
assert coprime(4 ,9)
assert not coprime(3, 6)
 

이러한 방법이 코드의 가독성에 훨씬 도움이 된다.

결론 : 루프 뒤에 else 블록을 사용하지 말자. 

reference

1.https://thebook.io/080235/ch01/09/

 

파이썬 코딩의 기술 - 개정 2판: BETTER WAY 9 for나 while 루프 뒤에 else 블록을 사용하지 말라

 

thebook.io

2. 파이썬 코딩의 기술

반응형

'Python' 카테고리의 다른 글

Python programming for Bioinformatics - 연습문제 1  (0) 2023.07.24
Pandas DataFrame 첫번째 행을 헤더로 지정  (0) 2022.03.11
range 보다는 enumerate 를 사용하자  (0) 2022.01.17
Numpy.transpose  (0) 2022.01.10
Numpy.dot  (0) 2022.01.10