Ein frei kopier- und anpassbares Lehrmittel von eduskript.org

Entscheidungen treffen: if ... else

Lernziele
  • Sie verstehen, wie Sie mit if ... else Entscheidungen in Python treffen können.
  • Sie können Bedingungen mit and, or und not kombinieren.
  • Sie kennen die Präzedenzregeln für logische Operatoren: Klammern () vor not, not vor and, and vor or.
  • Sie können mit break aus einer Schleife vorzeitig aussteigen.

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.

PythonLoading editor…
wetter = "sonnig"
print( wetter == "regnerisch" ) # False
print( wetter == "sonnig" ) # True

Neben der Gleichheit können Sie in Bedingungen Werte auch anderweitig überprüfen:

  • != überprüft die Ungleichkeit von zwei Werten. Also "dies" != "das" ist True, weil die zwei Werte tatsächlich ungleich sind.
  • Vergleichsoperatoren >, >=, <=, < können Zahlenwerte vergleichen. Also 5 > 2 ist True.

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

PythonLoading editor…
wetter = "regnerisch"

if wetter == "sonnig":
    print("Vergessen Sie nicht, Sonnencreme aufzutragen!")
else:
    print("Besser einen Regenschirm mitnehmen!")

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, das 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.
PythonLoading editor…
for i in range(11):
    # Ihr code
Mögliche Lösung
for 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.

PythonLoading editor…
print ("8 % 3:", 8 % 3 ) # 8 durch 3 hat einen Rest von 2
print ("8 % 4:", 8 % 4 ) # 8 durch 4 hat einen Rest von 0
print ("Ist der Rest 0?", 8 % 4 == 0) # True, weil das stimmt ja

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).

PythonLoading editor…
# Beispielcode
ergebnis = []
print("Zuerst ist die Liste leer:", ergebnis)
ergebnis.append(9)
print("Dann hat die Liste ein Element erhalten:", ergebnis)
Mögliche Lösung
ergebnis = []
for i in range(1, 11):
    if i % 3 == 0:
        ergebnis.append(i)
print(ergebnis)

Der Modulo-Operator % liefert den Rest einer Division. Wenn i % 3 == 0, geht die Division restlos auf — also ist i durch 3 teilbar.

Aufgabe Modulo-Summe

Addieren Sie alle Zahlen bis 100, die restlos durch 3 teilbar sind, und speichern Sie das Ergebnis in der Variable summe.

PythonLoading editor…
summe = 0  # Ihr Code hier
Mögliche Lösung
summe = 0
for i in range(1, 101):
    if i % 3 == 0:
        summe = summe + i
print(summe)

Statt eine Liste zu füllen, addieren wir hier die passenden Zahlen direkt zu einer laufenden 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 regnet wahr ist, soll das Wort "Regenschirm" im Text vorkommen.
  • Wenn es nicht regnet, aber die temperatur grö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.

PythonLoading editor…
def wetter_beratung(temperatur, regnet):
    # Ihr Code hier
    return ""

# Zum Testen können Sie Werte einsetzen
print( wetter_beratung(30, False) )
print( wetter_beratung(15, True) )
print( wetter_beratung(15, False) )
Mögliche Lösung
def wetter_beratung(temperatur, regnet):
    if regnet:
        return "Nehmen Sie einen Regenschirm mit!"
    else:
        if temperatur > 25:
            return "Vergessen Sie die Sonnencreme nicht!"
        else:
            return "Eine Jacke schadet nicht."

Hier liegt die Schwierigkeit darin, dass regnet Vorrang hat. Wir prüfen es deshalb zuerst — und nur wenn es nicht regnet, schauen wir auf die Temperatur. Genauso elegant geht das auch mit elif, das Sie in der nächsten Lektion kennenlernen.

Boolesche Algebra

Sie können mehrere Wahrheitstests verbinden. Dazu helfen Ihnen folgende Schlagwörter:

and fragt, ob beide Wahrheitstests wahr sind

PythonLoading editor…
x = 5
print("x < 10:", x < 10 ) # True
print("x % 2 == 0:", x % 2 == 0) # False
print("Beides zusammen:", x < 10 and x % 2 == 0) # False, weil nicht beides True ist.

# Noch ein Beispiel
print("x < 10 or x % 5 == 0:", x < 10 or x % 5 == 0) # True, weil x ist sowohl kleiner als 10 als auch restlos durch 5 teilbar.

or fragt, ob einer der Wahrheitstests wahr ist

PythonLoading editor…
x = 5

print ( x < 10 or x % 2 == 0 ) # True, weil x ist kleiner als 10. Das reicht für or bereits.

print ( x < 3 or x % 5 == 0 ) # True, weil x ist zwar nicht kleiner als 3, aber dafür restlos durch 5 teilbar.

not kehrt den Wahrheitswert um

PythonLoading editor…
x = 5
print ("normal:", x == 5 )
print ("mit not:", not x == 5 )

Klammern

Sie können auch Klammern verwenden, um die Reihenfolge der Auswertung zu steuern. Das ist besonders wichtig, wenn Sie mehrere Bedingungen kombinieren.

PythonLoading editor…
for i in range(51):
    if (i % 3 == 0 or i % 4 == 0) and i > 10:
        print(i)

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 Mengenlehre 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.

PythonLoading editor…
def filter_zahlen():
    ergebnis = []

    # Geht die Zahlen von 1 bis 20 durch
    for i in range(1, 21):
        if i % 2 == 0 or not i % 3 == 0:
            ergebnis.append(i)

    return ergebnis

