2012-02-29 8 views
7

Mi piacerebbe avere generatori che si riferiscono ad altri generatori, ad es.che si rimandano ai sub-generatori

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 

è il ciclo esplicito in gz() l'unico modo per fare questo, o ci sono alternative migliori?

+1

Hai bisogno di risolvere un problema reale o sei solo interessato a sapere se c'è una funzione specifica per questo in Python? –

risposta

17

In attualmente rilasciata Python versioni, un ciclo esplicito è l'unico modo per invocare i sub-generatori. (. Presumo che il vostro esempio è solo, beh, un esempio - non è il problema esatto che si desidera risolvere)

Python 3.3 aggiungerà la sintassi speciale yield from per questo scopo:

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

Vedi PEP 380 per maggiori dettagli.

+1

+1 per spiegare le nuove funzionalità che stanno arrivando in 3.3 –

+2

Perché il voto negativo? Il mio istinto è che questa è la risposta che l'OP sta in realtà dopo, a giudicare dal titolo della domanda. –

11

Utilizzando itertools.chain:

import itertools 

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

Nella documentazione di chain la descrivono con l'attuazione:

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

È possibile trarre ispirazione da questo pure :)

+0

+1, ma penso che il codice for-each sia più bello. :-) –

Problemi correlati