Задача: расчёт стоимости доставки интернет-магазина
Контекст
Интернет-магазин продаёт товары по Европе.
Стоимость доставки зависит от нескольких параметров заказа.
Логика расчёта вынесена в отдельные функции.
Нужно реализовать набор функций, каждая отвечает за отдельный этап расчёта.
⸻
Вводные данные
У заказа есть параметры:
- weight — вес заказа (кг)
- distance — расстояние доставки (км)
- order_amount — стоимость заказа (€)
- priority — срочность доставки ("standard" или "express")
- fragile — хрупкий товар (True или False)
- customer_type — тип клиента:
- "regular"
- "vip"
⸻
Бизнес-правила
- Базовая стоимость доставки по весу
Функция:
def calculate_weight_cost(weight):
pass
Правила:
- до 1 кг → 5 €
- от 1 до 5 кг → 8 €
- от 5 до 10 кг → 12 €
- больше 10 кг → 12 € + 1 € за каждый кг сверх 10
⸻
- Стоимость по расстоянию
Функция:
def calculate_distance_cost(distance):
pass
Правила:
- до 50 км → 3 €
- от 50 до 200 км → 7 €
- от 200 до 500 км → 15 €
- больше 500 км → 25 €
⸻
- Надбавка за срочность
Функция:
def calculate_priority_fee(priority):
pass
Правила:
- "standard" → 0 €
- "express" → +10 €
⸻
- Надбавка за хрупкость
Функция:
def calculate_fragile_fee(fragile):
pass
Правила:
- False → 0 €
- True → +6 €
⸻
- Скидка по сумме заказа
Функция:
def calculate_order_discount(order_amount):
pass
Правила:
- до 50 € → 0%
- от 50 до 100 € → 5%
- от 100 до 200 € → 10%
- больше 200 € → 15%
Возвращает процент скидки, не сумму.
⸻
- Скидка по типу клиента
Функция:
def calculate_customer_discount(customer_type):
pass
Правила:
- "regular" → 0%
- "vip" → 5%
⸻
- Итоговая функция расчёта доставки
Главная функция:
def calculate_total_delivery_cost(
weight,
distance,
order_amount,
priority="standard",
fragile=False,
customer_type="regular"
):
pass
Логика:
- Посчитать:
- стоимость по весу
- стоимость по расстоянию
- надбавки
- Сложить всё → получить базовую стоимость
- Посчитать скидки:
- по сумме заказа
- по типу клиента
- Сложить проценты скидок
- Применить скидку к базовой стоимости
- Вернуть итоговую цену доставки
⸻
Пример входных данных
weight = 7
distance = 120
order_amount = 180
priority = "express"
fragile = True
customer_type = "vip"
⸻
Ожидаемый формат использования
cost = calculate_total_delivery_cost(
weight=7,
distance=120,
order_amount=180,
priority="express",
fragile=True,
customer_type="vip"
)
print(cost)
⸻
Дополнительные требования (для усложнения)
A. Валидация параметров
Если:
- weight <= 0
- distance <= 0
- неизвестный priority
- неизвестный customer_type
→ выбрасывать:
ValueError
⸻
B. Логирование расчёта
Добавить параметр:
debug=False
Если True — функция печатает:
Weight cost: 12
Distance cost: 7
Priority fee: 10
Fragile fee: 6
Total before discount: 35
Discount: 15%
Final cost: 29.75
⸻
C. Округление
Итоговую цену:
round(value, 2)
⸻
Что тренируется
- позиционные и именованные параметры
- значения по умолчанию
- разбиение логики на функции
- возврат значений
- композиция функций
- валидация аргументов
- читаемость сигнатур функций
- повторное использование функций
⸻
Дополнительное усложнение (уровень выше)
Добавить:
def calculate_tax(amount, country):
pass
Ставки:
- "DE" → 19%
- "FR" → 20%
- "PL" → 23%
Включить налог в итоговый расчёт.