Python:检查用户对原始输入()的响应

Python:检查用户对原始输入()的响应,python,list,function,Python,List,Function,我试图让用户输入一个特定的单词 我的代码: import os os.system("clear") def get_answer(): print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?" x = raw_input('> ') answers = ['hit', 'stick', 'double', 'split'] y = [i for i in answers

我试图让用户输入一个特定的单词

我的代码:

import os

os.system("clear")

def get_answer():
    print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?"
    x = raw_input('> ')
    answers = ['hit', 'stick', 'double', 'split']
    y = [i for i in answers if i in x]
    if y == []:
        get_answer()
    print y
    # exit(0)
    return y

def foo():
    a = get_answer()
    print a

foo()
如果我第一次回答“hit”,这是我的输出

Would you like to 'hit', 'stick', 'double' down or 'split'?
> hit 
['hit']
['hit']
这是我的输出,如果我第一次键入“blah”,然后键入“hit”:

Would you like to 'hit', 'stick', 'double' down or 'split'?
> blah

Would you like to 'hit', 'stick', 'double' down or 'split'?
> hit
['hit']
[]
[]

我甚至不知道如何研究这个。这是一个简单的语法错误还是有一个更深层次的问题我只是不明白?我很想知道如何正确地执行此操作。

您只需测试答案中的x是否为
,这将检查输入是否为
答案中的元素之一

此外,由于您使用递归获取用户的输入,因此输入错误的值会在堆栈上放置另一个
get\u answer()
调用。结果是,当最内部的
get\u answer
获取有效输入时,外部的
get\u answer
调用继续执行,导致您看到的奇怪输出

例如,在第二种情况下,
['hit']
由最内部调用的
print y
生成,第一个
[]
由外部调用的
print y
生成(因为内部
get\u answer
完成),最后一个
[]
foo()中的
print a
生成(因为外部的
get_answer
返回
[]

您可能想做的是(a)将
get\u answer
调用更改为
return get\u answer()
,以便将最里面的调用的值发送回堆栈,或者(b)将
get\u answer
调用更改为循环,并在得到好的答案时中断

假设您正试图让用户恰好输入其中一个选项,下面是如何构造代码以使用循环而不是递归:

def get_answer():
    answers = ['hit', 'stick', 'double', 'split']
    while True:
        print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?"
        answer = raw_input('> ')
        if answer in answers:
            return answer

print get_answer()

您只需测试答案中的x是否为
,检查输入是否为
答案中的元素之一

另外,由于您使用递归获取用户的输入,输入错误的值会在堆栈上放置另一个
get\u answer()
调用。结果是,当最内部的
get\u answer
获取有效输入时,外部的
get\u answer
调用继续执行,导致您看到的奇怪输出

例如,在第二种情况下,
['hit']
由最内部调用的
print y
生成,第一个
[]
由外部调用的
print y
生成(因为内部
get\u answer
完成),最后一个
[]
foo()中的
print a
生成(因为外部的
get_answer
返回
[]

您可能想做的是(a)将
get\u answer
调用更改为
return get\u answer()
,以便将最里面的调用的值发送回堆栈,或者(b)将
get\u answer
调用更改为循环,并在得到好的答案时中断

假设您正试图让用户恰好输入其中一个选项,下面是如何构造代码以使用循环而不是递归:

def get_answer():
    answers = ['hit', 'stick', 'double', 'split']
    while True:
        print "\nWould you like to 'hit', 'stick', 'double' down or 'split'?"
        answer = raw_input('> ')
        if answer in answers:
            return answer

print get_answer()

这个问题更为基本。在
get\u answer()
函数中,您可以通过从函数本身调用函数:

if y == []:
    get_answer()
虽然这样做有效,但我怀疑这是否是您的预期行为。您必须在
get\u answer()
之外调用
get\u answer()
,才能很好地提示输入值

不管怎样,下面是我将如何构造您的代码:

def get_answer(question, answers):
    response = raw_input(question)

    while response not in answers:
        response = raw_input(question)

    return response

if __name__ == '__main__':
    question = "Would you like to 'hit', 'stick', 'double' down or 'split'?\n> "
    answers = ['hit', 'stick', 'double', 'split']

    print get_answer(question, answers)

这个问题更为基本。在
get\u answer()
函数中,您可以通过从函数本身调用函数:

if y == []:
    get_answer()
虽然这样做有效,但我怀疑这是否是您的预期行为。您必须在
get\u answer()
之外调用
get\u answer()
,才能很好地提示输入值

不管怎样,下面是我将如何构造您的代码:

def get_answer(question, answers):
    response = raw_input(question)

    while response not in answers:
        response = raw_input(question)

    return response

if __name__ == '__main__':
    question = "Would you like to 'hit', 'stick', 'double' down or 'split'?\n> "
    answers = ['hit', 'stick', 'double', 'split']

    print get_answer(question, answers)

该模块可能是您想要的。该模块可能是您想要的。非常感谢您的详细回答!但是,如果您能提供一个代码示例,我将不胜感激,因为我已经尝试使用您的建议,并且我也遇到了同样的问题。感谢您添加该示例!非常感谢您的详细回答!但是,如果您能提供一个代码示例,我将不胜感激非常感谢,因为我尝试采纳了你的建议,我也遇到了同样的问题。谢谢你添加了这个示例!嗯,不完全正确。如果你使用“If y=[]:return get_answer()”,它实际上工作得很好(除非用户输入错误的内容1000次,并导致堆栈溢出…)如果函数达到最大递归深度,Python只会抛出一个
运行时错误
。我不建议在这种情况下使用递归,因为它是不需要的。嗯,不完全正确。如果执行“If y=[]:return get_answer()”,它实际上可以正常工作(除非用户输入错误的内容1000次并导致堆栈溢出…)如果函数达到最大递归深度,Python只会抛出一个
运行时错误