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