首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:检查用户对raw_input()的响应

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

Stack Overflow用户
提问于 2012-08-25 10:56:26
回答 2查看 611关注 0票数 1

我正在尝试让用户输入一个特定的单词。

我的代码:

代码语言:javascript
复制
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‘,下面是我的输出;

代码语言:javascript
复制
Would you like to 'hit', 'stick', 'double' down or 'split'?
> hit 
['hit']
['hit']

如果我第一次输入“blah”,然后输入“hit”,下面是我的输出:

代码语言:javascript
复制
Would you like to 'hit', 'stick', 'double' down or 'split'?
> blah

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-25 10:58:07

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

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

例如,在第二种情况下,['hit']是由最里面的调用的print y生成的,第一个代码是由外部调用的print y生成的(因为内部代码完成了),最后一个代码是由print afoo()中生成的(因为外部get_answer返回< [] >d14get_answer>)。

相反,您可能想要做的是(a)将get_answer调用更改为return get_answer(),以便将最里面的调用的值向上发送回堆栈,或者(b)将get_answer调用更改为循环,并在获得好的答案时中断。

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

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2012-08-25 11:11:23

这个问题更根本一点。在get_answer()函数中,您可以通过从函数内部调用该函数来执行recurse

代码语言:javascript
复制
if y == []:
    get_answer()

虽然这行得通,但我怀疑这不是你的本意。您必须在get_answer()外部调用get_answer()才能很好地提示输入值。

无论如何,下面是我将如何组织您的代码:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12118777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档