📖 Содержание
Часть 1: Мир программирования вокруг нас
Часть 2: Алфавит и словарь программирования
Часть 3: Строим первые программы
Часть 4: Наш удивительный мозг
Часть 5: Творческие проекты
Часть 6: Программирование в реальном мире
Глава 11 из 27
3: Строим первые программы
Глава 11: "Ошибки и отладка: учимся на ошибках"
Во время очередного визита к Профессору Биту Алиса застала его за странным занятием: он сидел за компьютером и, казалось, был слегка раздражён.
— Что случилось, Профессор? — спросила Алиса.
— А, Алиса! — обернулся Профессор. — Я пытаюсь найти ошибку в моей новой программе. Она должна сортировать мои научные статьи, но почему-то работает неправильно.
— Ошибки в программах — это плохо? — поинтересовалась Алиса.
— Ошибки — это неизбежная часть программирования, — улыбнулся Профессор. — Даже самые опытные разработчики допускают ошибки. Важно уметь их находить и исправлять. Этот процесс называется "отладкой" или "дебаггингом".
Он на секунду отложил клавиатуру и негромко прочитал:
Право на ошибку есть у всех,
Ведь ошибки — скрытые подсказки.
Без случайных сбоев и помех
Не бывает даже доброй сказки.
Нам не сразу видеть суждено,
Где таится путь наверх, к вершине.
Ошибаться будем всё равно,
Чтоб составить точный код машине.
Иногда так сложно понимать
Следствия падений и ушибов.
Как лекарство, нужно принимать
Горькую досаду от ошибок.
— А в природе тоже бывают ошибки? — спросила Алиса.
— Интересный вопрос! — улыбнулся Профессор. — В природе тоже случаются "ошибки" — например, мутации в ДНК. Иногда они вредны, иногда незаметны, а иногда... приводят к появлению новых возможностей и даже новых видов!
— Видишь, — продолжил Профессор, — ошибки в программировании, как и мутации в природе, могут привести к неожиданным и полезным результатам. Главное — уметь их находить и использовать!
Байт подъехал к ним:
— Я могу показать типичные виды ошибок в программировании!
На его экране появился список:
1. Синтаксические ошибки — неправильная "грамматика" кода.
2. Логические ошибки — код выполняется, но делает не то, что нужно.
3. Ошибки времени выполнения — проблемы, возникающие прямо во время работы программы.

