2015-04-04 7 views
5

C'è un'espressione di una riga per:Esiste una scorciatoia per "fornire tutto l'output di un generatore"?

for thing in generator: 
    yield thing 

ho cercato yield generator inutilmente.

+0

La risposta è ** No ** allora. –

+1

http://stackoverflow.com/questions/17581332/converting-yield-from-statement-to-python-2-7-code è relativo –

+1

Chi vuol dire downvoted questa domanda si preoccuperà di chiarire? La domanda è perfettamente chiara e, se è duplicata, dovresti averlo collegato all'originale. – Tibor

risposta

9

In Python 3.3+, è possibile utilizzare yield from. Ad esempio,

>>> def get_squares(): 
...  yield from (num ** 2 for num in range(10)) 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

Si può effettivamente essere utilizzato con qualsiasi iterabile. Ad esempio,

>>> def get_numbers(): 
...  yield from range(10) 
... 
>>> list(get_numbers()) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> def get_squares(): 
...  yield from [num ** 2 for num in range(10)] 
... 
>>> list(get_squares()) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

Purtroppo, Python 2.7 non ha costrutto equivalente: '(

+0

Non penso che la funzione di aiuto faccia esattamente lo stesso in Py2.7 come ciò che 'yield from' fa in Py3.3. Chiamare questa funzione restituisce un altro oggetto generatore, quindi è molto simile al 'iter' incorporato. Se chiami il tuo 'yield_from()' da una funzione, questa funzione non diventerà automaticamente una funzione di generatore, come avverrà con 'yield from'. Per quanto ne so [capire] (https://www.python.org/dev/peps/pep-0380/#motivation), in Py2.7, è necessario scrivere il ciclo for esplicito come mostrato dall'OP. –

+0

@BasSwinckels Sì, la funzione di supporto non è la stessa. Ma è possibile delegare il generatore a quella funzione e renderebbe il codice più semplice, no? – thefourtheye

+0

No, penso che la funzione di aiuto sia inutile, dal momento che non cede alla funzione di chiamata. Come mostrato nel PEP, questo 'for i in generator: yield i' non può essere scomposto in una funzione separata. Hai appena riscritto 'iter' ... :) –

2

È possibile utilizzare un elenco di comprensione per ottenere tutti gli elementi di un generatore (assumendo che il generatore si conclude) :

[x for x in generator] 
+0

questo annullerebbe alcune delle proprietà pigre dei generatori, cioè converti l'output in un elenco? –

+0

Assolutamente. Convertendo in una lista si sta allocando tutta la memoria necessaria per immagazzinare i dati "generati" dal generatore. Inoltre, se il generatore non completa la dichiarazione sopra non finirà mai. –

+0

costo pesante per un solo rivestimento .... –

1

Ecco un semplice one-liner valida in Python 2.5 + come richiesto ;-):

for thing in generator: yield thing 
Problemi correlati