考虑以下(非工作)示例代码:
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
且不再是生成器函数。在这个小例子中,我只能从foo
和bar
返回值并将yield
放入test_gen
,但是我有一个不可能的情况。如何将test_gen
再次转换为生成器函数?
答案 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