Menu

Lambda in Python: funzioni anonime, chiave di ordinamento e map/filter

Cos'è una lambda, a cosa serve e i pochi casi in cui è davvero utile, più quando conviene passare a una funzione con nome.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una funzione a cui non serve un nome

La maggior parte delle funzioni in Python si definisce con def, ha un nome e vive in un file dove può essere riutilizzata. Una lambda è un'alternativa più piccola e senza nome, utile nei pochi casi in cui definire una funzione completa sarebbe più cerimonia di quanto valga.

Ecco le due forme a confronto:

Due funzioni che fanno esattamente la stessa cosa. La versione lambda sta su una riga perché in fondo è quello il suo compito: una funzione usa e getta per un momento usa e getta.

Sintassi

lambda <params>: <expression>

  • <params> è la stessa lista di parametri che useresti con def: supporta valori predefiniti, *args, **kwargs.
  • <expression> è una singola espressione il cui valore diventa il valore restituito.

Esempi:

Niente parola chiave return. Il valore dell'espressione viene restituito implicitamente.

L'unico limite

Una lambda può contenere solo una singola espressione. Non puoi metterci dentro delle istruzioni:

Però puoi usare l'espressione ternaria:

Se ti serve più di un'espressione, è il segnale per passare a def.

Dove le lambda sono davvero utili

Una lambda assegnata a una variabile è quasi sempre peggio di una def con nome:

È decisamente peggio di def double(x): return x * 2: stessa leggibilità, e in più la versione lambda mostra nei traceback il nome poco utile <lambda>.

Le lambda danno il meglio in un solo punto: come argomenti inline di funzioni di ordine superiore.

Chiavi di ordinamento personalizzate

Il caso classico:

L'argomento key di sorted vuole una funzione che riceve un elemento e restituisce il valore in base a cui ordinare. Una lambda su una riga è perfetta, mentre una def completa sembrerebbe pesante per una cosa così piccola.

Puoi ordinare in base a più campi usando una tupla:

min, max, filter, map

Stessa storia: accettano tutte un argomento funzione opzionale:

Per map e filter, una list comprehension di solito è ancora più chiara:

Per questo motivo la maggior parte di chi scrive Python preferisce le comprehension a map/filter. lambda resta la scelta naturale per sorted, min e max, dove non esiste una scorciatoia con le comprehension.

Lambda e operator

Quando la tua lambda si limita a "prendere una chiave" o "prendere un attributo", il modulo operator di Python offre alternative più veloci e chiare:

Non è un guadagno enorme, ma nel codice che importa già operator si legge in modo un po' più dichiarativo.

Quando tornare a def

Se vale anche solo una di queste condizioni, scrivi una def:

  1. La logica non sta comodamente in una singola espressione.
  2. Vuoi dare un nome alla funzione perché il nome aiuterebbe la leggibilità.
  3. Useresti la stessa logica in più di un punto.
  4. La funzione ha bisogno di una docstring (le lambda non possono averne).

Ricorda: in Python non si vince per numero di righe. Una funzione con nome di tre righe si legge quasi sempre meglio di una lambda su una riga, non appena la logica smette di essere banale.

Prossimo argomento: i decoratori

Le lambda passano funzioni in giro come valori. I decoratori portano la stessa idea un passo più in là: ti permettono di avvolgere qualsiasi funzione con un comportamento riutilizzabile (logging, misurazione dei tempi, cache, autenticazione) usando un solo @ nella riga sopra. È l'argomento della prossima pagina.

Domande frequenti

Cos'è una lambda in Python?

Una lambda è una funzione breve e anonima che puoi scrivere su una sola riga. lambda x: x * 2 equivale a def double(x): return x * 2, solo senza nome. È utile soprattutto quando ti serve una funzione minuscola da passare come argomento a un'altra funzione.

Quando dovrei usare lambda invece di def?

Usa lambda per funzioni usa e getta, fatte di una sola espressione, che passi direttamente a qualcosa come sorted, max o filter. Per tutto ciò che ha un corpo più lungo di una singola espressione, o per qualsiasi cosa a cui daresti un nome, usa def. Le funzioni con nome sono quasi sempre più chiare.

Quali sono i limiti di lambda?

Una lambda può contenere solo una singola espressione, non istruzioni. Niente assegnazioni, niente blocchi if (anche se puoi usare l'operatore ternario a if cond else b), niente logica su più righe. Se ti ritrovi a combattere con questi limiti, passa a def.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA