Level 2: Wiederholungen mit Bedingung #
Ein Kamel #
Mit der for-Wiederholungen können wir eine feste Anzahl an Wiederholungen vorgeben. Doch wie sieht es mit Wiederholungen aus, von denen wir noch gar nicht wissen, wie oft sie nötig sein werden?
Lege eine Datei geduld.py
an, und übernimm diesen Code:
geduld = 5
while (geduld > 0):
antwort = input('Hast Du noch Geduld? (j/n): ')
if antwort == 'j':
print('Wie schön!')
else:
print('Gib nicht auf!')
geduld -= 1
print('Kennst Du dieses arabische Sprichwort?')
print('Geduld und Humor sind zwei Kamele, die Dich durch jede Wüste bringen.')
Überlege, was wohl passieren wird. Lass das Programm dann laufen und überprüfe deine Erwartung.
Sollte übrigens etwas anderes passieren, als du erwartet hast, lohnt sich der so genannte Debug-Modus von Thonny. Er lässt sich mit einem Klick auf den Käfer starten (oder mit Strg+F5
). Wenn Du dann F7
(wiederholt) drückst, lässt sich gut nachvollziehen, was gerade passiert.
Und was ist nun passiert? #
Du hast sicher schon erraten, dass while
(engl. für »während«) hier das wichtige Schlüsselwort ist. Mit diesem Schlüsselwort zusammen wird eine Bedingung überprüft. Bedingungen kennst Du schon: nach einem if
wird ebenfalls eine Bedingung überprüft. Nur sagen wir jetzt nicht »Wenn dieses, dann tue jenes.«, sondern wir sagen »Solange diese Bedingung erfüllt ist, tue immer wieder…« Genau das geschieht im Programm. Solange die Geduld noch nicht erschöpft ist, wird immer wieder nachgefragt. Wird verneint, wird die Geduld weniger. Ist sie aufgebraucht, ist die Bedingung geduld > 0
nicht mehr erfüllt – diese Überprüfung wird also zu False
ausgewertet. Endlich kann die Wiederholung (man spricht auch von einer Schleife) verlassen werden.
Nein, du legst auf! #
Sieh’ dir nun diese Schleife an. Überlege, was geschehen wird, bevor du das Programm ausführst.
verbunden = True
while verbunden:
print('Schatzi (am Telefon): Du legst auf.')
print()
print('Was machst du?')
antwort = input('a: Du sagst "Nein, du legst auf!" oder b: du legst auf (a/b)')
if antwort == 'a':
print('Du: Nein, du legst auf!')
elif antwort == 'b':
verbunden = False
Was geschieht hier? #
Wahrheitswerte lassen sich auch direkt in Variablen abspeichern! Hier wird die Variable verbunden
als erstes auf True
gesetzt. Damit kannst du solange in der while
-Wiederholung bleiben, wie du möchtest. Wenn du die Wiederholung verlassen möchtest, genügt es, die Variable auf False
zu setzen! (Schatzi scheint hier sehr ausdauernd zu sein…)
Übung: Eine Eingabe mit einer While-Wiederholung absichern #
Sieh’ dir nochmal den Persönlichkeitstest aus Level 1 an: wurde etwas anderes als a, b, c oder d eingeben, wurde eine Meldung ausgegeben, dass die Eingabe nicht verstanden wurde. Mit einer while
-Wiederholung könntest du so oft nachfragen lassen, bis eine gültige Antwort gegeben wurde.
Übernimm folgenden Code in eine Datei absicherung.py
. Füge an geeigneter Stelle eine while
-Wiederholung hinzu, so dass sichergestellt wird, dass eine gültige Antwort eingegeben wird.
# Ergänze eine Absicherung im Code: Wenn die Eingabe nicht verstanden wurde,
# soll wiederholt nachgefragt werden.
print('Herzlich Willkommen zum Persönlichkeitstest: Hunde- oder Katzentyp?')
print('Wie viele der folgenden Hundetypen kennst Du?')
print('Schäferhund | Irish Setter | Goofy')
antwort = input('a: 0, b: 1, c: 2, d: 3 . Deine Eingabe (a,b,c,d): ')
hundepunkte = 0
# Hilfreich könnte diese Variable sein:
antwort_verstanden = False
# Dieser Abschnitt sollte wiederholt werden, bis die Antwort verstanden wurde!
if antwort == 'a':
# Was muss hier mit der Variable antwort_verstanden passieren?
pass
elif antwort == 'b':
hundepunkte += 1
# Und hier?
elif antwort == 'c':
hundepunkte += 5
# Und hier?
elif antwort == 'd':
hundepunkte -= 5
# Und auch hier?
else:
# Die nächste Zeile muss verändert werden.
# Können wir eine neue Antwort in der Variable antwort speichern?
print('Diese Antwort habe ich nicht verstanden. Antworte bitte mit a, b, c oder d.')
if hundepunkte > 0:
print('Du bist wahrscheinlich ein Hundetyp!')
else:
print('Du bist wohl eher ein Katzentyp!')
Tipp 1
Hilfreich könnte das Schlüsselwort not
sein. Dieses Wort verkehrt die Auswertung einer Bedingung ins Gegenteil, wie hier zum Beispiel:
>>> hungrig = True
>>> not hungrig
False
Tipp 2
while
-Wiederholung wiederholt werden soll, einzurücken! Wird innerhalb des Blockes dann z.B. mit if
eine Bedingung überprüft, muss der folgende Block noch einmal eingerückt werden. (Das lässt sich fast beliebig oft wiederholen, wird aber irgendwann unübersichtlich…)
Tipp 3
Wenn du die Variable antwort_verstanden
nutzt, hast du vermutlich die Bedingung der while
-Wiederholung mit while not antwort_verstanden
formuliert.
Damit die Wiederholung irgendwann verlassen werden kann, muss die Variable, wenn die Antwort verstanden wurde, also auf True
gesetzt werden:
while not antwort_verstanden:
if antwort == 'a':
antwort_verstanden = True
# weiterer Code…
Tipp 4
Wurde die Antwort nicht verstanden, müssen wir sie erneut einlesen und zuweisen:
antwort = input('Diese Antwort habe ich nicht verstanden. Antworte bitte mit a, b, c oder d.')
Lösungsvorschlag
# Ergänze eine Absicherung im Code: Wenn die Eingabe nicht verstanden wurde,
# soll wiederholt nachgefragt werden.
print('Herzlich Willkommen zum Persönlichkeitstest: Hunde- oder Katzentyp?')
print('Wie viele der folgenden Hundetypen kennst Du?')
print('Schäferhund | Irish Setter | Goofy')
antwort = input('a: 0, b: 1, c: 2, d: 3 . Deine Eingabe (a,b,c,d): ')
hundepunkte = 0
# Erst wenn wir die Antwort verstanden haben, ist das wahr
antwort_verstanden = False
# Dieser Abschnitt sollte wiederholt werden, bis die Antwort verstanden wurde!
while not antwort_verstanden:
if antwort == 'a':
antwort_verstanden = True
elif antwort == 'b':
hundepunkte += 1
antwort_verstanden = True
elif antwort == 'c':
hundepunkte += 5
antwort_verstanden = True
elif antwort == 'd':
hundepunkte -= 5
antwort_verstanden = True
else:
antwort = input('Diese Antwort habe ich nicht verstanden. Antworte bitte mit a, b, c oder d.')
# Die Auswertung bleibt unverändert
if hundepunkte > 0:
print('Du bist wahrscheinlich ein Hundetyp!')
else:
print('Du bist wohl eher ein Katzentyp!')