Оператор match в Python
matchявляется оператором структурного сопоставления с образцом, появившимся в Python 3.10, аналогичным таковому в других языкахswitch-case, но более мощный.
Оператор match может сопоставлять образцы в структурах данных; не только константные значения, но и сложные образцы, такие как типы, последовательности, словари.
Значение слова: matchОзначает «сопоставлять», используется для сопоставления с образцом.
Базовый синтаксис и параметры
Оператор match — новая возможность в Python 3.10+, используемая для замены сложных многовариантных структур if-elif.
Формат синтаксиса
match 变量:
case 模式1:
代码块1
case 模式2:
代码块2
case _:
默认代码块
Типы образцов
- Образец константы: соответствует конкретному значению.
- Образец с подстановочным знаком:
case _Совпадает с любым значением, эквивалентен значению по умолчанию. - Шаблон типа: сопоставляется с типами данных.
- Шаблон последовательности: сопоставляется с последовательностями, такими как списки, кортежи.
- Шаблон словаря: сопоставляется со словарями.
- Шаблон с условиями: используйте,
ifчтобы добавить дополнительные условия.
Примеры
Пример 1: Базовое использование (аналогично switch)
Пример
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)) # Вывод: OK
print(http_status(404)) # Вывод: Not Found
print(http_status(999)) # Вывод: Unknown
Ожидаемый вывод:
OK Not Found Unknown
Анализ кода:
case _является подстановочным знаком, который соответствует всем несовпавшим случаям.- Аналогично default в switch-case.
Пример 2: Сопоставление нескольких значений
Пример
def color_name(code):
match code:
case "r" | "R":
return "red"
case "g" | "G":
return "red"
case "b" | "B":
return "blue"
case _:
return "unknown"
print(color_name("r")) # Вывод: red
print(color_name("G")) # Вывод: green
print(color_name("x")) # Вывод: unknown
[/mycode]</div>
</div>
<p><strong>Ожидаемый вывод:</strong></p>
<pre>red
green
unknown
</pre>
<p>Используя<code>|</code>можно объединить несколько значений в одном случае.</p>
<h3>Пример3: Сопоставление шаблонов последовательностей</h3>
<div class="example">
<h2 class="example">Пример</h2>
<div class="example_code">[mycode4 type="python"]
# Сопоставление шаблонов последовательностей
def describe_point(point):
match point:
case (0, 0):
return "начало координат"
case (x, 0):
return f"Точка на оси X ({x}, 0)"
case (0, y):
return f"Точка на оси Y (0, {y})"
case (x, y):
return f"Точка на плоскости ({x}, {y})"
case _:
return "неверные координаты"
print(describe_point((0, 0))) # Вывод: начало координат
print(describe_point((5, 0))) # Вывод: Точка на оси X (5, 0)
print(describe_point((3, 4))) # Вывод: Точка на плоскости (3, 4)
Ожидаемый вывод:
原点 X轴上的点 (5, 0) 平面上的点 (3, 4)
match может деструктурировать кортежи/списки и извлекать из них значения.
Пример 4: Сопоставление с образцом для словаря
Пример
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"}))
Ожидаемый вывод:
User: Tom, 年龄: 20 User: Jerry 无效用户
Шаблоны словарей могут извлекать значения определённых ключей.
Пример 5: Шаблоны с условиями
Пример
def classify_number(n):
match n:
case n if n > 0:
return f"положительное число ({n})"
case n if n < 0:
return f"отрицательное число ({n})"
case 0:
return "ноль"
print(classify_number(10)) # Вывод: положительное число (10)
print(classify_number(-5)) # Вывод: отрицательное число (-5)
print(classify_number(0)) # Вывод: ноль
# Сложные условия
def describe_list(lst):
match lst:
case []:
return "empty list"
case [x]:
return f"single element: {x}"
case [x, y]:
return f"two elements: {x}, {y}"
case [x, *rest]:
return f"first: {x}, rest: {rest}"
print(describe_list([]))
print(describe_list([1]))
print(describe_list([1, 2, 3, 4]))
Ожидаемый вывод:
正数 (10) 负数 (-5) 零 空列表 单个元素: 1 第一个: 1, 其余: [2, 3, 4]
Использованиеcase 变量 if 条件можно добавить дополнительные условия сопоставления.
Другие расширения
Условное управление в Python3