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.
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.
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: '(
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. –
@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
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' ... :) –
È 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]
questo annullerebbe alcune delle proprietà pigre dei generatori, cioè converti l'output in un elenco? –
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. –
costo pesante per un solo rivestimento .... –
Ecco un semplice one-liner valida in Python 2.5 + come richiesto ;-):
for thing in generator: yield thing
La risposta è ** No ** allora. –
http://stackoverflow.com/questions/17581332/converting-yield-from-statement-to-python-2-7-code è relativo –
Chi vuol dire downvoted questa domanda si preoccuperà di chiarire? La domanda è perfettamente chiara e, se è duplicata, dovresti averlo collegato all'originale. – Tibor