了解和解决 Python Error: Name Is Not Defined
当执行你的 Python 程序看到一个错误,“NameError: name ... is not defined”,这是什么意思?
在本文中,将向您解释此错误是什么以及如何快速修复它。
是什么导致了 Python NameError?
当 Python 无法识别程序中的名称时,会发生 Python NameError。名称既可以与内置函数相关,也可以与您在程序中定义的内容相关(例如变量或函数)。
让我们看一下此错误的一些示例,为此我将创建一个简单的程序,并向您展示在 Python 程序开发过程中发生此错误的常见方式。
打印斐波那契数列的简单程序
我们将创建一个打印斐波那契数列的程序,在此过程中,我们将看到 Python NameError 出现的 4 种不同方式。
首先,为了理解我们正在创建的程序,让我们快速介绍一下斐波那契数列。
在斐波那契数列中,每个数都是该数列中前两个数之和。序列从 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
发生了什么?
此语法错误告诉我们未定义名称计数。
它基本上意味着未定义计数变量。
因此,在这种特定情况下,我们在 while 循环的条件中使用变量 count 而不事先声明它。正因为如此,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
所以,一切都很好。
第一节:如果使用变量而不声明它,则会发生 Python NameError。
订单在 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'
这不是处理错误的好方法。
我们程序的用户不知道如何处理这个错误......
如果有不同的数字作为输入传递给程序,我们希望退出程序并为我们的用户提供明确的消息。
要停止执行我们的程序,我们可以使用属于 Python sys 模块的exit()函数。
exit 函数接受一个可选参数,一个表示程序退出状态的整数(默认为零)。
让我们处理当我们没有将数字传递给我们的程序时抛出的异常。我们将使用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 没有定义。
那是因为我在程序开始时没有导入sys模块就使用了sys模块的exit()函数。让我们这样做。
这是最终的程序:
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)
如您所见,我错过了“nth”中的“h”:
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: name ... is not defined”。
让我们回顾一下我解释过的场景:
- 如果您使用变量而不声明它,则会发生 Python NameError。
- 确保在您的代码中使用之前(而不是之后)声明变量或函数。
- 请记住导入您在 Python 程序中使用的任何模块。
- 当您定义或使用变量或函数时,确认您的程序中没有拼写错误。这也适用于 Python 内置函数。
- 点赞
- 收藏
- 关注作者
评论(0)