La funzione lambda è una funzione anonima (senza nome) definita utilizzando la parola chiave lambda. Viene generalmente utilizzata dove è necessaria una funzione breve "una volta e sul posto".
add = lambda x, y: x + y print(add(1, 2)) # 3
Limitazioni delle funzioni lambda:
Quando è utile lambda:
sorted, filter, map).Quando è meglio evitare lambda:
Domanda: Possono le funzioni lambda catturare variabili dal contesto esterno, e come influisce sul loro comportamento quando vengono utilizzate all'interno di cicli?
Risposta: Le funzioni lambda possono catturare variabili dal contesto esterno (chiamata chiusura lessicale). Quando sono definite all'interno di un ciclo, questo porta spesso a comportamenti inaspettati — la lambda utilizza il valore corrente della variabile al momento della chiamata, e non quello "che era al momento della definizione".
funcs = [] for i in range(3): funcs.append(lambda: i) # tutte le funzioni restituiranno 2 (i=2 dopo il ciclo) print([f() for f in funcs]) # [2, 2, 2]
Per catturare il valore "vecchio":
funcs = [] for i in range(3): funcs.append(lambda i=i: i) print([f() for f in funcs]) # [0, 1, 2]
Storia
In un progetto hanno utilizzato lambda per filtrare una lista di dizionari in base a una chiave specifica. La lambda all'interno del ciclo catturava una variabile che al momento della chiamata aveva un valore diverso (inaspettato). Risultato — filtraggio errato e errori nei report.
Storia
Un grande progetto su Django: logica di validazione complessa, implementata come espressione lunga all'interno di una funzione lambda. Successivamente, la logica di business è cambiata, la lambda ha smesso di contenere tutto il codice, è stato necessario riscrivere in una funzione normale. La lambda ha rallentato il debug.
Storia
In una startup è stato applicato in modo infelice lambda per passare una funzione di ordinamento, dimenticando che restituisce un tipo non corretto (ad esempio, non una tupla, ma una lista). Questo portava a ordinamenti imprevedibili e bug nella deduplicazione dei dati.