[파이썬에서 살아남는법 제 8장] for나 while 루프 뒤에 else 블록을 사용하지 말라
2023. 1. 17. 18:17ㆍDL 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 를 절대 쓰지 말기를 바란다.
'DL Study' 카테고리의 다른 글
[파이썬에서 살아남는법 제 9장] 대입식을 사용해 반복을 피하라 (0) | 2023.01.18 |
---|---|
[밑바닥 부터 시작하는 딥러닝] 5장 Backpropagation (0) | 2023.01.18 |
[파이썬에서 살아남는법 제 7장] 여러 이터레이터에 대해 나란히 루프를 수행하려면 zip 을 사용하라 (0) | 2023.01.17 |
[밑바닥 부터 시작하는 딥러닝] 4장 신경망 학습 (1) | 2023.01.16 |
[파이썬에서 살아남는법 제 6장] range 보다는 enumerate 를 사용하라 (0) | 2023.01.12 |