많은 파이썬 프로그래머는 아마도 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
. 제어를 가로채는 명령문 for
은 else
블록을 무시합니다.
의 항목을 검색 할 때 일반적인 유스 케이스가 발견되며 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
/ else
를 if
거짓으로 평가할 때까지 실제 상태를 계속 유지하는 것으로 생각할 수 있습니다 . A break
는 그것을 바꾸지 않습니다. 그것은 평가없이 포함 루프 밖으로 뛰어납니다. 는 else
경우에만 실행 평가if
/ while
조건 것은 거짓입니다.
는 for
그 거짓 조건이 반복자를 배출 것을 제외하고, 유사합니다.
continue
및 break
실행하지 않습니다 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])
이 경우 else
for 루프의 else
명령문은 elif
s 체인의 명령문 과 동일하게 작동 하며 True로 평가되기 전에 조건이없는 경우에만 실행됩니다. (또는 return
예외 와 함께 또는 실행을 중단 ) 내 루프 가이 사양에 맞지 않으면 for: else
이 질문을 게시 한 정확한 이유로 사용하지 않기로 선택합니다 . 직관적이지 않습니다.