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..."

23voto

HVNSweeting Punkte 2661

Meine Antwort wird sich darauf konzentrieren, WANN wir while/for-else verwenden können.

Auf den ersten Blick scheint es keinen Unterschied zu geben, wenn man

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

et

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

Weil die print 'ELSE' Anweisung scheint in beiden Fällen immer ausgeführt zu werden (sowohl wenn die while Schleife beendet oder nicht ausgeführt).

Dann, es ist nur anders, wenn die Aussage print 'ELSE' wird nicht ausgeführt. Es ist, wenn es eine break innerhalb des Codeblocks unter 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

Falls 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 fällt nicht in diese Kategorie, da es in den beiden oben genannten Fällen die gleiche Wirkung hat.

Ausnahme auslöst, macht auch keinen Unterschied, denn wenn sie auslöst, wird der nächste Code im Exception-Handler (Ausnahmeblock) ausgeführt, der Code in else Klausel oder direkt nach der while Klausel wird nicht ausgeführt.

13voto

Iluvatar Punkte 602

Ich weiß, diese Frage ist alt, aber...

Wie Raymond Hettinger sagte, sollte es heißen while/no_break 代わりに while/else .
Ich finde, das ist 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 die Bedingung nach der while-Schleife zu prüfen, können wir sie nun mit else und werden Sie diesen Scheck los.

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

Ich lese es immer als while/no_break um den Code zu verstehen, und diese Syntax ergibt für mich viel mehr Sinn.

2voto

Leo Ufimtsev Punkte 5338

Else wird ausgeführt, wenn die while-Schleife nicht abgebrochen wurde.

Ich betrachte das gerne mit der Metapher des "Läufers".

Das "else" ist wie das Überqueren der Ziellinie, unabhängig davon, ob Sie am Anfang oder am Ende der Strecke gestartet sind. "sonst" ist nur pas ausgeführt, wenn Sie irgendwo dazwischen eine Pause einlegen.

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.

Die Hauptanwendungsfälle sind das Ausbrechen aus verschachtelten Schleifen oder wenn Sie einige Anweisungen nur dann ausführen wollen, wenn die Schleife nicht irgendwo abgebrochen ist (denken Sie daran, dass ein Abbruch eine ungewöhnliche Situation ist).

Im Folgenden finden Sie beispielsweise einen Mechanismus, wie Sie aus einer inneren Schleife ausbrechen können, ohne Variablen oder try/catch zu verwenden:

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

-1voto

BoltClock Punkte 660640

Die else: Anweisung wird dann und nur dann ausgeführt, wenn die while-Schleife ihre Bedingung nicht mehr erfüllt (in Ihrem Beispiel, wenn n != 0 falsch ist).

Die Ausgabe würde also so aussehen:

5
4
3
2
1
what the...

-1voto

Rahul Negi Punkte 33

Angenommen, Sie müssen ein Element x in einer einzelnen verketteten Liste suchen

    def search(self, x):
        position = 1
        p =self.start
        while p is not None:
            if p.info == x:
                print(x, " is at position ", position)
                return True
            position += 1
            p = p.link
        else:
            print(x, "not found in list") 
            return False

Wenn also die while-Bedingungen fehlschlagen, wird else ausgeführt, ich hoffe, das hilft!

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