[python] 파이썬 while 문에 Else 절

다음 코드는 Python에서 합법적이라는 것을 알았습니다. 내 질문은 왜? 특별한 이유가 있습니까?

n = 5
while n != 0:
    print n
    n -= 1
else:
    print "what the..."



답변

else귀하의 경우 절은 실행 while조건이 거짓이된다. break루프 를 벗어나거나 예외가 발생하면 실행되지 않습니다.

그것을 생각하는 한 가지 방법은 조건과 관련하여 if / else 구조입니다.

if condition:
    handle_true()
else:
    handle_false()

루핑 구조와 유사합니다.

while condition:
    handle_true()
else:
    # condition is false now, handle and go on with the rest of the program
    handle_false()

예를 들면 다음과 같습니다.

while value < threshold:
    if not process_acceptable_value(value):
        # something went wrong, exit the loop; don't pass go, don't collect 200
        break
    value = update(value)
else:
    # value >= threshold; pass go, collect 200
    handle_threshold_reached()


답변

else당신이 try 블록의 바닥을 루프 조건을 누르거나 떨어지는으로, 일반적으로 블록을 종료하면 절은 실행됩니다. 그것은되어 있지 당신이 경우 실행 break또는 return블록의 아웃, 또는 예외를 발생. while 및 for 루프뿐만 아니라 블록도 시도합니다.

일반적으로 일반적으로 루프를 일찍 종료하는 장소에서 찾을 수 있으며 루프 끝에서 벗어나는 것은 예기치 않은 / 특별하지 않은 경우입니다. 예를 들어 값을 찾는 목록을 반복하는 경우 :

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("


답변

에 대한 답으로 Is there a specific reason?, 여기에 하나의 흥미로운 어플리케이션이 있습니다 : 여러 레벨의 루핑에서 벗어나기.

작동 방식은 다음과 같습니다. 외부 루프는 끝에 중단이 있으므로 한 번만 실행됩니다. 그러나 내부 루프가 완료되면 (제수를 찾지 않음) else 문에 도달하고 외부 중단에 도달하지 않습니다. 이런 식으로 내부 루프가 끊어지면 하나의 루프가 아니라 두 루프에서 모두 분리됩니다.

for k in [2, 3, 5, 7, 11, 13, 17, 25]:
    for m in range(2, 10):
        if k == m:
            continue
        print 'trying %s %% %s' % (k, m)
        if k % m == 0:
            print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
            break
    else:
        continue
    print 'breaking another level of loop'
    break
else:
    print 'no divisor could be found!'

whilefor루프 모두 에 대해 else명령문이 break사용 되지 않는 한 마지막에 실행 됩니다.

대부분의 경우이 작업을 수행하는 더 좋은 방법이 있지만 (기능에 래핑하거나 예외를 발생시키는) 작동합니다!


답변

else-clause는 while 조건이 false로 평가 될 때 실행됩니다.

로부터 문서 :

while 문은 표현식이 참인 한 반복 실행에 사용됩니다.

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

이것은 반복적으로 표현식을 테스트하고, 참이면 첫 번째 스위트를 실행합니다. 표현식이 false 인 경우 (처음 테스트 될 수 있음) else절의 스위트가 있으면 실행되고 루프가 종료됩니다.

break최초의 제품군에서 실행 문은 실행하지 않고 루프를 종료 else조항의 스위트 룸. continue최초의 제품군에서 실행 문은 제품군의 나머지 부분을 건너 뛰고 식을 테스트로 돌아갑니다.


답변

저의 대답은 우리가 언제 / 어떻게 사용할 수 있는지에 초점을 맞출 것입니다.

언뜻보기에, 사용할 때 아무런 차이가없는 것 같습니다

while CONDITION:
    EXPRESSIONS
print 'ELSE'
print 'The next statement'

while CONDITION:
    EXPRESSIONS
else:
    print 'ELSE'
print 'The next statement'

print 'ELSE'명령문이 항상 두 경우 모두 실행되는 것처럼 보이기 때문에 ( while루프가 완료되거나 실행되지 않은 경우).

그러면 명령문 print 'ELSE'이 실행되지 않을 때만 다릅니다 . break코드 블록 안에 내부 가있을 때입니다.while

In [17]: i = 0

In [18]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
else:
    print 'ELSE'
print 'The next statement'
   ....:
0
1
2
The next statement

다른 경우 :

In [19]: i = 0

In [20]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
print 'ELSE'
print 'The next statement'
   ....:
0
1
2
ELSE
The next statement

return 위의 두 경우에 대해 동일한 효과를 나타 내기 때문에이 범주에 속하지 않습니다.

예외 발생은 다음 코드가 실행될 위치에서 예외 처리기 (블록 제외)에있을 때 else절에서 또는 절 바로 뒤의 코드 while가 실행되지 않기 때문에 차이가 발생하지 않습니다.


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 …

Raymond Hettinger가 말했듯이 while/no_break대신 대신 호출해야합니다 while/else.
이 스 니펫을 보면 이해하기 쉽다는 것을 알았습니다.

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
if n == 0:
    print n

이제 while 루프 후 상태를 확인하는 대신이를 교체하고 else해당 확인을 제거 할 수 있습니다 .

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
else:  # read it as "no_break"
    print n

나는 항상 while/no_break코드를 이해하기 위해 그것을 읽었고 그 구문은 나에게 훨씬 더 합리적입니다.


답변

else 절은 while 조건 이 false가 될 때만 실행됩니다 .

여기 몇 가지 예가 있어요.

예 1 : 처음에 조건이 false이므로 else-clause 가 실행됩니다.

i = 99999999

while i < 5:
    print(i)
    i += 1
else:
    print('this')

산출:

this

예 2 : 동안 조건이 i < 5 있기 때문에 거짓이되었다 결코 i == 3루프, 그래서 휴식 다른 절은 실행되지 않았습니다.

i = 0

while i < 5:
    print(i)
    if i == 3:
        break
    i += 1
else:
    print('this')

산출:

0
1
2
3

예 3 : 동안 조건이 i < 5 때 거짓되었다 i이었다가 5, 그래서 다른 절은 실행되었다.

i = 0

while i < 5:
    print(i)
    i += 1
else:
    print('this')

산출:

0
1
2
3
4
this