Zum Inhalt springen
Python Anfänger 2 min

while-Schleifen in Python

Lerne, wie du mit while-Schleifen wiederholte Ausfuehrungen steuerst. Von Grundlagen bis Eingabevalidierung und dem Zahlenraten-Spiel.

Aktualisiert:

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:

  1. Bedingung pruefen — ist sie True?
  2. Wenn ja: Block ausfuehren, zurueck zu Schritt 1.
  3. Wenn nein: Schleife beenden, Code danach ausfuehren.

Wann while statt for?

Die Faustregel ist einfach:

SituationVerwende
Anzahl der Durchlaeufe ist bekanntfor-Schleife
Anzahl der Durchlaeufe ist unbekanntwhile-Schleife
Iteration ueber eine Sequenzfor-Schleife
Wiederholung bis Bedingung erfuelltwhile-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.")
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())
Zurück zum Python Kurs