while-Schleifen in Python
Lerne, wie du mit while-Schleifen wiederholte Ausfuehrungen steuerst. Von Grundlagen bis Eingabevalidierung und dem Zahlenraten-Spiel.
while-Schleife Grundlagen
Eine while-Schleife wiederholt einen Codeblock, solange eine Bedingung wahr ist:
zaehler = 1
while zaehler <= 5:
print(f"Durchlauf {zaehler}")
zaehler += 1
print("Schleife beendet!")
Ausgabe:
Durchlauf 1
Durchlauf 2
Durchlauf 3
Durchlauf 4
Durchlauf 5
Schleife beendet!
Die Grundstruktur:
while bedingung:
# Code, der wiederholt wird
# WICHTIG: Die Bedingung muss sich irgendwann aendern!
pass
Ablauf:
- Bedingung pruefen — ist sie
True? - Wenn ja: Block ausfuehren, zurueck zu Schritt 1.
- Wenn nein: Schleife beenden, Code danach ausfuehren.
Wann while statt for?
Die Faustregel ist einfach:
| Situation | Verwende |
|---|---|
| Anzahl der Durchlaeufe ist bekannt | for-Schleife |
| Anzahl der Durchlaeufe ist unbekannt | while-Schleife |
| Iteration ueber eine Sequenz | for-Schleife |
| Wiederholung bis Bedingung erfuellt | while-Schleife |
Beispiel: for ist besser
# Wir wissen: genau 10 Durchlaeufe
for i in range(10):
print(i)
Beispiel: while ist besser
# Wir wissen NICHT, wie oft der Benutzer falsch eingibt
passwort = ""
while passwort != "geheim123":
passwort = input("Passwort eingeben: ")
print("Zugang gewaehrt!")
Endlosschleifen mit while True
Eine Endlosschleife laeuft fuer immer — bis sie explizit mit break beendet wird:
while True:
eingabe = input("Gib 'quit' ein zum Beenden: ")
if eingabe == "quit":
print("Tschuess!")
break
print(f"Du hast '{eingabe}' eingegeben.")
Beispielausgabe:
Gib 'quit' ein zum Beenden: hallo
Du hast 'hallo' eingegeben.
Gib 'quit' ein zum Beenden: test
Du hast 'test' eingegeben.
Gib 'quit' ein zum Beenden: quit
Tschuess!
Wann sind Endlosschleifen sinnvoll?
- Menue-Systeme: Das Programm zeigt Optionen, bis der Benutzer “Beenden” waehlt.
- Server: Warten endlos auf eingehende Anfragen.
- Spiele: Die Spielschleife laeuft, bis der Spieler aufhoert.
- Eingabevalidierung: Frage so lange, bis eine gueltige Eingabe kommt.
# Menue-System
while True:
print("\n--- Hauptmenue ---")
print("1. Neues Spiel")
print("2. Highscores")
print("3. Einstellungen")
print("4. Beenden")
wahl = input("Deine Wahl: ")
if wahl == "1":
print("Spiel wird gestartet...")
elif wahl == "2":
print("Highscores werden angezeigt...")
elif wahl == "3":
print("Einstellungen werden geoeffnet...")
elif wahl == "4":
print("Auf Wiedersehen!")
break
else:
print("Ungueltige Eingabe! Bitte 1-4 waehlen.")
break zum Beenden
break beendet die Schleife sofort:
# Finde die erste Zahl, die durch 7 UND durch 3 teilbar ist
zahl = 1
while True:
if zahl % 7 == 0 and zahl % 3 == 0:
print(f"Gefunden: {zahl}")
break
zahl += 1
print(f"Schleife nach {zahl} Durchlaeufen beendet.")
Ausgabe:
Gefunden: 21
Schleife nach 21 Durchlaeufen beendet.
continue zum Ueberspringen
continue ueberspringt den Rest des aktuellen Durchlaufs und springt zur Bedingungspruefung:
# Nur ungerade Zahlen ausgeben
zahl = 0
while zahl < 10:
zahl += 1
if zahl % 2 == 0:
continue # Gerade Zahlen ueberspringen
print(zahl)
Ausgabe:
1
3
5
7
9
Beispiel: Kommentare ueberspringen
zeilen = [
"name = 'Python'",
"# Dies ist ein Kommentar",
"version = 3.12",
"# Noch ein Kommentar",
"print(name)"
]
i = 0
while i < len(zeilen):
zeile = zeilen[i]
i += 1
if zeile.strip().startswith("#"):
continue # Kommentare ueberspringen
print(f"Code: {zeile}")
Ausgabe:
Code: name = 'Python'
Code: version = 3.12
Code: print(name)
while-else
Genau wie bei for-Schleifen gibt es auch bei while einen else-Block. Er wird ausgefuehrt, wenn die Bedingung False wird (aber nicht bei break):
versuche = 3
eingabe = ""
while versuche > 0:
eingabe = input(f"Passwort ({versuche} Versuche uebrig): ")
if eingabe == "geheim":
print("Zugang gewaehrt!")
break
versuche -= 1
else:
# Wird nur ausgefuehrt, wenn die Schleife OHNE break endet
print("Zu viele Fehlversuche! Zugang gesperrt.")
Wenn der Benutzer das richtige Passwort eingibt, wird break ausgefuehrt und der else-Block wird uebersprungen. Wenn alle Versuche aufgebraucht sind, wird else ausgefuehrt.
Das Zaehler-Pattern
Ein sehr haeufiges Muster mit while-Schleifen:
# Grundmuster: Zaehler initialisieren, pruefen, erhoehen
zaehler = 0 # 1. Initialisierung
while zaehler < 10: # 2. Bedingung
print(zaehler)
zaehler += 1 # 3. Erhoehung (NICHT VERGESSEN!)
Summe berechnen
# Summe aller Zahlen von 1 bis 100
summe = 0
n = 1
while n <= 100:
summe += n
n += 1
print(f"Die Summe von 1 bis 100 ist {summe}.") # 5050
Fakultaet berechnen
zahl = 5
ergebnis = 1
aktuell = zahl
while aktuell > 1:
ergebnis *= aktuell
aktuell -= 1
print(f"{zahl}! = {ergebnis}") # 5! = 120
Eingabevalidierung mit while
Eines der wichtigsten Anwendungsgebiete fuer while-Schleifen:
Grundmuster
while True:
try:
alter = int(input("Dein Alter: "))
if 0 <= alter <= 150:
break
else:
print("Bitte ein realistisches Alter eingeben (0-150).")
except ValueError:
print("Bitte eine ganze Zahl eingeben!")
print(f"Du bist {alter} Jahre alt.")
Ja/Nein-Abfrage
while True:
antwort = input("Moechtest du fortfahren? (ja/nein): ").lower()
if antwort in ("ja", "j", "yes", "y"):
print("Weiter geht's!")
break
elif antwort in ("nein", "n", "no"):
print("Abgebrochen.")
break
else:
print("Bitte 'ja' oder 'nein' eingeben.")
Menue mit Validierung
optionen = ["Kaffee", "Tee", "Wasser", "Saft"]
while True:
print("\nGetraenkekarte:")
for i, option in enumerate(optionen, 1):
print(f" {i}. {option}")
try:
wahl = int(input("Deine Wahl (Nummer): "))
if 1 <= wahl <= len(optionen):
getraenk = optionen[wahl - 1]
print(f"Du hast {getraenk} gewaehlt!")
break
else:
print(f"Bitte eine Zahl zwischen 1 und {len(optionen)} eingeben.")
except ValueError:
print("Bitte eine gueltige Nummer eingeben!")
Praxis: Zahlenraten-Spiel
Hier ist ein vollstaendiges Spiel mit while-Schleifen:
import random
print("=" * 40)
print(" ZAHLENRATEN-SPIEL")
print("=" * 40)
print()
# Zufaellige Zahl zwischen 1 und 100
geheimzahl = random.randint(1, 100)
versuche = 0
max_versuche = 7
print(f"Ich habe mir eine Zahl zwischen 1 und 100 ausgedacht.")
print(f"Du hast {max_versuche} Versuche!")
print()
while versuche < max_versuche:
versuche += 1
verbleibend = max_versuche - versuche
# Eingabevalidierung
while True:
try:
tipp = int(input(f"Versuch {versuche}/{max_versuche} - Dein Tipp: "))
if 1 <= tipp <= 100:
break
else:
print("Bitte eine Zahl zwischen 1 und 100!")
except ValueError:
print("Bitte eine ganze Zahl eingeben!")
# Tipp auswerten
if tipp == geheimzahl:
print(f"\nGlueckwunsch! {geheimzahl} ist richtig!")
print(f"Du hast es in {versuche} Versuchen geschafft!")
if versuche <= 3:
print("Unglaublich gut!")
elif versuche <= 5:
print("Sehr gut!")
else:
print("Knapp, aber geschafft!")
break
elif tipp < geheimzahl:
print(f"Zu niedrig!", end="")
else:
print(f"Zu hoch!", end="")
if verbleibend > 0:
print(f" (Noch {verbleibend} Versuche)")
print()
else:
# Alle Versuche aufgebraucht (kein break)
print(f"\nSchade! Die richtige Zahl war {geheimzahl}.")
print("Vielleicht klappt es beim naechsten Mal!")
print("\nDanke fuers Spielen!")
Haeufige Fehler
Fehler 1: Endlosschleife — Zaehler vergessen
# FALSCH: zaehler wird nie erhoeht -> Endlosschleife!
zaehler = 0
while zaehler < 5:
print(zaehler)
# zaehler += 1 <-- VERGESSEN!
# RICHTIG:
zaehler = 0
while zaehler < 5:
print(zaehler)
zaehler += 1 # Nicht vergessen!
Wenn du in eine Endlosschleife geraetst, druecke Ctrl+C um das Programm abzubrechen.
Fehler 2: Bedingung ist von Anfang an False
zaehler = 10
# Diese Schleife wird NIE ausgefuehrt
while zaehler < 5:
print(zaehler)
zaehler += 1
print("Fertig") # Wird sofort ausgefuehrt
Fehler 3: Off-by-one Error
# Soll 1 bis 5 ausgeben
# FALSCH: Gibt nur 1 bis 4 aus
zaehler = 1
while zaehler < 5: # < statt <=
print(zaehler)
zaehler += 1
# RICHTIG:
zaehler = 1
while zaehler <= 5: # <= fuer inklusive
print(zaehler)
zaehler += 1
Fehler 4: continue vor Zaehler-Erhoehung
# FALSCH: Endlosschleife! continue ueberspringt zaehler += 1
zaehler = 0
while zaehler < 10:
if zaehler == 5:
continue # Springt zurueck zur Bedingung, zaehler bleibt 5!
print(zaehler)
zaehler += 1
# RICHTIG: Zaehler VOR continue erhoehen
zaehler = 0
while zaehler < 10:
zaehler += 1
if zaehler == 5:
continue # Jetzt sicher, zaehler wurde schon erhoeht
print(zaehler)
for vs while — Der Vergleich
Hier sind dieselben Aufgaben mit beiden Schleifentypen:
Aufgabe: Zahlen 1 bis 5 ausgeben
# Mit for (BESSER fuer diese Aufgabe):
for i in range(1, 6):
print(i)
# Mit while:
i = 1
while i <= 5:
print(i)
i += 1
Aufgabe: Ueber eine Liste iterieren
farben = ["rot", "gruen", "blau"]
# Mit for (BESSER fuer diese Aufgabe):
for farbe in farben:
print(farbe)
# Mit while:
i = 0
while i < len(farben):
print(farben[i])
i += 1
Aufgabe: Eingabe bis “quit”
# Mit while (BESSER fuer diese Aufgabe):
while True:
text = input("Eingabe: ")
if text == "quit":
break
print(f"Echo: {text}")
# Mit for -- geht nicht sinnvoll!
# for hat kein natuerliches Ende fuer Benutzereingaben.
Zusammenfassung
for-Schleife:
+ Einfacher fuer bekannte Iterationen
+ Sicherer (kein Risiko fuer Endlosschleifen)
+ Pythonischer fuer Sequenzen
- Ungeeignet fuer unbekannte Wiederholungsanzahl
while-Schleife:
+ Flexibel fuer unbekannte Wiederholungsanzahl
+ Ideal fuer Bedingungsabhaengige Wiederholung
+ Gut fuer Eingabevalidierung
- Risiko fuer Endlosschleifen bei Fehlern
- Mehr Code noetig fuer einfache Iterationen
Uebungen
Uebung 1: Collatz-Vermutung
Die Collatz-Vermutung besagt: Nimm eine beliebige positive Zahl. Wenn sie gerade ist, teile durch 2. Wenn sie ungerade ist, multipliziere mit 3 und addiere 1. Wiederhole, bis du bei 1 ankommst. Gib jeden Schritt aus.
Loesung anzeigen
zahl = int(input("Startzahl: "))
schritte = 0
print(zahl, end="")
while zahl != 1:
if zahl % 2 == 0:
zahl = zahl // 2
else:
zahl = zahl * 3 + 1
schritte += 1
print(f" -> {zahl}", end="")
print(f"\nNach {schritte} Schritten bei 1 angekommen.")
Uebung 2: Wuerfel-Simulation
Simuliere einen Wuerfel, der so lange geworfen wird, bis eine 6 faellt. Zaehle die Wuerfe.
Loesung anzeigen
import random
wuerfe = 0
while True:
wurf = random.randint(1, 6)
wuerfe += 1
print(f"Wurf {wuerfe}: {wurf}")
if wurf == 6:
break
print(f"\nDu hast nach {wuerfe} Wuerfen eine 6 geworfen!")
Uebung 3: PIN-Eingabe
Simuliere eine PIN-Eingabe mit maximal 3 Versuchen. Die korrekte PIN ist “1234”. Nach 3 Fehlversuchen wird das Konto gesperrt.
Loesung anzeigen
korrekte_pin = "1234"
versuche = 0
max_versuche = 3
while versuche < max_versuche:
pin = input(f"PIN eingeben (Versuch {versuche + 1}/{max_versuche}): ")
versuche += 1
if pin == korrekte_pin:
print("PIN korrekt! Zugang gewaehrt.")
break
else:
verbleibend = max_versuche - versuche
if verbleibend > 0:
print(f"Falsche PIN! Noch {verbleibend} Versuche.")
else:
print("Konto gesperrt! Zu viele Fehlversuche.")
Uebung 4: Zahlen addieren
Schreibe ein Programm, das den Benutzer wiederholt nach Zahlen fragt und sie aufsummiert. Die Eingabe von “fertig” beendet das Programm und gibt die Summe aus.
Loesung anzeigen
summe = 0
anzahl = 0
print("Gib Zahlen ein (oder 'fertig' zum Beenden):")
while True:
eingabe = input("> ")
if eingabe.lower() == "fertig":
break
try:
zahl = float(eingabe)
summe += zahl
anzahl += 1
print(f" Zwischensumme: {summe}")
except ValueError:
print(" Ungueltige Eingabe! Bitte eine Zahl oder 'fertig' eingeben.")
print(f"\nDu hast {anzahl} Zahlen eingegeben.")
print(f"Summe: {summe}")
if anzahl > 0:
print(f"Durchschnitt: {summe / anzahl:.2f}")
Pro-Tipp: Das Walrus-Operator-Pattern (Python 3.8+)
Der Walrus-Operator := weist einen Wert zu und gibt ihn gleichzeitig zurueck. Das ist besonders nuetzlich bei while-Schleifen:
# Ohne Walrus-Operator (klassisch):
eingabe = input("Befehl: ")
while eingabe != "quit":
print(f"Verarbeite: {eingabe}")
eingabe = input("Befehl: ")
# Mit Walrus-Operator (eleganter):
while (eingabe := input("Befehl: ")) != "quit":
print(f"Verarbeite: {eingabe}")
Kein doppeltes input() mehr noetig! Der Walrus-Operator spart Code und vermeidet Wiederholung.
# Noch ein Beispiel: Datei zeilenweise lesen
with open("daten.txt") as f:
while (zeile := f.readline()):
print(zeile.strip())