为什么递归生成器在Python3.3中不能工作?

2024-04-25 17:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python创建一个递归生成器,但我做错了什么。这里有一个最小的例子。我希望函数f()返回一个iterable,它将给出所有正数>;=n

>>> def f(n):
...     yield n
...     if n>0:
...         f(n-1)
... 
>>> [ i for i in f(30) ]
[30]

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


Tags: 函数ingtforifdef数字iterable
2条回答

因为f(n-1)又是一个生成器,它只能与next协议一起使用。如果您使用的是python3.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]

如果您想用out yield from进行修复,或者使用没有yield from的Python版本,那么您必须手动迭代并生成这样的结果

^{pr2}$

你的职能是:

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

相关问题 更多 >

    热门问题