- Как исправить ошибку NameError в Python
- Что такое NameError в Python?
- Как исправить «NameError: Name Is Not Defined» в Python
- Пример №1. Имя переменной не определено
- Пример №2. Имя функции не определено
- Пример №3. Использование модуля без его импорта
- Заключение
- Python3: 16 частых ошибок начинающих программистов при выполнении скриптов (Runtime errors)
Как исправить ошибку NameError в Python
Первый шаг в исправлении ошибок при написании кода — понять, что именно пошло не так. И хотя некоторые сообщения об ошибках могут показаться запутанными, большинство из них помогут вам понять, что же не работает в вашей программе. В этой статье мы поговорим о том, как исправить ошибку NameError в Python. Мы рассмотрим несколько примеров кода, показывающих, как и почему возникает эта ошибка, и покажем, как ее исправить.
Что такое NameError в Python?
В Python ошибка NameError возникает, когда вы пытаетесь использовать переменную, функцию или модуль, которые не существуют, или использовать их недопустимым образом.
Некоторые из распространенных причин, вызывающих эту ошибку:
- Использование имени переменной или функции, которое еще не определено
- Неправильное написание имени переменной/функции при её вызове
- Использование модуля в Python без импорта этого модуля и т. д.
Как исправить «NameError: Name Is Not Defined» в Python
В этом разделе мы рассмотрим, как исправить ошибку NameError: Name is Not Defined в Python.
Мы начнем с блоков кода, вызывающих ошибку, а затем посмотрим, как их исправить.
Пример №1. Имя переменной не определено
name = "John" print(age) # NameError: name 'age' is not defined
В приведенном выше коде мы определили переменную name , но далее попытались вывести переменную age , которая ещё не была определена.
Мы получили сообщение об ошибке: NameError: name ‘age’ is not defined . Это означает, что переменная age не существует, мы её не задали.
Чтобы исправить это, мы можем создать переменную, и наш код будет работать нормально. К примеру, это можно сделать следующим образом:
name = "John" age = 12 print(age) # 12
Теперь значение переменной age выводится без проблем.
Точно так же эта ошибка может возникнуть, если мы неправильно напишем имя нашей переменной. Например, сделаем так:
name = "John" print(nam) # NameError: name 'nam' is not defined
В коде выше мы написали nam вместо name . Чтобы исправить подобную ошибку, вам просто нужно правильно написать имя вашей переменной.
Пример №2. Имя функции не определено
def sayHello(): print("Hello World!") sayHelloo() # NameError: name 'sayHelloo' is not defined
В приведенном выше примере мы добавили лишнюю букву o при вызове функции — sayHelloo() вместо sayHello() . Это просто опечатка, однако она вызовет ошибку, потому что функции с таким именем не существует.
Итак, мы получили ошибку: NameError: name ‘sayHelloo’ is not defined . Подобные орфографические ошибки очень легко пропустить. Сообщение об ошибке обычно помогает исправить это.
Вот правильный способ вызова данной функции:
def sayHello(): print("Hello World!") sayHello() # Hello World!
Как мы видели в предыдущем разделе, вызов переменной, которая еще не определена, вызывает ошибку. То же самое относится и к функциям.
К примеру, это может выглядеть так:
def sayHello(): print("Hello World!") sayHello() # Hello World! addTWoNumbers() # NameError: name 'addTWoNumbers' is not defined
В приведенном выше коде мы вызвали функцию addTWoNumbers() , которая еще не была определена в программе. Чтобы исправить это, вы можете создать функцию, если она вам нужна, или просто избавиться от нее.
Обратите внимание, что вызов функции перед ее созданием приведет к той же ошибке. То есть такой код также выдаст вам ошибку:
sayHello() def sayHello(): print("Hello World!") # NameError: name 'sayHello' is not defined
Поэтому вы всегда должны определять свои функции перед их вызовом.
Пример №3. Использование модуля без его импорта
x = 5.5 print(math.ceil(x)) # NameError: name 'math' is not defined
В приведенном выше примере мы используем метод математической библиотеки Python math.ceil() . Однако до этого мы не импортировали модуль math .
В результате возникает следующая ошибка: NameError: name ‘math’ is not defined . Это произошло потому, что интерпретатор не распознал ключевое слово math .
Таким образом, если мы хотим использовать функции библиотеки math в Python, мы должны сначала импортировать соответствующий модуль.
Вот так будет выглядеть исправленный код:
import math x = 5.5 print(math.ceil(x)) # 6
В первой строке кода мы импортировали математический модуль math . Теперь, когда вы запустите приведенный выше код, вы получите результат 6. То же самое относится и ко всем остальным библиотекам. Сначала нужно импортировать библиотеку с помощью ключевого слова import , а потом уже можно использовать весь функционал этой библиотеки. Подробнее про импорт модулей можно узнать в статье «Как импортировать в Python?»
Заключение
В этой статье мы поговорили о том, как исправить ошибку NameError в Python.
Мы выяснили, что собой представляет NameError. Затем мы разобрали несколько примеров, которые могли вызвать ошибку NameError при работе с переменными, функциями и модулями в Python. Также мы показали, как можно исправить эти ошибки.
Надеемся, данная статья была вам полезна! Успехов в написании кода!
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
Нужно помнить, что отступ необходимо делать только после : , а по завершению блока обязательно вернуться к прежнему количеству отступов.
4) Неиспользование функции len() в объявлении цикла for для списков list
Возникнет ошибка типа TypeError: ‘list’ object cannot 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’t 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 )
Использование локальной переменной в функции с именем, совпадающим с глобальной переменной, опасно. Правило: если переменная в функции использовалась с оператором присвоения, это всегда локальная переменная для этой функции. В противном случае, это глобальная переменная внутри функции.
Это означает, что нельзя использовать глобальную переменную (с одинаковым именем как у локальной переменной) в функции до ее определения.
Код с появлением этой ошибки такой: