Python:检查用户对原始输入()的响应
我试图让用户输入一个特定的单词 我的代码:Python:检查用户对原始输入()的响应,python,list,function,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
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']
[]
[]
我甚至不知道如何研究这个。这是一个简单的语法错误还是有一个更深层次的问题我只是不明白?我很想知道如何正确地执行此操作。您只需测试答案中的x是否为
,这将检查输入是否为答案中的元素之一
此外,由于您使用递归获取用户的输入,因此输入错误的值会在堆栈上放置另一个get\u answer()
调用。结果是,当最内部的get\u answer
获取有效输入时,外部的get\u answer
调用继续执行,导致您看到的奇怪输出
例如,在第二种情况下,['hit']
由最内部调用的print y
生成,第一个[]
由外部调用的print y
生成(因为内部get\u answer
完成),最后一个[]
由foo()中的print a
生成(因为外部的get_answer
返回[]
)
您可能想做的是(a)将get\u answer
调用更改为return get\u answer()
,以便将最里面的调用的值发送回堆栈,或者(b)将get\u 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()
您只需测试答案中的x是否为,检查输入是否为答案中的元素之一
另外,由于您使用递归获取用户的输入,输入错误的值会在堆栈上放置另一个get\u answer()
调用。结果是,当最内部的get\u answer
获取有效输入时,外部的get\u answer
调用继续执行,导致您看到的奇怪输出
例如,在第二种情况下,['hit']
由最内部调用的print y
生成,第一个[]
由外部调用的print y
生成(因为内部get\u answer
完成),最后一个[]
由foo()中的print a
生成(因为外部的get_answer
返回[]
)
您可能想做的是(a)将get\u answer
调用更改为return get\u answer()
,以便将最里面的调用的值发送回堆栈,或者(b)将get\u 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()
这个问题更为基本。在get\u answer()
函数中,您可以通过从函数本身调用函数:
if y == []:
get_answer()
虽然这样做有效,但我怀疑这是否是您的预期行为。您必须在get\u answer()
之外调用get\u 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)
这个问题更为基本。在get\u answer()
函数中,您可以通过从函数本身调用函数:
if y == []:
get_answer()
虽然这样做有效,但我怀疑这是否是您的预期行为。您必须在get\u answer()
之外调用get\u 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)
该模块可能是您想要的。该模块可能是您想要的。非常感谢您的详细回答!但是,如果您能提供一个代码示例,我将不胜感激,因为我已经尝试使用您的建议,并且我也遇到了同样的问题。感谢您添加该示例!非常感谢您的详细回答!但是,如果您能提供一个代码示例,我将不胜感激非常感谢,因为我尝试采纳了你的建议,我也遇到了同样的问题。谢谢你添加了这个示例!嗯,不完全正确。如果你使用“If y=[]:return get_answer()”,它实际上工作得很好(除非用户输入错误的内容1000次,并导致堆栈溢出…)如果函数达到最大递归深度,Python只会抛出一个运行时错误
。我不建议在这种情况下使用递归,因为它是不需要的。嗯,不完全正确。如果执行“If y=[]:return get_answer()”,它实际上可以正常工作(除非用户输入错误的内容1000次并导致堆栈溢出…)如果函数达到最大递归深度,Python只会抛出一个运行时错误
。