print(filter_zahlen())
Mögliche Lösung
def filter_zahlen():
    ergebnis = []
    for i in range(1, 21):
        if i % 2 == 0 and not i % 3 == 0:
            ergebnis.append(i)
    return ergebnis

print(filter_zahlen())

Der Trick: or macht den Filter viel zu locker — fast jede Zahl erfüllt mindestens eine der beiden Bedingungen. Mit and müssen beide gleichzeitig wahr sein, und genau das war gewünscht.

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.

PythonLoading editor…
ergebnis = []  # Ihr Code hier
Mögliche Lösung
ergebnis = []
for i in range(1, 51):
    if i % 3 == 0 and i % 4 == 0:
        ergebnis.append(i)
print(ergebnis)

Eine Zahl, die sowohl durch 3 als auch durch 4 teilbar ist, ist genau dann ein Vielfaches von 12 — was hier sichtbar wird: [12, 24, 36, 48].

Modulo Bingo 1

Schreiben Sie ein Programm, das 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.

PythonLoading editor…
# Ihr Code
Lösung

Eine 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.

PythonLoading editor…
summe = 0  # Ihr Code hier
Mögliche Lösung
summe = 0
for i in range(1, 101):
    if i % 5 == 0 and not i % 3 == 0:
        summe = summe + i
print(summe)

Zwei Bedingungen mit and verknüpft: durch 5 teilbar und nicht durch 3 teilbar. Damit fallen z.B. 15, 30, 45 (alle durch 15 teilbar) aus der Summe.

Schleifen vorzeitig beenden mit break

Bevor wir zur nächsten Aufgabe kommen, lernen wir noch ein nützliches neues Schlagwort: break.

Stellen Sie sich vor, Sie suchen in einer Liste nach einem bestimmten Wert. Sobald Sie ihn gefunden haben, wäre es Verschwendung, die Schleife weiterlaufen zu lassen — Sie haben ja schon, was Sie wollten. Genau das macht break: sobald break ausgeführt wird, springt das Programm sofort aus der Schleife heraus, auch wenn range(...) noch viel mehr Werte hätte.

PythonLoading editor…
for i in range(1, 100):
    print("Prüfe i =", i)
    if i == 5:
        print("Gefunden!")
        break
print("Schleife beendet, weiter geht's im Hauptprogramm.")

Beachten Sie: Das Programm prüft i = 1, 2, 3, 4, 5 — und sobald i == 5 ist, wird break ausgeführt. Die Werte 6, 7, ..., 99 werden gar nicht mehr durchlaufen. break ist also ein eleganter Notausgang aus einer Schleife.

Aufgabe mit grossen Zahlen

Was ist die kleinste Zahl ii, bei der gilt:

  • imod113=1i \mod{113} = 1
  • imod213=2i \mod{213} = 2
  • imod313=3i \mod{313} = 3

Speichern Sie das Ergebnis in der Variable ergebnis.

Tipp: Sobald Sie die passende Zahl gefunden haben, brauchen Sie nicht weiter zu suchen. Nutzen Sie break, um die Schleife zu verlassen.

PythonLoading editor…
ergebnis = 0  # Ihr Code hier
Mögliche Lösung
for i in range(10_000_000):
    if i % 113 == 1 and i % 213 == 2 and i % 313 == 3:
        ergebnis = i
        break

print(ergebnis)

Wir gehen mit for einfach alle Zahlen ab 0 durch und prüfen alle drei Bedingungen gleichzeitig. Sobald wir die erste passende Zahl gefunden haben, beendet break die Schleife sofort — andernfalls würde Python noch bis 10'000'000 weitersuchen und alle weiteren (uninteressanten) Werte abklappern.

Hinweis: Die obere Grenze 10_000_000 ist hier künstlich gewählt — wir wissen ja nicht, wo genau die Zahl liegt. In der nächsten Lektion lernen Sie mit der while-Schleife eine elegantere Variante, bei der man die obere Grenze gar nicht erst festlegen muss.

Zusammenfassung

Zusammenfassung

if ... else-Selektion

Selektionen funktionieren immer mit Bedingungen (oft auch Wahrheitstests genannt), die entweder True (wahr) oder False (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 ist

Vergleichsoperatoren

  • Zwei Gleichheitszeichen == sind ein Vergleich (Frage). Ein einzelnes = ist eine Wertzuweisung (Befehl) — in einer if-Bedingung gibt das einen SyntaxError.
    x = "beispielwert"             # Zuweisung
    if x == "beispielwert":        # Vergleich
        print("gleich!")
    
  • != prüft auf Ungleichheit: "dies" != "das" ist True.
  • <, >, <=, >= vergleichen Zahlen: 5 > 2 ist True.

Boolesche Algebra (and, or, not)

Mehrere Wahrheitstests lassen sich verknüpfen:

  • and ist nur True, wenn beide Seiten True sind.
  • or ist True, sobald mindestens eine Seite True ist.
  • not kehrt einen Wahrheitswert um.

Präzedenz (von hoch nach niedrig): Klammern ()notandor. 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

break

Mit break können Sie eine Schleife sofort verlassen — auch wenn range(...) noch weitere Werte liefern würde. Praktisch, sobald Sie das gesuchte Resultat gefunden haben:

for i in range(1, 1000):
    if i * i > 100:
        print("Erste Zahl, deren Quadrat > 100:", i)
        break