了解和解决 Python Error: Name Is Not Defined

举报
Tiamo_T 发表于 2021/10/17 18:16:06 2021/10/17
【摘要】 当执行你的 Python 程序看到一个错误,“NameError: name ... is not defined”,这是什么意思?在本文中,将向您解释此错误是什么以及如何快速修复它。是什么导致了 Python NameError?当 Python 无法识别程序中的名称时,会发生 Python NameError。名称既可以与内置函数相关,也可以与您在程序中定义的内容相关(例如变量或函数)。...

当执行你的 Python 程序看到一个错误,“NameError: name ... is not defined”,这是什么意思?

在本文中,将向您解释此错误是什么以及如何快速修复它。

是什么导致了 Python NameError?

python

当 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 内置函数。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。