Level 1: Mehrere Bedingungen besser überprüfen #
Das Problem #
Lass uns noch einmal einen Blick auf das 42er-Begrüßungsprogramm werfen. Wenn du in Thonny den Debug-Modus startest (die Schaltfläche mit dem Käfer), kannst du das Programm Schritt für Schritt ausführen und genau sehen, was passiert. Klicke auf den Käfer, und sieh’ dir durch wiederholtes Drücken der Taste F7 genau an, was passiert. (Etwas schneller geht es mit F6.)
# Hier wird begrüßt
name = input('Wie heißt Du? ')
print('Hallo', name)
# Jetzt fragen wir nach dem Alter und rechnen die Wartezeit aus
alter = input('Wie alt bist du? ')
zeit_bis_42 = 42 - int(alter)
# Hierher kommen unsere Bedingungen:
if zeit_bis_42 > 0:
print(name + ' muss noch ' + str(zeit_bis_42) + ' Jahre warten.')
if zeit_bis_42 == 0:
print(name + ' ist im besten Programmier_innenalter!')
if zeit_bis_42 < 0:
pass
Sicher hast du gesehen, dass jeder Fall, den wir behandeln (jünger als 42, 42, älter als 42) überprüft wird. (Jedes if
wird angesteuert, und die Bedingung ausgewertet.) Eigentlich ist das unnötig! Wer jünger als 42 ist, ist nicht genau 42 und auch nicht älter als 42!
Dass der Computer sich hier dreimal mehr Arbeit macht als erforderlich, ist kein großes Problem – unser Programm wird trotzdem sehr schnell ausgeführt. Stell’ dir aber einmal vor, wir müssten eine Liste mit einigen Millionen Einträge durchgehen, und wollten vielleicht noch mehr Bedingungen abprüfen; oder wir müssten sehr schnell viele Eingaben auf einem Server überprüfen – hier wäre die zusätzliche Wartezeit spürbar (und noch immer unnötig).
Es gibt zum Glück eine Möglichkeit, diese zusätzlichen Überprüfungen zu vermeiden. In Python gibt es neben dem Schlüsselwort if
das Schlüsselwort elif
(eine Zusammenziehung von »else« und »if«) und das Schlüsselwort else
. Nach einem mit if
eingeleiteten Block kann also einer mit elif
folgen; dieser wird nur ausgeführt, wenn die zuerst (mit if
abgeprüfte) Bedingung zu False
ausgewertet wurde. Es lassen sich auch mehrere elif
-Blöcke hintereinander schreiben, diese werden der Reihe nach abgearbeitet. Zum Schluss einer solchen Abfragekaskade kann ein mit else
eingeleiteter Block stehen. Bei diesem wird keine Bedingung benötigt, und er wird ausgeführt, falls alle anderen Bedingungen, die zuvor abgeprüft wurden, nicht zutrafen (alle zu False
ausgewertet).
Die Lösung #
Wir können also unser Programm verbessern, wenn wir nicht dreimal neu mit if
ansetzen, sondern die Bedingungsüberprüfungen mit if
– elif
– else
verbinden:
# Hier wird begrüßt
name = input('Wie heißt Du? ')
print('Hallo', name)
# Jetzt fragen wir nach dem Alter und rechnen die Wartezeit aus
alter = input('Wie alt bist du? ')
zeit_bis_42 = 42 - int(alter)
# Hierher kommen unsere Bedingungen:
if zeit_bis_42 > 0:
print(name + ' muss noch ' + str(zeit_bis_42) + ' Jahre warten.')
elif zeit_bis_42 == 0:
print(name + ' ist im besten Programmier_innenalter!')
else:
pass
Die beiden letzten Zeilen könnten eigentlich weggelassen werden, oder wir erzeugen noch eine Ausgabe für den letzten Fall, z.B. so:
else:
print('Einen schönen Tag noch!')
Übung #
Erweitere Davids Tore-Programm so, dass das Ergebnis des Spiels ausgegeben wird (»Die Heimmannschaft hat gewonnen.«, »Die Gastmannschaft hat gewonnen.« oder »Unentschieden.«)!
tore_heim = input('Wie viele Tore erzielte die Heimmannschaft? ')
tore_ausw = input('Wie viele Tore erzielte die Auswärtsmannschaft? ')
tore_insgesamt = int(tore_heim) + int(tore_ausw)
print('Es wurden insgesamt ' + str(tore_insgesamt) + ' Tore erzielt.')
# Wenn mehr als fünf Tore gefallen sind, soll der Satz ausgegeben werden:
# 'Das war eine aufregende und torreiche Partie!'
if tore_insgesamt > 5:
print('Das war eine aufregende und torreiche Partie!')
# Nun fehlt noch eine Ausgabe für den Gewinner oder unentschiedene Partien:
Lösungsvorschlag
tore_heim = input('Wie viele Tore erzielte die Heimmannschaft? ')
tore_ausw = input('Wie viele Tore erzielte die Auswärtsmannschaft? ')
tore_insgesamt = int(tore_heim) + int(tore_ausw)
print('Es wurden insgesamt ' + str(tore_insgesamt) + ' Tore erzielt.')
# Wenn mehr als fünf Tore gefallen sind, soll der Satz ausgegeben werden:
# 'Das war eine aufregende und torreiche Partie!'
if tore_insgesamt > 5:
print('Das war eine aufregende und torreiche Partie!')
# Nun fehlt noch eine Ausgabe für den Gewinner oder unentschiedene Partien:
if tore_heim > tore_ausw:
print('Die Heimmannschaft hat gewonnen!')
elif tore_heim < tore_ausw:
print('Die Gastmannschaft hat gewonnen!')
else:
print('Das Spiel endete unentschieden.')