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

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

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

最佳答案

由于 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/

相关文章:

python - 上下文管理器处理路径的类型提示

Python:从 Python 中的 wav 文件计算随时间变化的频率?

django - 属性错误 : 'Settings' object has no attribute <AUTH_USER_MODEL value> after attempt to make migration

python - python 2.7的内存库

python - 如何在 Mac 操作系统上使用 json

python - OpenCV 2.4 VideoCapture 在 Windows 上不起作用

python - 如何简化这些字典理解?

python - Errno 24 : Too many open files. 但是我打不开文件?

Python - 如何存储数值行?

python - 如何将 python 脚本放在路径上?