If, else, elif#

Wenn dies, dann das - If-Statements mit if.#

Nun haben wir uns sehr genau einen bestimmten Bestandteil der If-Statements angeschaut. Kommen wir nun dazu, If-Statements als Ganzes zu benutzen, um damit die Ausführung unseres Codes situationsspezifisch zu steuern. Wie oben bereits gezeigt, besteht ein If-Statement im einfachsten Fall aus zwei Bestandteilen: dem Wenn-Teil und dem Dann-Teil.

Der Wenn-Teil beginnt mit dem Schlüsselwort if und endet mit einem :. Dazwischen, also dort wo unten der Platzhalter THIS_STATEMENT_IS_TRUE steht, muss ein boolscher Ausdruck stehen. Ist der boolsche Ausdruck wahr d.h. wird er letztlich auf den Wert True reduziert, dann wird der eingerückte Codeblock darunter ausgeführt. Wenn der boolsche Ausdruck falsch ist, dann wird der eingerückte Codeblock einfach ignoriert. Die Bedingung dafür, dass der Codeblock ausgeführt wird, ist also dass der boolsche Ausdruck wahr ist.

if THIS_STATEMENT_IS_TRUE: # Wenn-Teil
    DO_THAT                # Dann-Teil

Schauen wir uns das an einem konkreten Beispiel an. Wie wir oben gelernt haben, sind die einfachsten boolschen Ausdrücke einfach die beiden Wahrheitswerte True und False selbst. Füge ich also als boolschen Ausdruck in ein If-Statement z.B. einfach ein True ein, dann ist das eine wahre Aussage, sodass die Bedingung erfüllt ist und somit der Codeblock des If-Statements ausgeführt wird:

if True:
    print("Diese Aussage ist wahr!")
Diese Aussage ist wahr!

Setzen wir stattedessen die einfachst mögliche falsche Aussage - ein False - ein, dann ist die Bedingung der wahren Aussage nicht erfüllt, wodurch der eingerückte Codeblock ignoriert wird. Es passiert dann einfach ertmal gar nichts:

if False:
    print("Diese Aussage ist wahr!")

Natürlich ist es etwas sinnlos, wenn man in If-Statements direkt einen nicht weiter zu reduzierenden Wahrheitswert einsetzt. Unten setze ich daher beispielhaft einen Vergleich als boolschen Ausdruck ein:

if 1 < 2:
    print("Diese Aussage ist wahr!")
Diese Aussage ist wahr!

Da die Aussage “1 ist kleiner 2” natürlich wahr ist, wird der eingerückte Codeblock ausgeführt. Aber natürlich machen auch If-Statements erst wieder wirklich Sinn, wenn die Wahrheit oder Falschheit der Bedingung nicht schon bereits zum Zeitpunkt der Programmierung klar ist bzw. für jeden Fall gleich ist. If-Statements machen v.a. Sinn, wenn sich das Programm in spezifischen Situationen spezfisch verhalten soll.

Im untigen Beispiel wird innerhalb eines For-Loops die Liste age_list durchgegangen und für jedes Element in einem If-Statement erfragt, ob es größer als 40 ist. Wenn das Element größer als 40 ist und somit die Bedingung des If-Statements erfüllt ist, wird das Element an die anfangs noch leere Liste Ü40 angehängt.

# Daten
age_list = [25, 39, 45, 61]

Ü40 = []

# für jedes Alter
for age in age_list:
    # wenn größer 40
    if age > 40:
        # an die Liste Ü40 anhängen
        Ü40.append(age)

Und wir sehen, dass sich in der Liste Ü40 nun alle Elemente größer 40 befinden:

Ü40
[45, 61]

Nein? Dann das! If-Statements mit else.#

Wir können nun If-Statements schreiben, welche bestimmten Code ausführen, sobald eine Bedingung erfüllt ist. Falls die Bedingung allerdings nicht erfüllt ist, dann passiert in unseren bisherigen If-Statements einfach gar nichts. Manchmal ist es aber sehr praktisch auch bei Nicht-Erfüllung der Bedingung etwas auszuführen - nur dann eben etwas anderes. Das können wir in Python mit dem Schlüsselwort else. Mit else können wir unseren Wenn-Dann-Satz praktisch um einen “Ansonsten”-Teil erweitern, welcher eintritt, wenn die Bedingung nicht zutrifft. Ein Beispiel aus dem Alltag: Wenn das Paket heute ankommt, dann freue ich mich, ansonsten bin ich sehr traurig.

