🎉 Разбор задачи: где прячется ошибка? 🎉
Друзья, спасибо всем, кто поучаствовал! Давайте разберёмся детально — и вы сразу увидите, в чём подвох. 👇
🧠 Что делает код:
- Функция calculate_total считает итоговую стоимость: цена × количество.
- Если сумма больше 1000 — применяется скидка 10%.
- Если больше 500 (но не больше 1000) — скидка 5%.
🤔 В чём проблема:
- Порядок условий if/elif выглядит логично, но на деле логика скидок нарушается.
- При вызове calculate_total(600, 2) получаем total = 1200.
- Срабатывает первое условие (total > 1000) — скидка 10%, итог: 1200 * 0.9 = 1080.
- А вот если бы сумма была, например, 550, скидка тоже была бы 10% — потому что условие > 1000 не сработает, но и > 500 сработает только при отсутствии более высокого порога. Но тут важнее другое: логика скидок пересекается, и диапазоны не разделены чётко.
❗ Главная ошибка — в перекрытии диапазонов и порядке проверки:
- Сейчас скидка 10% применяется при total > 1000, а 5% — при total > 500. Но если сумма, скажем, 1100, она всё равно попадает под 10%-ную скидку — это ок.
- Однако если мы позже захотим добавить ещё одну скидку (например, 15% при > 2000), порядок станет критичным.
- Более серьёзная проблема — отсутствие нижнего порога для скидки 10%: получается, что любая сумма выше 1000 получает 10%, а любая выше 500 — 5%, но при этом суммы от 501 до 1000 тоже попадают под 5%, что вроде бы верно, но структура условий хрупкая.
✅ Как сделать правильно (надёжный вариант):
def calculate_total(price, quantity):
total = price * quantity
if total > 1000:
total = total * 0.9 # скидка 10%
elif 500 < total <= 1000: # явно задаём диапазон
total = total * 0.95 # скидка 5%
return total
💡 Почему это лучше:
- Чётко прописаны границы: скидка 5% работает только в диапазоне от 500 до 1000.
- Логика становится предсказуемой, даже если позже добавятся новые уровни скидок.
- Такой подход проще читать и поддерживать — особенно в командном коде.
🚀 Бонус для тех, кто хочет избегать подобных ошибок:
Хотите прокачать внимательность к деталям и научиться сразу видеть типовые проблемы в коде? Приобретайте гайд «5 типовых ошибок в строковых методах Python: как не терять время на ревью и фиксы» — в нём собраны частые ловушки, примеры и готовые шаблоны проверок.
👉 Ссылка на гайд: https://vk.ru/market/product/5-tipovykh-oshibok-v-strokovykh-metodakh-python-kak-ne-teryat-vremya-na-revyu-i-fixy-233041006-14621525
#Python #РазборКода #ОшибкиВКоде #ОбучениеПрограммированию #PythonДляНачинающих #ПрактикаКода
Друзья, спасибо всем, кто поучаствовал! Давайте разберёмся детально — и вы сразу увидите, в чём подвох. 👇
🧠 Что делает код:
- Функция calculate_total считает итоговую стоимость: цена × количество.
- Если сумма больше 1000 — применяется скидка 10%.
- Если больше 500 (но не больше 1000) — скидка 5%.
🤔 В чём проблема:
- Порядок условий if/elif выглядит логично, но на деле логика скидок нарушается.
- При вызове calculate_total(600, 2) получаем total = 1200.
- Срабатывает первое условие (total > 1000) — скидка 10%, итог: 1200 * 0.9 = 1080.
- А вот если бы сумма была, например, 550, скидка тоже была бы 10% — потому что условие > 1000 не сработает, но и > 500 сработает только при отсутствии более высокого порога. Но тут важнее другое: логика скидок пересекается, и диапазоны не разделены чётко.
❗ Главная ошибка — в перекрытии диапазонов и порядке проверки:
- Сейчас скидка 10% применяется при total > 1000, а 5% — при total > 500. Но если сумма, скажем, 1100, она всё равно попадает под 10%-ную скидку — это ок.
- Однако если мы позже захотим добавить ещё одну скидку (например, 15% при > 2000), порядок станет критичным.
- Более серьёзная проблема — отсутствие нижнего порога для скидки 10%: получается, что любая сумма выше 1000 получает 10%, а любая выше 500 — 5%, но при этом суммы от 501 до 1000 тоже попадают под 5%, что вроде бы верно, но структура условий хрупкая.
✅ Как сделать правильно (надёжный вариант):
def calculate_total(price, quantity):
total = price * quantity
if total > 1000:
total = total * 0.9 # скидка 10%
elif 500 < total <= 1000: # явно задаём диапазон
total = total * 0.95 # скидка 5%
return total
💡 Почему это лучше:
- Чётко прописаны границы: скидка 5% работает только в диапазоне от 500 до 1000.
- Логика становится предсказуемой, даже если позже добавятся новые уровни скидок.
- Такой подход проще читать и поддерживать — особенно в командном коде.
🚀 Бонус для тех, кто хочет избегать подобных ошибок:
Хотите прокачать внимательность к деталям и научиться сразу видеть типовые проблемы в коде? Приобретайте гайд «5 типовых ошибок в строковых методах Python: как не терять время на ревью и фиксы» — в нём собраны частые ловушки, примеры и готовые шаблоны проверок.
👉 Ссылка на гайд: https://vk.ru/market/product/5-tipovykh-oshibok-v-strokovykh-metodakh-python-kak-ne-teryat-vremya-na-revyu-i-fixy-233041006-14621525
#Python #РазборКода #ОшибкиВКоде #ОбучениеПрограммированию #PythonДляНачинающих #ПрактикаКода
Рекламный пост