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
