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

时间:2014-06-26 11:41:48

标签: 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再次转换为生成器函数?

2 个答案:

答案 0 :(得分:5)

您需要循环委托生成器的结果并产生:

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进行正确的生成器委派:

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重新引入函数,再次使其成为生成函数。

答案 1 :(得分:0)

为什么不呢:

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

    def foo(self, i):
        yield i

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