2012-02-29 109 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