考虑以下(非工作)示例代码:
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,不再是生成器功能.在这个小例子我再从返回值foo和bar,并把yield成test_gen,但是我有一个情况下这是不可能的.如何test_gen再次变成发电机功能?
您需要循环委托生成器的结果并产生以下结果:
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功能,再次使其成为发电机功能.