Hello Stack溢出社区,
我正在尝试编写一个检查Fermat的最后定理的程序。我遇到的问题是出现一个错误,提示“ NameError:未定义名称'a'。但是,我在第一个函数中定义了'a',然后在函数末尾返回其值。
我试图在第二个功能中使用第一个功能的输入值,以便用户定义参数。
我误会了如何利用“收益”吗?所有帮助将不胜感激,这将使我保持理智。
def input_fermat():
a=input('Enter the first variable \'a\': \n')
b=input('Enter the second variable \'b\': \n')
c=input('Enter the third variable \'c\': \n')
n=input('Enter the exponential variable \'n\': \n')
return a, b, c, n
def check_fermat(a,b,c,n):
calc_1=a**n
calc_2=b**n
calc_3=c**n
if n>2 and int(calc_1) + int(calc_2) == calc_3:
print('Holy smokes, Fermat was wrong!')
else:
print('No that doesn\'t work.')
input_fermat()
check_fermat(a,b,c,n)
答案 0 :(得分:2)
您没有存储函数input_fermat
返回的值。试试:
a, b, c, n = input_fermat()
check_fermat(a,b,c,n)
答案 1 :(得分:1)
在a, b, c, n
中定义的变量input_fermat
仅存在于函数中,这就是为什么要返回它们的原因,但是在调用函数时,并没有将它们保存在任何地方。您应该替换:
input_fermat()
通过:
a, b, c, n = input_fermat()
或者您可以像这样直接将input_fermat
的返回值传递给check_fermat
:
check_fermat(*input_fermat())
答案 2 :(得分:1)
之所以会发生这种情况,是因为这些变量是在本地定义的,并且在check_fermat的命名空间中不可用。
请参阅LEGB规则。
您可以做的是使用函数定义中的global关键字定义所有这些变量,尽管通常这不是最佳方法。您还需要将所有输入转换为整数,因为input()将返回一个字符串。
答案 3 :(得分:0)
返回的值不仅会自动显示在名称空间中,还必须将它们分配给某些内容。
a, b, c, n = input_fermat()
答案 4 :(得分:0)
在input_fermat()
中作为输入接收的变量a,b,c和n仅在该函数的主体内可用;返回后,您就超出了input_fermat()
的范围,a,b,c和n中的 values 会传递给您调用input_fermat()
的任何变量进行分配
一个函数的作用域意味着在任何给定函数中唯一可用的变量是
在check_fermat()
中,这表示您可以根据需要重新使用变量a,b,c和其他输入(因为新功能意味着新作用域)。
但是,在下面显示的代码中,我们决定check_fermat()
中的a,b,c和n与input_fermat()
中的a,b,c和d相同,并且声明a,b,c,n = input_fermat()
。这是我们选择做出的决定;这是任意的。
这是功能的编辑版本,可以实现我认为的目标:
#Global variables would be declared up here, before all other function declarations.
#Global variables would be available to all the functions that follow.
def input_fermat(): #if there were arguments in these parentheses they'd be included in input_fermat scope
# input_fermat() scope begins
a=int(input('Enter the first variable \'a\': \n'))
b=int(input('Enter the second variable \'b\': \n'))
c=int(input('Enter the third variable \'c\': \n'))
n=int(input('Enter the exponential variable \'n\': \n'))
return a, b, c, n
#input_fermat() scope ends
def check_fermat(): #if there were arguments in these parentheses they'd be included in check_fermat scope
#check_fermat() scope begins
#just as you returned 4 variables at once in input_fermat(), 4 variables can be assigned at once here
a,b,c,n = input_fermat() #need to assign because a, b, c, n from input_fermat() no longer in scope
calc_1=a**n
calc_2=b**n
calc_3=c**n
if n>2 and int(calc_1) + int(calc_2) == calc_3:
print('Holy smokes, Fermat was wrong!')
else:
print('No that doesn\'t')
#python implicitly does a `return None` here
#check_fermat() scope ends
check_fermat()
请注意,由于这些功能的范围,我本可以在check_fermat()
中声明变量,如下所示,它们仍然可以正常工作(尝试运行此代码供自己查看)
def input_fermat():
a=int(input('Enter the first variable \'a\': \n'))
b=int(input('Enter the second variable \'b\': \n'))
c=int(input('Enter the third variable \'c\': \n'))
n=int(input('Enter the exponential variable \'n\': \n'))
return a, b, c, n
def check_fermat():
any,variable,names,go = input_fermat()
calc_1=any**go
calc_2=variable**go
calc_3=name**go
if n>2 and int(calc_1) + int(calc_2) == calc_3:
print('Holy smokes, Fermat was wrong!')
else:
print('No that doesn\'t')
check_fermat()
(两个代码段的)执行过程如下:
check_fermat()
被执行,因为它是我们的.py文件中唯一调用的函数(不仅仅是定义的函数)。check_fermat()
的定义来执行它
3.Python发现input_fermat()
在check_fermat
内部被调用,并继续寻找input_fermat()
的定义。check_fermat()
,并用于计算费马的最后定理。check_fermat()
的其余部分(输出打印到终端)。然后,check_fermat()
返回None,不返回任何变量结束函数调用。