Ошибка Python: Name Is Not Defined. Давайте исправим это

Вы запускаете свою программу 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:

ПеременнаяЗначение
nn-й член последовательности
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.

Имеет ли это смысл?