当我使用此代码时,我的目标是尝试确保任何输入都不会破坏代码,比如字母或数字,而不是0-3之间。但是当我使用这个代码时,整个列表不会出现。我该如何解决这个问题?

输出应该如下所示


13Hello Megan the four games avaliable are:
0 Mario Cart
1 Minecraft
2 Angry Birds
3 Grabd Theft Auto
What number game do you want? h
Please choose a valid number
What number game do you want? 23
Please choose a number between 0 and 3
What number game do you want? 1
You have chosen Minecraft

相反,输出是


6Hello the four games avaliable are:
0 Mario Cart
What number game do you want? 2
1 Minecraft
What number game do you want? h
Please enter a valid value

我使用的代码是:


23#Ask user what game they would like to play
def game () :
global gametype,gamelist
gamelist = ["Mario Cart","Minecraft","Angry Birds","Grabd Theft Auto"]
gamecount = 0
print ("Hello the four games avaliable are:")
while gamecount < 4:
print (gamecount,"",gamelist[gamecount])
gamecount = gamecount + 1

try:

gametype = int(input("What number game do you want?"))
while gametype <0 or gametype >3:
print (" Please enter a value between 0 and 3")
except ValueError:
print ("Please enter a valid value" )
return gametype
game ()

我还尝试了另一种方法,在"try"之前使用"while-true",但程序说这是无效语法。

第二次尝试

我已经使用了这段新代码,但它不会让我运行代码,因为它说当我输入while true时语法无效,true以红色突出显示。


24#Ask user what game they would like to play
def game () :
global gametype,gamelist
gamelist = ["Mario Cart","Minecraft","Angry Birds","Grabd Theft Auto"]
gamecount = 0
print ("Hello the four games avaliable are:")
while gamecount < 4:
print (gamecount,"",gamelist[gamecount])
gamecount = gamecount + 1

while True:

try:

gametype = int(input("What number game do you want?"))
if 0 <= gametype <= 3 :
return game
print ("Please enter a value between 0 and 3")
except ValueError:
print ("Please enter whole number from 0 to 3" )
return game
game ()

请修复代码中的缩进。按照您介绍的方式,它不是有效的python,因为try和except不在同一缩进级别上。

此外,while循环将永远不会终止,但如果满足条件,则会无限期运行。

最后,您能告诉我们Python解释器显示的确切错误吗?通常,会有一个关于什么是错误的明确提示。

问题不在您上面显示的代码中,而是在yup.py中,而正是解释器所说的:您试图打印的变量name未定义(尚未引入并设置为任何值)。

看起来您需要检查python的缩进代码规则。正确的缩进在Python中至关重要!

我修正了那些错误,但现在一切都没有打印出来。

检查压痕。我相信通过跟踪程序流,您可以看到它的错误所在。你快到了!

@IonicSolutions我已经更改了我的契约,但我仍然不知道该怎么做

@米歇尔,看起来你有点迷路了。但我可以告诉你,你正在努力使这项工作,所以我很快会发布一个答案。以后,请发布您试图运行的确切代码,并确保缩进与您的计算机上的代码完全相同。当您收到错误消息时,请在您的问题中包含完整的错误消息,从回溯行开始。将错误消息放入代码块以保留格式。

您应该看看Kevin的精彩问答:询问用户输入,直到他们给出有效的回答。在这个阶段,其中的一些代码可能对您来说有点高级,但它非常值得研究并为该页面添加书签,以供将来参考。

顺便说一句,你不想要return game。返回game函数对象本身。您需要返回gametype,并且只有在gametype有效时才应该这样做,所以您不应该将它返回到该except ValueError块中。

我想你想要这样的东西:


21gamelist = ["Mario Cart","Minecraft","Angry Birds","Grand Theft Auto"]

def game(name):

""" Ask user what game they would like to play"""
print ("Hello, {}, the four available games are:".format(name))
for gamenum, gamename in enumerate(gamelist):
print(gamenum,":", gamename)

while True:

try:

gamenum = int(input("What number game do you want?"))
if 0 <= gamenum <= 3:
return gamenum
print("Please enter a value between 0 and 3")
except ValueError:
print ("Please enter a whole number from 0 to 3")
name = input("What"s your name?")
gamenum = game(name)
print("You chose", gamelist[gamenum])

演示输出


12What"s your name? Megan
Hello, Megan, the four available games are:
0 : Mario Cart
1 : Minecraft
2 : Angry Birds
3 : Grand Theft Auto
What number game do you want? 4
Please enter a value between 0 and 3
What number game do you want? Minecraft
Please enter a whole number from 0 to 3
What number game do you want? 2
You chose Angry Birds

我对您的代码所做的主要更改是将try.. except的东西放在while True块中,所以我们一直要求输入,直到得到有效的东西为止。我还使用enumerate打印每个游戏及其编号。这比你的while gamecount < 4:环更整洁。

如果您必须使用while循环打印游戏列表,那么您可以这样做:


23gamelist = ["Mario Cart","Minecraft","Angry Birds","Grand Theft Auto"]
def game(name):
""" Ask user what game they would like to play"""
print ("Hello, {}, the four available games are:".format(name))
gamenum = 0
while gamenum < len(gamelist):
print(gamenum,":", gamelist[gamenum])
gamenum += 1
while True:
try:
gamenum = int(input("What number game do you want?"))
if 0 <= gamenum <= 3:
return gamenum
print("Please enter a value between 0 and 3")
except ValueError:
print ("Please enter a whole number from 0 to 3")
name = input("What"s your name?")
gamenum = game(name)
print("You chose", gamelist[gamenum])

我把gamelist列为一个全局列表,这样我们就可以在game功能之外访问它。我们不需要在函数中使用global语句,因为我们不更改gamelist。一般来说,应该避免使用global语句。

没有枚举还有什么办法吗?

@米歇尔当然!但是,使用enumerate是一种简洁的方法。你也可以用for gamenum in range(4):来实现。看看你能不能弄清楚。你也可以用一个while循环来完成,就像你以前试图做的那样,但这是最混乱的方式。

我试着改变它,我在问题的底部添加了它,你能看看吗?我想我需要它在while循环中作为一个需求

@Michelle编码时必须小心,以确保键入的关键字和变量名准确无误。你需要while都是小写的。您使用大写W,因此在堆栈溢出部分,它将以浅蓝色而不是深蓝色打印。

谢谢,这使它现在起作用了,但我相信我的"except valueerror"有问题,因为当我输入一个字母时,它会打印("请输入0到3之间的整数"),但它不会像"if"那样重新思考问题。

@米歇尔是的。你还做了一些其他的改变,把事情搞砸了。试着让你的新版本更接近我的。我现在做不了什么,因为我在打电话。

我不知道该怎么做,对不起,我是新来的,我不太明白,但是你能告诉我要改变什么吗?或者我可以等一下

@Michelle你需要让你的程序和我的程序一样,除了打印游戏号码和名称的循环。确保不要弄乱压痕。

@Michelle我在答案中添加了一个新版本。