[Python] Skill of coding - loop문 뒤 else쓰지않기

Hyeseong·2020년 12월 9일
0

python skill of coding

목록 보기
4/18

for와 while 루프 뒤에는 else 블록을 쓰지말자.

루프에서 반복되는 내부 블록 다음에 else 블록을 둘 수 있다.

for i in range(3):
    print('loop %d' %i)
else:
    print('end block!')
loop 0
loop 1
loop 2
end block!

else블럭은 루프가 끝나면 실행된다. 왜? else라고 부를까? and라고 안하고? if/else처럼 else 이전 블록이 실행되지 않으면 이 블록을 싱핸되다는 의미인데.. try/except문에서 except도 마찬가지이고. 비슷하게 try/except/else의 else도 이전 블럭이 실패하면 실행하라'는 뜻이다.
try/finally도 이전 블록을 실행하고 항상 마지막에 실행하라'는 의미이므로 이해가 잘됨

루프에 break문을 사용해야 else블록을 건너뜀.

for i in range(3):
    print('Loop %d' % 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!
else블록은 while 루프가 처음부터 거짓인 경우에도 실행되요.

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

이렇게 동작하는 이유는 루프 다음에 오는 else블록은 루프로 뭔가를 검색 할때 유용하기 때문이에요. 예를들어 두 숫자가 서로소인지를 판별한다고 할게요. 이제 가능한 모든 공약수를 구하고 숫자를 테스트 합니다. 모든 옵션을 시도한 후에 루프가 끝나요. else 블록은 루프가 break를 만나지 않아서 숫자가 서로소일때 실행되요ㅣ

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('Not coprime')
        break
else:
    print('Coprime')
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
print(coprime(4, 9))
print(coprime(3, 6))
True
False

두 번쨰 방법은 루프에서 찾으려는 대상을 찾았는지 알려주는 결과 변수를 사용하는 것이에요. 뭔가를 찾았으면 즉시 break로 루프를 중단해요.

def coprime2(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
print(coprime2(4, 9))
print(coprime2(3, 6))
True
False

이 두가지 방법을 적용하면서 낯선 코드를 접하는 개발자들이 코드를 훨씬 시ㅜㅂ게 이해할 수 있다. else 블럭을 사용한 표현의 장점이 나중에 여러분 자신을 비롯해 코드를 이해하려는 사람들이 받을 부담감보다는 크지 않아요. 루프처럼 간단한 구조는 파이썬에서 따로 설명할 필요가 없어야 합니다. 그러므로 루프 다음에 오는 else는 절대로 쓰지 마세요.

핵심정리

  • for, while 내부 블록 바로 뒤에 else블럭을 사용할수 있음
  • else 쓰지말자. 루프에서는
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글