Python递归生成器如何工作?

时间:2016-06-05 19:21:11

标签: python recursion generator permutation

Python tutorial中,我已经了解了

  

与函数类似,可以递归编程生成器。下列   example是一个生成器,用于创建给定项目列表的所有排列。

def permutations(items):
    n = len(items)
    if n==0: yield []
    else:
        for i in range(len(items)):
            for cc in permutations(items[:i]+items[i+1:]):
                yield [items[i]]+cc

for p in permutations(['r','e','d']): print(''.join(p))
for p in permutations(list("game")): print(''.join(p) + ", ", end="")

我无法弄清楚它是如何产生结果的。递归的东西和“产生”#39;我真的很困惑。有人能清楚地解释整个过程吗?

3 个答案:

答案 0 :(得分:3)

这有两个部分---递归和生成器。这里是使用递归的非生成器版本:

def permutations2(items):
    n = len(items)
    if n==0: return [[]]
    else:
        l = []
        for i in range(len(items)):
            for cc in permutations2(items[:i]+items[i+1:]):
                l.append([items[i]]+cc)
        return l

l.append([item[i]]+cc)大致转换为这些项目的排列,包括item [i]是第一项的条目,以及其余项目的排列。

生成器部分yield其中一个排列而不是return整个排列列表。

答案 1 :(得分:2)

当你调用一个返回的函数时,它会在产生结果后消失。

当您向生成器询问其 next 元素时,它会生成它(产生它),并暂停 - 产生(控件)回到你身边。当再次询问 next 元素时,它将恢复其操作,并正常运行直到命中yield语句。然后它将再次产生一个值并暂停。

因此,使用某个参数调用生成器会导致创建实际的内存实体,一个能够运行的对象,记住其状态和参数,并在被询问时生成值。

对同一个生成器的不同调用会在内存中生成不同的实际对象。该定义是用于创建该对象的配方。定义配方后,当它被称为时,可以调用它需要的任何其他配方 - 或相同的配方 - 来创建它需要的新内存对象,以便为它生成值。

这是一般性答案,而不是特定于Python的。

答案 2 :(得分:0)

感谢您的回答。它真的帮助我清除了我的想法,现在我想分享一些有关我在互联网上发现的递归和生成器的有用资源,这对初学者也非常友好。

  1. 了解python中的生成器。下面的链接非常易读且易于理解。 What does the "yield" keyword do in Python?

  2. 要理解递归," https://www.youtube.com/watch?v=MyzFdthuUcA"。这个youtube视频提供了一个专利的"编写任何递归方法/函数的4个步骤方法。这是非常明确和切实可行的。该频道还有几个视频,向人们展示递归如何工作以及如何跟踪它。

  3. 我希望它可以帮助像我这样的人。