Вы запускаете свою программу Python и видите ошибку «NameError: Name Is Not Defined». Что это значит?
В этой статье я объясню вам, что это за ошибка и как ее можно быстро исправить.
Что вызывает ошибку NameError в Python?
Ошибка Python NameError возникает, когда Python не может распознать имя в вашей программе. Имя может быть связано либо со встроенной функцией, либо с чем-то, что вы определяете в своей программе (например, с переменной или функцией).
Давайте рассмотрим несколько примеров этой ошибки. Для этого я создам простую программу и покажу вам распространенные способы возникновения этой ошибки во время разработки программы на Python.
Готовы?
Простая программа для печати последовательности Фибоначчи
Мы создадим программу, которая выводит последовательность Фибоначчи, и при этом увидим 4 различных способа появления ошибки NameError в Python.
Прежде всего, чтобы понять программу, которую мы создаем, давайте быстро рассмотрим последовательность Фибоначчи.
В последовательности Фибоначчи каждое число является суммой двух предыдущих чисел в последовательности. Последовательность начинается с 0 и 1.
Ниже вы можете увидеть первые 10 чисел в последовательности:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
Это практически все, что нам нужно знать для создания программы на Python, которая генерирует эту последовательность.
Давайте начнем!
Для упрощения наша программа на Python выведет последовательность, начиная с цифры 1.
Вот значение переменных n1, n2 и n:
Переменная | Значение |
n | n-й член последовательности |
n1 | (n-1)-й член последовательности |
n2 | (n-2)-й член последовательности |
А вот и наша программа.
На каждой итерации цикла while мы:
- Вычислите n-й член как сумму (n-2)-го и (n-1)-го членов.
- Присвойте значение (n-1)-го члена (n-2)-му члену.
- Присвойте значение n-го члена (n-1)-му члену.
Мы присваиваем значения (n-2)-му и (n-1)-му членам, чтобы иметь возможность использовать их в следующей итерации цикла while для вычисления значения n-го члена.
number_of_terms = int(input("How many terms do you want for the sequence? "))
n1 = 1
n2 = 0
while count < number_of_terms:
n = n1+n2
print(n)
n2 = n1
n1 = n
count += 1
Я запускаю программу и…
How many terms do you want for the sequence? 5
Traceback (most recent call last):
File "fibonacci.py", line 5, in <module>
while count < number_of_terms:
NameError: name 'count' is not defined
Что случилось?
Эта синтаксическая ошибка говорит нам о том, что количество имен не определено.
По сути, это означает, что переменная количества не определена.
Итак, в этом конкретном случае мы используем переменную count в условии цикла while, не объявляя ее заранее. И из-за этого Python генерирует эту ошибку.
Давайте определим count в начале нашей программы и попробуем еще раз.
number_of_terms = int(input("How many terms do you want for the sequence? "))
count = 0
n1 = 1
n2 = 0
.....
....
...
И если мы запустим программу, то получим…
How many terms do you want for the sequence? 5
1
2
3
5
8
Итак, все хорошо.
Урок 1: Ошибка NameError в Python возникает, если вы используете переменную, не объявляя ее.
Порядок действительно имеет значение в программе Python
Теперь я хочу создать отдельную функцию, которая вычисляет значение n-го члена последовательности.
Таким образом, мы можем просто вызвать эту функцию внутри цикла while.
В этом случае наша функция очень проста, но это всего лишь пример, показывающий, как мы можем извлечь часть нашего кода в функцию.
Это делает наш код более удобным для чтения (представьте, что функция calculate_nth_term состоит из 50 строк):
number_of_terms = int(input("How many terms do you want for the sequence? "))
count = 0
n1 = 1
n2 = 0
while count < number_of_terms:
n = calculate_nth_term(n1, n2)
print(n)
n2 = n1
n1 = n
count += 1
def calculate_nth_term(n1, n2):
n = n1+n2
return n
А вот и результат работы программы…
How many terms do you want for the sequence? 5
Traceback (most recent call last):
File "fibonacci.py", line 7, in <module>
n = calculate_nth_term(n1, n2)
NameError: name 'calculate_nth_term' is not defined
Подождите… опять NameError!?!
Мы определили вызываемую функцию, так почему же возникает ошибка?
Потому что мы вызываем функцию calculate_nth_term до определения этой же функции.
Перед использованием нам необходимо убедиться, что функция определена.
Итак, давайте переместим функцию перед строкой, в которой мы ее вызываем, и посмотрим, что произойдет:
number_of_terms = int(input("How many terms do you want for the sequence? "))
count = 0
n1 = 1
n2 = 0
def calculate_nth_term(n1, n2):
n = n1+n2
return n
while count < number_of_terms:
n = calculate_nth_term(n1, n2)
print(n)
n2 = n1
n1 = n
count += 1
How many terms do you want for the sequence? 4
1
2
3
5
На этот раз наша программа работает хорошо!
Урок 2: Убедитесь, что переменная или функция объявлена до ее использования в коде (а не после).
Ошибка имени со встроенными функциями
Я хочу улучшить нашу программу и остановить ее выполнение, если пользователь вводит данные, не являющиеся числом.
В текущей версии программы происходит следующее, если в качестве входных данных передается что-то, не являющееся числом:
How many terms do you want for the sequence? not_a_number
Traceback (most recent call last):
File "fibonacci.py", line 1, in <module>
number_of_terms = int(input("How many terms do you want for the sequence? "))
ValueError: invalid literal for int() with base 10: 'not_a_number'
Это не лучший способ обработки ошибок.
Пользователь нашей программы не будет знать, что делать с этой ошибкой…
Мы хотим выйти из программы с понятным сообщением для нашего пользователя, если в качестве входных данных программе передано что-то отличное от числа.
Чтобы остановить выполнение нашей программы, мы можем использовать функцию exit(), которая принадлежит модулю Python sys.
Функция выхода принимает необязательный аргумент — целое число, представляющее статус выхода программы (по умолчанию — ноль).
Давайте обработаем исключение, которое возникает, когда мы не передаем число в нашу программу. Мы сделаем это с помощью оператора try except
try:
number_of_terms = int(input("How many terms do you want for the sequence? "))
except ValueError:
print("Unable to continue. Please provide a valid number.")
sys.exit(1)
Давайте запустим его!
How many terms do you want for the sequence? not_a_number
Unable to continue. Please provide a valid number.
Traceback (most recent call last):
File "fibonacci.py", line 2, in <module>
number_of_terms = int(input("How many terms do you want for the sequence? "))
ValueError: invalid literal for int() with base 10: 'not_a_number'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "fibonacci.py", line 5, in <module>
sys.exit(1)
NameError: name 'sys' is not defined
Плохие новости, в конце вы можете увидеть еще одну ошибку NameError… она говорит о том, что sys не определен.
Это потому, что я использовал функцию exit() модуля sys, не импортировав модуль sys в начале моей программы. Давайте сделаем это.
Вот окончательная программа:
import sys
try:
number_of_terms = int(input("How many terms do you want for the sequence? "))
except ValueError:
print("Unable to continue. Please provide a valid number.")
sys.exit(1)
count = 0
n1 = 1
n2 = 0
def calculate_nth_term(n1, n2):
n = n1+n2
return n
while count < number_of_terms:
n = calculate_nth_term(n1, n2)
print(n)
n2 = n1
n1 = n
count += 1
И когда я запускаю его, я вижу, что исключение обрабатывается правильно:
How many terms do you want for the sequence? not_a_number
Unable to continue. Please provide a valid number.
Урок 3: Не забудьте импортировать все модули, которые вы используете в своей программе Python.
Выявите любые опечатки
Ошибка NameError также может возникнуть, если вы допустили ошибку в написании слова в своей программе.
Например, предположим, что когда я вызываю функцию для вычисления n-го члена последовательности Фибоначчи, я пишу следующее:
n = calculate_nt_term(n1, n2)
Как видите, я пропустил букву «h» в слове «nth»:
How many terms do you want for the sequence? 5
Traceback (most recent call last):
File "fibonacci.py", line 18, in <module>
n = calculate_nt_term(n1, n2)
NameError: name 'calculate_nt_term' is not defined
Python не может найти имя «calculate_nt_term» в программе из-за ошибки в написании.
Это может быть сложнее сделать, если вы написали очень длинную программу.
Урок 4: Проверьте, нет ли в вашей программе ошибок при определении или использовании переменной или функции. Это также относится к встроенным функциям Python.
Заключение
Теперь у вас есть руководство, которое поможет вам понять, почему Python выдает ошибку «NameError: имя … не определено» во время выполнения ваших программ.
Давайте повторим описанные мной сценарии:
- Ошибка Python NameError возникает, если вы используете переменную, не объявляя ее.
- Убедитесь, что переменная или функция объявлена до ее использования в коде (а не после).
- Не забудьте импортировать все модули, которые вы используете в своей программе Python.
- Проверьте, нет ли в вашей программе ошибок при определении или использовании переменной или функции. Это также относится к встроенным функциям Python.
Имеет ли это смысл?