在Python中使用def函数时发生NameError
我正在创建一个“猜数字”游戏,在尝试运行时遇到问题。我得到的错误如下: 回溯(最近一次呼叫最后一次):在Python中使用def函数时发生NameError,python,debugging,typeerror,nameerror,Python,Debugging,Typeerror,Nameerror,我正在创建一个“猜数字”游戏,在尝试运行时遇到问题。我得到的错误如下: 回溯(最近一次呼叫最后一次): 文件“C:\Users\Troy\Desktop\guess.py”,第10行,在 begin() 文件“C:\Users\Troy\Desktop\guess.py”,第9行,在begin 询问() NameError:未定义名称“ask” 在我在中定义的不同“块”中,脚本如下: 这里定义为begin()的第一部分想到一个数字,并询问告诉用户它想到的是一个介于1和10之间的数字 def b
文件“C:\Users\Troy\Desktop\guess.py”,第10行,在
begin()
文件“C:\Users\Troy\Desktop\guess.py”,第9行,在begin
询问()
NameError:未定义名称“ask” 在我在中定义的不同“块”中,脚本如下:
这里定义为begin()的第一部分想到一个数字,并询问告诉用户它想到的是一个介于1和10之间的数字
def begin():
import random
import sys
guessesRemaining = 3
randomNumber = random.randint(1,10)
print("I am thinking of a number between 1 and 10.")
ask()
begin()
下一部分定义为ask(),并要求用户输入他们猜测的数字,只要他们还有足够的猜测
def ask():
if guessesRemaining == 0:
print("Oh no! You've run out of guesses! I was thinking of the number " + str(randomNumber) + ".")
else:
print ("Take a guess.")
guess = input(">> ")
if int(guess) < randomNumber:
print("Your number is too small!")
global guessesRemaining
guessesRemaining -= int(1)
ask()
elif int(guess) > randomNumber:
print("Your number is too big!")
global guessesRemaining
guessesRemaining -= int(1)
ask()
elif int(guess) == randomNumber:
print("Well done! You got the right number!")
playAgain()
ask()
您需要在调用它之前定义
ask()
,就像在begin()
中一样。Python是一种解释语言,因此,如果在其定义之上调用函数,解释器将无法识别它。在调用函数之前需要定义ask()
,就像调用begin()
一样。Python是一种解释语言,因此,如果在其定义之上调用函数,解释器将无法识别它。在定义ask
之前,您不能调用ask
在这里,定义后立即调用begin
函数:
def begin():
import random
import sys
guessesRemaining = 3
randomNumber = random.randint(1,10)
print("I am thinking of a number between 1 and 10.")
ask()
begin() # this calls begin immediately!
请注意,在begin
中,有一个对ask
的调用,但此时,ask
函数仍然不存在
您可能希望将对开始
、询问
和再次播放
的调用至少放在脚本的最后。大概是这样的:
def begin():
...
def ask():
...
def playAgain():
...
begin()
ask()
playAgain()
现在,即使有了这一变化,您的程序也没有做您认为正在做的事情。有几个问题:
- 实际上,您不需要调用
或begin
,因为它们被ask
隐式调用playreach
- 变量
和guestesremaining
都是函数的局部变量,因此无论何时调用另一个函数,它们都不会看到相同的变量。要解决此问题,可以将变量设置为全局变量: 对于randomNumber
,也是如此ask
ask
之前,您不能调用ask
在这里,定义后立即调用begin
函数:
def begin():
import random
import sys
guessesRemaining = 3
randomNumber = random.randint(1,10)
print("I am thinking of a number between 1 and 10.")
ask()
begin() # this calls begin immediately!
请注意,在begin
中,有一个对ask
的调用,但此时,ask
函数仍然不存在
您可能希望将对开始
、询问
和再次播放
的调用至少放在脚本的最后。大概是这样的:
def begin():
...
def ask():
...
def playAgain():
...
begin()
ask()
playAgain()
现在,即使有了这一变化,您的程序也没有做您认为正在做的事情。有几个问题:
- 实际上,您不需要调用
或begin
,因为它们被ask
隐式调用playreach
- 变量
和guestesremaining
都是函数的局部变量,因此无论何时调用另一个函数,它们都不会看到相同的变量。要解决此问题,可以将变量设置为全局变量: 对于randomNumber
,也是如此ask
ask()
之前调用begin()
,因此当begin
尝试调用它时,它是未定义的
您通常希望在调用任何函数之前定义所有函数。否则,您将在所有函数可用之前开始执行程序。只要将调用移到文件底部,调用时就会定义所有内容。在您的示例中,您在定义
ask()
之前调用begin()
,因此当begin
尝试调用它时,它是未定义的
您通常希望在调用任何函数之前定义所有函数。否则,您将在所有函数可用之前开始执行程序。只要将调用移到文件的底部,调用时就会定义所有内容