Zum Inhalt springen

Python/ if

Aus Wikibooks

Ein Programm, was einfach von vorne bis hinten linear durchläuft, nützt uns höchstens begrenzt. Wir brauchen die Möglichkeit, den Verlauf zu verzweigen, basierend auf der Prüfung von Bedingungen. Wie die meisten Programmiersprachen stellt uns Python dazu das Konstrukt 'if-else' (englisch für "wenn"-"sonst") zur Verfügung.

if[Bearbeiten]

Ein einfaches Beispiel für eine Abfrage:

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe > 0:
    print("Die Zahl ist positiv")
if eingabe < 0:
    print("Die Zahl ist negativ")
============ RESTART: D:\AA_Projekte\Programmierung\Python\ifelse.py ===========
Bitte geben Sie eine Zahl ein: -3
Die Zahl ist negativ
============ RESTART: D:\AA_Projekte\Programmierung\Python\ifelse.py ===========
Bitte geben Sie eine Zahl ein: 5
Die Zahl ist positiv

In der ersten Zeile bitten wir den Nutzer um die Eingabe einer Ganzzahl. Interessanter sind die Zeilen zwei und vier. Hier lassen wir den Computer eine Bedingung prüfen, nämlich "eingabe > 0".

Damit Python die Prüfung durchführen kann, muss sie nach einem festen Schma aufgebaut sein:

  1. sie beginnt mit dem Schlüsselwort if
  2. dann folgt die Bedingung an sich, hier "größer Null" bzw. "kleiner Null"
  3. damit Python weiß, dass die Prüfung zu Ende ist, müssen wir sie mit einem ":" abschliessen.

Zusätzlich brauchen wir eine Unterscheidung, welche Befehle zu welcher Verzweigung gehören. Wenn Sie andere Programmiersprachen kennen, sind sie gewöhnt, dass diese Blöcke mit gescchweiften Klammern "{}" eingefasst sind. Bei Python verwenden wir stattdessen Code-Einrückung.

Einrückung[Bearbeiten]

Indem wir Code einrücken, teilen wir Python mit, wie Anweisungen gruppiert werden sollen:

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe > 0:
    print("Wir sind innerhalb des if-Blocks")
print("wir sind außerhalb des if-Blocks")

Das erste print wird nur ausgeführt, wenn Sie eine positive Zahl eingeben. Das zweite print, nicht mehr eingerückt, wird immer ausgeführt.

============ RESTART: D:\AA_Projekte\Programmierung\Python\ifelse.py ===========
Bitte geben Sie eine Ganzzahl ein: -5
wir sind außerhalb des if-Blocks

Diese Methode der Gruppierung hat den Vorteil, dass sie für Menschen leicht lesbar ist. Jede tiefere Ebene wird einfach weiter eingerückt:

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe > 0:
    print("Die Zahl ist positiv.")
    if eingabe > 5:
        print("Die Zahl ist größer als 5.")
        if eingabe > 20:
            print("Die Zahl ist größer als 20.")
            if eingabe > 100:
                print("Die Zahl ist größer als 100.")

Wir haben zwei verschiedene Möglichkeiten, den Code einzurücken:

  • mit der Leertaste: ein Leerzeichen genügt schon,
  • mit der Tabulatortaste ("tab", als ASCII "\t")

Python ist es egal, wenn wir die verschiedenen Möglichkeiten mischen, die Einrücktiefe muss nur innerhalb einer Ebene gleich sein. Allerdings geht die Lesbarkeit schnell verloren:

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe > 0:
   print("Die Zahl ist positiv.")
   if eingabe > 5:
     print("Die Zahl ist größer als 5.")

Quasi-Standard sind vier Leerzeichen pro Ebene (die meisten Code-Editoren ersetzen "einmal Tab" daher durch vier Leerzeichen). Am besten gewöhnen Sie sich das ebenfalls an. In den meisten Fällen ist dies auch der Standard ihres Editors (wie bspw. IDLE).

else[Bearbeiten]

Mit else geben wir einen alternativen "Codezweig" an, der dann ausgeführt wird, falls der if-Zweig nicht ausgeführt wird:

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe % 2 == 0:
    print("Die Zahl ist gerade")
