Funzioni lambda
Cosa sono le funzioni lambda?
Sezione intitolata “Cosa sono le funzioni lambda?”Per una funzione breve, con una sola espressione, puoi usare una funzione lambda invece di definirla con def.
È una funzione senza nome, scritta in una riga e senza return esplicito.
La forma base
Sezione intitolata “La forma base”lambda parametri: espressioneConfronta una funzione normale con la sua versione lambda:
# Funzione normaledef raddoppia(x): return x * 2
# La stessa cosa come lambdaraddoppia_lambda = lambda x: x * 2
print(raddoppia(5)) # 10print(raddoppia_lambda(5)) # 10Puoi anche avere più parametri:
somma = lambda a, b: a + bprint(somma(3, 5)) # 8Quando usare le lambda?
Sezione intitolata “Quando usare le lambda?”Le lambda sono utili quando devi passare una “piccola funzione” come argomento a un’altra funzione, per esempio con sorted(), map() e filter().
Ordinare una lista di oggetti complessi
Sezione intitolata “Ordinare una lista di oggetti complessi”Se hai una lista di tuple e vuoi ordinarla in base al secondo elemento, puoi usare una lambda:
studenti = [ ("Alice", 16), ("Bob", 15), ("Carlo", 17)]
# Ordina per età (il secondo elemento di ogni tupla)ordinati = sorted(studenti, key=lambda s: s[1])print(ordinati)# [('Bob', 15), ('Alice', 16), ('Carlo', 17)]Trasformare ogni elemento di una lista con map()
Sezione intitolata “Trasformare ogni elemento di una lista con map()”map() applica una funzione a ogni elemento di una sequenza:
numeri = [1, 2, 3, 4, 5]quadrati = list(map(lambda x: x ** 2, numeri))print(quadrati) # [1, 4, 9, 16, 25]Il codice equivale a: “per ogni numero nella lista, calcola il suo quadrato”.
Filtrare elementi con filter()
Sezione intitolata “Filtrare elementi con filter()”filter() tiene solo gli elementi per cui la funzione restituisce True:
numeri = [1, 2, 3, 4, 5, 6, 7, 8]pari = list(filter(lambda x: x % 2 == 0, numeri))print(pari) # [2, 4, 6, 8]Il filtro conserva i numeri che, divisi per 2, danno resto zero.
Limiti delle lambda
Sezione intitolata “Limiti delle lambda”Una lambda può contenere solo una singola espressione. Non è adatta a più istruzioni, cicli o blocchi if...elif...else distribuiti su più righe.
Quando la logica supera una singola espressione, usa una funzione definita con def:
# Questo va bene con lambda:doppio = lambda x: x * 2
# Questo è troppo complesso, usa def:def classifica(voto): if voto >= 9: return "Ottimo" elif voto >= 6: return "Sufficiente" else: return "Insufficiente"