我有一个关于python guru的新手问题。
我有一个功能A,它包含很多重复的yield-actions,如下所示:
yield a
yield b
yield c
所以它看起来像:
def funA():
…
yield a
yield b
yield c
…
yield a
yield b
yield c
…
yield a
yield b
yield c
有没有办法将所有重复的收益率放在函数中并做类似的事情?:
def funA():
…
yield funB()
…
yield funB()
…
yield funB()
yield a
yield b
yield c
这只是一个例子,但在实际应用中,它的更复杂的产量序列在主生成器中重复多次(因此不是关于组织产量的问题),而是关于子生成器。所以我想避免代码重复。
答案 0 :(得分:16)
如果您使用的是最新且最好的python
(> = 3.3),那就是yield from
构造。
yield from funB()
它完全符合你的要求:你可以调用一个函数作为一个子生成器,并将它产生的一切都收回给你。
如果您使用的是早期版本的python
,那么我担心您必须手动执行此操作:
for x in funB(): yield x
您可以像这样对它们进行分组,以节省空间:
groups = [funA, funB, funC]
for group in groups:
for item in group():
yield item
答案 1 :(得分:2)
itertools.chain
是您正在寻找的功能
import itertools
def funA():
for x in range(10):
yield x
def funB():
for x in range(10,20):
yield x
def funC():
for x in range(20,30):
yield x
def funs():
for x in itertools.chain(funA(), funB(), funC()):
yield x
print [x for x in funs()]
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]