Разбираем чужой код и ищем ошибки

Урок 7.5 · Программирование с нуля · Модуль 7. Файлы и ошибки · Бесплатно

Цель урока: Находить ошибку в готовом коде: читать сообщение, проверять значения, имена и границы, а не менять код наугад.

Нужно знать заранее: Циклы, списки, сообщения об ошибках

Объяснение

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

Как это работает: Порядок из шести шагов снимает половину страха перед незнакомым кодом. 1. Прочитайте задачу: что программа должна была сделать. Без этого любая строка выглядит бессмысленной. 2. Пробегите код глазами целиком, не вчитываясь: сколько в нём частей и где они начинаются. 3. Найдите вход и выход: что приходит снаружи (input, список, аргумент функции) и что печатается. 4. Пройдите по строкам с блокнотом: выписывайте значения переменных после каждой строки. Так вы перестаёте угадывать. 5. Сверьте имена и границы: похожие имена (total и totall), нумерация с нуля, правая граница range не включается. 6. Прочитайте сообщение об ошибке: в нём есть тип ошибки и номер строки — это не приговор, а адрес.

Важно: В настоящем Python сообщение об ошибке выглядит так: Traceback (most recent call last): File "main.py", line 5, in <module> print(totall) NameError: name 'totall' is not defined Traceback — это «след»: путь, по которому программа шла до ошибки. Читать его сверху вниз не обязательно; начните с конца. File "main.py", line 5 — файл и номер строки. print(totall) — сама строка. NameError — тип ошибки, name 'totall' is not defined — объяснение: имени totall нет. В уроке сообщение переведено на русский, но порядок тот же: сначала место, потом тип и смысл.

Разбор: Обозначения в Python читаются почти как в математике, но не все. Вот что значит каждый знак. = — положить значение в переменную: total = 0. Это не «равно», а «запиши». == — сравнить два значения и получить True или False: if age == 18. != — «не равно»: if answer != "да". += — прибавить к текущему значению: total += price значит total = total + price. : — начало блока. Следующая строка с отступом входит в него (if, for, def, try). () — вызов функции: print("Привет"), len(items). Внутри — то, что функция получает. [] — список или взятие по номеру: prices[0] — первый элемент, нумерация с нуля. {} — словарь: {"name": "Аня"}; так же обозначают множество. # — комментарий: всё до конца строки Python не читает. % — остаток от деления: 7 % 2 равно 1. Так проверяют чётность. // — деление нацело: 7 // 2 равно 3. — возведение в степень: 2 3 равно 8. "..." и '...' — строка; кавычки обязаны быть парными. отступ в 4 пробела — не украшение, а часть языка: по нему Python понимает, что входит в блок. , — разделяет аргументы и элементы: print(a, b), [1, 2, 3].

Пример с разбором: total = 0 for i in range(1, 4): total += i print(totall) Разбираем по шагам. total = 0 — заводим счётчик и кладём в него ноль. range(1, 4) даёт числа 1, 2, 3: правая граница не входит, четвёрки здесь нет. На каждом шаге total += i прибавляет очередное число: 0 + 1 = 1, потом 1 + 2 = 3, потом 3 + 3 = 6. Последняя строка печатает totall, а переменной с таким именем нет — есть total. Python остановится и скажет NameError: name 'totall' is not defined. Программа не «сломалась непонятно»: она назвала имя, которого не нашла.

Разбор по шагам: Вторая частая ошибка — границы. Чтобы сложить числа от 1 до 4, пишут range(1, 5): правая граница не включается, поэтому её увеличивают на единицу. Ошибка «не хватает последнего элемента» почти всегда именно здесь. И ещё: если печатать внутри цикла, а не после него, строк в выводе будет столько же, сколько шагов.

Частая ошибка: Правка наугад: поменять всё, что кажется подозрительным, и запустить. Тогда непонятно, что помогло и что теперь сломано. Правило простое: прочитать сообщение, найти одну причину, исправить одну строку, запустить снова. Вторая ошибка — исправить всё сразу и потерять, что именно помогло. Меняйте одну строку, запускайте, смотрите на результат. Если появилась новая ошибка — это нормально: значит, вы сдвинулись с места, и у неё есть своё сообщение.

