[파이썬에서 살아남는법 제 8장] for나 while 루프 뒤에 else 블록을 사용하지 말라

2023. 1. 17. 18:17DL Study

※본 내용은 파이썬의 코딩 기술 (개정 2판)을 바탕으로 작성 했습니다.

 

 

파이썬은 다른 언어와는 다르게 루프가 반복 수행하는 블록 바로 다음에 else블록을 추가 할수 있다.

for i in range(3):
	print('Loop', i)
else:
	print('Else block!')
>>>
Loop 0
Loop 1
Loop 2
Else block!

여기서 else 는 여러분이 알다 싶이 앞의 블록이 실행 안되면 이걸 실행해라 이다. 

다른 예시로 except / else / finally 등이 있다. 

일방적으로 for/else 는 "루프가 정상적으로 완료되지 않으면 이 블록을 실행하라"

로 알고 있지만 실제는 다르다.  for 문 안에 break 를 넣으면 else 가 안되기 때문이다.

 

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

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

for x in []:
	print('Never runs')
else:
	print('For Else block!')
>>>
For Else block!

while 루프도 그렇다. 

while False:
	print('Never runs')
else:
	print('While Else block!')
>>>
While Else block!

이런 이유는 루프를 사용해 검색을 수행할 경우, 루프 바로 뒤에 있는 else 블록이 그와 같이 동작해야 유용하기 때문이다. 

예를들어 두수가 서로소 인지 알아 보고자 한다. 

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

너무 가시성이 안좋아서 함수를 정의 해서 풀어본다. 

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_alternate(4, 9)
assert not coprime_alternate(3, 6)

두개의 코드다 명확히 코드가 보인다. 

else 를 쓰는것 보다 더욱 만족감을 줄수 있음으로 루프함수뒤에는 else 를 절대 쓰지 말기를 바란다.