La funzione any() è stata introdotta in Python 2.5 per la comoda verifica: se c'è almeno un elemento vero in un oggetto iterabile (ad esempio, lista, tupla, generatore). È utile quando è necessario verificare il rispetto di almeno una condizione tra molte.
Storicamente, senza di essa si doveva scrivere un ciclo con interruzione all'elemento trovato o combinare map e reduce — era ingombrante e lento. Il principale problema che risolve any() è la concisione e la leggibilità di questo tipo di controlli.
La soluzione è che any() e all() funzionano con valutazione pigra (si fermano non appena trovano False o True rispettivamente). È importante capire la differenza: any() restituisce True al primo elemento vero, all() — se tutti gli elementi sono veri.
Esempio di codice:
nums = [0, 0, 3, 0] if any(nums): print('La lista ha un elemento non nullo')
Caratteristiche chiave:
Cosa succede se si passa una lista vuota come argomento di any()?
Any() restituirà False. È logico: in una sequenza vuota non c'è alcun elemento vero.
In cosa any() si differenzia sostanzialmente da all()?
Any() verifica la presenza di almeno un valore vero. All() verifica la verità di tutti i valori. I loro risultati sono inversi l'uno all'altro solo per collezioni rigorosamente vuote.
Si può usare any() con un generatore che può essere infinito?
Sì, si può, e proprio grazie alla valutazione pigra any si fermerà non appena incontra True. Se il generatore non restituisce mai True, la funzione non terminerà da sola.
def infinite_gen(): while True: yield 0 # any(infinite_gen()) — funzionerà all'infinito se non ci sono condizioni di uscita
Si desidera verificare che almeno un valore non sia None:
values = [None, None, None] if any(values): do_something() # Non verrà mai eseguito, se si è semplicemente dimenticati che None == False
Vantaggi:
Svantaggi:
Applicazione corretta — cercare almeno un utente sopra i 30:
users = [{'age': 25}, {'age': 35}] if any(u['age'] > 30 for u in users): print('C'è un utente sopra i 30')
Vantaggi:
Svantaggi: