JustCaptain kod-buduschego
bb03bcdc780611e5fa808dc647b9a71eb07c292d
Перейти к файлу
Код
TASK.md

Задача: расчёт стоимости доставки интернет-магазина

Контекст

Интернет-магазин продаёт товары по Европе.
Стоимость доставки зависит от нескольких параметров заказа.
Логика расчёта вынесена в отдельные функции.

Нужно реализовать набор функций, каждая отвечает за отдельный этап расчёта.

⸻

Вводные данные

У заказа есть параметры:

  • weight — вес заказа (кг)
  • distance — расстояние доставки (км)
  • order_amount — стоимость заказа (€)
  • priority — срочность доставки ("standard" или "express")
  • fragile — хрупкий товар (True или False)
  • customer_type — тип клиента:
    • "regular"
    • "vip"

⸻

Бизнес-правила

  1. Базовая стоимость доставки по весу

Функция:

def calculate_weight_cost(weight):
pass

Правила:

  • до 1 кг → 5 €
  • от 1 до 5 кг → 8 €
  • от 5 до 10 кг → 12 €
  • больше 10 кг → 12 € + 1 € за каждый кг сверх 10

⸻

  1. Стоимость по расстоянию

Функция:

def calculate_distance_cost(distance):
pass

Правила:

  • до 50 км → 3 €
  • от 50 до 200 км → 7 €
  • от 200 до 500 км → 15 €
  • больше 500 км → 25 €

⸻

  1. Надбавка за срочность

Функция:

def calculate_priority_fee(priority):
pass

Правила:

  • "standard" → 0 €
  • "express" → +10 €

⸻

  1. Надбавка за хрупкость

Функция:

def calculate_fragile_fee(fragile):
pass

Правила:

  • False → 0 €
  • True → +6 €

⸻

  1. Скидка по сумме заказа

Функция:

def calculate_order_discount(order_amount):
pass

Правила:

  • до 50 € → 0%
  • от 50 до 100 € → 5%
  • от 100 до 200 € → 10%
  • больше 200 € → 15%

Возвращает процент скидки, не сумму.

⸻

  1. Скидка по типу клиента

Функция:

def calculate_customer_discount(customer_type):
pass

Правила:

  • "regular" → 0%
  • "vip" → 5%

⸻

  1. Итоговая функция расчёта доставки

Главная функция:

def calculate_total_delivery_cost(
weight,
distance,
order_amount,
priority="standard",
fragile=False,
customer_type="regular"
):
pass

Логика:

  1. Посчитать:
    • стоимость по весу
    • стоимость по расстоянию
    • надбавки
  2. Сложить всё → получить базовую стоимость
  3. Посчитать скидки:
    • по сумме заказа
    • по типу клиента
  4. Сложить проценты скидок
  5. Применить скидку к базовой стоимости
  6. Вернуть итоговую цену доставки

⸻

Пример входных данных

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%

Включить налог в итоговый расчёт.