Instruction match en Python

Python3 条件控制Contrôle conditionnel Python3


matchest une instruction de correspondance de motifs structurelle introduite dans Python 3.10, similaire à celle d'autres langagesswitch-case, mais plus puissante.

L'instruction match peut faire correspondre des motifs dans des structures de données ; non seulement des valeurs constantes, mais aussi des motifs complexes tels que des types, des séquences, des dictionnaires.

Signification du mot: matchSignifie « correspondre », utilisé pour la correspondance de motifs.


Syntaxe de base et paramètres

L'instruction match est une nouvelle fonctionnalité de Python 3.10+, utilisée pour remplacer les structures complexes à branches multiples if-elif.

Format de syntaxe

match 变量:
    case 模式1:
        代码块1
    case 模式2:
        代码块2
    case _:
        默认代码块

Types de motifs

  • Motif constant: correspond à une valeur spécifique.
  • Motif joker: case _Correspond à n'importe quelle valeur, équivalent au cas par défaut.
  • Motif de type: correspond aux types de données.
  • Motif de séquence: correspond aux séquences telles que les listes, les tuples.
  • Motif de dictionnaire: correspond aux dictionnaires.
  • Motif avec conditions: utilisezifpour ajouter des conditions supplémentaires.

Exemples

Exemple 1 : Utilisation de base (similaire à switch)

Exemple

# Version Python requise 3.10+
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))   # Sortie : OK
print(http_status(404))   # Sortie : Non trouvé
print(http_status(999))   # Sortie : Inconnu

Sortie attendue :

OK
Not Found
Unknown

Analyse du code :

  1. case _est un joker qui correspond à tous les cas non correspondants.
  2. Similaire à default dans switch-case.

Exemple 2 : Correspondance de valeurs multiples

Exemple

# Plusieurs valeurs correspondent au même résultat
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"))  # Sortie : red
print(color_name("G"))  # Sortie : green
print(color_name("x"))  # Sortie : unknown
[/mycode]</div>
</div>

<p><strong>Sortie attendue :</strong></p>
<pre>red
green
unknown
</pre>
<p>L'utilisation de<code>|</code>permet de combiner plusieurs valeurs dans le même cas.</p>
<h3>Exemple3: Filtrage par motif de séquence</h3>

<div class="example">
<h2 class="example">Exemple</h2>
<div class="example_code">[mycode4 type="python"]
# Filtrage par motif de séquence
def describe_point(point):
    match point:
        case (0, 0):
            return "origine"
        case (x, 0):
            return f"Point sur l'axe des X ({x}, 0)"
        case (0, y):
            return f"Point sur l'axe des Y (0, {y})"
        case (x, y):
            return f"Point sur le plan ({x}, {y})"
        case _:
            return "coordonnées invalides"

print(describe_point((0, 0)))      # Sortie : origine
print(describe_point((5, 0)))      # Sortie : Point sur l'axe des X (5, 0)
print(describe_point((3, 4)))      # Sortie : Point sur le plan (3, 4)

Sortie attendue :

原点
X轴上的点 (5, 0)
平面上的点 (3, 4)

match peut déstructurer des tuples/listes et en extraire les valeurs.

Exemple 4 : Filtrage par motif de dictionnaire

Exemple

# Filtrage par motif de dictionnaire
def process_user(user):
    match user:
        case {"name": name, "age": age}:
            return f"Utilisateur : {name}, Âge : {age}"
        case {"name": name}:
            return f"Utilisateur : {name}"
        case _:
            return "utilisateur invalide"

print(process_user({"name": "Tom", "age": 20}))
print(process_user({"name": "Jerry"}))
print(process_user({"role": "admin"}))

Sortie attendue :

User: Tom, 年龄: 20
User: Jerry
无效用户

Les motifs de dictionnaire peuvent extraire les valeurs de clés spécifiques.

Exemple 5 : Motifs avec conditions

Exemple

# Filtrage par motif avec conditions
def classify_number(n):
    match n:
        case n if n > 0:
            return f"nombre positif ({n})"
        case n if n < 0:
            return f"nombre négatif ({n})"
        case 0:
            return "zéro"

print(classify_number(10))   # Sortie : nombre positif (10)
print(classify_number(-5))    # Sortie : nombre négatif (-5)
print(classify_number(0))     # Sortie : zéro

# Conditions complexes
def describe_list(lst):
    match lst:
        case []:
            return "liste vide"
        case [x]:
            return f"élément unique : {x}"
        case [x, y]:
            return f"deux éléments : {x}, {y}"
        case [x, *rest]:
            return f"premier : {x}, reste : {rest}"

print(describe_list([]))
print(describe_list([1]))
print(describe_list([1, 2, 3, 4]))

Sortie attendue :

正数 (10)
负数 (-5)
零
空列表
单个元素: 1
第一个: 1, 其余: [2, 3, 4]

Utilisationcase 变量 if 条件Vous pouvez ajouter des conditions de correspondance supplémentaires.


Python3 条件控制Contrôle conditionnel Python3

Autres extensions