Python: Оператор 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 значение:
│
├── case 'a' → блок 1
├── case 'b' → блок 2
├── case 'c' → блок 3
└── case _ → блок по умолчаниюС точки зрения количества элементов 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.
Задание
Реализуйте функцию calculate_delivery_cost(), которая принимает страну доставки и вес посылки в килограммах. Функция должна вернуть стоимость доставки.
Для каждой страны есть два тарифа: для посылок весом до 1 кг включительно и для более тяжелых посылок:
'canada': 600 для посылок до 1 кг, 900 для остальных'usa': 800 для посылок до 1 кг, 1200 для остальных'germany': 700 для посылок до 1 кг, 1000 для остальных
Если страна неизвестна, функция должна вернуть None.
Примеры вызова функции:
calculate_delivery_cost('canada', 0.5) # 600
calculate_delivery_cost('canada', 2) # 900
calculate_delivery_cost('usa', 1) # 800
calculate_delivery_cost('france', 1) # NoneПолезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import solution
def test1():
assert solution.calculate_delivery_cost("canada", 0.5) == 600
assert solution.calculate_delivery_cost("canada", 1) == 600
assert solution.calculate_delivery_cost("canada", 2) == 900
assert solution.calculate_delivery_cost("usa", 1) == 800
assert solution.calculate_delivery_cost("usa", 3) == 1200
assert solution.calculate_delivery_cost("germany", 0.3) == 700
assert solution.calculate_delivery_cost("germany", 1.5) == 1000
assert solution.calculate_delivery_cost("france", 1) is NoneРешение учителя откроется через:
20:00
