为什么递归生成器在Python 3.3中不起作用?

moj*_*ojo 6 python python-3.x

我正在尝试用Python创建一个递归生成器,但我做错了.这是一个最小的例子.我希望函数f()返回一个迭代,它会给我所有的正数> = n.

>>> def f(n):
...     yield n
...     if n>0:
...         f(n-1)
... 
>>> [ i for i in f(30) ]
[30]
Run Code Online (Sandbox Code Playgroud)

为什么迭代在第一个数字后停止?

the*_*eye 11

因为它又f(n-1)是一个发生器,只能用next协议消耗.如果您使用的是Python 3.3+,则可以yield from像这样使用

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

print(list(f(10)))
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)

如果你想修复yield from或使用没有的Python版本yield from,那么你必须手动迭代并产生这样的结果

def f(n):
    yield n
    if n > 0:
        for item in f(n-1):
            yield item
Run Code Online (Sandbox Code Playgroud)