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 特定答案。
感谢您的回答。它确实帮助我理清思绪,现在我想分享一些我在网上找到的关于递归和生成器的有用资源,这对初学者也很友好。
了解 python 中的生成器。下面的 link 非常可读且易于理解。
What does the "yield" keyword do in Python?
要理解递归,“https://www.youtube.com/watch?v=MyzFdthuUcA”。这个 youtube 视频提供了一个 "patented" 4 步的方法来编写任何递归 method/function。这是非常明确和可行的。该频道还有几个视频向人们展示递归如何工作以及如何跟踪它。
希望能帮到像我这样的人。
在 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 特定答案。
感谢您的回答。它确实帮助我理清思绪,现在我想分享一些我在网上找到的关于递归和生成器的有用资源,这对初学者也很友好。
了解 python 中的生成器。下面的 link 非常可读且易于理解。 What does the "yield" keyword do in Python?
要理解递归,“https://www.youtube.com/watch?v=MyzFdthuUcA”。这个 youtube 视频提供了一个 "patented" 4 步的方法来编写任何递归 method/function。这是非常明确和可行的。该频道还有几个视频向人们展示递归如何工作以及如何跟踪它。
希望能帮到像我这样的人。