Python:检查用户对raw_input()的响应

时间:2012-08-25 02:56:26

标签: 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 if i in x]
    if y == []:
        get_answer()
    print y
    # exit(0)
    return y

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

foo()

这是我的输出,如果我回答'点击'第一次;

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

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

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

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

2 个答案:

答案 0 :(得分:4)

您只想测试if x in answers,它会检查输入是否是answers中的元素之一。

此外,由于您使用递归来获取用户的输入,因此输入不正确的值会在堆栈上调用另一个get_answer()。结果是,当最里面的get_answer获得有效输入时,外部get_answer调用继续执行,导致您看到的奇怪输出。

例如,在您的第二种情况下,['hit']由最里面的呼叫print y生成,第一个[]由外部呼叫print y生成(因为内部get_answer完成[],最后print afoo() get_answer生成(因为外[]返回get_answer)。

您可能要做的是(a)将return get_answer()调用更改为get_answer,以便将最里面的调用值发送回堆栈,或者(b)更改{{} 1}}调用循环,当你得到一个好的答案时突然爆发。

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

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

答案 1 :(得分:0)

问题更为根本。在get_answer()函数中,通过从内部调用函数来recurse

if y == []:
    get_answer()

虽然这有效,但我怀疑这是你的预期行为。您必须在get_answer()之外调用get_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)