Глава 11 з 27

Безкоштовно

3: Будуємо перші програми

⏱️ 55-70 хвилин
📊 intermediate

Розділ 11: "Помилки та налагодження: вчимося на помилках"

Під час чергового візиту до Професора Біта Аліса застала його за незвичним заняттям: він сидів за комп'ютером і, здавалося, був трохи роздратований.

— Що сталося, Професоре? — запитала Аліса.

— А, Алісо! — обернувся Професор. — Я намагаюся знайти помилку в моїй новій програмі. Вона має сортувати мої наукові статті, але чомусь працює неправильно.

— Помилки в програмах — це погано? — зацікавилась Аліса.

— Помилки — це неминуча частина програмування, — посміхнувся Професор. — Навіть найдосвідченіші програмісти припускаються помилок. Важливо вміти їх знаходити і виправляти. Цей процес називається "налагодженням", або дебагінгом (від слова bug — жук).

Він на мить замовк і тихо прочитав:

Прийнятно зробити простий хибний крок,
Помилки — таємні й безцінні підказки.
Без прикрих провалів не вивчиш урок,
І навіть не складеш щасливої казки.

Бува, не одразу ми бачимо ціль
В складній і великій життєвій картині.
Крізь спроби, помилки, крізь сумнів і біль
Ми пишемо код, зрозумілий машині.

Буває, гнітить безнадія тяжка
Всередині світ почуваєш поганим.
Як ліки потрібна помилка гірка,
Щоб спроба наступна була бездоганна!

Байт підкотився до них:
— Я можу показати типові види помилок у програмуванні!

На його екрані з'явився список:

1. Синтаксичні помилки — неправильна "граматика" коду.
2. Логічні помилки — код виконується, але робить не те, що потрібно.
3. Помилки під час виконання (runtime-помилки) — проблеми, що виникають під час роботи вже запущеної програми.

Налагодження: синтаксичні, логічні та runtime-помилки

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

python

Синтаксична помилка: пропущена закриваюча дужка


print("Привіт, світ!" # Має бути: 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 оцінки:
сума = сума + 1 # ПОМИЛКА 1
середнє = сума / кількість(оцінки) # ПОМИЛКА 2
return середнє

мої_оцінки = [5, 4, 5, 3, 5]
результат = розрахуватисереднє(моїоцінки)
print(результат)

— Як їх знайти? — Професор підняв палець догори. — Перший крок: додавання налагоджувальних повідомлень (print). Ми виведемо на екран проміжні значення, щоб побачити, що відбувається всередині циклу:

python
def розрахувати_середнє(оцінки):
сума = 0
for оцінка in оцінки:
сума = сума + 1
print("Додаємо", оцінка, "— тепер сума дорівнює", сума)

— Якщо ми це запустимо, то побачимо, що замість того, щоб додавати самі оцінки (5, 4, 3...), наша сума збільшується лише на одиницю! Ми написали сума = сума + 1 замість сума = сума + оцінка. Це типова логічна помилка.

— А друга помилка? — запитала Аліса.

— Коли програма дійде до рядка з діленням, вона аварійно зупиниться і видасть помилку під час виконання. Вона скаже, що функції кількість() не існує! У мові Python правильна функція для визначення довжини списку називається len().

— Давай виправимо обидві помилки і подивимося, що вийде! — запропонувала Аліса.

Професор швиденько виправив код:

python
def розрахувати_середнє(оцінки):
сума = 0
for оцінка in оцінки:
сума = сума + оцінка # Виправлено!
середнє = сума / len(оцінки) # Виправлено!
return середнє

мої_оцінки = [5, 4, 5, 3, 5]
середняоцінка = розрахуватисереднє(мої_оцінки)
print("Середня оцінка:", середня_оцінка)

— Тепер програма працює правильно! — посміхнувся Професор, дивлячись на результат: "Середня оцінка: 4.4".

Логік додала:
— У реальному житті ми теж постійно стикаємося з помилками і виправляємо їх. Наприклад, коли ти розв'язуєш математичну задачу і отримуєш дивну відповідь, ти перевіряєш свої обчислення по кроках, щоб знайти «баг».

— А в природі є системи виправлення помилок? — запитала Аліса.

— Звичайно! — відповів Професор. — Найяскравіший приклад — ДНК. При копіюванні ДНК клітинами іноді виникають помилки, але в них є спеціальні механізми для виявлення та виправлення цих збоїв. Якби таких механізмів не було, живі організми не могли б існувати.

— А як програмісти запобігають помилкам і падінням програми? — зацікавилась Аліса.

— Є кілька важливих інструментів, і найголовніший із них — обробка винятків, — показав Професор. — Це механізм, що дозволяє програмі коректно реагувати на критичні помилки:

python
try:
число = int(input("Введіть число: "))
результат = 100 / число
print("100 /", число, "=", результат)
except ValueError:
print("Помилка: Ви ввели текст, а не число!")
except ZeroDivisionError:
print("Помилка: На нуль ділити не можна!")
except:
print("Сталася невідома помилка!")

— Цей код намагається (try) виконати ділення, але готовий до можливих проблем, — пояснив він. — Якщо користувач введе слово замість числа, або введе нуль, програма не «зламається», а перехопить виняток (except) і виведе зрозуміле повідомлення.

— Виходить, помилки — це не завжди погано? — запитала Аліса.

— Помилки — це частина процесу навчання і розвитку, — посміхнувся Професор. — Як говорив винахідник Томас Едісон: "Я не зазнав невдачі. Я просто знайшов 10 000 способів, які не працюють." Важливо вчитися на помилках і ставати кращим програмістом!


Завдання

Знайди і виправ помилки в наступному коді. У ньому є як мінімум три помилки:

python
def порахувати_бали(відповіді):
правильні_відповіді = ["а", "б", "в", "г", "а"]
бали = 0
for і in range(len(відповіді)):
if відповіді[i] == правильні_відповіді[і]:
бали += 1
return бали

мої_відповіді = ["а", "б", "в", "г", "б"]
результат = порахуватибали(моївідповіді)
print("Ти набрав", результат, "балів з 5")

Після того як знайдеш і виправиш помилки, подумай: як можна покращити цей код, щоб він був більш зрозумілим і надійним?