我试图让用户输入一个特定的单词。
我的代码:
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']
[]
[]
我甚至不知道如何研究这个。这是一个简单的语法错误还是有一个我不明白的更深层次的问题?我很想知道如何正确地做到这一点。
答案 0 :(得分:4)
您只想测试if x in answers
,它会检查输入是否是answers
中的元素之一。
此外,由于您使用递归来获取用户的输入,因此输入不正确的值会在堆栈上调用另一个get_answer()
。结果是,当最里面的get_answer
获得有效输入时,外部get_answer
调用继续执行,导致您看到的奇怪输出。
例如,在您的第二种情况下,['hit']
由最里面的呼叫print y
生成,第一个[]
由外部呼叫print y
生成(因为内部get_answer
完成[]
,最后print a
由foo()
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)