Abschnitt 4 · Lektion 1
while
Wer dreimal „Runde“ ausgeben will, schreibt drei print-Zeilen. Bei dreihundert lässt man es
bleiben. Ein if hilft da nicht weiter. Es kann Zeilen überspringen, aber keine wiederholen, und so
läuft jede Zeile von oben nach unten höchstens einmal.
Dabei kann ein Computer Wiederholen besser als jeder Mensch. Er wird nicht müde, verzählt sich nicht
und findet die dreihundertste Runde nicht langweiliger als die erste. Es fehlt ihm nur die Anweisung
dazu. Dafür gibt es Schleifen (loops), und die erste davon heißt while.
Solange die Bedingung stimmt
runde = 1
while runde <= 3:
print("Runde", runde)
runde = runde + 1
print("Nach der Schleife steht runde auf", runde) while heißt „solange“, und so liest man die Zeile auch. Solange runde höchstens 3 ist, mach den
Block darunter. Aufgebaut ist sie wie ein if aus Abschnitt 3, mit Bedingung, Doppelpunkt und
eingerücktem Block. Der Unterschied liegt darin, was nach dem Block passiert.
Bei einem if geht es danach einfach weiter. Bei while springt Python zurück nach oben und stellt
die Frage noch einmal. Wenn die Bedingung immer noch stimmt, läuft der Block ein weiteres Mal, und
so weiter. Erst wenn die Antwort False lautet, geht es mit der ersten Zeile nach dem Block weiter.
Ein Durchgang durch den Block heißt Runde oder Durchlauf.
Im Beispiel sind es drei Runden. Danach steht runde auf 4. Das ist Absicht, denn erst bei der 4
kippt die Bedingung. Gefragt wurde also viermal, gelaufen ist der Block dreimal.
Anfang, Bedingung, Schritt
Jede while-Schleife braucht drei Dinge, und im Beispiel steht jedes in einer eigenen Zeile:
- einen Anfang,
runde = 1vor der Schleife. Ohne ihn wüsste Python bei der ersten Frage gar nicht, wasrundeist, und meldete einenNameError. - eine Bedingung,
runde <= 3. Vor jeder Runde wird an ihr entschieden, ob es noch eine gibt. - einen Schritt,
runde = runde + 1im Block. Durch ihn stimmt die Bedingung irgendwann nicht mehr.
Den dritten vergisst man am leichtesten, und er ist der wichtigste. Dazu gleich mehr.
So ein Schritt kommt ständig vor, deshalb gibt es eine Kurzform dafür. runde += 1 heißt dasselbe
wie runde = runde + 1, also „runde bekommt eins dazu“. Genauso gibt es -= zum Abziehen, und
beide gehen mit jeder Zahl, nicht nur mit 1. Eine Gleichung ist das nicht. Wie bei jeder Zuweisung
wird erst rechts gerechnet. Ab hier steht im Kurs meistens die kurze Form.
Wenn vorher niemand weiß, wie oft
guthaben = 1000
jahre = 0
while guthaben < 2000:
guthaben = guthaben * 1.03
jahre += 1
print(f"Nach {jahre} Jahren: {guthaben:.2f} Euro") Drei Runden hätte man auch mit drei print hinbekommen. Wirklich gebraucht wird while erst, wenn
vorher niemand sagen kann, wie viele Runden es werden.
1000 Euro liegen auf einem Konto und bekommen jedes Jahr 3 Prozent Zinsen, die im nächsten Jahr mitverzinst werden. Wann sind daraus 2000 Euro geworden? Mit einer Formel geht das auch, aber dafür bräuchte man einen Logarithmus, und den hat nicht jeder parat. Die Schleife rechnet einfach Jahr für Jahr weiter, bis es so weit ist, und zählt dabei mit. Nach 24 Jahren sind es 2032,79 Euro auf dem Konto.
Die drei Dinge stehen wieder da. Der Anfang sind diesmal zwei Zeilen, das Guthaben und ein Zähler
für die Jahre. Die Bedingung fragt nach dem Guthaben. Und der Schritt ist die Zinsrechnung, weil das
Guthaben durch sie wächst, bis die Bedingung kippt. jahre += 1 zählt nur mit.
Mit 2500 am Anfang steht Nach 0 Jahren: 2500.00 Euro da, und die Schleife ist kein einziges Mal
gelaufen. Auch das gehört zu while. Die Bedingung wird vor der ersten Runde gefragt, und wenn
sie schon da nicht stimmt, wird der Block übersprungen wie bei einem if.
Der Schleife beim Arbeiten zusehen
Ab jetzt lohnt sich der Reiter Debug wirklich. Für das Beispiel mit den drei Runden stehen in
der Aufzeichnung zwölf Schritte, und die Zeile mit dem while kommt viermal vor. An ihrem Rand
steht jedes Mal der Wert, den runde gerade hat, 1, 2, 3 und zuletzt 4. Nach der 4 kommt nicht mehr
das print im Block, sondern gleich die letzte Zeile des Programms. Das ist dasselbe wie oben. Nur
siehst du es jetzt, statt es glauben zu müssen.
Wenn die Schleife nicht aufhört
Wenn der Schritt fehlt, kippt die Bedingung nie. Die Schleife läuft dann immer weiter, und das nennt man Endlosschleife (infinite loop). Python merkt davon nichts, weil eine Bedingung, die immer stimmt, für Python kein Fehler ist. Es tut genau, was dasteht, und zwar für immer.
Auf dem eigenen Rechner hilft dann nur noch Strg+C im Terminal. Hier wird ein Lauf über Prüfen und eine Aufzeichnung nach zehn Sekunden beendet, ein Befehl im Terminal nach dreißig.
Ohne die Zeile guthaben = guthaben * 1.03 im Beispiel mit dem Guthaben läuft die Aufzeichnung im
Reiter Debug zehn Sekunden lang. Am Ende der Liste steht dann „Ab hier wurde nicht weiter
aufgezeichnet. Läuft dein Code vielleicht endlos?“. Davor kommen die Zeilen der Schleife immer
wieder, und am Rand zählt jahre hoch, 1, 2, 3 und so weiter. Nur guthaben ändert sich nie. Es
steht von der ersten bis zur letzten Runde auf 1000, und daran sieht man den Fehler. Das kostet ein
paar Sekunden von deinem Kontingent und spart dir später vermutlich eine Viertelstunde Suchen.
Was die Aufgabe will
Im Sparplan gibt es keine Zinsen, und wie lange es bis zum Sparziel dauert, ließe sich auch mit
einer Division ausrechnen. Geprüft wird trotzdem, dass du mit while zählst. Sobald Zinsen
dazukommen, hilft die Division nämlich nicht mehr weiter.
Zum Mitnehmen
Eine while-Schleife wiederholt ihren Block, solange die Bedingung stimmt. Dafür braucht sie drei Dinge: einen Anfang, eine Bedingung und einen Schritt, der die Bedingung irgendwann kippen lässt.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 2 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.