在Python

时间:2016-05-29 09:04:06

标签: python debugging typeerror nameerror

我正在制作一个猜猜数字'游戏,并在尝试运行它时遇到问题。我得到的错误如下:

  

追踪(最近的呼叫最后):
       文件" C:\ Users \ Troy \ Desktop \ guess.py",第10行,在中          ()开始
       文件" C:\ Users \ Troy \ Desktop \ guess.py",第9行,开头
         问()
     NameError:name' 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()

这个最后一部分被定义为playAgain(),询问用户是否想再玩一次。

def playAgain():
    print("Would you like to play again?")
    again = input
    if again == y or Y or yes or Yes:
        print("Restarting game...")
        begin()
    if again == n or N or no or No:
        print("Quitting game...")
        sys.quit()
    else:
        print("Invalid response!")
        playAgain()
playAgain()

3 个答案:

答案 0 :(得分:3)

在定义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功能仍然不存在!

您可能希望至少在脚本的最末端将调用一直放到beginaskplayAgain。像这样:

def begin():
    ...
def ask():
    ...
def playAgain():
    ...

begin()
ask()
playAgain()

现在,即使进行了这项更改,您的计划也没有按照您的想法进行。有几个问题:

  • 实际上,您无需致电beginask,因为playAgain会隐式调用它们。
  • 变量guessesRemainingrandomNumber都是函数的 local ,因此无论何时调用另一个函数,它们都将看不到相同的变量。要解决此问题,您可以创建变量 global

    def begin():
        global guessesRemaining, randomNumber
        ...
    

    同样适用于ask

答案 1 :(得分:0)

在调用之前,您需要定义ask(),就像使用begin()一样。 Python是一种解释型语言,因此如果在其定义之上调用函数,则解释器不会识别它。

答案 2 :(得分:0)

在您的示例中,您在定义begin()之前致电ask(),因此当begin尝试调用它时,它是未定义的。

您通常希望在调用其中任何函数之前定义所有函数。否则,您将在所有功能可用之前开始执行程序。只需将您的呼叫移至文件底部,即可在调用时定义所有内容。