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..."
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..."
else
für diese Verwendung eine bemerkenswert schlechte Idee war und dass sie nicht mehr davon machen würden.after:
.Antworten:
Die
else
Klausel wird nur ausgeführt, wenn Ihrewhile
Bedingung falsch wird. Wenn Siebreak
die Schleife verlassen oder eine Ausnahme ausgelöst wird, wird sie nicht ausgeführt.Eine Möglichkeit, darüber nachzudenken, ist ein if / else-Konstrukt in Bezug auf die Bedingung:
ist analog zum Schleifenkonstrukt:
Ein Beispiel könnte sein wie folgt:
quelle
while {} something
außer dass dassomething
übersprungen wird, wenn Siebreak
in derwhile
Schleife sind.Die
else
Klausel wird ausgeführt, wenn Sie einen Block normal verlassen, indem Sie die Schleifenbedingung treffen oder vom Boden eines try-Blocks fallen. Es wird nicht ausgeführt, wenn Siebreak
oderreturn
außerhalb eines Blocks oder eine Ausnahme auslösen. Es funktioniert nicht nur für while- und for-Schleifen, sondern auch für Try-Blöcke.Sie finden es normalerweise an Stellen, an denen Sie normalerweise eine Schleife vorzeitig verlassen, und das Ablaufen am Ende der Schleife ist eine unerwartete / ungewöhnliche Gelegenheit. Wenn Sie beispielsweise eine Liste durchlaufen und nach einem Wert suchen:
quelle
found_it=False
am Anfang einer Schleife gesetzt habe und dannfound_it
am Ende einen If-Check durchführeAls Antwort auf
Is there a specific reason?
hier ist eine interessante Anwendung: Ausbrechen mehrerer Schleifenebenen.So funktioniert es: Die äußere Schleife hat am Ende eine Unterbrechung, sodass sie nur einmal ausgeführt wird. Wenn die innere Schleife jedoch abgeschlossen ist (keinen Divisor findet), erreicht sie die else-Anweisung und die äußere Unterbrechung wird nie erreicht. Auf diese Weise bricht ein Bruch in der inneren Schleife aus beiden Schleifen heraus und nicht nur aus einer.
Für beide
while
undfor
Schleifen wird dieelse
Anweisung am Ende ausgeführt, sofernbreak
sie nicht verwendet wurde.In den meisten Fällen gibt es bessere Möglichkeiten, dies zu tun (in eine Funktion einbinden oder eine Ausnahme auslösen), aber das funktioniert!
quelle
Die else-Klausel wird ausgeführt, wenn die while-Bedingung false ergibt.
Aus der Dokumentation :
quelle
Meine Antwort wird sich darauf konzentrieren, WANN wir while / for-else verwenden können.
Auf den ersten Blick scheint es bei der Verwendung keinen Unterschied zu geben
und
Weil die
print 'ELSE'
Anweisung in beiden Fällen immer ausgeführt zu sein scheint (sowohl wenn diewhile
Schleife beendet ist als auch nicht).Dann ist es nur anders, wenn die Anweisung
print 'ELSE'
nicht ausgeführt wird. Es ist, wenn sichbreak
innerhalb des Codeblocks ein befindetwhile
Wenn abweichend von:
return
ist nicht in dieser Kategorie, da es in zwei oben genannten Fällen den gleichen Effekt hat.Ausnahmeerhöhung verursacht auch keinen Unterschied, da beim Auslösen, wo der nächste Code ausgeführt wird, der Ausnahmebehandlungsroutine (außer Block), der Code in
else
Klausel oder direkt nach derwhile
Klausel nicht ausgeführt wird.quelle
Ich weiß, das ist eine alte Frage, aber ...
Wie Raymond Hettinger sagte, sollte es statt genannt
while/no_break
werdenwhile/else
.Ich finde es leicht zu verstehen, wenn Sie sich diesen Ausschnitt ansehen.
Anstatt jetzt die Bedingung nach der while-Schleife zu überprüfen, können wir sie austauschen
else
und diese Prüfung loswerden.Ich habe es immer als gelesen
while/no_break
, um den Code zu verstehen, und diese Syntax ist für mich viel sinnvoller.quelle
Die else-Klausel wird nur ausgeführt, wenn die while-Bedingung erfüllt ist falsch wird.
Hier sind einige Beispiele:
Beispiel 1: Anfangs ist die Bedingung falsch, daher wird die else-Klausel ausgeführt.
AUSGABE:
Beispiel 2: Die while-Bedingung wurde
i < 5
nie falsch, dai == 3
die Schleife unterbrochen wird und die else-Klausel nicht ausgeführt wurde.AUSGABE:
Beispiel 3: Die while-Bedingung
i < 5
wurde falsch, als wasi
war5
, also wurde die else-Klausel ausgeführt.AUSGABE:
quelle
Die
else:
Anweisung wird nur dann ausgeführt, wenn die while-Schleife ihre Bedingung nicht mehr erfüllt (in Ihrem Beispiel, wenn sien != 0
falsch ist).Die Ausgabe wäre also:
quelle
Andernfalls wird ausgeführt, wenn die while-Schleife nicht unterbrochen wurde.
Ich denke gerne mit einer "Läufer" -Metapher darüber nach.
Das "Sonst" ist wie das Überqueren der Ziellinie, unabhängig davon, ob Sie am Anfang oder am Ende der Strecke begonnen haben. "else" wird nur nicht ausgeführt, wenn Sie irgendwo dazwischen brechen.
Hauptanwendungsfälle sind das Ausbrechen verschachtelter Schleifen oder wenn Sie einige Anweisungen nur ausführen möchten, wenn die Schleife nicht irgendwo unterbrochen wurde (denken Sie daran, dass das Unterbrechen eine ungewöhnliche Situation ist).
Im Folgenden finden Sie beispielsweise einen Mechanismus zum Ausbrechen einer inneren Schleife ohne Verwendung von Variablen oder Try / Catch:
quelle
Die bessere Verwendung der Konstruktion 'while: else:' in Python sollte sein, wenn in 'while' keine Schleife ausgeführt wird, wird die Anweisung 'else' ausgeführt. Die heutige Funktionsweise macht keinen Sinn, da Sie den folgenden Code mit denselben Ergebnissen verwenden können ...
quelle
else
Block nicht ausgeführt wird, wenn Sie die Schleife mit dem Schlüsselwortbreak
oder verlassenreturn
. In Ihrem Beispielprint
wird auch ausgeführt, wenn die Schleife aufbreak
Befehl beendet wurde.Es ist nützlich für die soziale Interaktion.
quelle
else
Hier? Der Code macht genau das gleiche ohne ihn.break
während Ihres Countdowns nicht verwendetelse
werden, sagen Sie "Frohes neues Jahr!" sofort, was keinen Sinn ergibt.break
"?break
Der Code enthält keine .