我正在尝试让用户输入一个特定的单词。
我的代码:
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']
[]
[]我甚至不知道如何研究这个。这是一个简单的语法错误,还是有一个更深层次的问题我就是不明白?我很想知道如何正确地做到这一点。
发布于 2012-08-25 10:58:07
您只需要测试if x in answers,它会检查输入是否是answers中的元素之一。
此外,由于您使用递归来获取用户的输入,因此输入不正确的值会将另一个get_answer()调用放入堆栈。结果是,当最内部的get_answer获得有效的输入时,外部的get_answer调用继续执行,从而导致您看到的奇怪的输出。
例如,在第二种情况下,['hit']是由最里面的调用的print y生成的,第一个代码是由外部调用的print y生成的(因为内部代码完成了),最后一个代码是由print a在foo()中生成的(因为外部get_answer返回< [] >d14get_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-25 11:11:23
这个问题更根本一点。在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)https://stackoverflow.com/questions/12118777
复制相似问题