Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

match

match ist wie if aber auf Steroide. Mit einem match Statement können wir je nach dem Wert einer Variable beliebig viel Fälle (case) definieren. Zum Beispiel hier dieses match Statement führt je nach dem Wert von x Code aus

match x:
    case 10:
        print("x is ten")
    case 20:
        print("x is twenty")
    case _:
        print("default case. i dont know")

Wir könnten auch ganz viele if-else Statments hintereinander benutzen, aber match ist einfacher zu lesen und dementsprechend macht es unser Code einfacher nachzuvollziehen. Lass uns einmal match Code zu if-else migrieren:

if x == 10:
    print("x is ten")
elif x == 20:
    print("x is twenty")
else:
    print("default case. i dont know")

Ja. Matches sind einfach nur eine neue Form if-else zu schreiben, aber wenn wir ganz viele elif haben und immer den Wert der selben Variable überprüfen müssen, dann sind match Statements weit aus geeigneter als if.

String

match können wir mit jeder Art von Datentyp benutzen. Hier zum Beispiel einmal ein match mit einem String:

match greeting:
    case "hi":
        print("hi whats up!")
    case "hello":
        print("hello how is your day?")
    case _:
        print("sorry sir i didn't get you")

Und als if-else würde es dann so aussehen:

if greeting == "hi":
    print("hi whats up!")
elif greeting == "hello":
    print("hello how is your day?")
else:
    print("sorry sir i didn't get you")

Grouping

Bis jetzt haben wir nach einem Wert einen Codeblock eines cases ausgeführt. Wir können aber auch mehrere cases in einen case zusammenfassen, um dann ein Codeblock auszuführen.

match x:
    case 10 | 20 | 30:
        print("x is either 10, 20 or 30")
    case _:
        print("i dont know")

Mit if-else würde es dann so aussehen:

if x == 10 or x == 20 or x == 30:
    print("x is either 10, 20 or 30")
else:
    print("i dont know")

Mit if statement

Zum guten Schluss, um deinen Kopf nochmal explodieren zu lassen, können wir auch match und if gleichzeitg verwenden, um noch komplexere cases definieren zu können.

match x:
    case x_even if x % 2 == 0:
        print(x_even, "is even")
    case _:
        print(x, "is not even")

Ohne match und nur mit if-else würde das dann so aussehen:

if x % 2 == 0:
    x_even = x
    print(x_even, "is even")
else:
    print(x, "is not even")

Man könnte argumentieren, dass wenn man schon if-else in einem match benutzt, dass dann der reine if-else Code einfacher nachzuvollziehen ist, als der match plus if-else Code. Am Ende des Tages kommt es auf persönliche Präferenzen, welches du bevorzugt, aber ein Vorteil von match plus if-else ist, dass wir ganz viele cases untereinander auflisten können und falls wir mal für einen case die Vorteile von if-else brauchen, dann können wir das ganz easy, ohne großartig unseren kompletten Code neuzuschreiben. Dadurch haben wir das beste von beiden Welten.

Mit Listen

Wir können auch match mit einer Liste verwenden:

match my_list:
    case [a, b, c]:
        print()
    case [a, b, c, d]:
        print()
    case _:
        print()

Mit [a, b, c, d] werden dann auch neue Variablen für je deisen Platz in der Liste erstellt, auf die wir dann innerhalb des case Codeblockes zugreifen können.

Mit Dictionaries

Das selbe können wir auch mit Dictionaries machen.

match my_dict:
    case { "name": name, "age": age }:
        # ...
    case _:
        # ...

Und auch hier wie bei den Listen können wir extra Variablen für jedes Feld erstellen.

Als wir match ganz am Anfang mit Numbers und Strings verwendet haben, haben wir je nach dem Wert der gematchten Variable cases ausgeführt. Diesen Prozess nennt man auch "Value matching".

Aber bei Listen und Dictionaries haben wir nach der Form oder Struktur gematcht, je nachdem wie lang die Liste ist oder welche Felder ein Dictionary hat. Dies nennt man "Strucutal pattern matching" und ist unglaublich hiflreich und macht unser Pythoncode sooo einfach nachzuvollziehen.

Zum Beispiel lass den vorherigen Code mit der Liste und dem Dictionary einmal zu if-else migrieren. Dann siehst du auch was genau ich meine 😀

### Liste

if len(my_list) == 3:
    a = my_list[0]
    b = my_list[1]
    c = my_list[2]
    # ...
elif len(my_list) == 4:
    a = my_list[0]
    b = my_list[1]
    c = my_list[2]
    d = my_list[3]
    # ...
else:
    # ...


### Dictionary
if my_dict["name"] is not None and my_dict["age"] is not None:
    name = my_dict["name"]
    age = my_dict["age"]
    # ...
else:
    #...