Zum Inhalt springen

Verzweigungen

Aus Wikibooks

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

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 ":" abschließen.

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 geschweiften Klammern "{}" eingefasst sind. Bei Python verwenden wir stattdessen Code-Einrückung.

Mit else geben wir einen alternativen "Codezweig" an, der ausgeführt wird, wenn die Bedingung nicht erfüllt ist:

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 keine der Bedingungen erfüllt ist.

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 das elif-Schlüsselwort (= 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")

Bedingte Ausdrücke

[Bearbeiten]

Die Schlüsselwörter if und else können nicht nur verwendet werden um den Programmablauf zu steuern, sondern auch um den Wert eines Ausdrucks von einer Bedingung abhängig zu machen: if Bedingung TrueWert else FalseWert, der else-Zweig muss immer angegeben werden.

Beispiel: 1 if x > 0 else -1 ergibt 1 wenn x größer als Null ist und sonst -1.

Bedingungen

[Bearbeiten]

Als Bedingungen werden oft Vergleiche von 2 Objekten gebraucht. Dafür stehen folgende Vergleichsoperatoren zu Verfügung:

Vergleichsoperator Bedeutung
== gleich
!= ungleich
< kleiner
<= kleiner oder gleich
> größer
>= größer oder gleich

Vergleiche können auch wie Ungleichungen in der Mathematik verkettet werden: 0 <= x < 10 ist True, wenn x größer gleich 0 und kleiner als 10 ist. Dabei sollten größer und kleiner nicht wie zum Beispiel x > y < z miteinander kombiniert werden; das würde die Lesbarkeit beeinträchtigen.

Alle Werte, die als True oder False interpretiert werden können, sind auch als Bedingung verwendbar, zum Beispiel werden 0, [] oder "" dabei als False interpretiert und 0.001, [0] und " " als True.

Seit Python 3.8 gibt es auch Zuweisungsausdrücke, die einen Wert liefern. Das Symbol dafür ist := (der "walrus operator”); solche Ausdrücke müssen in Klammern gesetzt werden und können ebenfalls als Bedingung verwendet werden. Der Ausdruck (y := x) hat den gleichen Wert wie x.

Beispiel:

x = 3
if (y := x): print(y)
3

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("Unbekannter Wochentag: ", wochentag)

Zwei Dinge sollten Ihnen auffallen:

  1. An Stelle des else müssen wir den Unterstrich _ nutzen, um die "Restfälle" abzufangen; dieser Fall muss an letzter Stelle stehen.
  2. Mit dem | (oder) können Sie verschiedene Werte gruppieren um sie gemeinsam abzuhandeln.

Die zu vergleichenden Werte hinter case müssen als Literale (Konstanten), wie Strings oder Zahlen, angegeben werden; die Werte von Variablen werden nur dann geprüft, wenn die Bezeichner einen Punkt enthalten, zum Beispiel x.real.

Nach case Wert kann optional mit if eine zusätzliche Bedingung (guard genannt), angegeben werden. Der zugehörige Block wird nur dann ausgeführt, wenn sowohl der Wert übereinstimmt, als auch die Bedingung erfüllt ist.

Außer der oben beschriebenen Fallunterscheidung durch Vergleich mit vorgegebenen Werten ist auch "Structural Pattern Matching" (Mustererkennung) möglich.

Beispiel: je nach Typ einer Variablen x soll eine andere Funktion aufgerufen werden:

* für int ≥ 0: math.isqrt(x)
* für float ≥ 0: math.sqrt(x)
* für int, float < 0: cmath.sqrt(x)
* für complex: cmath.sqrt(x)
match x:
    case int() | float() if x < 0: y = cmath.sqrt(x)
    case int(): y = math.isqrt(x)
    case float(): y = math.sqrt(x)
    case complex(): y = cmath.sqrt(x)

Ein Beispiel, welche Rolle Variable beim Structural Pattern Matching spielen:

for point in ((0, 0), (0, 1), (2, 0), (3, 2)):
	match point:
		case (0, 0): wo = "im Ursprung"
		case (0, y): wo = f"auf der y-Achse bei y = {y}"
		case (x, 0): wo = f"auf der x-Achse bei x = {x}"
		case (x, y): wo = f"auf keiner der Achsen: x = {x}, y = {y}"
	print(f"Punkt {point} liegt {wo}.")

Ausgabe:

Punkt (0, 0) liegt im Ursprung.
Punkt (0, 1) liegt auf der y-Achse bei y = 1.
Punkt (2, 0) liegt auf der x-Achse bei x = 2.
Punkt (3, 2) liegt auf keiner der Achsen: x = 3, y = 2.

Seitentitel: Python/ Verzweigungen
(Python/ Verzweigungen)
(Python/ Verzweigungen)