1

我正在用 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吗?

4

3 回答 3

1

您只需将代码中的语句替换contains_words(prompt, words)return contains_words(prompt, words)

于 2015-05-17T17:53:17.717 回答
1

递归时,需要返回结果。

return contains_words(prompt , words) 
于 2015-05-17T17:53:46.427 回答
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块,函数中的下一件事是......什么都没有。其余的ifs。elifs 和elses 没有任何意义(正如原始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."

这将避免可能涉及许多递归的内存问题。

于 2015-05-17T18:15:35.323 回答