Storia della questione
Il concetto di funzioni di ordine superiore proviene dalla programmazione funzionale ed è disponibile in Python fin dall'inizio. Permette di costruire codice più astratto, flessibile e conciso.
Problema
Molti sottovalutano le potenzialità delle funzioni come oggetti di prima classe. Gli errori sorgono dalla trasmissione/ritorno errato di funzioni, chiamate errate o perdita di leggibilità del codice.
Soluzione
In Python, una funzione è un vero e proprio oggetto. È possibile passare una funzione come argomento, restituirla da altre funzioni e conservarla in collezioni. Questo è ciò che si definisce una funzione di ordine superiore. Ciò consente di implementare wrapper generali, callback, decoratori e numerosi altri pattern.
Esempio di codice:
def apply_function(func, value): return func(value) def square(x): return x * x result = apply_function(square, 5) # Restituisce 25
Caratteristiche chiave:
Possono le funzioni di ordine superiore restituire non solo funzioni ma anche dati?
Sì, una funzione di ordine superiore è qualsiasi funzione che accetta una funzione come argomento e/o restituisce una funzione. Non ci sono limiti sul valore restituito.
La funzione incorporata map restituisce un oggetto generatore o un array? (Python 3+)
In Python 3, map restituisce un oggetto generatore iterabile, non un array. Per ottenere un array, è necessario racchiudere esplicitamente in list(map(...)).
squared = map(lambda x: x**2, [1,2,3]) result = list(squared) # Ora otteniamo [1, 4, 9]
È possibile assegnare funzioni a variabili e conservarle in collezioni?
Sì, le funzioni possono essere assegnate a variabili, possono essere conservate in liste, dizionari e passate come argomenti come valori. Queste sono oggetti Python normali.
def greet(): print('Hello') a = greet a() # Invocerà greet
Tentare di implementare il logging per più funzioni senza funzioni di ordine superiore ha portato a duplicazione del codice ed errori in ogni singolo gestore.
Vantaggi:
Svantaggi:
È stato introdotto un decoratore logger universale — tutte le funzioni sono state loggate in modo uniforme, il codice è diventato più pulito.
Vantaggi:
Svantaggi: