打包/解包生成器
我有两个生成器。第一个生成器有时候需要调用第二个生成器,并把从那里得到的值返回:
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 个回答
2
在这个简单的例子中,你可以直接写 a = b
或者 a = lambda: b
。但是如果 a
还要添加自己的一些元素,那你可以使用 itertools.chain。
import itertools
def a():
return itertools.chain(['a-value'], b())
需要注意的是,虽然这个变体可能更简短,但 for: yield
这种写法是比较直观的(所以也容易理解)。
3
你可以使用生成器表达式。这种写法和循环差不多简洁,而且它表明你的代码主要是为了产生一个返回值,而不是产生其他的副作用。
def a():
return (_b for _b in b())
正如phihag所说,如果你的代码真的像这个例子那样,你可能只需要写 a = b
,因为a和b返回的是同样的序列。
6
我想你指的是PEP380。这个功能从Python 3.3开始就有了。它的样子是:
yield from b()
在Python2中没有特别的语法来实现这个功能。你只需要用一个for循环就可以了。
你提到的a
函数其实是完全没用的。你可以直接用b
来代替它。