符合子发电机的发电机

时间:2012-02-29 15:50:02

标签: python

我喜欢让发电机服从其他发电机,例如

def gx():
    for i in [1, 2, 3]:
        yield i

def gy():
    for i in [11, 12, 13]:
        yield i

def gz():
    """this should defer to gx and gy to
       generate [1, 2, 3, 11, 12, 13]"""
    for i in gx(): yield i
    for i in gy(): yield i

gz()中的显式循环是唯一可行的方法,还是有更好的选择?

2 个答案:

答案 0 :(得分:18)

在当前发布的Python版本中,显式循环是调用子生成器的唯一方法。 (我认为你的例子只是一个例子 - 不是你要解决的确切问题。)

Python 3.3将为此目的添加特殊语法yield from

def gz():
    """this should defer to gx and gy to
       generate [1, 2, 3, 11, 12, 13]"""
    yield from gx()
    yield from gy()

有关详细信息,请参阅PEP 380

答案 1 :(得分:11)

使用itertools.chain

import itertools

gz = itertools.chain(gx(), gy())

chain的文档中,他们通过实现来描述它:

def chain(*iterables):
    for it in iterables:
        for element in it:
            yield element

你也可以从中汲取灵感:)