Оператор match…case в Python

Оператор match…case позволяет нам выполнять различные действия в зависимости от значения выражения.

Синтаксис оператора match...case в Python:

match expression:

  case value1:
    # блок кода 1

  case value2:
    # блок кода 2

  ...

Здесь expression — это значение или условие, которое нужно вычислить.

Если expression равно

  • value1, выполняется блок кода 1.

  • value2, выполняется блок кода 2.

В операторе match будет выполнен только один из вариантов. Как только совпадение найдено, выполняется соответствующий блок кода, а остальные пропускаются.

Примечание

Оператор match..case был введён в Python 3.10 и не работает в более старых версиях. Он похож на оператор switch…case в других языках программирования, таких как C++ и Java.

Теперь давайте рассмотрим несколько примеров оператора match..case.


Пример 1: Оператор match…case в Python

operator = input("Enter an operator: ")

x = 5
y = 10

match operator:
    case '+':
        result = x + y
    case '-':
        result = x - y
    case '*':
        result = x * y
    case '/':
        result = x / y

print(result)

Вывод 1

Enter an operator: *
50

Переменная operator хранит ввод от пользователя, представляющий математический оператор. Оператор match оценивает значение operator и выполняет соответствующий блок кода.

Если operator:

  • + : выполняется result = x + y.

  • - : выполняется result = x - y.

  • * : выполняется result = x * y.

  • / : выполняется result = x / y.

Хотя эта программа работает для входных данных +, -, *, и /, она приведёт к ошибке, если мы введём любой другой символ в качестве оператора.

Вывод 2

Enter an operator: %
ERROR!
NameError: name 'result' is not defined

Мы получаем эту ошибку, потому что входное значение (%) не соответствует ни одному из случаев.

Чтобы решить эту проблему, мы можем использовать случай по умолчанию.


Случай по умолчанию

Мы используем случай по умолчанию, который выполняется, если ни один из случаев не совпадает. Вот как мы используем случай по умолчанию:

match expression:

   case value1:
      ....
   case value2:
      ...
   case _:     # случай по умолчанию
      ....

Здесь _ представляет случай по умолчанию.

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


Пример 2: Случай по умолчанию

operator = input("Enter an operator: ")

x = 5
y = 10

match operator:
    case '+':
        result = x + y
    case '-':
        result = x - y
    case '*':
        result = x * y
    case '/':
        result = x / y
    case _:
         result = "Unsupported operator"

print(result)

Вывод

Enter an operator: %
Unsupported operator

Использование match…case с оператором |

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

Например,

status = int(input("Enter the status code: "))

match status:
    case 200 | 201 | 202:
        print("Success")
    case 400 | 401 | 403:
        print("Client error")
    case 500 | 501 | 502:
        print("Server error")
    case _:
        print("Unknown status")

Вывод 1

Enter the status code: 500
Server error

Вывод 2

Enter the status code: 700
Unknown status

В каждом случае оператор | используется для сопоставления с несколькими значениями. Если значение status соответствует любому из значений в определённом случае, код в этом случае будет выполнен:

  • 200 | 201 | 202: печатает "Success", если status равен 200, 201 или 202.

  • 400 | 401 | 403: печатает "Client error", если status равен 400, 401 или 403.

  • 500 | 501 | 502: печатает "Server error", если status равен 500, 501 или 502.


Использование оператора if в case

В Python мы также можем использовать оператор if в case-клаузах. Это называется guard (ограничитель), который добавляет дополнительное условие к выражению.

Если условие guard (оператор if) оценивается как False, оператор match пропускает этот случай и переходит к следующему.

Например,

subject = input("Enter a subject: ")
score = int(input("Enter a score: "))

match subject:
    # если score 80 или выше по Physics или Chemistry
    case 'Physics' | 'Chemistry' if score >= 80:
        print("Excellent in Science!")

    # если score 80 или выше по English или Grammar
    case 'English' | 'Grammar' if score >= 80:
        print("Excellent in English!")

    # если score 80 или выше по Maths
    case 'Maths' if score >= 80:
        print("Excellent in Maths!")

    case _:
        print(f"Needs improvement in {subject}!")

Вывод 1

Enter a subject: Chemistry
Enter a score: 95
Excellent in Science!

Здесь case 'Physics' | 'Chemistry' if score >= 80: выполняется, потому что subject соответствует "Chemistry", и score 95 удовлетворяет условию if (score >= 80).

В case-клаузах мы использовали оператор if для добавления дополнительного условия. Здесь он проверяет, является ли score 80 или выше.

Примечание

Когда мы используем оператор if в case, условие if оценивается только после того, как найдено совпадение case.