Python match-Anweisung
matchist eine in Python 3.10 eingeführte Anweisung für strukturelles Pattern-Matching, ähnlich wie in anderen Sprachenswitch-case, aber mächtiger.
Die match-Anweisung kann Muster in Datenstrukturen abgleichen; nicht nur konstante Werte, sondern auch komplexe Muster wie Typen, Sequenzen, Dictionaries.
Wortbedeutung: matchBedeutet "to match", wird für Pattern-Matching verwendet.
Grundlegende Syntax und Parameter
Die match-Anweisung ist eine neue Funktion in Python 3.10+, die komplexe mehrzweigige if-elif-Strukturen ersetzen soll.
Syntaxformat
match 变量:
case 模式1:
代码块1
case 模式2:
代码块2
case _:
默认代码块
Pattern-Typen
- Konstantes Muster: stimmt mit einem bestimmten Wert überein.
- Wildcard-Muster:
case _Entspricht jedem Wert, äquivalent zu default. - Typmuster: entspricht Datentypen.
- Sequenzmuster: entspricht Sequenzen wie Listen, Tupeln.
- Dictionary-Muster: entspricht Dictionaries.
- Muster mit Bedingungen: verwende
ifum zusätzliche Bedingungen hinzuzufügen.
Beispiele
Beispiel 1: Grundlegende Verwendung (ähnlich wie switch)
Beispiel
def http_status(status):
match status:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Server Error"
case _:
return "Unknown"
print(http_status(200)) # Ausgabe: OK
print(http_status(404)) # Ausgabe: Not Found
print(http_status(999)) # Ausgabe: Unknown
Erwartete Ausgabe:
OK Not Found Unknown
Codeanalyse:
case _ist ein Platzhalter, der alle nicht übereinstimmenden Fälle abgleicht.- Ähnlich wie default in switch-case.
Beispiel 2: Abgleich mehrerer Werte
Beispiel
def color_name(code):
match code:
case "r" | "R":
return "red"
case "g" | "G":
return "green"
case "b" | "B":
return "blue"
case _:
return "unknown"
print(color_name("r")) # Ausgabe: red
print(color_name("G")) # Ausgabe: green
print(color_name("x")) # Ausgabe: unknown
[/mycode]</div>
</div>
<p><strong>Erwartete Ausgabe:</strong></p>
<pre>red
⟦0⟧
unknown
</pre>
<p>Mit<code>|</code>können mehrere Werte im selben Fall kombiniert werden.</p>
<h3>Beispiel3: Sequenzmusterabgleich</h3>
<div class="example">
<h2 class="example">Beispiel</h2>
<div class="example_code">[mycode4 type="python"]
# Sequenzmusterabgleich
def describe_point(point):
match point:
case (0, 0):
return "Ursprung"
case (x, 0):
return f"Punkt auf der X-Achse ({x}, 0)"
case (0, y):
return f"Punkt auf der Y-Achse (0, {y})"
case (x, y):
return f"Punkt in der Ebene ({x}, {y})"
case _:
return "ungültige Koordinaten"
print(describe_point((0, 0))) # Ausgabe: Ursprung
print(describe_point((5, 0))) # Ausgabe: Punkt auf der X-Achse (5, 0)
print(describe_point((3, 4))) # Ausgabe: Punkt in der Ebene (3, 4)
Erwartete Ausgabe:
原点 X轴上的点 (5, 0) 平面上的点 (3, 4)
match kann Tupel/Listen destrukturieren und Werte daraus extrahieren.
Beispiel 4: Musterabgleich für Dictionaries
Beispiel
def process_user(user):
match user:
case {"name": name, "age": age}:
return f"User: {name}, Age: {age}"
case {"name": name}:
return f"User: {name}"
case _:
return "invalid user"
print(process_user({"name": "Tom", "age": 20}))
print(process_user({"name": "Jerry"}))
print(process_user({"role": "admin"}))
Erwartete Ausgabe:
User: Tom, 年龄: 20 User: Jerry 无效用户
Dictionary-Muster können Werte bestimmter Schlüssel extrahieren.
Beispiel 5: Muster mit Bedingungen
Beispiel
def classify_number(n):
match n:
case n if n > 0:
return f"positive Zahl ({n})"
case n if n < 0:
return f"negative Zahl ({n})"
case 0:
return "Null"
print(classify_number(10)) # Ausgabe: positive Zahl (10)
print(classify_number(-5)) # Ausgabe: negative Zahl (-5)
print(classify_number(0)) # Ausgabe: Null
# Komplexe Bedingungen
def describe_list(lst):
match lst:
case []:
return "leere Liste"
case [x]:
return f"einzelnes Element: {x}"
case [x, y]:
return f"zwei Elemente: {x}, {y}"
case [x, *rest]:
return f"erstes: {x}, Rest: {rest}"
print(describe_list([]))
print(describe_list([1]))
print(describe_list([1, 2, 3, 4]))
Erwartete Ausgabe:
正数 (10) 负数 (-5) 零 空列表 单个元素: 1 第一个: 1, 其余: [2, 3, 4]
Verwendungcase 变量 if 条件kann zusätzliche Übereinstimmungsbedingungen hinzufügen.
Andere Erweiterungen
Python3 Bedingte Steuerung