考虑以下(非工作)示例代码:
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
变成生成器函数?
最佳答案
您需要遍历委托(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/