Глава 12 · Множество увлекательных мини-проектов!

Строим проект по шагам

Маленькими проверяемыми шагами вместо 80 строк за раз — и системный способ найти и исправить ошибку, когда что-то пошло не так.

Не пишите 80 строк, а потом нажимайте «Запустить»

Профессиональная привычка, которую стоит выработать с первого крупного проекта: инкрементальная разработка — маленькими шагами, каждый из которых сразу проверяется.

Маленькая версия5 строкПроверказапустили, посмотрели+ новая частьветвление / циклПроверкаснова запустилиФинальный проектпо шагам, а не сразу
Small version → test → add a feature → test → ... — а не всё и сразу
Работающая маленькая версия лучше, чем неработающая большая
Если после каждого маленького шага программа запускается и делает то, что ожидалось — вы всегда точно знаете, где искать причину, если что-то сломалось на следующем шаге.

Версии: сначала работает, потом — лучше

ВерсияЧто в ней есть
V1минимальная работающая версия — ядро идеи, без украшений
V2более надёжная проверка ввода, обработка граничных случаев
V3дополнительные возможности, улучшенный вывод

Такую первую работающую версию иногда называют MVP (minimal working version) — «сначала добьёмся маленькой, но работающей версии», а уже потом улучшаем.

Проверяем проект на примерах

Для каждого нетривиального проекта полезно заранее продумать несколько сценариев — что подать на вход и что должно получиться на выходе:

СценарийВходОжидаемый результат
секрет 50, попытка меньшеguess = 20«слишком мало»
секрет 50, попытка большеguess = 70«слишком много»
секрет 50, попытка вернаguess = 50победа, цикл завершается
Граничные случаи
Обычных примеров недостаточно — стоит явно проверить: пустой ввод, ноль, отрицательное число там, где оно не ожидается, повтор в данных, пустой список, неизвестная команда, значение точно на границе диапазона. Мы вернёмся к этой идее в каждом крупном проекте главы.

Воркфлоу отладки

ОжиданиеEXPECTEDРеальностьACTUALПервоерасхождениегде именно разошлосьПричинакакая строка виноватаИсправлениеменяем одну вещь
Ожидание vs реальность → первое расхождение → причина → исправление

Пошагово:

Шесть шагов отладки — работают для любого проекта этой главы
1
Воспроизвести ошибку
получить её снова, стабильно
2
Осмотреть значения
print() нужных переменных
3
Найти первое неверное состояние
где ожидание разошлось с фактом
4
Изолировать условие/цикл
какая именно строка виновата
5
Исправить одну причину
не переписывать всё
6
Запустить снова
убедиться, что починилось

print()-отладка

print_otladka.py
for word in words:
    print("DEBUG:", word, counts.get(word))   # временная диагностика
    counts[word] = counts.get(word, 0) + 1
Уберите отладочные print() после того, как нашли причину
Временный print("DEBUG:", ...) внутри цикла — самый надёжный способ увидеть, что происходит на самом деле. Уберите такие строки, когда баг найден и исправлен — иначе они засоряют настоящий вывод программы.

Debug Lab: найдите ошибку

В программе ниже счёт должен расти на каждом правильном ответе, но почему-то всегда остаётся 1. Прежде чем читать дальше — попробуйте найти причину сами.

debug_lab_schet.py
answers = ["python", "git", "sql"]
user_answers = ["python", "python", "sql"]

for correct, given in zip(answers, user_answers):
    score = 0
    if given == correct:
        score += 1

print("Итоговый счёт:", score)
Причина: счётчик обнуляется внутри цикла
score = 0 стоит ВНУТРИ тела цикла — значит, он пересоздаётся на каждой итерации, и предыдущий прогресс теряется. Счётчик нужно инициализировать ОДИН раз, до цикла — та же ошибка, что и «почему cart total сбрасывается на каждой итерации» из главы 10.

Чек-лист готовности проекта

Прежде чем сказать «проект готов»

  • Программа выполняет то, что требовалось (чек-лист приёмки)?
  • Обычный, «счастливый» ввод работает правильно?
  • Проверены граничные случаи (пусто, ноль, повтор, неизвестная команда)?
  • Имена переменных понятны без дополнительных объяснений?
  • Нет ли повторяющегося куска кода, который можно было бы убрать?
  • Использована ли подходящая коллекция (список / множество / словарь)?
  • Цикл действительно останавливается в нужный момент?
  • Условия проверяют именно то, что нужно?
  • Вывод понятен — пользователь видит, что произошло?
  • Сможет ли другой человек прочитать и понять эту программу?
Практика: Debug Lab — найдите и исправьте ошибку счётчика
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →