我试图在 Python 中创建一个递归生成器,但我做错了什么。这是一个最小的例子。我希望函数 f() 返回一个可迭代对象,它会给我所有 >= n 的正数。
>>> def f(n):
... yield n
... if n>0:
... f(n-1)
...
>>> [ i for i in f(30) ]
[30]
为什么迭代在第一个数字后停止?
最佳答案
由于 f(n-1)
又是一个生成器,它只能通过 next
协议(protocol)使用。如果你使用的是 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 版本,那么你必须像这样手动迭代和 yield
def f(n):
yield n
if n > 0:
for item in f(n-1):
yield item
关于python - 为什么递归生成器在 Python 3.3 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22395116/