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?
- Ignora il consiglio di "usare gli iteratori per tutto"
- Esci dall'abitudine di usare slice e altri comportamenti che non sono disponibili per tutti gli iterabili
- Esegui
list(my_iterable)
ogni volta che potrei voler utilizzare le funzionalità che elencano il supporto ei generatori non - 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.