우리 모두는 Python에서 else의 기본 사용법이 조건 제어문에서 if...elif...else...라는 것을 알고 있습니다. 그러나 else에는 두 가지 다른 용도가 있습니다. 하나는 루프의 끝을 위한 것이고, 다른 하나는 오류 처리 시도에 사용됩니다. 이것은 원래 Python의 표준 구문이었지만 대부분의 다른 프로그래밍 언어의 습관과 다르기 때문에 사람들은 의도적으로 또는 의도하지 않게 이러한 사용법을 무시했습니다. 또한 이러한 사용법이 0x00 The Zen of Python의 원칙과 일치하는지, 널리 사용해야 하는지에 대한 논란이 많습니다. 예를 들어, 내가 본 두 권의 책(Effective Python VS Write Idiomatic Python)에서 두 저자는 이에 대해 완전히 다른 태도를 보였습니다.
else in the loop
루프 뒤의 else 문은 루프에 중단이 없을 때, 즉 일반 루프가 완료된 경우에만 실행됩니다. 먼저 삽입 정렬의 예를 살펴보겠습니다.
from random import randrange def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: inserted = False for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] inserted = True break if not inserted: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [8, 12, 12, 34, 38, 68, 72, 78, 84, 90]
이 예에서는 정렬된 _sorted 요소를 i와 하나씩 비교합니다. 정렬된 목록의 모든 요소보다 크면 정렬된 목록의 끝에만 배치할 수 있습니다. 이때 순회 루프가 완료되었는지 또는 중간에 중단되었는지 표시하기 위해 추가 상태 변수를 삽입해야 합니다. 이 경우 이 상태 변수를 else:
def insertion_sort(seq): if len(seq) 1: return seq _sorted = seq[:1] for i in seq[1:]: for j in range(len(_sorted)): if i _sorted[j]: _sorted = [*_sorted[:j], i, *_sorted[j:]] break else: _sorted.append(i) return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)])) [1, 10, 27, 32, 32, 43, 50, 55, 80, 94]정말 멋진 접근 방식인 것 같아요! 그러나 break는 후속 else 문을 트리거할 수 있을 뿐만 아니라 루프가 없을 때도 발생한다는 점에 유의해야 합니다.
while False: print("Will never print!") else: print("Loop failed!") Loop failed!else
try...excess...else...finally 흐름 제어 구문은 가능한 예외를 포착하고 그에 따라 처리하는 데 사용됩니다. Except는 try 문에서 발생하는 오류를 포착하는 데 사용됩니다. 발생하지 않는 오류를 처리합니다. 오류가 발생한 경우 최종적으로 try 문의 "사후 관리"를 담당하고 어쨌든 실행됩니다. 이는 간단한 예를 통해 확인할 수 있습니다.
def pide(x, y): try: result = x / y except ZeropisionError: print("pision by 0!") else: print("result = {}".format(result)) finally: print("pide finished!") pide(5,2) print("*"*20) pide(5,0)
result = 2.5 pide finished! ******************** pision by 0! pide finished!
물론 상태 변수를 사용하여 else를 대체할 수도 있습니다.
def pide(x, y): result = None try: result = x / y except ZeropisionError: print("pision by 0!") if result is not None: print("result = {}".format(result)) print("pide finished!") pide(5,2) print("*"*20) pide(5,0)
result = 2.5 pide finished! ******************** pision by 0! pide finished!
요약
어떤 사람들은 else의 이러한 사용이 명시적이지 않고 반직관적이거나 암시적이며 홍보할 가치가 없다고 생각합니다. 그러나 나는 이 "판단"이 특정 응용 프로그램 시나리오와 Python에 대한 우리의 이해에 달려 있다고 생각합니다. 명시적이기 위해 반드시 초보자에게 친숙한 구문일 필요는 없습니다. 물론, 이 구문을 모든 곳에 사용하는 것은 권장되지 않습니다. for/while...else의 가장 큰 단점은 else가 for/file과 정렬되어야 한다는 것입니다. 여러 수준의 중첩이나 루프가 있으면 매우 불편합니다. 몸체가 너무 깁니다. 다른 용도로 사용하기에 적합합니다. (버니어 캘리퍼스 이야기를 떠올려 보세요. :P) 일부 짧은 루프 제어문에서만 else를 사용하여 일부 성가신 상태 변수를 제거합니다. 이는 가장 Pythonic한 애플리케이션 시나리오입니다.
파이썬의 else에 대한 더 자세한 소개와 관련 글은 PHP 중국어 홈페이지를 주목해주세요!