Проверь себя: Прежде чем менять чужой код, ответьте себе на пять вопросов. 1. Что программа должна была сделать? Если ответа нет — сначала прочитайте задачу, а не код. 2. Где вход? Что приходит снаружи: input(), список, аргумент функции. 3. Где выход? Что печатается и в каком порядке. 4. Какие значения получаются после каждой строки? Выпишите их на бумаге или в блокноте. 5. На какой строке программа остановилась и что говорит сообщение? Если код большой, не читайте его целиком. Запустите по частям: закомментируйте половину (Ctrl+/) и посмотрите, где поведение меняется. Печатайте промежуточные значения с подписями: print("total после цикла:", total). Так вы не угадываете, а видите.

Итог: Чужой код читают по шагам: задача → части → вход и выход → значения переменных → имена и границы → сообщение об ошибке. Обозначения — это словарь языка, и он небольшой: =, ==, !=, +=, :, (), [], {}, #, %, //, , кавычки и отступ.

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

total = 0
for i in range(1, 4):
  total += i
print(totall)   # ошибка: такой переменной нет

# а так — сумма чисел от 1 до 4
total = 0
for i in range(1, 5):
  total += i
print(total)    # 10

Найдите ошибку в коде

Программа должна посчитать сумму цен, но падает с ошибкой. Найдите причину и исправьте одну строку.

Критерий успеха: Программа выводит «Итого: 400».

Уроки модуля 7

Что ещё есть на сайте

Учиться

  • Уроки — Все уроки трёх траекторий: список, поиск и ваш прогресс.
  • Программирование с нуля — Python с первой команды до своего проекта: 12 модулей.
  • Интерфейсы и сайты с нуля — Кнопки, страницы и мини-игры: результат виден сразу в браузере.
  • Компьютер без страха — Файлы, браузер, пароли, мошенники, документы и деньги в интернете простыми словами. Бесплатно и без оплаты.
  • Если уже случилось — Деньги ушли с карты, пропала симка, взломали аккаунт, потерялись документы — порядок действий по шагам и куда звонить.
  • Какой компьютер нужен — Чек-лист по уровням: для учёбы ничего покупать не нужно, для своего проекта — 16 ГБ и SSD, для работы — 32 ГБ. Плюс нейросети и устаревание железа.
  • Без кода: ставить задачу — Как объяснить задачу программисту и принять работу. Кода нет ни строчки.
  • Конструктор описания задачи — Собрать описание по полям и получить готовый текст для исполнителя.

С чего начать

Потренироваться

  • Практикум: задачи из жизни — Та же команда урока — на работе, дома и в документах. 63 задачи с проверкой вывода и без регистрации.
  • Игры-тренажёры — Найти ошибку в чужом коде, прочитать, что делает программа, и увидеть, что случится, если нажать клавишу.
  • Симулятор: от задания до сдачи — Пройти путь целиком: папка, терминал, файл, сохранение, запуск, проверка по критерию приёмки. Два сценария и две системы.
  • Мастерская экрана — Проверить цвета и раскладку страницы: контраст, шаблоны, конструктор.
  • Колесо фортуны — Одна прокрутка в день: скидка на подписку или дни доступа.

Словари и юмор

Сайт, оплата и помощь

  • Родителям — Возраст, время на уроки, безопасность в сообществе, деньги и результат — что важно знать до оплаты.
  • Инструкция пользователя — Как всё устроено: уроки, кабинет, уведомления, подписка, ярлык.
  • Сообщество — Вопросы и ответы: читать можно всем, писать — после входа.
  • Подписка — Тарифы, что входит, возврат 14 дней, история платежей.
  • Помощь и поддержка — Частые вопросы и форма обращения — ответ в течение дня.
  • Отзывы учеников — Что пишут те, кто уже учится: без звёзд, с проверкой каждого текста.
  • Профиль и пароль — Имя, пароль для входа без кода, уведомления, свои данные.