Quando dovrei usare un generatore e quando un elenco in Python? [duplicare]

4

Spesso trovo più pulito scrivere un generatore piuttosto che restituire una lista. Ad esempio, preferisco

def my_func_gen(foo):
    for i in foo:
        # Do some stuff that's too complicated for a list or generator comprehension
        yield whatever

a

def my_func_list(foo):
    result = []
    for i in foo:
        # Do some stuff that's too complicated for a list or generator comprehension
        result.append(whatever)
    return result

Inoltre, questa risposta dice: "Sei incoraggiato a usare gli iteratori per tutto". Quindi è my_func_gen migliore, quindi? Forse no. Mi piacerebbe che il chiamante non sapesse nemmeno se sta ricevendo una lista o un iteratore. Ma il chiamante deve pensarci perché, per esempio, l'iteratore non sarà affettabile usando la bella sintassi pulita di Python; Dovrò usare itertools.islice .

Quindi cosa dovrei fare?

  1. Ignora il consiglio di "usare gli iteratori per tutto"
  2. Esci dall'abitudine di usare slice e altri comportamenti che non sono disponibili per tutti gli iterabili
  3. Esegui list(my_iterable) ogni volta che potrei voler utilizzare le funzionalità che elencano il supporto ei generatori non
  4. Utilizza gli elenchi a volte e altri generatori. Ma quando?

Correlati: ecco un codice che utilizza una classe wrapper per rendere affettabile qualsiasi iteratore. Tuttavia, non funziona nel modo in cui potresti pensare: la ricerca di foo[:2] e la ricerca di foo[:2] danno ancora risultati diversi.

    
posta kuzzooroo 20.07.2015 - 17:30
fonte

1 risposta

3

Sei confuso tra generatori e iteratori. Non sono affatto lo stesso concetto.

Gli iteratori sono grandi e onnipresenti in Python. Dovresti usarli molto. Sia my_func_gen che my_func_list li usa.

I generatori sono un modo pigro per costruire iterabili. Sono utili quando la lista completamente realizzata non lo farebbe in memoria, o quando il costo per calcolare ogni elemento dell'elenco è alto e si desidera farlo più tardi il più possibile Ma possono essere ripetuti solo una volta.

Ti invito a leggere questo .

    
risposta data 20.07.2015 - 18:33
fonte

Leggi altre domande sui tag