Назад к вопросам
Junior
78
questionbank

Что такое конструкции match/case в Python?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Конструкции match/case в Python, введенные в версии 3.10, предоставляют механизм структурного сопоставления с образцом (structural pattern matching). Это позволяет сравнивать значение выражения со списком образцов и выполнять блок кода, соответствующий первому совпавшему образцу.

Основные элементы:

  • match: Ключевое слово, вводящее блок сопоставления. За ним следует выражение, значение которого будет сопоставляться.
  • case: Ключевое слово для определения образца. За ним следует сам образец. Если значение выражения из match совпадает с образцом из case, выполняется код, находящийся внутри этого блока case.
  • Образцы: Могут быть простыми литералами (числа, строки, булевы значения), именованными константами, списками, кортежами, словарями с определенной структурой, а также включать записывающие переменные (которые захватывают совпавшие части значения) и защитные условия (с помощью if).

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

// Функция, возвращающая описание HTTP-статуса
def get_http_status_description(status_code):
    match status_code:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Internal Server Error"
        case _: // Wildcard pattern - совпадает с любым значением
            return "Unknown Status"

// Использование функции
print(get_http_status_description(200))
print(get_http_status_description(404))
print(get_http_status_description(999))

Пример сопоставления с составными структурами и записывающими переменными:

// Пример данных (кортеж or список)
point = (1, 2)
command = ["move", 10, 20]
user_data = {"name": "Alice", "age": 30}

// Сопоставление с кортежем
match point:
    case (x, y):
        // x и y захватывают значения из кортежа
        print(f"Point coordinates: x={x}, y={y}")

// Сопоставление со списком
match command:
    case ["move", dx, dy]:
        // dx и dy захватывают значения из списка
        print(f"Move by dx={dx}, dy={dy}")
    case ["wait", time]:
        print(f"Wait for {time} seconds")
    case _:
        print("Unknown command")

// Сопоставление со словарем
match user_data:
    case {"name": name, "age": age}:
        // name и age захватывают значения из словаря
        print(f"User: {name}, Age: {age}")
    case {"name": name}: // Совпадение по имени, возраст необязателен
         print(f"User: {name} (age not specified)")
    case _:
        print("Invalid user data")

Пример с защитным условием:

// Функция с защитным условием
def process_number(n):
    match n:
        case int() if n > 0:
            // Совпадает, только если n является целым и больше 0
            print(f"Positive integer: {n}")
        case int() if n < 0:
            // Совпадает, только если n является целым и меньше 0
            print(f"Negative integer: {n}")
        case 0:
            // Совпадает с нулем
            print("Zero")
        case _:
            // Совпадает с любым другим значением
            print(f"Non-integer or zero: {n}")

// Использование функции
process_number(5)
process_number(-3)
process_number(0)
process_number(3.14)

Преимущества match/case:

  • Читаемость: Улучшает читаемость кода по сравнению с длинными цепочками if/elif/else, особенно при сопоставлении с различными типами данных и структурами.
  • Безопасность типа: Позволяет проверять тип данных в образце.
  • Извлечение данных: Упрощает извлечение данных из сложных структур (списков, кортежей, словарей) непосредственно в процессе сопоставления.
  • Выразительность: Предоставляет более выразительный способ обработки множественных условий, основанных на структуре и значении данных.

Отличия от if/elif/else:

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