Computer sind zum Wiederholen da. Ein Mensch, der eine Million Zahlen addieren müsste, würde aufgeben; eine Schleife erledigt das, bevor Sie mit den Augen blinzeln können. Diese Lektion behandelt die beiden Schleifen von Python und die Steueranweisungen, die sie lenken: und zwar mit Sorgfalt, denn Schleifen sind der Ort, an dem Anfänger zum ersten Mal die Kluft zwischen Code lesen und Code schreiben spüren. Am Ende haben Sie Einmaleins-Tabellen geschrieben, Reihen summiert, Werte gesucht, Eingaben validiert und FizzBuzz gelöst, die berühmteste Aufwärmübung für Vorstellungsgespräche der Welt.
Die beiden Schleifen teilen die Arbeit sauber auf. Verwenden Sie for, wenn Sie wissen, welche Sammlung von Dingen Sie durchlaufen: jede Zahl in einem Bereich, jedes Zeichen in einer Zeichenkette, jede Zeile in einer Datei. Verwenden Sie while, wenn Sie nur die Abbruchbedingung kennen: weiter fragen, bis die Antwort gültig ist, weiterspielen, bis der Spieler aufhört. Zu erkennen, welche Schleife ein Problem verlangt, ist die halbe Lektion; die Syntax ist die einfachere Hälfte.
Was Sie in Teil 3 lernen werden
- while-Schleifen für Probleme mit Wiederholung bis zur Bedingung
- for-Schleifen mit range, Zeichenketten und Sammlungen
- break zum vorzeitigen Verlassen einer Schleife und continue zum Überspringen einer Runde
- Die else-Klausel bei Schleifen und wann sie tatsächlich nützlich ist
- Verschachtelte Schleifen und das Muster der Einmaleins-Tabelle
- Die Muster Akkumulator, Zähler und Suche, die in jedem echten Code vorkommen
Hinweis
Bevor Sie beginnen
Sie benötigen Variablen und F-Strings aus Teil 1 sowie Bedingungen aus Teil 2, denn jede interessante Schleife enthält ein if. Der folgende Playground führt alle Beispiele live aus.
1. Die while-Schleife: Wiederholen, bis etwas anderes gesagt wird
Eine while-Schleife ist ein if, das immer wieder passiert. Python prüft die Bedingung; ist sie wahr, wird der Block ausgeführt, und dann wird die Bedingung erneut geprüft: immer wieder, bis die Prüfung fehlschlägt. Diese Struktur legt Ihnen eine heilige Pflicht auf: Irgendetwas im Block muss die Bedingung irgendwann ändern, sonst endet die Schleife nie. Jeder Programmierer, der lebt, hat schon einmal versehentlich eine Endlosschleife geschrieben; im Terminal unterbricht Strg+C sie, und in unserem Playground schneidet der Runner sie einfach ab.
countdown = 5
while countdown > 0:
print(countdown)
countdown -= 1 # the line that makes the loop finite
print("Liftoff!")
# 5 4 3 2 1 Liftoff!
Vollziehen Sie sie einmal von Hand nach, so wie Sie die Notenleiter in Teil 2 nachvollzogen haben. countdown beginnt bei 5, die Bedingung 5 > 0 ist erfüllt, wir geben aus und dekrementieren. Der Schleifenkörper wird insgesamt fünfmal ausgeführt, und wenn countdown 0 erreicht, schlägt die Bedingung endgültig fehl und die Ausführung fällt zur Startlinie durch. Die Gewohnheit, eine Schleife für die ersten beiden und die letzten beiden Durchläufe mit dem Finger nachzuverfolgen, wird Sie in diesem Jahr vor fast jedem Um-eins-daneben-Fehler bewahren.
Der ehrliche Anwendungsfall für while ist, wenn die Anzahl der Wiederholungen im Voraus nicht bekannt ist. Das klassische Beispiel ist die Eingabevalidierung: fragen, prüfen und erneut fragen, bis die Antwort akzeptabel ist. Diese exakte Form werden Sie in echten Programmen ständig schreiben, und sie lässt sich nicht auf natürliche Weise mit for umsetzen, weil niemand weiß, wie viele Versuche der Benutzer benötigt.
# Keep asking until we get a valid choice (terminal version)
choice = ""
while choice not in ("rock", "paper", "scissors"):
choice = input("rock, paper or scissors? ").lower().strip()
print(f"You chose {choice}")
2. Die for-Schleife und range
Eine for-Schleife durchläuft die Elemente einer Sequenz, eines pro Durchlauf, und übergibt jedes Element einem Namen Ihrer Wahl. Die häufigste Sequenz in frühem Code ist range, das bei Bedarf gleichmäßig verteilte ganze Zahlen erzeugt. range(5) liefert 0 bis 4, range(1, 6) liefert 1 bis 5 und range(0, 50, 10) zählt in Zehnerschritten. Beachten Sie die Asymmetrie, über die jeder genau einmal stolpert: Der Start ist enthalten, das Ende ist ausgeschlossen. Diese Konvention ist beabsichtigt, denn sie sorgt dafür, dass range(len(items)) perfekt mit gültigen Indizes übereinstimmt und Längen sich sauber addieren, wenn man Bereiche aufteilt.
for i in range(5):
print(i, end=" ") # 0 1 2 3 4
print()
for year in range(2024, 2027):
print(f"Report for {year}")
total = 0
for n in range(1, 101):
total += n
print(f"1 + 2 + ... + 100 = {total}") # 5050
Das letzte Beispiel ist das Akkumulatormuster, und es ist vielleicht die am häufigsten wiederverwendete Form in der gesamten Programmierung: Legen Sie vor der Schleife eine Variable an, falten Sie in jedem Durchlauf ein Element hinein und verwenden Sie das Ergebnis danach. Summen, Produkte, Zählungen, zusammengefügte Zeichenketten und (ab Teil 5) aufgebaute Listen sind alles Akkumulatoren. Wenn eine Aufgabe „Summe“, „Anzahl“ oder „Kombinieren“ sagt, sollten Ihre Finger anfangen, einen Akkumulator zu tippen, bevor Ihr Gehirn zu Ende gelesen hat.
for ist nicht auf range beschränkt. Jede Sequenz funktioniert, und Zeichenketten sind Sequenzen von Zeichen, was die Textverarbeitung mühelos erscheinen lässt. Das Zählen von Vokalen, eines der Übungsbeispiele in der Learn Python App, umfasst vier Zeilen: einen Akkumulator, eine Schleife über die Zeichenkette, einen Zugehörigkeitstest und eine Ausgabe.
sentence = "Learn Python by doing"
vowels = 0
for ch in sentence.lower():
if ch in "aeiou":
vowels += 1
print(f"{vowels} vowels in: {sentence}") # 7 vowels
Kontrollpunkt
Wie oft wird der Körper von „for i in range(2, 10, 3)“ ausgeführt?
3. break, continue und das else der Schleife
Zwei Anweisungen steuern eine laufende Schleife. break verlässt die Schleife sofort und springt zur ersten Zeile danach; continue bricht den aktuellen Durchlauf ab und geht direkt zur nächsten Prüfung über. break macht aus while True, einer absichtlich endlosen Schleife, die sauberste Art, Frage-dann-Entscheide-Abläufe auszudrücken. continue glänzt als früher Filter, der den interessanten Code eingerückt hält: Wenn ein Element irrelevant ist, überspringen Sie es am Anfang des Körpers und lassen die eigentliche Arbeit atmen.
# break: search for the first number divisible by 7 and 5
for n in range(1, 200):
if n % 7 == 0 and n % 5 == 0:
print(f"Found it: {n}") # 35
break
# continue: process only the valid readings
readings = [21.5, -999, 22.1, -999, 23.8]
for r in readings:
if r == -999: # sensor error code
continue
print(f"Temperature: {r}")
Python bietet ein Konstrukt, das die meisten Sprachen nicht haben: einen else-Zweig für Schleifen. Der else-Block wird nur ausgeführt, wenn die Schleife ohne break beendet wurde. Beim ersten Lesen wirkt das ungewohnt, aber es löst das Suchproblem perfekt: Wenn die Schleife durch break abgebrochen wurde, haben wir das Gesuchte gefunden; lief der else-Zweig, haben wir alle Möglichkeiten ausgeschöpft. Ohne else müsste man eine Fund-Flag von Hand verwalten, und genau das ersetzt der else-Zweig.
target = 17
for n in (4, 9, 12, 21):
if n == target:
print("Found the target")
break
else:
print(f"{target} is not in the data") # this runs
4. Verschachtelte Schleifen und das Einmaleins
Schleifen lassen sich verschachteln: Setzt man eine Schleife in eine andere, wird die innere bei jedem einzelnen Durchlauf der äußeren vollständig ausgeführt. Das klassische Beispiel: und eine der beliebtesten Lektionen in der Learn-Python-App: ist das Einmaleins. Die äußere Schleife wählt die Zeile, die innere durchläuft die Spalten, und ein f-String sorgt für ausgerichtete Zahlen. Verschachtelte Schleifen vervielfachen die Arbeit schnell: Zehn mal zehn ergibt hundert Durchläufe. Damit bekommt man auch einen ersten Eindruck davon, wie viel Arbeit ein Programm leistet: ein Thema, das wir in der Lektion zu Generatoren (Teil 9) vertiefen.
for row in range(1, 6):
for col in range(1, 6):
print(f"{row * col:4}", end="")
print() # end the row
# 1 2 3 4 5
# 2 4 6 8 10
# 3 6 9 12 15
# 4 8 12 16 20
# 5 10 15 20 25
Kontrollfrage
In einer verschachtelten Schleife, bei der die äußere 4-mal und die innere pro Durchlauf 3-mal läuft: Wie oft wird die innerste Anweisung ausgeführt?
5. Alles zusammen: FizzBuzz und Verwandtes
FizzBuzz ist der klassische Test, ob jemand eine Schleife mit Bedingungen kombinieren kann: Gib die Zahlen von 1 bis N aus, aber schreibe Fizz für Vielfache von 3, Buzz für Vielfache von 5 und FizzBuzz für Vielfache von beiden. Die Falle liegt in der Reihenfolge: direkt aus Teil 2: Man muss die spezifischste Bedingung, also die Teilbarkeit durch beide, zuerst prüfen. Der folgende Spielplatz enthält eine funktionierende Version sowie drei Übungen, die diese Lektion in Reflexe verwandeln. Ausführen, kaputtmachen, reparieren.
Übung 1 enthält eine echte Lektion: Der kombinierte Fall für 4 und 6 ist ihr kleinstes gemeinsames Vielfaches, 12, nicht ihr Produkt 24, und der Modulo-Test muss dieses verwenden. Solche kleinen Rätsel zeigen, warum Schleifenübungen wichtig sind; die Syntax lernt man in einer Stunde, aber die Gewohnheit, vorherzusagen, was Code tun wird, bevor man ihn ausführt, erfordert bewusste Wiederholung. Fünf weitere Schleifenübungen mit sofortigem Feedback findest du im Flow-Control-Quiz der App am Ende dieser Seite.
6. Wahl zwischen for und while
| Du überlegst ... | Schleife | Typische Form |
|---|---|---|
| Für jedes Element in einer bekannten Sammlung ausführen | for | for element in sammlung: |
| Genau N-mal ausführen | for | for i in range(n): |
| Weitermachen, bis etwas eintritt | while | while not fertig: |
| Abfragen oder wiederholen, bis Eingabe gültig | while | while True: ... break |
| Zwei Sammlungen parallel durchlaufen | for | for a, b in zip(xs, ys): (Teil 5) |
Im Zweifelsfall greif zu for. Mit for ist es schwerer, eine Endlosschleife zu schreiben, die Schleifenvariable wird für dich verwaltet, und die meisten realen Wiederholungen laufen ohnehin über eine Sammlung. while ist für wirklich offene Wiederholungen reserviert. Wenn du es verwendest, schreibe die Zeile, die die Bedingung ändert, zuerst: noch vor den Schleifenkörper -, damit du sie nie vergisst.
Hinter der Syntax verbirgt sich zudem eine Übersetzungsfertigkeit, die es wert ist, bewusst geübt zu werden: Reale Probleme kommen nicht mit einem Etikett, welche Schleife sie verlangen. Eine Anforderung wie „Sende eine Erinnerung an jeden Studierenden, der noch nicht bezahlt hat“ muss im Kopf zu „Durchlaufe alle Studierenden, prüfe eine Bedingung, handle bei Treffern“ werden, bevor irgendein Code entsteht. Trainiere diese Übersetzung, indem du Probleme laut in Schleifensprache formulierst: für jedes Element, tue was, es sei denn was, bis was. Das fühlt sich eine Woche lang albern an und wird dann zu deiner Art, jede Aufgabe zu lesen. Interviewer testen genau diese Übersetzung weit häufiger als die Syntax.
Eine Lesbarkeitsregel wird dir jahrzehntelang dienen: Wenn ein Schleifenkörper länger als eine Handvoll Zeilen wird, will er eine Funktion werden. Eine Schleife, die for bestellung in bestellungen: verarbeite(bestellung) lautet, erzählt die ganze Geschichte in einer Zeile, während vierzig eingebettete Zeilen sie begraben. Das kannst du nach Teil 4 richtig umsetzen, und sobald du es kannst, sorgt die Kombination aus kleinen Schleifen, die benannte Funktionen aufrufen, dafür, dass große Programme sich klein anfühlen.
! Häufige Fehler, die du vermeiden solltest
-
✕Vergessen, die Bedingungsvariable in einer while-Schleife zu aktualisieren, was zu einer Endlosschleife führt.
✓Schreibe die Aktualisierungszeile (zähler -= 1, fertig = ..., einen weiteren input-Aufruf) sofort, wenn du den while-Kopf schreibst, und fülle dann den Körper aus.
-
✕Erwarten, dass range(1, 10) die 10 einschließt.
✓Der Endwert ist immer ausgeschlossen. Um 10 einzuschließen, schreiben Sie range(1, 11). Im Zweifel prüfen Sie mit print(list(range(...))).
-
✕break in einer verschachtelten Schleife verwenden und erwarten, dass beide Schleifen verlassen werden.
✓break beendet nur die innerste Schleife. Um beide zu verlassen, setzen Sie ein Flag oder: besser: verlagern Sie die Schleifen in eine Funktion und nutzen return, wie Teil 4 zeigt.
-
✕Eine Sammlung verändern, während man sie durchläuft.
✓Wenn Sie Elemente aus einer Liste entfernen, über die Sie iterieren, werden Elemente unvorhersehbar übersprungen. Iterieren Sie über eine Kopie oder bauen Sie eine neue Sammlung mit den behaltenen Elementen auf; Teil 5 macht dieses Muster einfach.
? Häufig gestellte Fragen
Was ist schneller, for oder while? +
Zum Durchlaufen einer Sammlung ist for sowohl schneller als auch klarer, weil Python die Iteration intern verwaltet. Der Unterschied ist weit weniger wichtig als die Wahl der Schleife, die Ihre Absicht ausdrückt; lesbarer Code wird später optimiert, unlesbarer Code wird umgeschrieben.
Was ist die Schleifenvariable i, und muss ich sie so nennen? +
Es ist eine gewöhnliche Variable, die for in jeder Iteration neu zuweist. i ist Konvention für einen anonymen Zähler; sobald der Wert eine Bedeutung hat, benennen Sie ihn: for row, for student, for price. Lesbare Namen kosten nichts.
Kann eine for-Schleife rückwärts zählen? +
Ja: range(10, 0, -1) liefert 10 abwärts bis 1. Das dritte Argument ist die Schrittweite, und eine negative Schrittweite zählt abwärts. Der Endwert ist weiterhin ausgeschlossen, genau wie beim Vorwärtszählen.
Gibt es eine do-while-Schleife in Python? +
Nicht als Syntax. Das Idiom ist while True mit einem break an der Stelle, an der die Abbruchbedingung bekannt wird, normalerweise nachdem die erste Arbeit einmal ausgeführt wurde.
7. Zusammenfassung und Ausblick
Sie beherrschen jetzt die zweite Hälfte des Programmiermotors: while für offene Wiederholungen, for und range für Sammlungen, break und continue zur Steuerung, das else der Schleife für Suchvorgänge, verschachtelte Schleifen für Raster und das Akkumulatormuster, das fast jeder Berechnung zugrunde liegt. Zusammen mit den Entscheidungen aus Teil 2 können Sie bereits jeden Algorithmus ausdrücken; alles, was in diesem Kurs folgt, dreht sich darum, sie besser auszudrücken.
Der nächste Schritt ist die größte Verbesserung der Arbeitserleichterung im gesamten Lehrplan. In Teil 4: Python-Funktionen erklärthören Sie auf, Skripte zu schreiben, und beginnen, wiederverwendbare Werkzeuge mit Namen, Eingaben und Ausgaben zu bauen. Bevor Sie gehen, führen Sie die obigen FizzBuzz-Übungen noch einmal durch, ohne auf die Lösung zu schauen, und probieren Sie die Lektion zur Ablaufsteuerung in der Learn Python-App unten aus; räumliche Wiederholung bei Schleifen zahlt sich für den gesamten weiteren Pfad aus, den Sie jederzeit auf der Serienübersicht.
Profi-Tipp
Wenn eine Schleife sich falsch verhält, fügen Sie print(f"iteration {i}: variable = {x}") als erste Zeile des Rumpfs ein. Fünf Iterationen echter Werte zu beobachten, schlägt zwanzig Minuten Starren. Entfernen Sie die print-Anweisung, wenn Sie fertig sind; in Teil 13 steigen Sie auf echte Debugging- und Testwerkzeuge um.
Üben für unterwegs
Learn Python, die kostenlose Android-App
Jedes Thema dieser Serie gibt es auch in der App: mundgerechte Lektionen, ausführbare Beispiele, Quizze, Miniprojekte und einen Offline-Python-Spielplatz, der auf Ihrem Handy läuft.
Kommentare
0Noch keine Kommentare. Teile als Erste oder Erster deine Gedanken.