— Синтаксические ошибки похожи на опечатки в обычном тексте, — объяснил Профессор. — Например, если ты забудешь закрыть скобку или поставишь неправильный знак.
python
Синтаксическая ошибка: пропущена закрывающая скобка
print("Привет, мир!"Синтаксическая ошибка: неправильный оператор
if x = 5: # Для сравнения нужен двойной знак: if x == 5:
print("x равен 5")
— Такие ошибки обычно легко обнаружить, — продолжил Профессор. — Программа даже не запустится и сразу сообщит, в какой строке проблема.
— А логические ошибки? — спросила Алиса.
— Логические ошибки коварнее, — ответила Логик, спускаясь на стол. — Программа запускается, но работает неправильно. Например:
python
Логическая ошибка: перепутан порядок действий
площадь = 5 + 10 2 # Результат: 25, но правильно было бы: (5 + 10) 2 = 30Логическая ошибка: неправильное условие
возраст = 12
if возраст < 12: # Должно быть: if возраст <= 12:
print("Детский билет")
else:
print("Взрослый билет")
— В первом примере программа не выдаст ошибку, но результат будет неправильным из-за неверного порядка математических операций, — объяснил Профессор. — Во втором примере 12-летний ребёнок получит взрослый билет, хотя должен получить детский.
— А ошибки времени выполнения? — спросила Алиса.
— Это ошибки, которые возникают, когда программа уже запущена и вовсю работает, — объяснил Байт. — Например:
python
Деление на ноль
x = 10
y = 0
результат = x / y # Ошибка: деление на ноль невозможно!Обращение к несуществующему элементу списка
список = [1, 2, 3]
элемент = список[5] # Ошибка: индекс 5 выходит за пределы списка!
— Такие ошибки приводят к аварийному завершению — программа просто "падает", если их не обработать специальным образом, — добавил Профессор.
— И как же вы находите и исправляете ошибки? — поинтересовалась Алиса.
— Для этого существует процесс отладки, — ответил Профессор. — Давай я покажу тебе основные приёмы.

Профессор открыл на компьютере программу с ошибкой:
python
def рассчитать_среднее(числа):
сумма = 0
for число in числа:
сума = сумма + число
среднее = сумма / лен(числа)
return среднееоценки = [5, 4, 5, 3, 5]
средняяоценка = рассчитатьсреднее(оценки)
print("Средняя оценка:", средняя_оценка)
— В этой простой программе есть несколько ошибок, — сказал Профессор. — Давай найдём их.
Первый шаг в отладке — чтение кода. Внимательно просмотри весь код и постарайся понять, что он должен делать.
Второй шаг — использование отладочных сообщений. Давай добавим в код вывод промежуточных значений:
python
def рассчитать_среднее(числа):
сумма = 0
print("Начальная сумма:", сумма)
for число in числа:
сума = сумма + число
print("После добавления", число, "сумма стала:", сума)
среднее = сумма / лен(числа)
print("Среднее:", среднее)
return среднее
— Смотри, после запуска мы видим по отладочным сообщениям, что переменная сумма не изменяется, хотя должна увеличиваться. Это опечатка! Внутри цикла мы написали сума (с одной буквой "м") вместо сумма.
— А есть ещё ошибки? — спросила Алиса.
— Да, есть ещё одна ошибка: лен(числа). В языке Python функция для определения длины списка пишется по-английски — len.
— Давай исправим обе ошибки и посмотрим, что получится, — предложил Профессор:
python
def рассчитать_среднее(числа):
сумма = 0
for число in числа:
сумма = сумма + число # Исправлено: сума → сумма
среднее = сумма / len(числа) # Исправлено: лен → len
return среднееоценки = [5, 4, 5, 3, 5]
средняяоценка = рассчитатьсреднее(оценки)
print("Средняя оценка:", средняя_оценка)
— Теперь программа работает правильно! — улыбнулся Профессор, глядя на результат: Средняя оценка: 4.4.
Логик добавила:
— В реальной жизни мы тоже постоянно сталкиваемся с ошибками и исправляем их. Например, когда ты решаешь математическую задачу и получаешь странный ответ, ты перепроверяешь свои вычисления, чтобы найти опечатку.
— А как программисты предотвращают ошибки заранее? — поинтересовалась Алиса.
— Для этого есть несколько важных правил, — ответил Профессор:
1. Автоматическое тестирование — написание дополнительного кода, который сам регулярно проверяет работу твоей основной программы.
2. Помощь тестировщиков (QA) — это специальные инженеры, чья работа заключается в том, чтобы проверять программы и намеренно искать в них баги до того, как продукт попадёт к обычным пользователям.
3. Проверка кода коллегами — другой программист свежим взглядом может быстро заметить то, что ты пропустил.
4. Обработка исключений — механизм, позволяющий программе не ломаться, а корректно реагировать на ошибки.
— Вот пример обработки исключений, — показал Профессор:
python
try:
число = int(input("Введите число: "))
результат = 100 / число
print("100 /", число, "=", результат)
except ValueError:
print("Ошибка: Вы ввели не число!")
except ZeroDivisionError:
print("Ошибка: На ноль делить нельзя!")
except:
print("Произошла неизвестная ошибка!")
— Этот код пытается выполнить деление, но он готов к любым проблемам, — объяснил он. — Если пользователь введёт буквы вместо цифр или напишет ноль, программа не "сломается", а просто выведет понятное сообщение.
— Получается, ошибки — это не всегда плохо? — задумчиво спросила Алиса.
— Ошибки — это часть процесса обучения и развития, — улыбнулся Профессор. — Как говорил великий изобретатель Томас Эдисон: "Я не потерпел неудачу. Я просто нашёл 10 000 способов, которые не работают". Важно учиться на своих ошибках и становиться лучше!
Задание
python
python
Copy
def посчитать_очки(ответы):
правильные_ответы = ["а", "б", "в", "г", "а"]
очки = 0
for и in range(лен(ответы)):
if ответы[i] = правильные_ответы[и]:
очки += 1
return очкимои_ответы = ["а", "б", "в", "г", "б"]
результат = посчитатьочки(моиответы)
print("Ты набрал", результаты, "очков из 5")
После того как найдёшь и исправишь ошибки, подумай: как можно улучшить этот код, чтобы он был более понятным и надёжным?