我正在制作一个猜猜数字'游戏,并在尝试运行它时遇到问题。我得到的错误如下:
追踪(最近的呼叫最后):
文件" 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()
答案 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
功能仍然不存在!
您可能希望至少在脚本的最末端将调用一直放到begin
,ask
和playAgain
。像这样:
def begin():
...
def ask():
...
def playAgain():
...
begin()
ask()
playAgain()
现在,即使进行了这项更改,您的计划也没有按照您的想法进行。有几个问题:
begin
或ask
,因为playAgain
会隐式调用它们。变量guessesRemaining
和randomNumber
都是函数的 local ,因此无论何时调用另一个函数,它们都将看不到相同的变量。要解决此问题,您可以创建变量 global :
def begin():
global guessesRemaining, randomNumber
...
同样适用于ask
。
答案 1 :(得分:0)
在调用之前,您需要定义ask()
,就像使用begin()
一样。 Python是一种解释型语言,因此如果在其定义之上调用函数,则解释器不会识别它。
答案 2 :(得分:0)
在您的示例中,您在定义begin()
之前致电ask()
,因此当begin
尝试调用它时,它是未定义的。
您通常希望在调用其中任何函数之前定义所有函数。否则,您将在所有功能可用之前开始执行程序。只需将您的呼叫移至文件底部,即可在调用时定义所有内容。