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

chi*_*org 1 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
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为test_gen没有yield,不再是生成器功能.在这个小例子我再从返回值foobar,并把yieldtest_gen,但是我有一个情况下这是不可能的.如何test_gen再次变成发电机功能?

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 3.3或更高版本,则可以使用该yield from表达式进行正确的生成器委派:

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

两者都重新引入yield功能,再次使其成为发电机功能.