
Le funzioni anonime in Python
Le funzioni anonime in Python sono un tipo di funzioni che non hanno un nome associato. Sono chiamate anche "lambda functions".
La loro caratteristica principale è la brevità e la mancanza del nome.
Sono spesso utilizzate laddove serve una funzione piccola e semplice per un breve periodo.
A cosa servono? Sono particolarmente utili quando hai bisogno di una funzione per un breve periodo e non vuoi scrivere una definizione di funzione completa. Le funzioni lambda ti offrono un modo conciso per scrivere rapidamente delle piccole funzioni. Inoltre, sono molto utili se vuoi programmare adottando il paradigma della programmazione funzionale, dove le funzioni sono argomenti di altre funzioni.
Ecco come si definisce una funzione lambda in Python:
lambda arguments: expression
Vediamo alcuni punti chiave:
- lambda è la parola chiave che inizia la definizione. La parola chiave "lambda" non viene interpretata come una istruzione, quindi può essere utilizzata dentro un'espressione. Lo stesso non si potrebbe fare con l'istruzione def.
- arguments sono gli argomenti che passi alla funzione, simili a quelli delle funzioni normali.
- expression è un'espressione che viene valutata e restituita dalla funzione.
La parola chiave "lambda" crea una funzione senza assegnarla a un'etichetta ossia a un nome. Per questa ragione viene detta "funzione anonima".
Una caratteristica importante delle funzioni lambda è che possono avere qualsiasi numero di argomenti, ma solo una espressione.
Un esempio
A questo punto facciamo qualche esempio pratico.
Supponiamo di voler creare una funzione che raddoppia il valore che riceve.
In una funzione normale, scriviamo:
- def raddoppia(x):
- return x * 2
- print(raddoppia(5))
Possiamo ottenere lo stesso risultato usando una semplice funzione lambda.
- raddoppia = lambda x: x * 2
- print(raddoppia(5))
Il risultato finale è lo stesso ma la funzione anonima è decisamente più compatta rispetto a una funzione normale.
10
Puoi anche scrivere funzioni lambda con più argomenti.
Le funzioni lambda possono prendere più di un argomento.
Ad esempio, questa funzione anonima somma due numeri:
- somma = lambda x, y: x + y
- print(somma(5, 3))
8
Come vedi, le funzioni anonime rendono il codice più compatto e leggibile.
Tuttavia, fai attenzione a non esagerare perché l'uso eccessivo delle funzioni anonime potrebbe rendere il codice più complesso da interpretare a colpo d'occhio.
Un consiglio. Per funzioni più complesse è preferibile usare le funzioni definite con l'istruzione def per mantenere il codice leggibile.
Le funzioni map(), filter(), sorted()
Spesso le funzioni lambda sono usate insieme a funzioni come map(), filter(), e sorted() per operazioni su liste e altri iterabili.
- map() applica una funzione a tutti gli elementi di una lista.
- filter() crea una lista di elementi per cui una funzione restituisce True.
- sorted() ordina gli elementi di una lista.
Ecco un esempio pratico di utilizzo con map().
Supponiamo di voler elevare al quadrato tutti i numeri in una lista:
- numeri = [1, 2, 3, 4, 5]
- quadrati = map(lambda x: x**2, numeri)
- print(list(quadrati))
In questo esempio, lambda x: x**2 è una funzione anonima che prende un numero e restituisce il suo quadrato.
La funzione map() applica questa funzione a ogni elemento della lista "numeri".
Il risultato finale è il seguente:
[1, 4, 9, 16, 25]
Tutti gli elementi della lista sono raddoppiati e non è stato necessario definire una funzione apposita per ottenere questo risultato.
Esempio 2
Supponiamo di avere una lista di numeri e di voler filtrare solo quelli pari.
Ecco come potremmo farlo con filter() e una funzione lambda:
- numeri = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- numeri_pari = filter(lambda x: x % 2 == 0, numeri)
- print(list(numeri_pari))
In questo esempio, lambda x: x % 2 == 0 è una funzione anonima che prende un numero (x) e restituisce True se il numero è pari (cioè se il resto della divisione di x per 2 è 0).
La funzione filter() applica questa funzione lambda a ogni elemento della lista numeri.
Solo gli elementi per cui la funzione lambda restituisce True (cioè i numeri pari) vengono inclusi nel risultato finale.
[2, 4, 6, 8, 10]
Esempio 3
Supponiamo di avere una lista di tuple e vogliamo ordinarla in base al secondo elemento di ogni tupla, cioè la stringa del frutto.:
- lista = [(1, 'mela'), (3, 'banana'), (2, 'arancia')]
- lista_ordinata = sorted(lista, key=lambda x: x[1])
- print(lista_ordinata)
In questo esempio, lambda x: x[1] indica che l'ordinamento deve basarsi sul secondo elemento (indice 1) di ogni tupla (x).
Quindi la funzione sorted() riordina lista in base ai nomi dei frutti in ordine alfabetico.
[(2, 'arancia'), (3, 'banana'), (1, 'mela')]
Questo approccio è molto potente e flessibile, ti permette di ordinare una lista basandoti su praticamente qualsiasi criterio che puoi definire in una singola espressione.