Python "while" -Schleifen (unbestimmte Iteration)

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 diewhile-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 und3 wird gedruckt.

  • Dies wird fortgesetzt, bisn 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 istn0, 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 Pythonbreakbeendet eine Schleife sofort vollständig. Die Programmausführung fährt mit der ersten Anweisung fort, die dem Schleifenkörper folgt.

  • Die Anweisung Pythoncontinuebeendet 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 Anweisungbreakdemonstriert:

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

thought balloon

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 sichelse 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 Operatorinverwenden:

>>>

>>> 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 Anweisungbreakaufgebrochen 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 /elseverschachtelt 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 komplexewhile-Schleifen

  • Unterbrechen Sie die Schleifenausführung mitbreak undcontinue

  • Verwenden Sie dieelse-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.