我在python中创建了一个基于文本的游戏并且遇到了障碍。我有一个函数检查用户输入是否包含某些单词,如果是,它返回用户输入,否则它将重新请求输入。如果你写的东西不包含其中一个单词,它将重新调用该函数。
def contains_words(prompt, words):
user_input = raw_input(prompt).strip().lower()
if user_input == "instructions":
print
instructions()
print
contains_words(prompt, words)
elif user_input == "i" or user_input == "inventory":
if len(inventory) == 0:
print
print "There is nothing in your inventory."
print
contains_words(prompt, words)
else:
print "Your inventory contains: " + inventory
contains_words(prompt, words)
else:
if user_input in words:
return user_input
else:
print
print "I did not understand your answer, consider rephrasing."
contains_words(prompt , words)
我在这称呼它:
pizza = contains_words("Do you like pizza?", ["yes", "no"])
在此功能中,您可以调出说明或库存,然后它将调用该功能。如果您在第一次被问到答案时将其中一个单词放在答案中,那么一切都会正常工作。当您输入不正确的内容,调出库存或提出说明时,就会出现问题。它导致函数不返回任何内容,而不是用户输入。为什么会这样?是因为函数重置所以参数等于none?
答案 0 :(得分:1)
您只需要通过contains_words(prompt, words)
return contains_words(prompt, words)
中的语句
答案 1 :(得分:1)
当你递归时,你需要返回结果。
return contains_words(prompt , words)
答案 2 :(得分:1)
让我们来看看这个函数的示例调用。
pizza = contains_words("Do you like pizza?", ["yes", "no"])
说用户输入instructions
。您的第一个if
语句是True
,因此我们输入该块,调用instructions()
(可能是向控制台打印指令),然后再次调用contains_words
。假设用户此次输入yes
。我们将转到上一个if
语句,它将是True
,此contains_words
的调用将返回yes
- 到它所在的位置称为强>
所以,现在我们将堆栈备份到contains_words
的原始调用。返回值被忽略,因为函数本身在一行上调用,而不是作为另一个函数或语句的参数。现在我们完成了这个if
块,函数中的下一个东西是......什么都没有。 if
的其余部分。 elif
和else
s没有任何意义(原始if
评估为True
),我们退出函数的底部。它什么都不返回(实际上None
)。 (检查要查看的pizza
的类型。)
解决方法是将递归调用更改为return contains_words(prompt, words)
,这样当函数从每个递归调用中删除时,它会将返回值传递给堆栈,或者,因为这只是尾递归,所以请替换它循环:
def contains_words(prompt, words):
while True:
user_input = raw_input(prompt).strip().lower()
if user_input == "instructions":
print
instructions()
print
elif user_input == "i" or user_input == "inventory":
if len(inventory) == 0:
print
print "There is nothing in your inventory."
print
else:
print "Your inventory contains: " + inventory
else:
if user_input in words:
return user_input
else:
print
print "I did not understand your answer, consider rephrasing."
这将避免可能导致多次递归的内存问题。