2011-06-06 12 views
13

Tengo un generador de Python que puede llamar a sí mismo para obtener más elementos para ceder. Se ve así:generador de Python para ceder todo a partir de otra llamada del generador

def gen(list): 
    # ... 
    if list: 
     for x in gen(list[1:]): 
      yield x 

Mi pregunta se refiere a las dos últimas líneas: ¿hay una manera más concisa de expresar esto? Espero algo como esto (entendiendo que esto no es válido en Python como está):

def gen(list): 
    # ... 
    if list: 
     yield each in gen(list[1:]) 
+0

No entiendo exactamente lo que se supone que debe hacer, originalmente pensé que era solo una forma ingenua de convertir una lista en un generador, pero estaba equivocado. ¿Podrías iluminarme? – Davy8

+0

Corrígeme si me equivoco, pero ese código parece que siempre devolverá una lista vacía. Supongo que debe haber otros rendimientos en el comentario? – Dunes

+0

@Dunes: sí, hay otros rendimientos en el comentario. –

Respuesta

17

Ha habido alguna llamada para un yield from o similar que "atraviese" todos los valores devueltos por un subgenerador. Consulte PEP 380 para obtener algunas ideas que se han recuperado. Sin embargo, nada se ha implementado todavía. Tu primer ejemplo es correcto.

+4

Nota: Python 3.3 ha sido lanzado, junto con PEP 380 (rendimiento de). – jomido

+1

¡Ahora eso es concienzudo! – kindall

+2

... pero no en Python 2.x – smci

3

Su primer ejemplo es la solución adecuada.

5

Su código de muestra es muy idiomático y conciso, no es necesario y no hay posibilidad real de mejoras adicionales y especialmente no cuando se trata de la legibilidad.