Самый простой способ понять, что происходит внутри программы.
⏱️ ~1 ч·Начальный·📚 4 урока
Программа делает не то — что дальше?
Рано или поздно вы столкнётесь с ситуацией: код запускается без ошибок, но результат неправильный. ФункцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат. возвращает не то число, циклКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно. считает как-то странно, условие срабатывает не тогда, когда нужно. Ошибки нет — а поведение неверное. Что делать?
Главный вопрос отладки всегда один: «что на самом деле лежит в переменных в этот момент?» Мы думаем, что там одно, а Python работает с тем, что там реально есть. Чтобы увидеть реальность, есть самый простой и честный инструмент — print().
Печатаем значения переменных
Идея проста: вставьте print() в подозрительное место и распечатайте значения переменных. Так вы своими глазами увидите, что внутри, вместо того чтобы гадать.
Чтобы потом было понятно, что именно напечаталось, всегда подписывайте вывод — пишите рядом имя переменнойИменованное хранилище для значения. Имя связывается со значением через присваивание: x = 5..
▶ debug-print.py
Запустите код. Вы увидите не только итог, но и total и result по пути. Если бы функция считала неправильно, такие распечатки сразу показали бы, на каком шаге всё пошло не так.
Проверяем тип переменной
Очень частая причина «странного» поведения — переменная не того типа, что вы ожидали. Например, число пришло как строкаТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str).: "5" вместо 5. Внешне в выводе они выглядят одинаково, но ведут себя по-разному. Подсмотреть тип помогает type().
▶ debug-type.py
Печать type(x) мгновенно подсказывает: если там <class 'str'>, а вы ждали число — вот и причина. Значение нужно превратить в число через int().
Следим за ходом цикла
Когда цикл считает неправильно, распечатайте переменные на каждом шаге. Так вы увидите всю «историю» выполнения и заметите, где число стало не таким.
▶ debug-loop.py
Каждая строка вывода — это снимок цикла в конкретный момент. Если ожидаемая и реальная сумма расходятся, вы точно увидите, на каком шаге i или total повели себя не так.
💡Совет
Маркеры в выводе. Чтобы быстро находить свои отладочные распечатки, помечайте их заметным значком, например: print("👉 DEBUG x =", x). После того как баг найден и исправлен, такие строки легко удалить — они служебные.
Предскажите вывод
Прежде чем запустить, подумайте: что напечатает каждая строка? Где переменная price станет числом, а не строкой?
▶ predict-debug.py
Проверьте себя: на строке «1» тип ещё str, на строке «2» — уже int, а на строке «3» арифметика сработает и получится 150.
Заданиерешение.py
В функции есть ошибка в логике: она должна возвращать сумму трёх чисел, но возвращает что-то не то. Добавьте print() внутри функции, чтобы напечатать значение переменной s перед return. Запустите, посмотрите на вывод и исправьте функцию так, чтобы add3(1, 2, 3) вернула 6.
Заданиерешение.py
Функция double_each должна вернуть список, где каждое число удвоено. Сейчас результат пустой. Добавьте print(result) внутри цикла, чтобы увидеть, как наполняется список, найдите ошибку и исправьте функцию так, чтобы double_each([1, 2, 3]) вернула [2, 4, 6].
❓Проверь себя
Зачем вставлять print() во время отладки?
Что напечатает type(x), если x = input() и пользователь ввёл 5?
Почему при отладке цикла полезно печатать переменные на каждом шаге?
Что стоит сделать с отладочными print() после того, как баг найден и исправлен?
ℹ️Важно
✅ Что вы узнали
Если ошибки нет, а результат неверный — главный вопрос: «что реально лежит в переменных?».
print() показывает реальные значения; всегда подписывайте вывод именем переменной.
type(x) помогает поймать переменную не того типа (частый случай — строка вместо числа).
В цикле печатайте переменные на каждом шаге, чтобы найти место поломки.
Отладочные распечатки временные — после починки бага их удаляют.
Комментарии
Загрузка…
Загрузка комментариев…