Zum Inhalt springen

while-Schleifen

Einführung

while-Schleifen sind anders als for-Schleifen nicht von Anfang an terminiert, das heißt die Anzahl der Durchläufe ist nicht per se vorgegeben. Stattdessen läuft die Schleife solange, bis eine bestimmte Bedingung erfüllt ist.

Schauen wir uns ein Beispiel an:

status = "" #Startwert, damit die erste Prüfung fehlerfrei stattfinden kann

while status != "stop": #Bedingung, hier: Ist status ungleich “stop”? Falls ja, weiter!
    status = input("Ich frage dich solange, bis du 'stop' eingibst.") #neuer Wert für status per input()
print("Programm beendet!") #diese Ausgabe kommt nach der while-Schleife

Beachte bitte folgende Eigenschaften bzw. Kriterien:

  • Die erste Prüfung der Bedingung muss erfolgen können. Deshalb ist in diesem Beispiel status erst ein mal mit einem leeren String übergeben. So kann in der while-Schleife geprüft werden, ob status den Wert hat, der zum Abbruch der Schleife führen soll. Du würdest sofort eine Fehlermeldung erhalten, weil status nicht definiert wäre.
  • Der Block in der while-Schleife wird so lange durchlaufen, bis die Bedingung erfüllt ist. Da muss aber nicht immer ein != als Operator eingesetzt werden. Auch andere Operatoren sind zulässig, wichtig ist nur, dass die Abfrage insgesamt True oder False zurückgibt.
    • Wenn status einen Wert ungleich “stop” hat, dann ist der Wert der Bedingung status != “stop” also True, weil die Bedingung fragt “Ist der Wert ungleich stop?” – “Ja (= True), ist er!”.
    • Wenn status einen Wert gleich “stop” hat, dann ist der Wert der Bedingung status != “stop” also False, weil die Bedingung fragt “Ist der Wert ungleich stop?” – “Nein (= False), ist er nicht!”.

Wann sollte man while-Schleifen nutzen?

while-Schleifen eignen sich bestens dafür, Fallunterscheidungen in einem Zug zu prüfen, auch hier schauen wir uns ein Beispiel an. Aus den Übungen zu if-else-Bedingungen kennen wir diesen Code:

print('Willkommen zu meinem Ratespiel! Ich werde erraten, woran du denkst! Denke an ein Auto, einen Bär oder einen Menschen! Gib bitte immer ein ja oder nein als Antwort ein!\n')

aw = input('Ist es lebendig?\n')

if aw == 'nein':
    print('Es ist das Auto!\n')
else:
    if aw == 'ja':
        aw = input('Hat es vier Beine?\n')
        if aw == 'ja':
            print('Es ist der Bär!')
        else:
            print('Es ist der Mensch!\n')

Wenn du bei diesem Beispiel etwas anders als exakt “ja” oder “nein” eingibst, verlässt du den if-else-Block ohne Ausgabe. Jetzt ergänzen wir Prüfungsstrukturen:

#für mehr Übersicht bereiten wir ein paar Stringvariablen vor, die wir dann einfach einsetzen
ersterGruß = 'Willkommen zu meinem Ratespiel! Ich werde erraten, woran du denkst! Denke an ein Auto, einen Bär oder einen Menschen! Gib bitte immer ein ja oder nein als Antwort ein!\n'
fehlermeldung = "--- Fehler --- \n"+"Schreibe exakt 'ja' oder 'nein'. Also bitte noch mal:\n"

fehler = 1 #Prüfvariable am Anfang 1

while fehler == 1: #solange ein Fehler vorliegt, wiederholt sich die Schleife
    print(ersterGruß)
    aw = input("Ist es lebendig?")
    if aw == 'nein':
        fehler = 0 #kein Fehler
        print('Es ist das Auto!\n')
    elif aw == 'ja':
        aw = input('Hat es vier Beine?\n')
        if aw == 'ja':
            fehler = 0 #kein Fehler
            print('Es ist der Bär!')
        elif aw == "nein":
            fehler = 0 #kein Fehler --> verlasse nach diesem Block die Schleife
            print('Es ist der Mensch!\n')
        else:
            fehler = 1 #Fehler --> wiederhole Schleife
            print(fehlermeldung)
    else:
        fehler = 1 #Fehler --> wiederhole Schleife
        print(fehlermeldung)

Besonders wichtig ist die Zeile mit fehler = 1, hier nimmt die Prüfungsvariable den Wert 1 an. Damit wird der Anweisungsblock in der while-Schleife erneut durchlaufen, eben solange ein Fehler existiert. In den anderen Anweisungsblöcken, in die ich mit einer gültigen Bedingung hineingelangt bin, wird der fehler = 0 gesetzt. Damit ist dann aber die Bedingung der while-Schleife nicht mehr erfüllt, deshalb kann ich sie verlassen.

while-Schleifen statt for-Schleifen

