Что такое отладка программ
Отладка программ — это работа детектива: программа ведёт себя не так, как задумано, и нужно по уликам найти строку, где мысль автора и код разошлись. Баг — жаргонное название такой ошибки.
Ошибки бывают трёх видов. Синтаксические — программа написана не по правилам языка, и Python отказывается её запускать: забыта скобка, кавычка или двоеточие. Ошибки выполнения — программа запустилась, но на какой-то строке не смогла сделать действие: разделила на ноль или обратилась к несуществующей переменной. Логические — самые коварные: программа работает до конца, ничего не сообщает, но выдаёт неправильный ответ. С первыми двумя видами Python помогает сам, печатая сообщение. Логическую ошибку приходится искать без подсказки.
Сеймур Пейперт, автор языка для детей Logo, считал, что умение отлаживать важнее умения сразу писать без багов: ошибка — это не провал, а информация о том, что пошло не так[1]. Позже исследователи из MIT Media Lab Карен Бреннан и Митчел Резник включили тестирование и отладку в список ключевых практик вычислительного мышления[2]. Иными словами, отладка — это обычная часть работы, а не наказание за невнимательность.
Шаг 1. Прочитайте сообщение об ошибке снизу вверх
Если программа упала, Python печатает отчёт Traceback, и главное в нём — 2 последние строки: номер строки кода и тип ошибки с пояснением. Читать отчёт удобнее снизу вверх.
a = 5
b = 3
print(a + c)
Traceback (most recent call last):
File "main.py", line 3, in <module>
print(a + c)
^
NameError: name 'c' is not defined
Последняя строка говорит: тип ошибки — NameError, имя c не определено. Строкой выше — сам проблемный код, а ещё выше — номер строки: line 3. Галочка ^ показывает место в строке. В официальной документации Python отчёту об ошибке и типам ошибок посвящена отдельная глава[4]. Теперь ясно, что искать: переменную c никто не создавал, а имелась в виду, скорее всего, b. В редакторе на нашем сайте под сообщением появляется ещё и подсказка на русском со ссылкой на разбор. Подробно об устройстве такого отчёта рассказано в статье как читать ошибки Python.
| Тип ошибки | Что обычно случилось | Куда смотреть |
| SyntaxError | забыта скобка, кавычка, двоеточие | указанная строка и строка выше |
| IndentationError | сбился отступ | начало строк блока |
| NameError | опечатка в имени или переменная ещё не создана | где имя появилось впервые |
| TypeError | строка складывается с числом | результат input() |
| IndexError | индекс за пределами списка | границы range и len |
| ZeroDivisionError | деление на ноль | откуда взялся делитель |
Шаг 2. Найдите строку, а потом посмотрите выше
Номер строки в сообщении — это место, где Python заметил проблему, а не всегда место, где её допустили. Для синтаксических ошибок причина часто стоит на 1 строку раньше.
print("Привет"
x = 1
SyntaxError: '(' was never closed
В новых версиях Python сообщения стали понятнее, и здесь интерпретатор прямо пишет, что скобка не закрыта. Но бывает и иначе: забытая кавычка в строке 4 может «съесть» конец программы, а сообщение укажет на строку 7. Правило простое — если в указанной строке всё в порядке, проверьте ту, что над ней, особенно её конец: скобки, кавычки, двоеточие. Разбор частых случаев есть на странице об ошибке SyntaxError.
С ошибками выполнения наоборот: номер строки точный, но причина может быть далеко. Если в строке 20 делитель оказался нулём, ноль мог появиться в строке 5. Тогда нужно проследить путь значения назад: где переменную создали и где меняли.
Шаг 3. Print-отладка: покажите, что внутри
Print-отладка — это временные строки print(), которые показывают значения переменных в нужный момент. Это самый простой и самый частый приём: он работает в любом редакторе и не требует никаких инструментов.
Возьмём программу из редактора выше. Она должна выводить среднюю оценку 4.2, а выводит 3.2. Сообщения об ошибке нет — значит, баг логический. Добавим вывод внутрь цикла:
ocenki = [5, 4, 3, 5, 4]
summa = 0
for i in range(1, len(ocenki)):
print("i =", i, "ocenka =", ocenki[i], "summa =", summa)
summa = summa + ocenki[i]
i = 1 ocenka = 4 summa = 0
i = 2 ocenka = 3 summa = 4
i = 3 ocenka = 5 summa = 7
i = 4 ocenka = 4 summa = 12
Теперь видно: первая пятёрка с индексом 0 в сумму не попала, цикл начинается с 1. Исправление — range(len(ocenki)) или перебор самих оценок for x in ocenki. Подписывайте выводимые значения, как в примере: строка «4 0» через минуту уже непонятна, а «i = 1 summa = 0» читается сразу. Когда баг найден, отладочные print удаляют, иначе они засорят ответ программы.
Шаг 4. Одна гипотеза — одна проверка
Если причина неясна, сформулируйте гипотезу словами — «я думаю, сумма неправильная, потому что цикл пропускает элемент» — и придумайте 1 проверку, которая её подтвердит или опровергнет.
Так работают учёные в любом исследовании, и так же стоит работать с кодом. Главное правило: меняйте только одно место за раз и сразу запускайте. Если поправить три строки одновременно и программа заработает, вы не узнаете, какая правка помогла, а какая добавила новую ошибку на будущее. Хорошая проверка — маленький пример, ответ к которому вы знаете заранее. Для средней оценки подойдёт список [5, 5]: ответ точно 5.0. Если программа выдаёт 2.5, гипотеза о пропущенном элементе подтверждается.
Полезно и сокращать программу. Закомментируйте половину кода знаком # и посмотрите, осталась ли ошибка. Если осталась — она в первой половине, если нет — во второй. Несколько таких шагов приводят к нужной строке даже в длинной программе.
Шаг 5. Метод резиновой уточки
Метод резиновой уточки — это объяснение своего кода вслух строка за строкой кому угодно, даже игрушке на столе. Часто ошибка находится уже на 3-й или 4-й фразе.
Почему это работает? Когда мы читаем свой код глазами, мозг видит то, что мы хотели написать, а не то, что написано. Проговаривая каждую строку — «здесь я создаю пустую сумму, здесь цикл идёт от одного до…» — приходится замедлиться, и расхождение становится заметным: «стоп, почему от одного?». Уточка не обязательна: подойдёт младший брат, кот или родитель, который не знает Python. Слушателю не нужно ничего понимать, ему нужно только не перебивать. Родителям, которые хотят так помогать, пригодится статья как помочь ребёнку с программированием.
Близкий приём — трассировка на бумаге: таблица, где для каждого шага цикла записаны значения переменных. Она медленнее print-отладки, но тренирует умение читать код без компьютера, а это нужно и на уроке, и на экзамене.
Отладка программ на ОГЭ и в олимпиадах
На ОГЭ по информатике задания 11–16 выполняются на компьютере, а в задании 16, по материалам ФИПИ, нужно написать программу на универсальном языке, например на Python[3]. Отладка здесь — часть решения, и формат задания удобно заранее посмотреть в демоверсии ФИПИ.
Перед сдачей программу стоит проверить на примерах из условия, а потом на крайних случаях: одно число, все числа одинаковые, ни одно число не подходит под условие. Ошибки на границах — самые частые: цикл не дошёл до последнего числа, счётчик начался с единицы вместо нуля. В олимпиадных задачах то же самое, только тестов больше и они скрыты. Привычка придумывать свои маленькие тесты экономит баллы сильнее, чем знание редких функций.
Когда print-отладка не поможет
Print не поможет, если программа вообще не запускается или выводит так много, что прочитать невозможно. В этих 4 случаях нужен другой подход.
- SyntaxError в строке 1 или 2. Программа не стартует, и до print дело не дойдёт — читайте сообщение и проверяйте скобки.
- Цикл на 10 000 шагов. Тысячи строк вывода не прочесть — печатайте только при условии, например когда
i % 1000 == 0. - Программа зависла. Скорее всего, это бесконечный цикл while: проверьте, меняется ли условие на каждом шаге из 1–2 подозрительных.
- Ошибка в понимании задачи. Если неверно понято условие, 100 print не помогут — перечитайте задачу и посчитайте пример вручную.
Миф: «хорошие программисты пишут без ошибок». Таких программистов не существует: опытный автор тоже ошибается, просто быстрее находит баг, потому что у него есть привычка проверять и сужать круг поиска.
Миф: «если программа ничего не сообщила, значит, она правильная». Это не подтверждается: логическая ошибка не вызывает сообщений, и программа спокойно выведет неверный ответ. Проверять результат на примерах нужно всегда.
Чего делать нельзя
Нельзя переписывать всю программу с нуля при первой же ошибке: чаще всего баг сидит в одной строке. Вот что ещё мешает поиску.
- Нельзя пропускать сообщение интерпретатора, не прочитав последнюю строку: там тип и подсказка.
- Не стоит менять сразу несколько мест — непонятно, какая правка сработала.
- Не следует менять код наугад, пока не появилась гипотеза о причине.
- Не стоит оставлять отладочные print в готовой программе: они портят ответ, и на экзамене решение не засчитают.
- Нельзя проверять программу только на одном примере — пробуйте крайние случаи.
- Не следует родителю исправлять код за ребёнка: лучше задать вопрос «что должно быть в этой переменной?».
Источники
[1] Papert S. Mindstorms: Children, Computers, and Powerful Ideas. New York: Basic Books, 1980.
[2] Brennan K., Resnick M. New frameworks for studying and assessing the development of computational thinking // Proceedings of the 2012 Annual Meeting of the American Educational Research Association. Vancouver, 2012.
[3] ФИПИ. Методические рекомендации для обучающихся по организации индивидуальной подготовки к ОГЭ 2026 года. Информатика. М., 2026.
[4] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
Вопросы и ответы
Почему ошибки называют багами?
Bug по-английски — «жучок». Инженеры давно называют так неполадки в технике, и слово перешло в программирование. Поиск багов по-английски — debugging, «удаление жучков».
Что делать, если сообщение на английском непонятно?
Найдите тип в последней строке — NameError, TypeError — и откройте его разбор в разделе про ошибки Python. Через десяток случаев основные типы запоминаются сами.
Есть ли в Python отладчик?
Да, в IDLE есть пошаговый отладчик, а в стандартной библиотеке — модуль pdb. Оба инструмента описаны в документации Python, но новичку достаточно print: он нагляднее и работает везде, включая редактор на сайте.
Сколько времени тратить на поиск одного бага?
Если за 15–20 минут причина не нашлась, сделайте перерыв или объясните код кому-нибудь. Свежий взгляд часто сразу видит то, что ускользало.
Как отладка программ помогает в учёбе?
Она приучает проверять свою работу и искать причину, а не винить компьютер. Тот же подход пригодится в задачах по математике и физике.
Почему программа работает у друга, а у меня нет?
Сравните код построчно: часто отличается один символ, отступ или вводимые данные. Попробуйте запустить обе версии на одном и том же примере.