Оператор match в Python

Python3 条件控制Условное управление в Python3


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)

Пример

# Требуется Python версии 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))   # Вывод: OK
print(http_status(404))   # Вывод: Not Found
print(http_status(999))   # Вывод: Unknown

Ожидаемый вывод:

OK
Not Found
Unknown

Анализ кода:

  1. case _является подстановочным знаком, который соответствует всем несовпавшим случаям.
  2. Аналогично 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 条件控制Условное управление в Python3

Другие расширения