JMG*_*JMG 2 python recursion input function python-2.7
我正在尝试制作石头剪刀布游戏,并尝试验证输入。
def player1():
x = (raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ")).lower()
if x == 'r' or x == 'p' or x == 's' or x == 'rock' or x == 'paper' or x == 'scissors':
return x[0]
else:
print "Error - wrong input!"
player1() #I know I can run a While loop, but I need to run it this way.
print(player1())
Run Code Online (Sandbox Code Playgroud)
如果我在第一次尝试时输入正确的输入,一切正常。但是如果我第一次输入错误的输入,第二次输入正确的输入,我会得到None输出,而不是 RPS 选项的第一个字母。
我错过了什么?
你会想要循环输入。您当前正在做的是递归调用player1,并且递归情况没有明确的返回值(因此None返回)。
这样做的方法很简单:当输入无效时,再次提示。我正在使用“while True break”风格的修改版本;它实现了相同的目标。我们无限循环,如果我们想要的条件有效,我们就返回;否则,我们提示输入并再次循环。
def player1():
while True:
x = raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ").lower()
if x == 'r' or x == 'p' or x == 's' or x == 'rock' or x == 'paper' or x == 'scissors':
return x[0]
else:
print "Error - wrong input!"
Run Code Online (Sandbox Code Playgroud)
作为该if语句的替代方案,有一种更简洁的方式通过in运算符来表达它。
if x in ('r', 'p', 's', 'rock', 'paper', 'scissors'):
Run Code Online (Sandbox Code Playgroud)
作为您原始问题的附录(因为它说您必须递归地进行),我必须强烈警告您不要通过递归进行任何输入评估。Python 的调用堆栈大小约为 1,000,这意味着在程序不可恢复地崩溃之前,您的尝试次数非常有限(但相当大)。
不仅如此,您的操作堆栈将不必要地充满行为方式与循环类似的方法调用。为了记忆,除了绝对递归上限之外,不要为此使用递归。
如果你绝对必须,我再次强烈建议不要这样做,那么你只需要从你的迭代案例中返回。
def player1():
x = (raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ")).lower()
if x == 'r' or x == 'p' or x == 's' or x == 'rock' or x == 'paper' or x == 'scissors':
return x[0]
else:
print "Error - wrong input!"
return player1() #I know I can run a While loop, but I need to run it this way.
print(player1())
Run Code Online (Sandbox Code Playgroud)