414 Stimmen

Else-Klausel in der Python-Anweisung while

Ich habe festgestellt, dass der folgende Code in Python legal ist. Meine Frage ist, warum? Gibt es einen bestimmten Grund?

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

487voto

ars Punkte 112843

Die else Klausel wird nur ausgeführt, wenn Ihr while Bedingung falsch wird. Wenn Sie break aus der Schleife heraus, oder wenn eine Ausnahme ausgelöst wird, wird sie nicht ausgeführt.

Eine Möglichkeit, sich das vorzustellen, ist eine if/else-Konstruktion in Bezug auf die Bedingung:

if condition:
    handle_true()
else:
    handle_false()

ist analog zu dem Schleifenkonstrukt:

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

Ein Beispiel könnte in etwa so lauten:

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

145voto

John Kugelman Punkte 327535

Die else Klausel wird ausgeführt, wenn Sie einen Block normal verlassen, indem Sie auf die Schleifenbedingung treffen oder am Ende eines Try-Blocks abfallen. Sie ist pas ausgeführt, wenn Sie break o return aus einem Block heraus, oder eine Ausnahme auslösen. Dies gilt nicht nur für while- und for-Schleifen, sondern auch für try-Blöcke.

Man findet sie in der Regel an Stellen, an denen man normalerweise eine Schleife vorzeitig verlassen würde, und das Auslaufen aus dem Ende der Schleife ist ein unerwartetes/ungewöhnliches Ereignis. Zum Beispiel, wenn Sie in einer Schleife eine Liste nach einem Wert durchsuchen:

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

43voto

Mark Punkte 16672

In Antwort auf Is there a specific reason? Hier ist eine interessante Anwendung: Ausbrechen aus mehreren Ebenen der Schleifenbildung.

So funktioniert es: Die äußere Schleife hat eine Pause am Ende, wird also nur einmal ausgeführt. Wenn die innere Schleife jedoch abgeschlossen ist (keinen Divisor findet), gelangt sie zur else-Anweisung und die äußere Pause wird nie erreicht. Auf diese Weise führt ein Abbruch in der inneren Schleife zum Abbruch beider Schleifen und nicht nur einer Schleife.

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!'

Für beide while y for Schleifen, die else Anweisung wird am Ende ausgeführt, es sei denn break verwendet wurde.

In den meisten Fällen gibt es bessere Möglichkeiten, dies zu tun (Einbindung in eine Funktion oder Auslösen einer Ausnahme), aber dies funktioniert!

30voto

Mark Rushakoff Punkte 236626

Die else-Klausel wird ausgeführt, wenn die while-Bedingung zu false ausgewertet wird.

Von der Dokumentation :

Die while-Anweisung wird zur wiederholten Ausführung verwendet, solange ein Ausdruck wahr ist:

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

Dies testet den Ausdruck wiederholt und führt, wenn er wahr ist, die erste Suite aus; wenn der Ausdruck falsch ist (was das erste Mal sein kann, dass er getestet wird), wird die Suite der else Klausel, falls vorhanden, ausgeführt und die Schleife wird beendet.

A break Anweisung, die in der ersten Suite ausgeführt wird, beendet die Schleife, ohne die else die Suite der Klausel. A continue Anweisung, die in der ersten Suite ausgeführt wird, überspringt den Rest der Suite und kehrt zum Testen des Ausdrucks zurück.

25voto

Saif Punkte 1364

Die else-Klausel wird nur ausgeführt, wenn die while-Bedingung falsch wird.

Hier sind einige Beispiele:

Beispiel 1: Zu Beginn ist die Bedingung falsch, also else-Klausel ausgeführt wird.

i = 99999999

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

OUTPUT:

this

Beispiel 2: Die while-Bedingung i < 5 nie falsch wurde, weil i == 3 unterbricht die Schleife, so dass else-Klausel wurde nicht ausgeführt.

i = 0

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

OUTPUT:

0
1
2
3

Beispiel 3: Die while-Bedingung i < 5 falsch wurde, als i war 5 Así que else-Klausel ausgeführt wurde.

i = 0

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

OUTPUT:

0
1
2
3
4
this

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X