python - 如何创建调用生成器函数的生成器函数

标签 python generator

考虑以下(非工作)示例代码:

class MyGenerator:
    def test_gen(self):
        for i in range(1,5):
            if i % 2:
                self.foo(i)
            else:
                self.bar(i)

    def foo(self, i):
        yield i

    def bar(self, i):
        yield i**2

g = MyGenerator()
for i in g.test_gen():
    print i

这将不起作用,因为 test_gen 没有 yield 并且不再是生成器函数。在这个小例子中,我可以只返回 foobar 的值,并将 yield 放入 test_gen,但是我有一个情况是不可能的。如何再次将 test_gen 变成生成器函数?

最佳答案

您需要遍历委托(delegate)生成器的结果并产生这些结果:

def test_gen(self):
    for i in range(1,5):
        if i % 2:
            for res in self.foo(i):
                yield res
        else:
            for res in self.bar(i):
                yield res

如果您使用的是 Python 3.3 或更高版本,您将使用 yield from expression进行适当的生成器委托(delegate):

def test_gen(self):
    for i in range(1,5):
        if i % 2:
            yield from self.foo(i)
        else:
            yield from self.bar(i)

两者都将 yield 重新引入到函数中,再次使其成为生成器函数。

关于python - 如何创建调用生成器函数的生成器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24429591/

相关文章:

python - 如何对 pandas 中的数据框应用函数?

javascript - 如何获取嵌套在两个赋值函数和 forEach 循环中的值?

javascript - 测试生成器内部抛出错误?

python - 如何在虚拟环境中放置自定义 Jupyter 内核?

python - itertools.ifilter 与 IPython 并行

python - itertools 或手写生成器 - 哪个更好?

python - Python中有 'cross-referencing'生成器吗?

Python全屏图形

python - 在查询 Postgres 函数中附加单引号?

python - 使用 SCons 作为 distutils 的构建引擎