파이썬 루프의 ‘else’절을 어떻게 이해할 수 있습니까? 난 그냥 때문이 알고 그것을보고

많은 파이썬 프로그래머는 아마도 while루프와 for루프 의 구문에 선택적 else:절이 포함되어 있다는 것을 인식하지 못합니다 .

for val in iterable:
    do_something(val)
else:
    clean_up()

else절의 본문은 특정 종류의 정리 작업에 적합한 위치이며 루프가 정상적으로 종료 될 때 실행됩니다. 즉, 절 과 함께 루프를 종료 return하거나 절을 break건너 뜁니다 else. continue실행 후 종료 합니다. 난 그냥 때문이 알고 그것을보고 내가 기억하지 못할 수 있기 때문에, (다시 한번) else 절이 실행됩니다.

항상? 이름에서 알 수 있듯이 루프의 “실패”? 정기적으로 해지됩니까? return?로 루프를 종료하더라도 나는 그것을 보지 않고 완전히 확신 할 수 없습니다.

나는 키워드의 선택에 대한 나의 지속적인 불확실성을 비난한다 else. 내 질문은 “이 키워드가 왜 이런 목적으로 사용 되었는가”(답과 의견을 읽은 후에 만 ​​투표 할 수 있음 )가 아니라 키워드의 의미가 이해되도록 키워드 에 대해 어떻게 생각할 수 else있습니까? 그러므로 기억할 수 있습니까?

나는 이것에 대해 상당한 양의 논의가 있었을 것이라고 확신하며, try성명서의 else:조항 (또한 조회해야 함)과 일관성을 유지하기 위해 선택되었으며 파이썬의 예약어. 아마도 선택의 이유는 else그 기능을 명확히하고 더 기억에 남을 것이지만, 나는 역사적 설명 자체가 아니라 이름을 기능에 연결 한 후입니다.

에 대한 답변 이 질문에 내 질문에 간단히의 중복으로 폐쇄했다, 흥미로운 다시 이야기를 많이 포함되어 있습니다. 내 질문은 다른 초점 ( else키워드 선택과 특정 의미를 연결하는 방법 )이 있지만 어딘가에이 질문에 대한 링크가 있어야한다고 생각합니다.



답변

(@Mark Tolonen의 답변에서 영감을 얻었습니다.)

if문은 실행 else의 조건이 false로 평가되면 절을. 동일하게하는 while루프는 false로 상태 평가 될 경우 다른 절을 실행합니다.

이 규칙은 설명 된 동작과 일치합니다.

  • 정상 실행에서 while 루프는 조건이 false로 평가 될 때까지 반복적으로 실행되므로 자연스럽게 루프를 종료하면 else 절이 실행됩니다.
  • break명령문 을 실행할 때 조건을 평가하지 않고 루프를 종료하므로 조건이 false로 평가 될 수 없으며 else 절을 ​​실행하지 않습니다.
  • continue명령문 을 실행할 때 조건을 다시 평가하고 루프 반복이 시작될 때 정상적으로 수행하는 작업을 정확하게 수행합니다. 따라서 조건이 true이면 루프를 계속 유지하지만 false이면 else 절을 ​​실행합니다.
  • 와 같은 루프를 종료하는 다른 방법은 return조건을 평가하지 않으므로 else 절을 ​​실행하지 마십시오.

for루프는 같은 방식으로 동작합니다. 반복자에 더 많은 요소가 있으면 조건을 true로, 그렇지 않으면 false를 고려하십시오.


답변

이 방법으로 생각하는 것이 좋습니다. 모든 블록 이 이전 블록 에서 올바르게 진행 되어 완전히 소진 되면 else블록이 항상 실행됩니다 .for

오른쪽 이 맥락에서 어떤 의미하는 것 exception아니, break아니, return. 제어를 가로채는 명령문 forelse블록을 무시합니다.


의 항목을 검색 할 때 일반적인 유스 케이스가 발견되며 iterable, 항목을 찾거나 "not found"다음 else블록을 통해 플래그를 올리거나 인쇄 하는 검색이 호출됩니다 .

for items in basket:
    if isinstance(item, Egg):
        break
else:
    print("No eggs in basket")  

A continue는의 제어를 가로 채지 for않으므로 제어가 else종료 된 후로 진행됩니다 for.


