← Назад ко всем вопросам

match/case

1️⃣ Как кратко ответить

В Python 3.10 введена конструкция match/case, которая реализует структурное сопоставление. Она позволяет сравнивать значение с набором шаблонов и выполнять код, соответствующий первому совпавшему шаблону. Это улучшает читаемость и упрощает обработку сложных условий по сравнению с вложенными if-elif-else.

2️⃣ Подробное объяснение темы

Конструкция match/case в Python 3.10 и выше предоставляет новый способ управления потоком выполнения программы, который называется структурным сопоставлением. Это похоже на оператор switch в других языках программирования, но с более мощными возможностями.

Зачем это нужно

match/case упрощает код, который должен проверять значение переменной на соответствие нескольким условиям. Это делает код более читаемым и поддерживаемым, особенно когда нужно обрабатывать сложные структуры данных или множество условий.

Как это работает

Конструкция match/case позволяет сопоставлять значение с набором шаблонов. Если значение соответствует шаблону, выполняется связанный с ним блок кода. Шаблоны могут быть простыми, например, константами, или сложными, включая сопоставление с последовательностями и структурами данных.

Пример использования

def describe_value(value):
    match value:
        case 0:
            return "Zero"
        case 1:
            return "One"
        case _:
            return "Other"
​
# Вызов функции с различными значениями
print(describe_value(0))  # Вывод: Zero
print(describe_value(1))  # Вывод: One
print(describe_value(42)) # Вывод: Other

Подробный разбор примера

  • def describe_value(value):: Определение функции describe_value, которая принимает один аргумент value.
  • match value:: Начало конструкции match/case, где value — это переменная, значение которой будет сопоставляться с шаблонами.
  • case 0:: Шаблон, который проверяет, равно ли значение 0. Если да, выполняется следующий блок кода.
  • return "Zero": Возвращает строку "Zero", если значение равно 0.
  • case 1:: Шаблон, который проверяет, равно ли значение 1. Если да, выполняется следующий блок кода.
  • return "One": Возвращает строку "One", если значение равно 1.
  • case _:: Шаблон _ является универсальным и соответствует любому значению, если предыдущие шаблоны не подошли.
  • return "Other": Возвращает строку "Other" для всех значений, которые не равны 0 или 1.

Применение в сложных структурах

match/case также может использоваться для сопоставления сложных структур данных, таких как списки или словари.

def process_data(data):
    match data:
        case [x, y, z]:
            return f"List with three elements: {x}, {y}, {z}"
        case {"name": name, "age": age}:
            return f"Name: {name}, Age: {age}"
        case _:
            return "Unknown structure"
​
# Примеры вызова функции
print(process_data([1, 2, 3]))  # Вывод: List with three elements: 1, 2, 3
print(process_data({"name": "Alice", "age": 30}))  # Вывод: Name: Alice, Age: 30
print(process_data(42))  # Вывод: Unknown structure

Подробный разбор примера

  • case [x, y, z]:: Шаблон, который проверяет, является ли data списком из трех элементов. Если да, элементы присваиваются переменным x, y, z.
  • return f"List with three elements: {x}, {y}, {z}": Возвращает строку с элементами списка.
  • case {"name": name, "age": age}:: Шаблон, который проверяет, является ли data словарем с ключами name и age. Если да, значения присваиваются переменным name и age.
  • return f"Name: {name}, Age: {age}": Возвращает строку с именем и возрастом.
  • case _:: Универсальный шаблон для всех других структур данных.
  • return "Unknown structure": Возвращает строку для всех значений, которые не соответствуют предыдущим шаблонам.

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки