Урок 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».