Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Python
/

Оператор Match

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
Коммерческий опыт и Трудоустройство

Полезное

  • Match

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

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

Оператор Match

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
Коммерческий опыт и Трудоустройство

Полезное

  • Match

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

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

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

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

waiting_clock
← ПредыдущийСледующий →