DamiRocK

Python: match и учебные тарифы доставки по стране и весу

Выбираем страну через match/case, затем проверяем порог 1 кг. Возвращаем None для неизвестной страны и не выдаём учебные числа за реальные тарифы.

Выбор по образцу

Match сопоставляет значение с последовательностью образцов case. В простом примере используются строковые литералы, а case _ подходит к любому оставшемуся значению. Полные возможности структурного сопоставления шире проверки равенства; здесь изучается только начальная форма.

Задание источника

Страны canada, usa и germany имеют по два учебных тарифа: для веса до 1 кг включительно и более тяжёлых посылок. Неизвестная страна должна дать None. Числа — данные упражнения, не действующие тарифы перевозчиков.

def calculate_delivery_cost(country: str, weight: float) -> int | None:
    match country:
        case "canada":
            return 600 if weight <= 1 else 900
        case "usa":
            return 800 if weight <= 1 else 1200
        case "germany":
            return 700 if weight <= 1 else 1000
        case _:
            return None

В исходном решении внутри case используется обычный if. Здесь его короткий эквивалент записан условным выражением; таблица и границы сохранены.

Проверка порога

Для canada и 0,5 ответ 600, для canada и 2 — 900. Для usa и ровно 1 кг ответ 800, поскольку граница включена в первый тариф. France даёт None независимо от веса.

Что не проверяется

Веса предполагаются корректными неотрицательными значениями. Отрицательный вес не отклоняется автоматически и попал бы в первую ветвь. Регистр страны не нормализуется: Canada отличается от canada. Эти ограничения нужно задать отдельно перед использованием функции как реального интерфейса.

Синтаксис версии

Match и запись объединения типов int | None в таком виде рассчитаны на Python 3.10 и новее. Отступы после case обязательны; пустой блок только с комментарием не является полноценным исполняемым телом.

Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Тарифная таблица сохранена; сокращение ветвей отмечено.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.