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..."
after:
.
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..."
after:
.
Antworten:
Die else
Klausel wird nur ausgeführt, wenn Ihre while
Bedingung falsch wird. Wenn Sie break
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:
if condition:
handle_true()
else:
handle_false()
ist analog zum 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 sein wie folgt:
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()
while {} something
außer dass das something
übersprungen wird, wenn Sie break
in der while
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 Sie break
oder return
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:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
am Anfang einer Schleife gesetzt habe und dann found_it
am Ende einen If-Check durchführe
Als 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.
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
und for
Schleifen wird die else
Anweisung am Ende ausgeführt, sofern break
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!
Die else-Klausel wird ausgeführt, wenn die while-Bedingung false ergibt.
Aus der Dokumentation :
Die while-Anweisung wird für die wiederholte Ausführung verwendet, solange ein Ausdruck wahr ist:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
Dadurch wird der Ausdruck wiederholt getestet und, falls dies zutrifft, die erste Suite ausgeführt. Wenn der Ausdruck falsch ist (was möglicherweise das erste Mal ist, dass er getestet wird), wird die Suite der
else
Klausel, falls vorhanden, ausgeführt und die Schleife wird beendet.Eine
break
in der ersten Suite ausgeführte Anweisung beendet die Schleife, ohne dieelse
Suite der Klausel auszuführen . Einecontinue
in der ersten Suite ausgeführte Anweisung überspringt den Rest der Suite und geht zurück zum Testen des Ausdrucks.
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
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
und
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
Weil die print 'ELSE'
Anweisung in beiden Fällen immer ausgeführt zu sein scheint (sowohl wenn die while
Schleife beendet ist als auch nicht).
Dann ist es nur anders, wenn die Anweisung print 'ELSE'
nicht ausgeführt wird. Es ist, wenn sich break
innerhalb des Codeblocks ein befindetwhile
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
Wenn abweichend von:
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
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 der while
Klausel nicht ausgeführt wird.
Ich weiß, das ist eine alte Frage, aber ...
Wie Raymond Hettinger sagte, sollte es statt genannt while/no_break
werden while/else
.
Ich finde es leicht zu verstehen, wenn Sie sich diesen Ausschnitt ansehen.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
Anstatt jetzt die Bedingung nach der while-Schleife zu überprüfen, können wir sie austauschen else
und diese Prüfung loswerden.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
Ich habe es immer als gelesen while/no_break
, um den Code zu verstehen, und diese Syntax ist für mich viel sinnvoller.
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.
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
AUSGABE:
this
Beispiel 2: Die while-Bedingung wurde i < 5
nie falsch, da i == 3
die Schleife unterbrochen wird und die else-Klausel nicht ausgeführt wurde.
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
AUSGABE:
0
1
2
3
Beispiel 3: Die while-Bedingung i < 5
wurde falsch, als was i
war 5
, also wurde die else-Klausel ausgeführt.
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
AUSGABE:
0
1
2
3
4
this
Die else:
Anweisung wird nur dann ausgeführt, wenn die while-Schleife ihre Bedingung nicht mehr erfüllt (in Ihrem Beispiel, wenn sie n != 0
falsch ist).
Die Ausgabe wäre also:
5
4
3
2
1
what the...
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.
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.
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:
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
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 ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
Block nicht ausgeführt wird, wenn Sie die Schleife mit dem Schlüsselwort break
oder verlassen return
. In Ihrem Beispiel print
wird auch ausgeführt, wenn die Schleife auf break
Befehl beendet wurde.
Es ist nützlich für die soziale Interaktion.
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
Hier? Der Code macht genau das gleiche ohne ihn.
break
während Ihres Countdowns nicht verwendet else
werden, sagen Sie "Frohes neues Jahr!" sofort, was keinen Sinn ergibt.
break
"? break
Der Code enthält keine .
else
für diese Verwendung eine bemerkenswert schlechte Idee war und dass sie nicht mehr davon machen würden.