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
← ПредыдущийСледующий →