Batter way09

매일 공부(ML)·2022년 2월 4일
0

for나 while루프 뒤에 else블록 사용 말기

  • 다른 프로그래밍 언어와 달리 파이썬은 루프가 반복 수행하는 내부 블록 다음에 else추가 가능

  • 장점은 처리할 예외가 없는 경우 이 블록을 실행하라는 의미를 갖고 있기에 루프가 끝나고 실행이 가능하다

for i in range(3):
    print('Loop', i)
else:
    print('Else block!')
    
#결과

Loop 0
Loop 1
Loop 2
Else block!
  • 루프 안에서 break 사용 시 else 블록 실행 안됨
for i in range(3):
    print('Loop', i)
    if == 1:
        break
else:
    print('Else block!')
    
# 결과
Loop 0
Loop 1
  • 빈 시퀀스에 대해 루프 실행 시 else 블록이 바로 실행
for x in []:
    print('이 줄은 실행되지 않음')
else:
    print('For Else block!')
    
# For Else block!
  • While 루프의 조건이 처음부터 False인 경우 else블록이 바로 실행
while False:
    print('이 줄은 실행되지 않음')
else:
    print('While Else block!')
    
#While Else block!
  • 루프를 사용해서 검색을 수행할 경우 루프 바로 뒤에 있는 else블록이 유용합니다.

예를 들어, 두 수가 서로소인지 알아보려고 할 때, 공약수일 가능성인 모든 수를 이터레이션 하면서 두 수룰 나눌 가능성이 있는지에 대해서 검사하면 됩니다.

모든 가능성을 검사 후 루프가 끝나는데, 루프가 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('서로소')
     
#결과

검사 중 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)

두 번째: 루프 안에서 원하는 대상을 찾았는지 나타내는 결과 변수를 도입

  • 원하는 대상을 찾자마자 break로 루프 빠져나오기
def  coprime(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)

정리

  • 파이썬은 for나 while루프에 속한 블록 바로 뒤에 else블록을 허용하는 특별 문법 제공

  • 루프 뒤에 오는 else 블록은 루프가 반복되는 도중에 break를 만나지 않은 경우에만 실행

  • 동작이 직관적이지 않고 혼동을 이야기하므로 루프 뒤에 else블록 사용 말기

profile
성장을 도울 아카이빙 블로그

0개의 댓글