Vai al contenuto
eLearner.app
Modulo 5 · Lezione 4 di 420/36 nel corso~10 min
Lezioni del modulo (4/4)

Lambda e funzioni higher-order

Una lambda è una funzione anonima, definita su una sola riga. Sintassi:

Python
lambda parametri: espressione

Equivalente a def, ma più conciso e adatto per funzioni "usa e getta" da passare ad altre funzioni.

Python
quadrato = lambda x: x ** 2
quadrato(5)    # 25

# equivalente a:
def quadrato(x):
    return x ** 2

Differenze vs def

Aspettodeflambda
nomeobbligatorioanonima
corpopiù statementUNA sola espressione
returnesplicitoimplicito (l'espressione)
docstringno

Niente return dentro una lambda: il valore dell'espressione È il risultato.

Quando usare lambda

Quasi sempre: come argomento key per funzioni di ordinamento o selezione.

Python
parole = ["banana", "kiwi", "mela", "fragola"]
sorted(parole, key=len)
# ['kiwi', 'mela', 'banana', 'fragola']

key=len dice a sorted: "per confrontare due elementi, usa la loro lunghezza". Per criteri custom, lambda:

Python
utenti = [
    {"nome": "Ada", "eta": 36},
    {"nome": "Linus", "eta": 54},
    {"nome": "Grace", "eta": 85},
]
per_eta = sorted(utenti, key=lambda u: u["eta"])
# ordinati per età crescente

Altri usi tipici: min(...), max(...), filter(...), map(...).

Python
nums = [-3, 1, -4, 1, -5, 9]
max(nums, key=lambda n: abs(n))   # -5 (massimo per valore assoluto)

Funzioni higher-order

Una funzione è higher-order se accetta una funzione come argomento o ne restituisce una. sorted, max, filter, map sono higher-order. Lambda esiste proprio per facilitare le chiamate higher-order.

Quando evitare le funzioni lambda

Le funzioni lambda sono utili per operazioni brevi e usa-e-getta (come ordinamenti rapidi). Tuttavia, se ti ritrovi ad assegnare una lambda a una variabile (es. raddoppia = lambda x: x * 2), è considerato preferibile usare def per motivi di leggibilità e per facilitare il debug (poiché le funzioni definite con def mantengono il loro nome reale nei traceback di errore).

Prova tu

Esercizio#python.m5.l4.e1
Tentativi: 0Caricamento…

Data la lista `words = ['banana', 'kiwi', 'mela', 'fragola']`, ordinala per lunghezza crescente in `by_length`. Valuta `by_length`.

Caricamento editor…
Mostra suggerimento

key=len (o lambda p: len(p)).

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m5.l4.e2
Tentativi: 0Caricamento…

Data la lista di tuple `points = [(1, 5), (3, 2), (2, 4)]`, ordinali per il SECONDO elemento crescente e assegna a `by_y`. Valuta `by_y`.

Caricamento editor…
Mostra suggerimento

lambda p: p[1]

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m5.l4.e3
Tentativi: 0Caricamento…

Definisci una funzione anonima `lambda` che prenda un numero `x` e restituisca `True` se il numero è pari, altrimenti `False`. Assegna la lambda alla variabile `is_even` e testa la chiamata `is_even(8)` come ultima riga.

Caricamento editor…
Mostra suggerimento

Scrivi is_even = lambda x: x % 2 == 0 e poi evalua is_even(8).

Soluzione disponibile dopo 3 tentativi