Allgemein formuliert können wir unser If-Statement also wie folgt erweitern:

if THIS_STATEMENT_IS_TRUE: 
    DO_THAT               
else:
    DO_THAT_INSTEAD      

Ein konkretes Beispiel: Der folgende Code prüft mithilfe der Funktion type(), inwiefern die Variable element vom Datentyp str ist. Wenn die Variable element vom Typ str ist, dann soll "String!" angezeigt werden, ist sie nicht vom Typ str, soll hingegen "Kein String!" angezeigt.

element = 10

if type(element) == str:
    print("String!")
else:
    print("Kein String!")
Kein String!

Da die Variable element den Wert 10 aufweist, vom Typ int ist und somit nicht vom Typ str, wird die aufgestellte Bedingung nicht erfüllt. Daher springt Python direkt zum Ansonsten-Teil und führt den zugehörigen Code-Block aus. Im nächsten Beispiel ist die Variable element nun vom Typ str. Die Bedingung des Wenn-Teils wird also erfüllt und der entsprechende Dann-Teil ausgeführt. Dadurch wird diesmal der Ansonsten-Teil ignoriert.

element = "python"

if type(element) == str:
    print("String!")
else:
    print("Kein String!")
String!

Im Folgenden sollen die Elemente der Liste stuff danach sortiert werden, ob sie vom Datentyp str sind oder nicht. Daher wird innerhalb eines For-Loops die Liste stuff durchgegangen und für jedes Element geprüft, ob dieses vom Typ str ist. Falls dies der Fall ist, wird das entsprechende Element an die Liste strings angehängt. Wenn dies nicht der Fall ist, wird das entsprechende Element an die Liste no_strings angehängt.

# zu sortierende Liste
stuff = [10,"python", 1.2, True, "15", "Zwanzig", str]

# leere Listen erstellen
strings = []
no_strings = []

# für jedes Element der Liste stuff
for element in stuff:
    # wenn das Element ein String ist
    if type(element) == str:
        # an Liste strings anhängen
        strings.append(element)
    # Ansonsten
    else:
        # an Liste no_strings anhängen
        no_strings.append(element)
strings
['python', '15', 'Zwanzig']
no_strings
[10, 1.2, True, str]

Nein? Dann vielleicht das hier? If-Statements mit elif.#

Mit if und else können wir angeben, was passieren soll, wenn ein bestimmter Fall eintritt und was passieren soll, wenn dieser bestimmte Fall nicht eintritt. Was ist aber, wenn wir nicht nur zwischen das und nicht das, sondern feiner zwischen verschiedenen Fällen differenzieren wollen? Dann brauchen wir elif! Mit elif können wir unserem If-Statement weitere Bedingungen hinzufügen. Diese werden geprüft, wenn die Bedingung davor nicht erfüllt wurde. Wir können also die Struktur der folgenden fiktiven Wenn-Dann-Satz-Konstruktion in Python bilden:

Wenn es Burger gibt, dann esse ich Burger.

Wenn es keine Burger gibt, aber es Maultaschen gibt, dann esse ich Maultaschen.

Ansonsten gehe ich zum Buffet.

In dieser Wenn-Dann-Aussage werden für mehrere mögliche Fälle, bestimmte Folgen angegeben. Dabei sind die Bedingungen nach der gegebenen Reihenfolge der einzelnen Wenn-Dann-Aussagen priorisiert. Die Bedingungen werden von vorne nach hinten nacheinander durchgegangen und immer nur wenn die vorherige Bedingung nicht erfüllt ist, wird die nächste Bedingung geprüft. Gibt es beispielsweise Burger, so ist sofort klar, dass Burger gegessen werden. Die anderen Möglichkeiten bzw. Bedingungen werden nicht einmal angeschaut, selbst wenn es beispielsweise neben den Burgern auch Maultaschen geben sollte. Erst wenn die erste Bedingung nicht erfüllt ist und es keine Burger gibt, wird geprüft, ob es Maultaschen gibt. Und nur wenn es weder Burger noch Maultaschen gibt, dann tritt der Notfall-Plan des Buffets in Kraft.

Etwas allgemeiner könnte man dies so formulieren:

Wenn Fall1:
    ...
Wenn nicht Fall1, aber Fall2:
    ...
Ansonsten:
    ...

