2012-02-29 76 views
7

我希望有发电机,其他发电机,例如发电机,推迟到子发电机

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()中的显式循环是唯一的方法来做到这一点,或者是否有更好的选择?

+1

你需要解决一个实际的问题,或者你只是想知道在Python中是否有一个特定的功能? – 2012-02-29 16:02:22

回答

17

汲取灵感,在当前发布的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

+1,用于解释即将推出的新功能3.3 – 2012-02-29 15:55:32

+2

为什么选择投票?我的直觉是,这是OP实际上是从问题标题判断的答案。 – 2012-02-29 15:57:59

11

使用itertools.chain

import itertools 

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

chain的文件,他们形容它的实现:

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

你可以从这个以及:)

+0

+1,但我认为for-each代码看起来更好。 :-) – 2012-02-29 15:52:55