Python 递归生成器如何工作?

How do Python Recursive Generators work?

Python tutorial 中,我了解到

Like functions, generators can be recursively programmed. The following example is a generator to create all the permutations of a given list of items.

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="")

我不知道它是如何生成结果的。递归的东西和 'yield' 真的让我很困惑。有人能把整个过程说清楚吗?

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

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 整个排列列表。

当您调用 returns 的函数时,它会在生成结果后消失。

当您向生成器请求它的 下一个 元素时,它会生成它(yields 它),然后暂停 -- yields(把控制权还给你)。当再次询问 next 元素时,它将恢复其操作,并且 运行 正常直到遇到 yield 语句。然后它将再次产生一个值并暂停。

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

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

这是一般性答案,并非 Python 特定答案。

感谢您的回答。它确实帮助我理清思绪,现在我想分享一些我在网上找到的关于递归和生成器的有用资源,这对初学者也很友好。

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

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

希望能帮到像我这样的人。