Tatsächlich bewahrt uns das Wort elif (das eine Zusammensetzung aus else und if ist) davor, geschachtelte If-Statements schreiben zu müssen. Denn wir hätten deneselben Inhalt von oben durchaus auch ohne elif bzw. ohne “wenn nicht Fall1, aber Fall2” schreiben können, indem wir einfach in den Ansonsten-Teil ein zweites ganz normales If-Statement gesetzt hätten, wie ich unten beispielhaft zeige:

Wenn Fall1:
    dann ...
Ansonsten:
    wenn Fall2:
        dann ...
    Ansonsten:
        ...

Und nochmal als “Python-Code” ausgedrückt:

if Fall1:
    ...
else:
    if Fall2:
        ...
    else:
        ...

Spätestens wenn man noch eine Bedingung hinzufügen möchte, werden geschachtelte If-Statements ziemlich unübersichtlich. Genau deswegen gibt es das Wort elif. Mit elif würden dann die obigen abstrakten Beispiele so aussehen:

if Fall1:
    ...
elif Fall2:
    ...
else:
    ...

Wir können mit elif also einen weiteren Wenn-Teil bzw. eine weitere Bedingung zu unserem If-Statement hinzufügen. Diese zusätzlichen Wenn-Dann-Blöcke mit elif kommen immer erst nach einem ersten, mit if eingeleiteten Wenn-Teil und immer vor einem eventuellen Ansonsten-Teil mit else. Während wir in einem If-Statement genau einmal zu Beginn das Schlüsselwort if benutzen und auch maximal einmal am Ende das Schlüsselwort else benutzen können, können wir das Schlüsselwort elif beliebig oft verwenden. Die Bedingungen werden solange bis eine der Bedingungen True ist, von oben nach unten nacheinander überprüft. Ist eine Bedingung True, dann wird der zugehörige Code-Block ausgeführt. Alle folgenden Bedingungen dieses If-Statements werden dann ignoriert.

Wollen wir beispielsweise die Elemente der Liste stuff nicht nur danach sortieren, ob sie vom Typ String oder nicht vom Typ String sind, sondern auch danach, ob sie vom Datentyp int sind, dann könnte das z.B. so mit einem elif aussehen:

# zu sortierende Liste
stuff = [10,"python", 1.2, True, "15", "Zwanzig", str]

# leere Listen zum einsortieren
strings = []
integers = []
other = []


# für jedes Element der Liste stuff
for element in stuff:
    
    # wenn es ein String ist
    if type(element) == str:
        strings.append(element)
    
    # wenn es kein String, aber ein Integer ist
    elif type(element) == int:
        integers.append(element)
    
    # ansonsten
    else:
        other.append(element)
strings
['python', '15', 'Zwanzig']
integers
[10]
other
[1.2, True, str]

Ich füge nun noch eine weitere Bedingung hinzu. Diesmal füge ich eine Bedingung ein, die abfragt, inwiefern das Element keine 10 ist. Diese Bedingung schreibe ich an den Anfang des If-Statements hinter das Schlüsselwort if, sodass diese Bedingung die erste ist, die evaluiert wird. Was verändert dies am Ergebnis?

# zu sortierende Liste
stuff = [10,"python", 1.2, True, "15", "Zwanzig", str]

# leere Listen zum einsortieren
not_ten = []
strings = []
integers = []
other = []


# für jedes Element der Liste stuff
for element in stuff:
    
    # wenn es keine 10 ist
    if element != 10:
        not_ten.append(element)
    
    # wenn es eine 10 ist, aber ein String
    elif type(element) == str:
        strings.append(element)
    
    # wenn es eine 10 und kein String ist, aber ein Integer
    elif type(element) == int:
        integers.append(element)
    
    # ansonsten
    else:
        other.append(element)
not_ten
['python', 1.2, True, '15', 'Zwanzig', str]
strings
[]
integers
[10]
other
[]

Da für fast alle Elemente zutrifft, dass sie keine 10 sind, wurden fast alle Elemente der Liste not_ten angehängt. Da die Bedingung in der Reihenfolge als erstes kommt, ist es auch egal, ob unter den Elementen, welche nicht 10 sind, Strings und Integers sind. Allein die 10 ist nicht ungleich 10, weshalb die erste Bedingung nicht erfüllt ist und dann weitere Bedingungen evaluiert werden.

Wichtig

Die Reihenfolge der Bedingungen kann bei längeren If-Elif-Else-Statements sehr wichtig sein!