Глава 11 из 27

Бесплатно

3: Строим первые программы

⏱️ 55-70 минут
📊 intermediate

Глава 11: "Ошибки и отладка: учимся на ошибках"

Во время очередного визита к Профессору Биту Алиса застала его за странным занятием: он сидел за компьютером и, казалось, был слегка раздражён.

— Что случилось, Профессор? — спросила Алиса.

— А, Алиса! — обернулся Профессор. — Я пытаюсь найти ошибку в моей новой программе. Она должна сортировать мои научные статьи, но почему-то работает неправильно.

— Ошибки в программах — это плохо? — поинтересовалась Алиса.

— Ошибки — это неизбежная часть программирования, — улыбнулся Профессор. — Даже самые опытные разработчики допускают ошибки. Важно уметь их находить и исправлять. Этот процесс называется "отладкой" или "дебаггингом".

Он на секунду отложил клавиатуру и негромко прочитал:

Право на ошибку есть у всех,
Ведь ошибки — скрытые подсказки.
Без случайных сбоев и помех
Не бывает даже доброй сказки.

Нам не сразу видеть суждено,
Где таится путь наверх, к вершине.
Ошибаться будем всё равно,
Чтоб составить точный код машине.

Иногда так сложно понимать
Следствия падений и ушибов.
Как лекарство, нужно принимать
Горькую досаду от ошибок.

— А в природе тоже бывают ошибки? — спросила Алиса.

— Интересный вопрос! — улыбнулся Профессор. — В природе тоже случаются "ошибки" — например, мутации в ДНК. Иногда они вредны, иногда незаметны, а иногда... приводят к появлению новых возможностей и даже новых видов!

— Видишь, — продолжил Профессор, — ошибки в программировании, как и мутации в природе, могут привести к неожиданным и полезным результатам. Главное — уметь их находить и использовать!

Байт подъехал к ним:
— Я могу показать типичные виды ошибок в программировании!

На его экране появился список:

1. Синтаксические ошибки — неправильная "грамматика" кода.
2. Логические ошибки — код выполняется, но делает не то, что нужно.
3. Ошибки времени выполнения — проблемы, возникающие прямо во время работы программы.

Отладка: синтаксические, логические и runtime-ошибки

— Синтаксические ошибки похожи на опечатки в обычном тексте, — объяснил Профессор. — Например, если ты забудешь закрыть скобку или поставишь неправильный знак.

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")

После того как найдёшь и исправишь ошибки, подумай: как можно улучшить этот код, чтобы он был более понятным и надёжным?