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
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.