"yield from"如何在递归函数中工作?



我正在编写一些python代码,其中需要在递归函数中使用生成器。下面是我写的一些代码来模仿我正在尝试做的事情。这是尝试1。

def f():
def f2(i):
if i > 0:
yield i
f2(i - 1)

yield f2(10)
for x in f():
for y in x:
print(y)

这只打印10,尝试使用我在网上找到的yield from结构进行2次打印。

def f():
def f2(i):
if i > 0:
yield i
yield from f2(i - 1)

yield from f2(10)

for x in f():
print(x)

这是我想要的,但我不明白发生了什么,yield from在幕后做什么,为什么我的第一次尝试没有成功?

您可以将yield from视为一个for循环,它生成每一项:

for i in f(10):
yield i

与CCD_ 4相同。换句话说,它给定的可迭代项中产生项,在这种情况下,它是另一个生成器。

yield from g()将在新生成器g内递归,从该生成器的每个yield语句中产生

所以

def g1():
yield from g2()
def g2()
for i in range(10):
yield i * 2

你可以想象g1中的yield from在里面展开g2,扩展到类似的东西

def g1():
for i in range(10):
yield i * 2

这不是因为你有作用域等,而是在g1中执行yield from g2()的过程中,解释器在g2中递归产生它产生的每个值,可能会递归到另一个生成器。

现在考虑这个生成器

def flatten(maybe_it): 
try: 
for i0 in maybe_it: 
for i1 in flatten(i0): 
yield i1 
except TypeError: 
yield maybe_it 

使用yield from可以将其重写为

def flatten(maybe_it): 
try: 
for i0 in maybe_it: 
yield from flatten(i0): 
except TypeError: 
yield maybe_it

最新更新