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

时间:2014-03-14 02:36:02

标签: 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]

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

2 个答案:

答案 0 :(得分: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]

如果您想要修复yield from或使用没有yield from的Python版本,那么您必须手动迭代并按此收益

def f(n):
    yield n
    if n > 0:
        for item in f(n-1):
            yield item

答案 1 :(得分:0)

你的功能正在做:

return a generator that generates "n"
call function f(n-1) which returns a generator
throw that inner generator away, never use it
quit