ProgrammazioneSviluppatore Python

Parla delle funzioni lambda in Python. Quali sono le loro limitazioni rispetto alle funzioni normali? In quali situazioni è preferibile utilizzare le funzioni lambda e in quali è sconsigliato?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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:

  • La lambda può contenere solo un'espressione — essa stessa è il valore restituito, non è possibile fare calcoli multi-linea, return, condizioni di tipo if-else (solo sotto forma di espressione ternaria).
  • Non è possibile utilizzare codice complesso con try/except, cicli, ecc.
  • La lambda non ha una documentazione completa (non è possibile aggiungere docstring).
  • Le funzioni lambda sono meno leggibili, soprattutto se sono annidate.

Quando è utile lambda:

  • Nelle chiavi di ordinamento/filtro su una sola riga (argomenti key; ad esempio, in sorted, filter, map).
  • Quando non è necessario riutilizzare il codice — operazioni locali, "inserire rapidamente una funzione".

Quando è meglio evitare lambda:

  • Nella logica complessa: per il riutilizzo, con molto codice o condizioni, per chiarezza e leggibilità è meglio estrarre in una funzione def con un nome e un docstring.

Domanda insidiosa

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]

Esempi di errori reali causati dalla mancanza di conoscenza delle sottigliezze dell'argomento


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.