我正在用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"])
在此功能中,您可以提出指令或库存,然后回想起该功能。如果您第一次被问到回答中的一个单词之一,一切都像正常人一样工作。当您输入不正确的内容,提出库存或提出说明时,问题就会发生。它导致该功能什么都没有返回,而不是用户输入。为什么会发生这种情况?是因为函数重置以使参数等于无吗?
让我们浏览此功能的示例调用。
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
s。 elif
s和 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."
将避免可能与许多递归有关的记忆问题。
您只需要由return contains_words(prompt, words)
contains_words(prompt, words)
中的语句重复时,您需要返回结果。
return contains_words(prompt , words)