问题描述
我正在尝试用Python创建一个递归生成器,但我做错了。 这是一个最小的例子。 我希望函数f()返回一个迭代,它会给我所有的正数> = n。
>>> def f(n):
... yield n
... if n>0:
... f(n-1)
...
>>> [ i for i in f(30) ]
[30]
为什么迭代在第一个数字后停止?
1楼
由于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
2楼
你的功能是:
return a generator that generates "n"
call function f(n-1) which returns a generator
throw that inner generator away, never use it
quit