Es ist möglichst, statt einer for-Schleife einfach eine while-Schleife zu kontruieren

Übungen

Übung 1

# Beispiel 1
k = 0
while k < 10:
  print(k)
  k += 1 #diese Stelle ist sehr wichtig! Ansonsten läuft dein Code endlos!

#Beispiel 2
for i in range(10):
    print(i)
  1. Probiere beide Codes aus. Du wirst feststellen, dass beide Codes genau die gleiche Ausgabe haben.
  2. Programmiere sowohl mit einer for- als auch while-Schleife einen Code, der 15 mal den gleichen Text ausgibt. (a)
  3. Beantworte die Fragen unten.

Übung 2

i = 1
while i < 8:
    if i == 5:
        break
    i += 1
print(i)
  1. Überlege, welchen Wert i haben könnte. Kommentiere anschließend den print()-Befehl aus und teste. Wie würdest du das erklären?
  2. Schreibe ein Skript, das i bis 20 iterieren würde, aber bei 14 aufhört. (a)
  3. Recherchiere, was der Befehl “continue” bei while-Schleifen bewirkt. Nutze ihn, um in einer while-Schleife alle Zahlen von 1 bis 100 zu überspringen, die durch 3 teilbar sind. Die Ausgabe soll also etwa so aussehen: 1,2,4,5,7,8,10,… (a)
  4. While-Schleifen können auch für den Fall, dass die Prüfbedingung nicht mehr stimmt, etwas ganz bestimmtes ausführen, bevor es einfach weitergeht. Prüfe den Code unten. Stimmt die Aussage?
k = 50
while k >= 0:
  print(k)
  k -= 1
else:
  print("k ist jetzt negativ!") #dieser else-Block gehört noch zur while-Schleife!

print("Du hast die Schleife offiziell verlassen.") #der Befehl kommt nach dem while-Block

Übung 3

Schreibe ein Skript, dass folgende Kriterien erfüllt (a):

  • Nimmt Eingaben des Nutzers per input() an.
  • Prüfe die Eingaben per while-Schleife.
  • Solange die Bedingung nicht erfüllt ist, wird der Nutzer oder die Nutzerin erneut gefragt.

[expand title = “Tipp anzeigen”]

eingabe = input("Frage an Nutzer:in")

while eingabe != "prüftext": #prüft die Variable eingabe mit Vergleichsoperatoren
    #dein Code hier. Wichtig: Denke daran, erneut nach input() zu fragen!

[/expand]

Übung 4

Insbesondere bei sich dynamisch und außerhalb des Loops ändernden Werten, bieten sich while-Loops an. Mit einer for-Schleife kann man bspw. nicht bzw. nicht sinnvoll mit Zeitpunkten oder Zeiträume umgehen.

  1. Analysiere den Code unten und stelle eine Vermutung auf, bevor du ihn ausführst.
  2. Führe den Code aus und beobachte. Was passiert? Schreibe Kommentare über die Blöcke oder hinter die Zeilen. (a)
  3. Ändere den Code so, dass er 20 Sekunden lang alle 3 Sekunden “tik” in der Konsole ausgibt.
  4. Schreibe verschiedene Codes mit while-Schleifen:
    1. Es wird abwechselnd “tik” und “tak” mit zeitlicher Verzögerung ausgegeben. (a)
    2. Eine Geschichte wird mit Pausen erzählt. Zwischendurch wird der Nutzer um eine Eingabe gebeten. (a)

Beispielcode

import time #importiere Modul time
ende = time.time()+20 # jetzt = time.time(), +20 jetzt+20

while time.time() < ende:
    print("..tik..")
    time.sleep(1) # time.sleep(x) Warte x Sekunden
    print("..tak..")
    time.sleep(1)

Übung 5 (extra)

Löse Aufgabe 3 mit if-else- und elif- Bedingungen mit Fallunterscheidungen. Überlege dir dazu ein sinnvolles Beispiel. (a, freiwillig)

2 Kommentare

  1. Zulaikha Rehman Zulaikha Rehman

    Tipp zu Aufgabe 2/2:
    Die Zahl soll vor continue erhöht werden ( i += 1), sonst funktioniert es nicht richtig.

    • Das ist ein guter Hinweis! Bei continue werden die nachfolgenden Befehle in der Schleife nicht mehr ausgeführt, stattdessen springt das Programm direkt an den Anfang der Schleife (wenn die Bedingung für continue erfüllt ist). Dieses Diagramm verdeutlicht das.

      statt also so etwas zu schreiben:

      i = 0
      while i < 6:
          if i == 3:
              continue
          print(i)
          i += 1
      

      solltest du die Schleife so gestalten:

      i = 0
      while i < 6:
          i += 1
          if i == 3:
              continue
          print(i)
      
      

      Probiere mal beide Varianten aus.

      Tipp für Nutzer:innen der Konsole/des Terminals:
      Mit Strg+C bzw. Cmd+C kannst du den laufenden Prozess beenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert