파이썬 while 문에 Else 절


321

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

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

5
@detly : 대부분의 사람들이이 구성을 피하기 때문입니다. :) Guido가 Py3k 프로세스 중에 언급 한 바에 따르면, 적어도이 else용도로 사용 되는 단어의 선택은 상당히 나쁜 생각이며 더 이상 그렇게하지 않을 것이라고 생각합니다.
Nicholas Knight

5
@Nicholas Knight-그래, 유혹적이지만, 아마도 내가 처음에 이해 한 것일 수도 있습니다. 다른 불쌍한 수액은 언어 사양을 보거나 시간을 거슬러 올라
서서

8
'else'를 선택하는 아이디어는이 구문이 while 루프 내에서 'if X : break'와 함께 자주 사용된다는 것입니다. 루프에서 벗어나지 않으면 'else'절이 실행되므로 'if'에 대해 일종의 소르 타 'else'를 형성합니다.
Jonathan Hartley

12
이름을 바꿔야합니다 after:.
naught101

답변:


388

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()

42
"else 절은 while 조건이 false가 될 때만 실행됩니다." 여기서 문구는 귀하의 while 상태가 true 상태에서 false로 바뀌고 다른 것보다 실행됨을 의미합니다. 그러나 while이 참이 아닌 경우 else 절이 계속 실행됩니다.
user597608 2009

의사는 내가 틀렸다면 그래서 정정 해줘, 그러나 이것은 정확히 동일 while {} something 제외 (가) 것을 something당신이 경우 생략됩니다 breakwhile루프.
Daniel Kaplan

2
가장 정확한 의사 코드는 다음과 같습니다. while (True) {if (cond) {handle_true (); } else {handle_false (); 단절; }}
VinGarcia

2
"통과하지 마십시오, 200을 수집하지 마십시오", 하하, 이것이 어디에서 왔는지 아는 모두 좋은 유년기를 보냈습니다
Stefan Octavian

102

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

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

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

1
실제로 그러한 것에 매우 유용한 구조입니다. found_it=False루프를 시작할 때 몇 번이나했는지 모르고 found_it마지막 에 if 체크를 수행하십시오
Cruncher

42

에 대한 답으로 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사용 되지 않는 한 마지막에 실행 됩니다.

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


1
공감하지는 않았지만 누군가 왜 그랬는지 알 것 같습니다. 당신은 질문에 대답하지 않고 단지 2 줄의 설명으로 14 줄의 코드를 제공합니다. 질문과 관련이 있다면 당신이 우리에게 말하지 않았다고 물었다.
BlueEel

1
의견을 보내 주셔서 감사합니다! 코드에 대한 추가 설명을 추가하고 이것이 질문에 어떻게 대답하는지 명확하게했습니다 (부분적으로 답변하기 때문에).
Mark

코드를 컨텍스트에 넣을 수 있었지만 지금 관련성이있는 모든 질문에 대답하지는 않습니다. 나는 초보자와 초보자에게 유용하기 때문에 귀하의 답변을 찬성했습니다 (파이썬과 관련하여 나 자신처럼). 고마워, 뭔가 배웠어
BlueEel

나는 간단한 응용 프로그램을 좋아합니다. 이제 누군가가 왜 그것을 사용할 수 있는지 알았습니다. 나는 그것을 필요로 본 적이 없지만.
gabe

예 쇼의 사용 을위한 / 다른하지만 문제는 구체적으로는 약이었다 동안 / 다른.
Ian Goldby

20

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

로부터 문서 :

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

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

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

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


15

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

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

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가 실행되지 않기 때문에 차이가 발생하지 않습니다.


4

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

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코드를 이해하기 위해 그것을 읽었고 그 구문은 나에게 훨씬 더 합리적입니다.


3

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

0

else:문은 while 루프가 더 이상 조건을 충족하는 경우에만 (귀하의 예제에서, 때 때 실행되는 n != 0거짓 없음).

결과는 다음과 같습니다.

5
4
3
2
1
what the...

나는 알고 있지만이 종류의 while / else는 Java에서 작동하지 않습니다. 파이썬에서 작동한다는 것을 알았을 때 꽤 흥미 롭습니다. 나는 단지 궁금해서 기술적 이유를 알고 싶었다.
Ivan

6
@Ivan : Java 에서는 작동 하지 않지만 Java에는 존재 하지 않습니다 . 누군가 언어에 추가하기를 원한다면 작동하도록 만들 수 있습니다.
이그나시오 바스케스-아 브람스

1
False : .. else ..는 여전히 else 절을 ​​실행합니다. 말하기 더 정확합니다 : 그렇지 않으면 루프가 중단 된 경우에만 실행되지 않습니다.
Leo Ufimtsev

0

while 루프가 중단되지 않으면 Else가 실행됩니다.

나는 '런너'비유로 생각하고 싶습니다.

"else"는 트랙의 시작 또는 끝에서 시작했는지에 관계없이 결승선을 통과하는 것과 같습니다. "else"는 중간에 어딘가에있을 경우 에만 실행 되지 않습니다 .

runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
    print("Runner at: ", runner_at)
    if runner_at == unlucky_sector:
        print("Runner fell and broke his foot. Will not reach finish.")
        break
    runner_at += 1
else:
    print("Runner has finished the race!") # Not executed if runner broke his foot.

주요 사용 사례는 이것을 중첩 루프에서 분리하거나 루프가 어딘가에서 깨지지 않은 경우에만 문을 실행하려는 경우입니다 (특별한 상황이 아닌 것을 생각하십시오).

예를 들어, 다음은 변수 나 try / catch를 사용하지 않고 내부 루프를 해제하는 방법에 대한 메커니즘입니다.

for i in [1,2,3]:
    for j in ['a', 'unlucky', 'c']:
        print(i, j)
        if j == 'unlucky':
            break
    else: 
        continue  # Only executed if inner loop didn't break.
    break         # This is only reached if inner loop 'breaked' out since continue didn't run. 

print("Finished")
# 1 a
# 1 b
# Finished

-1

파이썬에서 'while : else :'구성을 더 잘 사용하려면 'while'에서 루프가 실행되지 않으면 'else'문이 실행됩니다. 아래 코드를 동일한 결과로 사용할 수 있기 때문에 오늘날의 작동 방식은 의미가 없습니다 ...

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

8
아니요, 차이점은 else루프 사용 break또는 return키워드를 떠나면 블록이 실행되지 않는다는 것 입니다. 귀하의 예에서 print루프가 break명령에 따라 종료 된 경우에도 실행됩니다 .
notsurewhattodo

2
대부분의 사람들이 기능이 실제로 작동하는 방식이 아니라 기능이 작동하기를 원하는 방식을 설명합니다!
dotancohen

-2

사회적 상호 작용에 유용합니다.

while (Date != "January 1st"):
    time.sleep(1)
else:
    print("Happy new year!")

2
그리고 else여기 의 목적은 정확히 무엇 입니까? 코드가 없으면 코드가 정확히 동일합니다.
wovano

break카운트 다운 중에 시계와 달력 을 사용하지 않으면 else"새해 복 많이 받으세요!"라고 말하게됩니다. 말이 안되는 순간.
Guimoute

@Guimote, "시계와 달력 break" 이라면 무엇을 의미 합니까? break코드 에는 없습니다 .
wovano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.