Python: Оператор Match

Многие языки в дополнение к условной конструкции if включают в себя switch. С выходом версии Python 3.10 также был добавлен оператор с аналогичной функциональностью — match. В этом уроке мы познакомимся с этим оператором.

Оператор match — это специализированная версия if, которую создали для особых ситуаций. Например, ее нужно использовать там, где есть цепочка if else с проверками на равенство:

if status == 'processing':
    # Делаем раз
elif status == 'paid':
    # Делаем два
elif status == 'new':
    # Делаем три
else:
    # Делаем четыре

У этой составной проверки есть одна отличительная черта: каждая ветка здесь — это проверка значения переменной status. Оператор match позволяет записать этот код короче и выразительнее:

match status:
    case 'processing':  # status == 'processing'
        # Делаем раз
    case 'paid':  # status == 'paid'
        # Делаем два
    case 'new':  # status == 'new'
        # Делаем три
    case _:  # else
        # Делаем четыре

С точки зрения количества элементов match — это сложная конструкция. Она состоит из таких элементов:

  • Внешнее описание, в которое входит ключевое слово match. Это переменная, по значениям которой match будет выбирать поведение
  • Конструкции case, внутри которой описывается поведение для разных значений рассматриваемой переменной. Каждый case соответствует if в примере выше. При этом case _ — это особая ситуация, которая соответствует ветке else в условных конструкциях. Как и else, указывать case _ необязательно

Внутри match допустим только тот синтаксис, который показан выше. Другими словами, там можно использовать case. А вот внутри каждого case ситуация другая. Здесь можно выполнять любой произвольный код:

match count:
    case 1:
        # Делаем что-то полезное
    case 2:
        # Делаем что-то полезное
    case _:
        # Что-то делаем

Иногда результат, полученный внутри case — это конец выполнения функции, которая содержит match. В таком случае его нужно как-то вернуть наружу. Для решения этой задачи есть два способа:

Первый. Создать переменную перед match, заполнить ее в case и затем в конце вернуть значение этой переменной наружу:

def count_items(count):
    # Объявляем переменную
    result = ''

    # Заполняем
    match count:
        case 1:
            result = 'one'
        case 2:
            result = 'two'
        case _:
            result = None

    # Возвращаем
    return result

Второй способ проще и короче. Вместо создания переменной при работе с case можно делать обычный возврат из функции:

def count_items(count):
    match count:
        case 1:
            return 'one'
        case 2:
            return 'two'
        case _:
            return None

Оператор match хоть и встречается в коде, но технически всегда можно обойтись без него. Ключевая польза при его использовании в том, что он лучше выражает намерение программиста, когда нужно проверять конкретные значения переменной. Хотя кода и стало физически чуть больше, читать его легче, в отличие от блоков elif.

Задание

Реализуйте функцию get_number_explanation(), которая принимает на вход число и возвращает объяснение этого числа. Если для числа нет объяснения, то возвращается just a number. Объяснения есть только для следующих чисел:

  • 666 - devil number
  • 42 - answer for everything
  • 7 - prime number

Примеры вызова функции:

get_number_explanation(8)  # just a number
get_number_explanation(666)  # devil number
get_number_explanation(42)  # answer for everything
get_number_explanation(7)  # prime number

Полезное

Как с вами связаться? 🙃

Команда проекта находится в телеграм-сообществе по ссылке https://ttttt.me/HexletLearningBot. Там можно задать любой вопрос и повлиять на проект

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "Обсуждение". Как правильно задать вопрос:

В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт

Loading...

Ваше упражнение проверяется по этим тестам

1import index
2
3
4def test1():
5    assert index.get_number_explanation(0) == "just a number"
6    assert index.get_number_explanation(666) == "devil number"
7    assert index.get_number_explanation(42) == "answer for everything"
8    assert index.get_number_explanation(7) == "prime number"
9

Решение учителя откроется через:

20:00
waiting_clock