1

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

我的代码:

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”然后“hit”,这是我的输出:

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

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

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

4

2 回答 2

4

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

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

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

相反,您可能想要做的是(a)将get_answer调用更改为return get_answer()以便将最里面的调用的值发送回堆栈,或者(b)将get_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()
于 2012-08-25T02:58:06.800 回答
0

这个问题有点更根本。在get_answer()函数中,您通过从自身内部调用函数来进行递归

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)
于 2012-08-25T03:11:23.230 回答