Python "while" -Schleifen (unbestimmte Iteration)
Iteration bedeutet, dass derselbe Codeblock möglicherweise immer wieder ausgeführt wird. Eine Programmierstruktur, die die Iteration implementiert, heißtloop.
Bei der Programmierung gibt es zwei Arten von Iterationen: unbestimmte und bestimmte:
-
Mitindefinite iteration wird die Häufigkeit, mit der die Schleife ausgeführt wird, nicht explizit im Voraus angegeben. Vielmehr wird der angegebene Block wiederholt ausgeführt, solange eine Bedingung erfüllt ist.
-
Mitdefinite iteration wird zum Zeitpunkt des Starts der Schleife explizit angegeben, wie oft der angegebene Block ausgeführt wird.
In diesem Tutorial werden Sie:
-
Erfahren Sie mehr über die
while
-Schleife, die Python-Steuerstruktur, die für unbestimmte Iteration verwendet wird -
Erfahren Sie, wie Sie vorzeitig aus einer Schleife oder einer Schleifeniteration ausbrechen
-
Erkunde Endlosschleifen
Wenn Sie fertig sind, sollten Sie ein gutes Verständnis für die Verwendung der unbestimmten Iteration in Python haben.
Free Bonus:Click here to get our free Python Cheat Sheet zeigt Ihnen die Grundlagen von Python 3, z. B. das Arbeiten mit Datentypen, Wörterbüchern, Listen und Python-Funktionen.
__ Take the Quiz: Testen Sie Ihr Wissen mit unserem interaktiven Quiz "Python" während "Loops". Nach Abschluss erhalten Sie eine Punktzahl, mit der Sie Ihren Lernfortschritt im Laufe der Zeit verfolgen können:
Diewhile
-Schleife
Lassen Sie uns sehen, wie diewhile
-Anweisung von Python zum Erstellen von Schleifen verwendet wird. Wir werden einfach anfangen und verschönern, wenn wir gehen.
Das Format einer rudimentärenwhile
-Schleife ist unten dargestellt:
while :
<statement(s)>
stellt den Block dar, der wiederholt ausgeführt werden soll und häufig als Hauptteil der Schleife bezeichnet wird. Dies wird wie in einerif
-Anweisung mit Einrückung bezeichnet.
Remember: Alle Kontrollstrukturen in Python verwenden Einrückungen, um Blöcke zu definieren. Weitere Informationen finden Sie in der Diskussion zugrouping statements im vorherigen Lernprogramm.
Der steuernde Ausdruck<expr>
umfasst typischerweise eine oder mehrere Variablen, die vor dem Starten der Schleife initialisiert und dann irgendwo im Schleifenkörper geändert werden.
Wenn einewhile
-Schleife angetroffen wird, wird<expr>
zuerst inBoolean context ausgewertet. Wenn es wahr ist, wird der Schleifenkörper ausgeführt. Dann wird<expr>
erneut überprüft, und wenn dies immer noch zutrifft, wird der Body erneut ausgeführt. Dies wird fortgesetzt, bis<expr>
falsch wird. An diesem Punkt fährt die Programmausführung mit der ersten Anweisung über den Schleifenkörper hinaus fort.
Betrachten Sie diese Schleife:
>>>
1 >>> n = 5
2 >>> while n > 0:
3 ... n -= 1
4 ... print(n)
5 ...
6 4
7 3
8 2
9 1
10 0
In diesem Beispiel passiert Folgendes:
-
n
ist anfänglich5
. Der Ausdruck im Anweisungsheaderwhile
in Zeile 2 lautetn > 0
, was wahr ist, sodass der Schleifenkörper ausgeführt wird. Innerhalb des Schleifenkörpers in Zeile 3 wirdn
um1
auf4
dekrementiert und dann gedruckt. -
Wenn der Hauptteil der Schleife beendet ist, kehrt die Programmausführung in Zeile 2 an den Anfang der Schleife zurück, und der Ausdruck wird erneut ausgewertet. Es ist immer noch wahr, also wird der Body erneut ausgeführt und
3
wird gedruckt. -
Dies wird fortgesetzt, bis
n
zu0
wird. Zu diesem Zeitpunkt ist der Ausdruck beim Testen falsch und die Schleife wird beendet. Die Ausführung wird bei der ersten Anweisung nach dem Schleifenkörper fortgesetzt, in diesem Fall gibt es jedoch keine.
Beachten Sie, dass der steuernde Ausdruck derwhile
-Schleife zuerst getestet wird, bevor etwas anderes passiert. Wenn es zunächst falsch ist, wird der Schleifenkörper überhaupt nicht ausgeführt:
>>>
>>> n = 0
>>> while n > 0:
... n -= 1
... print(n)
...
Im obigen Beispiel istn
0
, wenn die Schleife angetroffen wird. Der steuernde Ausdruckn > 0
ist bereits falsch, sodass der Schleifenkörper niemals ausgeführt wird.
Hier ist eine weiterewhile
-Schleife, die eine Liste anstelle eines numerischen Vergleichs enthält:
>>>
>>> a = ['foo', 'bar', 'baz']
>>> while a:
... print(a.pop(-1))
...
baz
bar
foo
Wenn einlist is evaluated in Boolean context ist, ist es wahr, wenn es Elemente enthält, und falsch, wenn es leer ist. In diesem Beispiel ista
wahr, solange es Elemente enthält. Sobald alle Elemente mit der Methode.pop()
entfernt wurden und die Liste leer ist, ista
falsch und die Schleife wird beendet.
Die Anweisungen Pythonbreak
undcontinue
In jedem Beispiel, das Sie bisher gesehen haben, wird bei jeder Iteration der gesamte Körper derwhile
-Schleife ausgeführt. Python bietet zwei Schlüsselwörter, die eine Schleifeniteration vorzeitig beenden:
-
Die Anweisung Python
break
beendet eine Schleife sofort vollständig. Die Programmausführung fährt mit der ersten Anweisung fort, die dem Schleifenkörper folgt. -
Die Anweisung Python
continue
beendet sofort die aktuelle Schleifeniteration. Die Ausführung springt an den Anfang der Schleife, und der steuernde Ausdruck wird neu ausgewertet, um zu bestimmen, ob die Schleife erneut ausgeführt oder beendet wird.
Die Unterscheidung zwischenbreak
undcontinue
ist in der folgenden Abbildung dargestellt:
Hier ist eine Skriptdatei mit dem Namenbreak.py
, die die Anweisungbreak
demonstriert:
1 n = 5
2 while n > 0:
3 n -= 1
4 if n == 2:
5 break
6 print(n)
7 print('Loop ended.')
Das Ausführen vonbreak.py
von einem Befehlszeileninterpreter erzeugt die folgende Ausgabe:
C:\Users\john\Documents>python break.py
4
3
Loop ended.
Wennn
zu2
wird, wird die Anweisungbreak
ausgeführt. Die Schleife wird vollständig beendet und die Programmausführung springt zur Anweisungprint()
in Zeile 7.
Das nächste Skript,continue.py
, ist bis auf einecontinue
-Anweisung anstelle vonbreak
identisch:
1 n = 5
2 while n > 0:
3 n -= 1
4 if n == 2:
5 continue
6 print(n)
7 print('Loop ended.')
Die Ausgabe voncontinue.py
sieht folgendermaßen aus:
C:\Users\john\Documents>python continue.py
4
3
1
0
Loop ended.
Wenn diesmaln
2
ist, bewirkt die Anweisungcontinue
die Beendigung dieser Iteration. Daher wird2
nicht gedruckt. Die Ausführung kehrt zum Anfang der Schleife zurück, die Bedingung wird neu ausgewertet und ist immer noch wahr. Die Schleife wird fortgesetzt und endet, wennn
wie zuvor zu0
wird.
Dieelse
-Klausel
Python erlaubt eine optionaleelse
-Klausel am Ende einerwhile
-Schleife. Dies ist eine einzigartige Funktion von Python, die in den meisten anderen Programmiersprachen nicht zu finden ist. Die Syntax ist unten dargestellt:
while :
else:
Die in derelse
-Klausel angegebenen<additional_statement(s)>
werden ausgeführt, wenn diewhile
-Schleife endet.
Ungefähr jetzt denken Sie vielleicht: "Wie ist das nützlich?" Sie können dasselbe erreichen, indem Sie diese Anweisungen unmittelbar nach derwhile
-Schleife ohneelse
einfügen:
while :
Was ist der Unterschied?
Im letzteren Fall wird<additional_statement(s)>
ohne dieelse
-Klausel ausgeführt, nachdem diewhile
-Schleife beendet wurde, egal was passiert.
Wenn<additional_statement(s)>
in eineelse
-Klausel eingefügt werden, werden sie nur ausgeführt, wenn die Schleife "durch Erschöpfung" endet - das heißt, wenn die Schleife iteriert, bis die Steuerungsbedingung falsch wird. Wenn die Schleife durch einebreak
-Anweisung beendet wird, wird dieelse
-Klausel nicht ausgeführt.
Betrachten Sie das folgende Beispiel:
>>>
>>> n = 5
>>> while n > 0:
... n -= 1
... print(n)
... else:
... print('Loop done.')
...
4
3
2
1
0
Loop done.
In diesem Fall wiederholte sich die Schleife, bis die Bedingung erschöpft war:n
wurde zu0
, also wurden > 0
falsch. Da die Schleife sozusagen ihr natürliches Leben gelebt hat, wurde dieelse
-Klausel ausgeführt. Beobachten Sie nun den Unterschied hier:
>>>
>>> n = 5
>>> while n > 0:
... n -= 1
... print(n)
... if n == 2:
... break
... else:
... print('Loop done.')
...
4
3
2
Diese Schleife wird vorzeitig mitbreak
beendet, sodass dieelse
-Klausel nicht ausgeführt wird.
Es scheint, als ob die Bedeutung des Worteselse
nicht ganz in diewhile
-Schleife passt, ebenso wenig wie in dieif
-Anweisung. Guido van Rossum, der Schöpfer von Python, hat tatsächlich gesagt, dass er dieelse
-Klausel derwhile
-Schleife aus der Sprache herauslassen würde, wenn er es noch einmal tun müsste.
Eine der folgenden Interpretationen könnte helfen, es intuitiver zu gestalten:
-
Stellen Sie sich den Header der Schleife (
while n > 0
) als eineif
-Anweisung (if n > 0
) vor, die immer wieder ausgeführt wird, wobei dieelse
-Klausel schließlich ausgeführt wird, wenn die Bedingung erfüllt ist wird falsch. -
Stellen Sie sich
else
so vor, als wäre esnobreak
, da der folgende Block ausgeführt wird, wenn es keinbreak
gibt.
Wenn Sie keine dieser Interpretationen hilfreich finden, können Sie sie ignorieren.
Wann könnte eineelse
-Klausel in einerwhile
-Schleife nützlich sein? Eine häufige Situation ist, wenn Sie eine Liste nach einem bestimmten Element durchsuchen. Sie könnenbreak
verwenden, um die Schleife zu verlassen, wenn das Element gefunden wird, und dieelse
-Klausel kann Code enthalten, der ausgeführt werden soll, wenn das Element nicht gefunden wird:
>>>
>>> a = ['foo', 'bar', 'baz', 'qux']
>>> s = 'corge'
>>> i = 0
>>> while i < len(a):
... if a[i] == s:
... # Processing for item found
... break
... i += 1
... else:
... # Processing for item not found
... print(s, 'not found in list.')
...
corge not found in list.
Note: Der oben gezeigte Code ist nützlich, um das Konzept zu veranschaulichen, aber es ist sehr unwahrscheinlich, dass Sie eine Liste auf diese Weise durchsuchen.
Zunächst werden Listen normalerweise mit einer bestimmten Iteration verarbeitet, nicht mit einerwhile
-Schleife. Die definitive Iteration wird im nächsten Tutorial dieser Reihe behandelt.
Zweitens bietet Python integrierte Möglichkeiten zur Suche nach einem Element in einer Liste. Sie können den Operatorin
verwenden:
>>>
>>> if s in a:
... print(s, 'found in list.')
... else:
... print(s, 'not found in list.')
...
corge not found in list.
Dielist.index()
-Methode würde ebenfalls funktionieren. Diese Methode löst eineValueError
-Ausnahme aus, wenn das Element nicht in der Liste gefunden wird. Sie müssen daher die Ausnahmebehandlung verstehen, um es verwenden zu können. In Python verwenden Sie einetry
-Anweisung, um eine Ausnahme zu behandeln. Ein Beispiel ist unten angegeben:
>>>
>>> try:
... print(a.index('corge'))
... except ValueError:
... print(s, 'not found in list.')
...
corge not found in list.
Sie werden später in dieser Serie mehr über die Ausnahmebehandlung erfahren.
Eineelse
-Klausel mit einerwhile
-Schleife ist etwas seltsam und wird nicht oft gesehen. Aber scheuen Sie sich nicht davor, wenn Sie eine Situation finden, in der Sie das Gefühl haben, dass dies Ihrem Code Klarheit verleiht!
Endlosschleifen
Angenommen, Sie schreiben einewhile
-Schleife, die theoretisch nie endet. Klingt komisch, oder?
Betrachten Sie dieses Beispiel:
>>>
>>> while True:
... print('foo')
...
foo
foo
foo
.
.
.
foo
foo
foo
KeyboardInterrupt
Traceback (most recent call last):
File "", line 2, in
print('foo')
Dieser Code wurde durch [.keys] #Ctrl [.kbd .key-c] # C ## beendet, wodurch ein Interrupt über die Tastatur generiert wird. Sonst wäre es endlos weitergegangen. Viele "+ foo" -Ausgangszeilen wurden entfernt und durch die vertikalen Auslassungspunkte in der gezeigten Ausgabe ersetzt.
Es ist klar, dassTrue
niemals falsch sein wird, oder wir haben alle große Probleme. Somit initiiertwhile True:
eine Endlosschleife, die theoretisch für immer läuft.
Vielleicht klingt das nicht nach etwas, das Sie tun möchten, aber dieses Muster ist eigentlich ziemlich häufig. Beispielsweise können Sie Code für einen Dienst schreiben, der gestartet wird und für immer Dienstanforderungen akzeptiert. "Für immer" bedeutet in diesem Zusammenhang, bis Sie es abschalten oder bis der Hitzetod des Universums, je nachdem, was zuerst eintritt.
Denken Sie prosaischer daran, dass Schleifen mit der Anweisungbreak
aufgebrochen werden können. Es kann einfacher sein, eine Schleife basierend auf Bedingungen zu beenden, die innerhalb des Schleifenkörpers erkannt werden, als auf einer Bedingung, die oben ausgewertet wird.
Hier ist eine weitere Variante der oben gezeigten Schleife, bei der Elemente nacheinander mit.pop()
aus einer Liste entfernt werden, bis sie leer sind:
>>>
>>> a = ['foo', 'bar', 'baz']
>>> while True:
... if not a:
... break
... print(a.pop(-1))
...
baz
bar
foo
Wenna
leer wird, wirdnot a
wahr und die Anweisungbreak
verlässt die Schleife.
Sie können auch mehrerebreak
-Anweisungen in einer Schleife angeben:
while True:
if : # One condition for loop termination
break
...
if : # Another termination condition
break
...
if : # Yet another
break
In solchen Fällen, in denen es mehrere Gründe gibt, die Schleife zu beenden, ist es häufig sauberer,break
von mehreren verschiedenen Stellen aus zu entfernen, anstatt zu versuchen, alle Beendigungsbedingungen im Schleifenheader anzugeben.
Endlosschleifen können sehr nützlich sein. Denken Sie daran, dass Sie sicherstellen müssen, dass die Schleife irgendwann unterbrochen wird, damit sie nicht wirklich unendlich wird.
Verschachteltewhile
-Schleifen
Im Allgemeinen können Python-Steuerungsstrukturen ineinander verschachtelt sein. Beispielsweise können die bedingten Anweisungen vonif
/elif
/else
verschachtelt werden:
if age < 18:
if gender == 'M':
print('son')
else:
print('daughter')
elif age >= 18 and age < 65:
if gender == 'M':
print('father')
else:
print('mother')
else:
if gender == 'M':
print('grandfather')
else:
print('grandmother')
In ähnlicher Weise kann einewhile
-Schleife in einer anderenwhile
-Schleife enthalten sein, wie hier gezeigt:
>>>
>>> a = ['foo', 'bar']
>>> while len(a):
... print(a.pop(0))
... b = ['baz', 'qux']
... while len(b):
... print('>', b.pop(0))
...
foo
> baz
> qux
bar
> baz
> qux
Die Anweisungbreak
odercontinue
in verschachtelten Schleifen gilt für die nächste einschließende Schleife:
while :
statement
statement
while :
statement
statement
break # Applies to while : loop
break # Applies to while : loop
Zusätzlich könnenwhile
Schleifen inif
/elif
/else
Anweisungen verschachtelt werden und umgekehrt:
if :
statement
while :
statement
statement
else:
while :
statement
statement
statement
while :
if :
statement
elif :
statement
else:
statement
if :
statement
Tatsächlich können alle Python-Steuerungsstrukturen in jedem gewünschten Umfang miteinander vermischt werden. So sollte es sein. Stellen Sie sich vor, wie frustrierend es wäre, wenn es unerwartete Einschränkungen gäbe wie „Einewhile
-Schleife kann nicht in einerif
-Schrift enthalten sein“ oder „while
-Schleifen können nur ineinander verschachtelt werden die meisten vier tief. " Es fällt Ihnen sehr schwer, sich an alle zu erinnern.
Scheinbar willkürliche numerische oder logische Einschränkungen werden als Zeichen für ein schlechtes Design der Programmsprache angesehen. Glücklicherweise werden Sie in Python nicht viele finden.
Einzeiligewhile
Schleifen
Wie bei einerif
-Anweisung kann einewhile
-Schleife in einer Zeile angegeben werden. Wenn der Block, aus dem der Schleifenkörper besteht, mehrere Anweisungen enthält, können diese durch Semikolons (;
) getrennt werden:
>>>
>>> n = 5
>>> while n > 0: n -= 1; print(n)
4
3
2
1
0
Dies funktioniert jedoch nur mit einfachen Anweisungen. Sie können nicht zwei zusammengesetzte Anweisungen in einer Zeile kombinieren. Auf diese Weise können Sie einewhile
-Schleife in einer Zeile wie oben angeben und eineif
-Anweisung in eine Zeile schreiben:
>>>
>>> if True: print('foo')
foo
Dies können Sie jedoch nicht tun:
>>>
>>> while n > 0: n -= 1; if True: print('foo')
SyntaxError: invalid syntax
Denken Sie daran, dassPEP 8 mehrere Anweisungen in einer Zeile abschreckt. Sie sollten dies wahrscheinlich sowieso nicht sehr oft tun.
Fazit
In diesem Tutorial haben Sie mithilfe der Pythonwhile
-Schleife etwas überindefinite iteration gelernt. Sie können jetzt:
-
Konstruieren Sie einfache und komplexe
while
-Schleifen -
Unterbrechen Sie die Schleifenausführung mit
break
undcontinue
-
Verwenden Sie die
else
-Klausel mit einerwhile
-Schleife -
Beschäftige dich mit Endlosschleifen
Sie sollten jetzt ein gutes Verständnis dafür haben, wie ein Code wiederholt ausgeführt wird.
__ Take the Quiz: Testen Sie Ihr Wissen mit unserem interaktiven Quiz "Python" während "Loops". Nach Abschluss erhalten Sie eine Punktzahl, mit der Sie Ihren Lernfortschritt im Laufe der Zeit verfolgen können:
Das nächste Tutorial in dieser Reihe behandeltdefinite iteration mitfor
Schleifen - wiederkehrende Ausführung, bei der die Anzahl der Wiederholungen explizit angegeben wird.