else:
    print("Die Zahl ist ungerade")
=================== RESTART: D:\AA_Projekte\Python\ifelse.py ===================
Bitte geben Sie eine Ganzzahl ein: 37
die Zahl ist ungerade

Wir lassen also die Bedingung einmal prüfen und verzweigen den Code an Hand dieser Prüfung ("Wenn-Sonst").

Im Unterschied dazu führt dieser Code

eingabe = int(input("Bitte geben Sie eine Ganzzahl ein: "))
if eingabe % 2 == 0:
    print("Die Zahl ist gerade")
if eingabe % 2 != 0:
    print("Die Zahl ist ungerade")

zwei Prüfungen durch ("Wenn-Wenn"). Bei if-else wird also immer Code ausgeführt. Bei zwei if-Prüfungen kann es vorkommen, dass gar kein Code ausgeführt wird, nämlich dann, wenn beide Prüfungen scheitern.

elif[Bearbeiten]

Nicht jede Prüfbedingung ist binär, d.h. sie hat nur zwei mögliche Ergebnisse. Beispielsweise hat die Woche sieben Tage:

wochentag = "Dienstag"
if wochentag == "Montag":
    print("Montag")
if wochentag == "Dienstag":
    print("Dienstag")
if wochentag == "Mittwoch":
    print("Mittwoch")
if wochentag == "Donnerstag":
    print("Donnerstag")
if wochentag == "Freitag":
    print("Freitag")
if wochentag == "Samstag":
    print("Samstag")
if wochentag == "Sonntag":
    print("Sonntag")

Diese Aneinanderreihung von if ist ineffizient, da jede der sieben Prüfungen vorgenommen wird. Im Beispiel wissen wir schon, dass Dienstag ist, trotzdem prüft Python auf Mittwoch bis Sonntag.

Um eine Kette von logisch zusammenhängenden if-else zu verknüpfen, bietet uns Python den elif-Operator (= else-if):

wochentag = "Dienstag"
if wochentag == "Montag":
    print("Montag")
elif wochentag == "Dienstag":
    print("Dienstag")
elif wochentag == "Mittwoch":
    print("Mittwoch")
elif wochentag == "Donnerstag":
    print("Donnerstag")
elif wochentag == "Freitag":
    print("Freitag")
elif wochentag == "Samstag":
    print("Samstag")
elif wochentag == "Sonntag":
    print("Sonntag")
else:
    print("Die Woche hat nur sieben Tage")

match[Bearbeiten]

Seit Version 3.10 können wir match nutzen, um uns Schreibarbeit zu sparen und die Abfragen noch logischer zu gruppieren:

wochentag = "Samstag"
match wochentag:
    case "Montag":
        print("Montag")
    case "Dienstag":
        print("Dienstag")
    case "Mittwoch":
        print("Mittwoch")
    case "Donnerstag":
        print("Donnerstag")
    case "Freitag":
        print("Freitag")
    case "Samstag"|"Sonntag":
        print("Wochenende")
    case(_):
        print("Die Woche hat nur sieben Tage")

Zwei Dinge sollten Ihnen auffallen:

  1. An Stelle des else müssen wir den Unterstrich "_" nutzen, um die "Restfälle" abzufangen.
  2. Mit dem "|" können Sie verschiedene Werte gruppieren um sie gemeinsam abzuhandeln

Datentyp: Bool(ean)[Bearbeiten]

Um die logischen Werte "wahr" und "falsch" zu speichern, gibt es bei Python einen eigenen Datentyp: Boolean, kurz bool. Dieser kann entweder den Wert True (wahr) oder False (falsch annehmen):

ist_heute_Donnerstag = True
print(type(ist_heute_Donnerstag))
=================== RESTART: D:\AA_Projekte\Python\ifelse.py ===================
<class 'bool'>
>>>

Bitten achten Sie auf die Schreibweise (großes T bzw. großes F).

ist_heute_Donnerstag = True
if ist_heute_Donnerstag:
    print ("Donnerstag!")

Verkettung von Bedingungen[Bearbeiten]

Der "Last-Christmas"-Fehler[Bearbeiten]