我正在编写一些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