답변

언제 if실행 else합니까? 조건이 거짓 인 경우. while/ 와 동일합니다 else. 따라서 while/ elseif거짓으로 평가할 때까지 실제 상태를 계속 유지하는 것으로 생각할 수 있습니다 . A break는 그것을 바꾸지 않습니다. 그것은 평가없이 포함 루프 밖으로 뛰어납니다. 는 else경우에만 실행 평가if / while조건 것은 거짓입니다.

for그 거짓 조건이 반복자를 배출 것을 제외하고, 유사합니다.

continuebreak실행하지 않습니다 else. 그것은 그들의 기능이 아닙니다. 을 break포함하는 루프를 종료합니다. 가 continue루프 상태가 평가된다 함유 루프의 상부로 돌아 간다. 실행 되고 다른 방법 이없는 것은 if/ while를 거짓 으로 평가 하거나 for더 이상 항목이없는 행위입니다 else.


답변

이것이 본질적으로 의미하는 바입니다.

for/while ...:
    if ...:
        break
if there was a break:
    pass
else:
    ...

이 일반적인 패턴을 작성하는 것이 더 좋습니다.

found = False
for/while ...:
    if ...:
        found = True
        break
if not found:
    ...

else절은이 경우 실행되지 않습니다 return때문에 return이에 의미로, 잎 기능. 당신이 생각할 수있는 유일한 예외는 finally의 목적이며 항상 실행되도록하는 것입니다.

continue이 문제와 관련이 없습니다. 루프의 현재 반복이 종료되어 전체 루프가 종료 될 수 있으며,이 경우 루프가로 끝나지 않았습니다 break.

try/else 유사하다:

try:
    ...
except:
    ...
if there was an exception:
    pass
else:
    ...


답변

루프를 이와 비슷한 구조 (의사 코드)로 생각하면 :

loop:
if condition then

   ... //execute body
   goto loop
else
   ...

좀 더 이해가 될 수 있습니다. 루프는 본질적으로 if조건이 될 때까지 반복 되는 명령문입니다 false. 그리고 이것이 중요한 포인트입니다. 루프는 상태를 확인하고 그것이 상태임을 확인 false하여 else(보통과 마찬가지로)if/else 한 다음 루프가 완료됩니다.

따라서 else 조건이 확인되면 유일한 get이 실행됩니다 . 즉 , 예를 들어 a return또는 a 로 실행 도중 루프 본문을 종료 break하면 조건이 다시 확인되지 않으므로else 되지 않으므로 사례가 실행되지 않습니다.

반면 continue에 A 는 현재 실행을 중지 한 다음 루프 상태를 다시 확인하기 위해 다시 점프하므로이 else시나리오에서 도달 할 수 있습니다.


답변

루프의 나의 잡았다 순간 else내가 의한 이야기보고 때 절이었다 레이몬드 Hettinger 그는이 호출되어 있어야합니다 생각하는 방법에 대한 이야기를 말했다 nobreak. 다음 코드를 살펴보십시오. 어떻게 할 것이라고 생각하십니까?

for i in range(10):
    if test(i):
        break
    # ... work with i
nobreak:
    print('Loop completed')

당신은 무엇을 추측합니까? 글에서 루프에 부딪치지 않은 nobreak경우에만 실행되는 부분입니다 break.


답변

일반적으로 다음과 같은 루프 구조를 생각하는 경향이 있습니다.

for item in my_sequence:
    if logic(item):
        do_something(item)
        break

변수 개수가 많은 if/elif문장 과 비슷하려면 :

if logic(my_seq[0]):
    do_something(my_seq[0])
elif logic(my_seq[1]):
    do_something(my_seq[1])
elif logic(my_seq[2]):
    do_something(my_seq[2])
....
elif logic(my_seq[-1]):
    do_something(my_seq[-1])

이 경우 elsefor 루프의 else명령문은 elifs 체인의 명령문 과 동일하게 작동 하며 True로 평가되기 전에 조건이없는 경우에만 실행됩니다. (또는 return예외 와 함께 또는 실행을 중단 ) 내 루프 가이 사양에 맞지 않으면 for: else이 질문을 게시 한 정확한 이유로 사용하지 않기로 선택합니다 . 직관적이지 않습니다.