Python3 16 частих помилок початківців програмістів при виконанні скриптів (runtime errors)

Набрів на цікаву статтю про часті помилки на Python у початківців програмістів. Мені здається, вона корисна буде для тих, хто перейшов з іншої мови або тільки планує перехід. Далі йде переклад.

Пошук рішення проблем з повідомленнями про помилки, які видаються під час запуску програм в Python, може доставляти труднощі, якщо ви вивчаєте цю мову програмування вперше. Далі будуть описані найбільш часті помилки, що зустрічаються при запуску програм і викликають збій при виконанні.

1) Пропущено двокрапка в кінці рядка після керуючих конструкцій типу if. elif. else. for. while. class. or def. що призведе до помилки типу SyntaxError: invalid syntax

2) Використання = замість == призводить до помилки типу SyntaxError: invalid syntax

Символ = є оператором присвоювання, а символ == - оператором порівняння.

Ця помилка виникає в наступному коді:

3) Використання неправильного кількості відступів.

Виникне помилка типу IndentationError: unexpected indent. IndentationError: unindent does not match any outer indentation level і IndentationError: expected an indented block

Потрібно пам'ятати, що відступ необхідно робити тільки після. а по завершенню блоку обов'язково повернутися до колишньої кількості відступів.

Виникне помилка типу TypeError: 'list' object can not be interpreted as an integer

Часто виникає бажання пройти в циклі за індексами елементів списку або рядки, при цьому потрібно використовувати функцію range (). Потрібно пам'ятати, що необхідно отримати значення len (someList) замість самого значення someList

Помилка виникне в наступному коді:

Деякі читачі (оригінальної статті) помітили, що краще використовувати конструкцію типу for i in spam. ніж написаний код вище. Але, коли потрібно отримати номер ітерації в циклі, використання вишенапісанного коду набагато корисніше, ніж отримання значення списку.

Від перекладача. Іноді можна помилково переплутати метод shape з len () для визначення розміру списку. При цьому виникає помилка типу 'list' object has no attribute 'shape'

5) Спроба змінити частину рядка. (Помилка типу TypeError: 'str' object does not support item assignment)

Рядки мають незмінний тип. Ця помилка станеться в наступному коді:

А очікується таке результат:

Від перекладача. Детальніше про незмінність рядків можна прочитати тут

6) Спроба поєднати нестроковую змінну з рядком призведе до помилки TypeError: Can not convert 'int' object to str implicitly

Така помилка станеться тут:

Від перекладача. ще зручно так

7) Некоректна одинарна лапка на початку або кінці строкової змінної (Помилка SyntaxError: EOL while scanning string literal)

Така помилка станеться в наступному коді:

8) Помилка в назві змінної або функції (Помилка типу NameError: name 'fooba' is not defined)

Така помилка може зустрітися в такому коді:

Від перекладача. дуже часто при написанні виникають помилки типу NameError: name 'true' is not defined і NameError: name 'false' is not defined. пов'язані з тим, що потрібно писати булевние значення з великої літери True і False

9) Помилка при зверненні до методу об'єкта. (Помилка типу AttributeError: 'str' object has no attribute 'lowerr')

Така помилка станеться в наступному коді:

10) Спроба використовувати індекс поза межами списку. (Помилка типу IndexError: list index out of range)

Помилка виникає в наступному коді:

11) Використання неіснуючих ключів для словника. (Помилка типу KeyError: 'spam')

Помилка відбудеться в наступному коді:

12) Використання зарезервованих в Пітоні ключових слів в якості імені для змінної. (Помилка типу SyntaxError: invalid syntax)

Ключові слова (зарезервовані) в Пітоні неможливо використовувати як змінні. Приклад в наступному коді:

Python 3 має наступні ключові слова: and. as. assert. break. class. continue. def. del. elif. else. except. False. finally. for. from. global. if. import. in. is. lambda. None. nonlocal. not. or. pass. raise. return. True. try. while. with. yield

13) Використання операторів присвоювання для нової неініціалізованої змінної. (Помилка типу NameError: name 'foobar' is not defined)

Не варто сподіватися, що змінні не започатковано при старті якимось значенням типу 0 або символом нового рядка.

Ця помилка зустрічається в наступному коді:

Оператори присвоювання типу spam + = 1 еквівалентні spam = spam + 1. Це означає, що змінна spam вже повинна мати якесь значення до.

14) Використання локальних змінних, які збігаються за назвою з глобальними змінними, в функції до ініціалізації локальної змінної. (Помилка типу UnboundLocalError: local variable 'foobar' referenced before assignment)

Використання локальної змінної у функції з ім'ям, що збігається з глобальної змінної, небезпечно. Правило: якщо змінна в функції використовувалася з оператором присвоєння, це завжди локальна змінна для цієї функції. В іншому випадку, це глобальна змінна всередині функції.

Це означає, що не можна використовувати глобальну змінну (з однаковим ім'ям як у локальній змінній) в функції до її визначення.

Код з появою цієї помилки такий:

15) Спроба використовувати range () для створення списку цілих чисел. (Помилка типу TypeError: 'range' object does not support item assignment)

Іноді хочеться отримати список цілих чисел по порядку, тому range () здається підходящої функцією для генерації такого списку. Проте потрібно пам'ятати, що range () повертає range object. а не список цілих чисел.

Приклад помилки в наступному коді:

До речі, це працює в Python 2, так як range () повертає список. Однак спроба виконати код в Python 3 призведе до описаної помилку.

Потрібно зробити так:

16) Відсутність операторів інкремента ++ або декремента -. (Помилка типу SyntaxError: invalid syntax)

Якщо ви прийшли з іншої мови типу C ++, Java або PHP, ви можете спробувати використовувати оператори ++ або - для змінних. У Пітоні таких операторів немає.

Помилка виникає в наступному коді:

Потрібно написати так:

Ця помилка виникає в наступному коді:

Короткий пояснення різних повідомлень про помилки представлено в Appendix D of the "Invent with Python" book.

Корисні матеріали