我试图做一个石头,剪子,布的游戏,我试图验证输入。
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())
如果我在第一次尝试输入正确的输入,一切工作正常。 但是,如果我进入上首次尝试输入错误,并进入第二时间出现在正确的输入,我得到None
替代的RPS选项的第一个字母的输出。
我在想什么?
你会想在输入回路。 你在做什么目前是递归调用player1
,和递归情况下,没有一个明确的返回值(因此, None
返回)。
这样做的方法很简单:虽然是无效的输入,再提示。 我使用的这的“而真正的突破”的风格静脉修改后的版本; 它实现同样的目标。 我们无限循环,如果我们想要的条件是有效的,我们返回; 否则,我们再次提示输入回路。
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!"
作为替代的是if
语句,有通过表达它一个稍微更清洁的方式in
运营。
if x in ('r', 'p', 's', 'rock', 'paper', 'scissors'):
作为附录你原来的问题(因为它说,你必须递归地做到这一点),我必须强烈警告你不要通过递归做任何输入的评价。 Python有大约1000调用堆栈大小,这意味着你有尝试的一个非常有限的(但相当大的)量的程序崩溃且不可恢复之前。
不仅如此,但你的操作堆栈将不必要地充满了类似的方式表现一个循环的方法调用。 对于内存的,除了绝对递归天花板起见, 不使用递归此。
如果你绝对必须 ,我再次强烈反对这样做,那么你只需从你的迭代的情况下返回。
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())
动@诚的例子的改进版本:
def player1():
x = raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ").lower()
while True:
if x in ['r', 'p', 's', 'rock', 'paper', 'scissors']:
return x[0]
else:
print "Error - wrong input!"
x = raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ").lower()
这是一个小比许多更简洁 or
表达式,如果你有很多要检查条件,变得有点笨拙!
一点解释:
我们正在检查,看看x
( 我们的用户输入 )是有效输入预先定义的列表。
一个更广义的版本,其中可重复使用变成:
例如:( 可重复使用,非递归:)
#!/usr/bin/env python
from __future__ import print_function # For Python 2/3 compat
try:
input = raw_input # For Python 2/3 compat
except NameError:
pass
def prompt(prompt="Enter: ", valid=None):
s = input(prompt)
while valid and s not in valid:
print("Invalid input! Please try again. Valid inputs are {0:s}".format(" ".join(valid)))
s = input(prompt)
return s
x = prompt("Enter action ([r]ock, [p]aper, [s]cissors): ", ["r", "p", "s", "rock", "paper", "scissors"])
演示:
$ python foo.py
Enter action ([r]ock, [p]aper, [s]cissors): a
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): foo
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): r
$ python foo.py
Enter action ([r]ock, [p]aper, [s]cissors): a
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): foo
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): rock
PS:对不起,我没有使用递归回答你的问题。 IHMO这不是一个很好的用例的递归。 哦 :)不过; 这是很容易改变:
例如:( 可重复使用,递归 )
def userprompt(prompt="Enter: ", valid=None):
s = input(prompt)
while valid and s not in valid:
print("Invalid input! Please try again. Valid inputs are {0:s}".format(" ".join(valid)))
s = userprompt(prompt, valid)
return s
在else
分支的功能(在第一次调用你的函数,尤其是)不return
任何东西。 在Python函数不return
任何事情总是返回None
隐。
我加入这个答案的完整性考虑,因为你问一个递归解决方案。 这里是我的解决方案是最接近你的:
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()
正如你所看到的,你忘了所有的return语句。 更可读的方式可能是:
def player1():
playerInput=None
while playerInput not in ('r', 'p', 's', 'rock', 'paper', 'scissors'):
if playerInput is not None:
print("Error - wrong input!")
playerInput = raw_input("please select: Rock(r)/Paper(p)/Scissors(s)").lower()
return playerInput[0]
它甚至会吸尘器while循环做的,但蟒蛇缺乏一个结构。