Un certo numero di volte che ho pensato che lo stile generatore può essere più diretta che restituisce un elenco, ad esempio,Esiste una funzione di libreria in Python per trasformare una funzione generatore in una funzione che restituisce un elenco?
def foo(input_array):
for x in input_array:
yield processed(x)
vs.
def bar(input_array):
accumulator = []
for x in input_array:
accumulator.append(processed(x))
return accumulator
(va bene, se fosse davvero così semplice , Scriverei map
, ma ottieni il punto: la versione del generatore è più pulita). Tuttavia, un tipo di ritorno di un generatore non è sempre desiderato. C'è un decoratore incorporato che posso usare per cambiare foo
in una funzione che restituisce una lista o una tupla? Il modo in cui mi piacerebbe scrivere io stesso a dire,
import functools
def transform_return_value(transformer):
def inner(f):
@functools.wraps(f)
def new_f(*argv, **kwargs):
return transformer(f(*argv, **kwargs))
return new_f
return inner
@transform_return_value(list)
def foo(input_array):
for x in input_array:
yield processed(x)
Attendere ... Si desidera scrivere una funzione generatore che restituisca un elenco? Non sono sicuro di capirlo. Perché non scrivere semplicemente 'list (generator_function())', o scrivere 'list_function()' per cominciare? – mgilson
Un'altra scelta è quella di usare la list comprehension: '[elaborato (x) per x in input_array]'. Probabilmente più pulito di entrambi ... –
@mgilson ha ragione: di solito ti converti in lista quando hai bisogno di una lista, che è invariabilmente nel codice cliente. Tendo a documentare le funzioni come restituibili iterabili e mantenere una funzione 'to_sequence (x)' attorno a ciò che effettivamente fa 'list (x) se non isstance (x, Sequence) else x'. –