Оператор match-case

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

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

Основы match-case в Python

Оператор match-case позволяет выполнять проверки значений на основе их структуры или типов. Простейший синтаксис выглядит следующим образом:

color = "green"

match color:
    case "red":
        print("Цвет красный")
    case "blue":
        print("Цвет синий")
    case "green":
        print("Цвет зелёный")
    case _:
        print("Цвет неизвестен")

Здесь переменная color проверяется на значения "red", "blue" и "green". Если ни одно из условий не выполняется, используется _, чтобы поймать все остальные значения (аналог default в других языках).


Использование case _ как else в match-case

Когда ни одно из условий не совпадает, case _ выполняется автоматически. Например, если значение переменной не соответствует ни одному из явно указанных case, то управление передаётся блоку case _. Это помогает избежать ошибок и предусмотреть обработку непредвиденных значений.

operation = "multiply"

match operation:
    case "add":
        print("Сложение")
    case "subtract":
        print("Вычитание")
    case "divide":
        print("Деление")
    case _:
        print("Операция неизвестна")

Здесь, если значение operation не совпадает с "add", "subtract" или "divide", сработает блок case _, который выполняет роль else и выведет "Операция неизвестна".


Сравнение на несколько значений в match-case

В match-case можно объединять несколько значений в одном case, используя оператор "или" (|). Это позволяет сделать код более лаконичным и удобочитаемым.

day = "суббота"

match day:
    case "суббота" | "воскресенье":
        print("Это выходной день!")
    case "понедельник" | "вторник" | "среда" | "четверг" | "пятница":
        print("Это рабочий день.")
    case _:
        print("Неизвестный день.")

В этом примере case проверяет сразу несколько значений: если день "суббота" или "воскресенье", это выходной день. Такой подход сокращает количество проверок и делает код легче для понимания.


Использование методов в match-case

Оператор match-case позволяет применять условия или методы внутри case. Например, можно использовать методы для проверки строковых значений, например, проверку префиксов с помощью startswith().

command = "print_text"

match command:
    case cmd if cmd.startswith("print"):
        print("Команда для вывода текста")
    case cmd if cmd.startswith("save"):
        print("Команда для сохранения данных")
    case _:
        print("Неизвестная команда")

Здесь match-case проверяет, начинается ли строка command с "print" или "save". В зависимости от префикса выводится соответствующее сообщение.

Ещё один пример с использованием числовых условий:

number = -10

match number:
    case n if n < 0:
        print("Отрицательное число")
    case n if n == 0:
        print("Число равно нулю")
    case n if n > 0:
        print("Положительное число")

Здесь проверяются разные условия для переменной number: если число отрицательное, равно нулю или положительное, выводится соответствующее сообщение.


Использование match case types

В match-case можно проверять тип данных переменной, что особенно полезно, если тип значения неизвестен заранее. Это можно сделать, используя шаблоны типа int(), float(), str() и т.д.

# меняйте значение переменной value
value = [1, 2, 3]

match value:
    case int() | float():
        print("Имеем дело с числом")
    case str():
        print("Имеем дело со строкой")
    case list():
        print("Имеем дело со списком")
    case _:
        print("Лучше с этим дел не иметь")

Здесь match-case проверяет тип переменной value. Если она — целое или вещественное число (int или float), строка (str), или список (list), то выводится соответствующее сообщение. В противном случае выполняется case _, который выводит общее сообщение, если тип данных не совпал с перечисленными.


Примеры использования match-case в python


Калькулятор с использованием match-case

Реализуем простейший калькулятор, который выполняет арифметические операции в зависимости от введённой команды.

operation = ("add", 10, 5)  # Вы можете менять операцию на "subtract", "multiply", "divide"

match operation:
    case ("add", x, y):
        print(f"Сложение: {x} + {y} = {x + y}")
    case ("subtract", x, y):
        print(f"Вычитание: {x} - {y} = {x - y}")
    case ("multiply", x, y):
        print(f"Умножение: {x} * {y} = {x * y}")
    case ("divide", x, y) if y != 0:
        print(f"Деление: {x} / {y} = {x / y}")
    case ("divide", _, 0):
        print("Ошибка: Деление на ноль!")
    case _:
        print("Неизвестная операция")

В этом примере:

  • Каждый case обрабатывает определённый вид операции.
  • case ("divide", _, 0) обрабатывает случай деления на ноль, чтобы избежать ошибки.
  • case _ используется как else, чтобы обработать неизвестные операции.

Определение дня недели по номеру

В следующем примере match-case помогает получить название дня недели по его номеру.

day_number = 5

match day_number:
    case 1:
        print("Понедельник")
    case 2:
        print("Вторник")
    case 3:
        print("Среда")
    case 4:
        print("Четверг")
    case 5:
        print("Пятница")
    case 6:
        print("Суббота")
    case 7:
        print("Воскресенье")
    case _:
        print("Некорректный номер дня")

Здесь каждый case соответствует одному из дней недели. Если введено число вне диапазона 1-7, то срабатывает case _, выводя сообщение об ошибке.


Простая система управления доступом

Допустим, мы разрабатываем систему доступа, в которой разные уровни пользователей имеют разные права.

user_role = "editor"  # Возможные роли: "admin", "editor", "viewer"

match user_role:
    case "admin":
        print("Полный доступ: чтение, редактирование, удаление")
    case "editor":
        print("Доступ на чтение и редактирование")
    case "viewer":
        print("Доступ только на чтение")
    case _:
        print("Роль неизвестна, доступ ограничен")

В данном случае match-case используется для обработки разных уровней доступа. В зависимости от значения user_role, выводится соответствующий уровень прав.


Оператор match-case в Python позволяет легко и эффективно обрабатывать различные условия и структуры данных. Благодаря гибкости синтаксиса match-case можно:

  • Проверять несколько значений в одном case;
  • Использовать методы и сложные проверки внутри условий;
  • Проверять тип данных переменной для обработки разных ситуаций.

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

Перейти к следующему шагу

Возникли вопросы при прочтении лекции? Задайте вопрос в комментариях

Комментарии