python - 为用户输入递归调用函数

标签 python function python-2.7 recursion input

我正在尝试制作剪刀石头布游戏, 并正在尝试验证输入。

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)。

这样做的方法很简单:当输入无效时,再次提示。我按照“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!"

作为 if 语句的替代方案,有一种更简洁的方式通过 in 运算符来表达它。

if x in ('r', 'p', 's', 'rock', 'paper', 'scissors'):

作为您原始问题的附录(因为它说您必须递归地进行),我必须强烈警告您不要通过递归进行任何输入评估。 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())

关于python - 为用户输入递归调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160315/

相关文章:

python - 使用正则表达式从 JSON 中删除字符串中的 Unicode\uxxxx

python - 将 DHT22 传感器数据上传到 Xively Feed

python - 如何将内存中的 SQLite 数据库复制到 Python 中的另一个内存中的 SQLite 数据库?

c++ - 如何递归到 "print list from tail to head"?

django - 如何解码 token 并获取djangorestframework-jwt包的信息为Django

python - 如何在列表中的每个字符串的末尾添加一个字符?

python - 如何为/: 'str' and 'int' in for loops处理不受支持的操作数类型

c++ - 引用 set for c++ 中的最大/最小 int

javascript - 动态选择单选按钮

python - Python2/3 中 __new__ 和 __init__ 顺序的区别