Entscheidungen treffen: if ... else
Lernziele
- Sie verstehen, wie Sie mit
if ... elseEntscheidungen in Python treffen können.- Sie können Bedingungen mit
and,orundnotkombinieren.- Sie kennen die Präzedenzregeln für logische Operatoren: Klammern
()vornot,notvorand,andvoror.
Wenn wir in Python programmieren, nutzen wir oft if-Anweisungen, um Entscheidungen zu treffen. Das ist so, als würden wir im echten Leben sagen: "Wenn es regnet, dann nehme ich einen Regenschirm mit."
Vergleich mit if
Wie setzen wir das in Python um?
Syntax
if Bedingung:
# Auszuführende Anweisungen, wenn die Bedingung True (wahr) ist
Beispiel
wetter = "sonnig"
if wetter == "sonnig":
print("Vergessen Sie nicht, Sonnencreme aufzutragen!")
if wetter == "regnerisch":
print("Nehmen Sie einen Regenschirm mit!")
In diesem Beispiel wird die Nachricht nur dann ausgegeben, wenn die Variable wetter den String "sonnig" enthält. Die Bedingung wetter == "sonnig" wird ausgewertet und ist entweder True (wahr) oder False (falsch). Die Befehle im if-Block werden ausgeführt, wenn die Bedingung True ist, nicht aber, wenn sie False ist.
Beachten Sie, dass zwei Gleichheitszeichen verwendet werden:
- Ein einzelnes Gleichheitszeichen
=ist beim Programmieren kein Vergleich, sondern eine Wertzuweisung — es ist ein Befehl. - Zwei Gleichheitszeichen
==sind ein Vergleich. Also eine Frage, ob zwei Werte gleich sind.
Bevor wir im Programmcode weiterarbeiten: Was schätzen Sie, passiert, wenn wir in einer if-Bedingung versehentlich nur ein Gleichheitszeichen verwenden, also if wetter = "sonnig": schreiben?
Die booleschen Werte von Bedingungen können Sie direkt mit print() ausdrucken.
Neben der Gleichheit können Sie in Bedingungen Werte auch anderweitig überprüfen:
!=überprüft die Ungleichkeit von zwei Werten. Also"dies" != "das"istTrue, weil die zwei Werte tatsächlich ungleich sind.- Vergleichsoperatoren
>,>=,<=,<können Zahlenwerte vergleichen. Also5 > 2istTrue.
Und sonst? if ... else
Manchmal möchten wir nicht nur eine Aktion ausführen, wenn eine Bedingung wahr ist, sondern auch eine alternative Aktion, falls die Bedingung nicht erfüllt wird. Für solche Fälle verwenden wir die if ... else-Struktur.
Syntax
if Bedingung:
# Auszuführende Anweisungen, wenn die Bedingung True (wahr) ist
else:
# Auszuführende Anweisungen, wenn die Bedingung False (falsch) ist
Beispiel
In diesem Beispiel wird die erste Nachricht ausgegeben, wenn das Wetter "sonnig" ist. Falls das Wetter jedoch nicht "sonnig" ist (also die Bedingung wetter == "sonnig" nicht erfüllt ist), wird die zweite Nachricht ausgegeben. Sie können den Wert ändern, um das Verhalten des Programms zu ändern.
Aufgabenteil 1
Aufgabe for-print
Schreiben Sie ein Programm, dass alle Zahlen von 0 bis 10 durchgeht und mit print() ausdruckt.
- Bei 5 soll das Programm zusätzlich "Wir sind in der Hälfte!" ausdrucken.
- Bei allen Zahlen die grösser als 7 sind, soll das Programm zusätzlich "Fast geschafft!" ausdrucken.
Mögliche Lösungfor i in range(11): print(i) if i == 5: print("Wir sind in der Hälfte!") if i > 7: print("Fast geschafft!")
Aufgabe Modulo
Den Rest einer Division können Sie mit dem "Modulo"-Operator % ausrechnen.
Schreiben Sie ein Programm, das alle Zahlen von 1 bis 10 in eine Liste ergebnis speichert, die restlos durch 3 teilbar sind. Tipp: Sie können der Liste die Zahl 9 hinzufügen mit ergebnis.append(9).
Aufgabe Modulo-Summe
Addieren Sie alle Zahlen bis 100, die restlos durch 3 teilbar sind, und speichern Sie das Ergebnis in der Variable summe.
Challenge: Smarte Wetterberatung
Nutzen Sie Ihr Wissen über if ... else, um eine automatische Beratung zu programmieren, die dynamisch auf Situationen reagieren kann.
Schreiben Sie eine Funktion wetter_beratung(temperatur, regnet). Die Funktion soll einen Text (String) zurückgeben (return):
- Wenn die Variable
regnetwahr ist, soll das Wort "Regenschirm" im Text vorkommen. - Wenn es nicht regnet, aber die
temperaturgrösser als 25 ist, soll das Wort "Sonnencreme" im Text enthalten sein. - Andernfalls (es regnet nicht, und es sind 25 Grad oder weniger) soll das Wort "Jacke" vorkommen.
Hier gibt es viele richtige Lösungswege! Sie können mehrere if-Entscheidungen nacheinander prüfen oder miteinander verschachteln.
Boolesche Algebra
Sie können mehrere Wahrheitstests verbinden. Dazu helfen Ihnen folgende Schlagwörter:
and fragt, ob beide Wahrheitstests wahr sind
or fragt, ob einer der Wahrheitstests wahr ist
not kehrt den Wahrheitswert um
Klammern
Sie können auch Klammern verwenden, um die Reihenfolge der Auswertung zu steuern. Das ist besonders wichtig, wenn Sie mehrere Bedingungen kombinieren.
In diesem Beispiel wird zuerst die Bedingung in den Klammern ausgewertet. Wenn diese wahr ist, wird die zweite Bedingung geprüft.
Präzedenzregeln
Bevor wir uns die genauen Regeln ansehen: Was werten Sie intuitiv aus diesem Ausdruck heraus?
not (5 > 3 or 2 == 2)
Es gelten bei Bedingungen klare Präzedenzregeln für logische Operatoren, ähnlich wie "Punkt vor Strich" in der Mathematik:
- Klammern
()haben immer die höchste Priorität (und können auch verwendet werden, um die Lesbarkeit und Logik eindeutig zu machen). - Danach kommt
not(höchste Präzedenz unter den logischen Operatoren), - dann
and, - und zuletzt
or(niedrigste Präzedenz).
Beispiel:
if a == 1 or b == 2 and c == 3:
Das wird interpretiert als:
if a == 1 or (b == 2 and c == 3):
Denn and wird vor or ausgewertet.
Mengenlehre
Sie kennen die Logik von or, and und not von den Logikgates, die wir zu einem Addierer verbaut haben. In der Mathematik kennen Sie das vielleicht aus der Mengelehre unter dem Schlagwort "boolesche Algebra".
Entsprechend heissen die Datentypen von True und False auch "boolesche Werte" oder einfach "bool".
Aufgabenteil 2
Bug-Hunt: Der Filterfehler
Wir möchten eine Funktion schreiben, die uns alle Zahlen von 1 bis 20 in eine Liste verpackt. Unsere Anforderung lautet: Die Zahlen müssen durch 2 teilbar sein, dürfen aber gleichzeitig nicht durch 3 teilbar sein.
Im folgenden Code hat sich ein logischer Fehler bei der Filterung eingeschlichen. Wenn Sie den Code laufen lassen, filtert er viel zu ungenau. Finden und beheben Sie den Fehler!
Tipp: Schauen Sie sich genau an, auf welche Art die beiden Regeln verknüpft sind.
Aufgabe mit zwei Modulo
Finden Sie alle Zahlen bis 50, die restlos sowohl durch 3 als auch durch 4 teilbar sind, und speichern Sie diese in der Liste ergebnis.
Modulo Bingo 1
Schreiben Sie ein Programm, dass alle Zahlen bis 20 überprüft.
- Wenn die Zahl nur durch 3 teilbar ist, drucken Sie "Drei" aus
- Wenn die Zahl nur durch 4 teilbar ist, drucken Sie "Vier" aus
- Wenn die Zahl sowohl durch 3 als auch durch 4 teilbar ist, drucken Sie "BINGO!" aus
- Ansonsten drucken Sie die Zahl selbst aus
Beachten Sie: Es gibt grundsätzlich zwei mögliche Lösungen.
LösungEine Lösung wäre, unabhängige
if-Selektionen zu machen.for i in range(1, 21): if i % 3 == 0 and not i % 4 == 0: print("Drei") if i % 4 == 0 and not i % 3 == 0: print("Vier") if i % 3 == 0 and i % 4 == 0: print("BINGO!") if not i % 3 == 0 and not i % 4 == 0: print(i)Das ist nicht sehr elegant und ineffizient: Der Computer überprüft immer alle Bedingungen! In der nächsten Lektion finden Sie eine elegantere Lösung.
Erklärvideo
Aufgabe kompliziertere Modulo-Summe
Addieren Sie alle Zahlen bis 100 auf, die zwar restlos durch 5 teilbar sind, aber nicht restlos durch 3 teilbar sind, und speichern Sie das Ergebnis in der Variable summe.
Aufgabe mit grossen Zahlen
Was ist die kleinste Zahl , bei der gilt:
Speichern Sie das Ergebnis in der Variable ergebnis.
Zusammenfassung
Zusammenfassung
if ... else-SelektionSelektionen funktionieren immer mit Bedingungen (oft auch Wahrheitstests genannt), die entweder
True(wahr) oderFalse(falsch) sind. Je nachdem werden andere Teile des Programms ausgeführt.if Bedingung: # Auszuführende Anweisungen, wenn die Bedingung True ist else: # Auszuführende Anweisungen, wenn die Bedingung False istVergleichsoperatoren
- Zwei Gleichheitszeichen
==sind ein Vergleich (Frage). Ein einzelnes=ist eine Wertzuweisung (Befehl) — in einer if-Bedingung gibt das einenSyntaxError.x = "beispielwert" # Zuweisung if x == "beispielwert": # Vergleich print("gleich!")!=prüft auf Ungleichheit:"dies" != "das"istTrue.<,>,<=,>=vergleichen Zahlen:5 > 2istTrue.Boolesche Algebra (
and,or,not)Mehrere Wahrheitstests lassen sich verknüpfen:
andist nurTrue, wenn beide SeitenTruesind.oristTrue, sobald mindestens eine SeiteTrueist.notkehrt einen Wahrheitswert um.Präzedenz (von hoch nach niedrig): Klammern
()→not→and→or. Im Zweifel Klammern setzen — das macht die Logik für Sie und für Mitlesende eindeutig.Modulo
Den Rest einer Division berechnen Sie mit
%:print( 10 % 3 ) # 1 (10 / 3 = 3 Rest 1) print( 8 % 4 ) # 0 (8 / 4 geht restlos auf) print( 8 % 4 == 0 ) # True — Test, ob restlos teilbar