我有两台发电机。第一个生成器有时需要调用第二个生成器并从中获得返回值:
def a():
for _b in b():
yield _b
def b():
yield 1
yield 2
for _a in a():
print _a
有更优雅的方式来做到这一点:
for _b in b():
yield _b
我试过这个:
yield *b()
但肯定不起作用。我有Python 2.6。
答案 0 :(得分:6)
我认为你的意思是PEP380。这是available from Python 3.3。它看起来像:
yield from b()
Python2中没有特殊的语法。你只需使用for循环。
你问题中的a
函数实际上完全没用。您可以在其中使用b
。
答案 1 :(得分:3)
您可以使用生成器表达式。它与循环一样简洁,而且它表明您的代码主要用于产生返回值而不是副作用。
def a():
return (_b for _b in b())
正如phihag所说,如果你的代码真的像这个例子,你可以简单地写a = b
,因为a和b返回相同的序列。
答案 2 :(得分:2)
嗯,在这个简单的例子中,你可以写a = b
或a = lambda: b
。但如果a
添加了自己的元素,则可以使用itertools.chain:
import itertools
def a():
return itertools.chain(['a-value'], b())
请记住,尽管此变体可能更短,但for: yield
是一种非常直观(因此易于理解)的模式。