在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
尝试调用它时,它是未定义的

您通常希望在调用任何函数之前定义所有函数。否则,您将在所有函数可用之前开始执行程序。只要将调用移到文件的底部,调用时就会定义所有内容