Python - 有没有办法在子函数中组织一组产量来产生主函数?

时间:2013-11-22 21:54:29

标签: python generator yield

我有一个关于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

这只是一个例子,但在实际应用中,它的更复杂的产量序列在主生成器中重复多次(因此不是关于组织产量的问题),而是关于子生成器。所以我想避免代码重复。

2 个答案:

答案 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]