打包/打开发电机组

时间:2011-06-12 14:27:45

标签: python

我有两台发电机。第一个生成器有时需要调用第二个生成器并从中获得返回值:

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。

3 个答案:

答案 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 = ba = lambda: b。但如果a添加了自己的元素,则可以使用itertools.chain

import itertools
def a():
  return itertools.chain(['a-value'], b())

请记住,尽管此变体可能更短,但for: yield是一种非常直观(因此易于理解)的模式。