Lambda in Python: usare funzioni anonime per trasformare dati al volo

by theArchitect
SHARE
Lambda in Python: usare funzioni anonime per trasformare dati al volo
© Guida-HTML5.it

Introduzione

Le funzioni anonime in Python, chiamate comunemente lambda, sono uno strumento molto utile quando serve definire una funzione piccola, immediata e usa-e-getta. Non sostituiscono le normali funzioni def, ma in alcuni casi permettono di scrivere codice più compatto e leggibile.

Un sotto-argomento particolarmente pratico, spesso sottovalutato, è l’uso delle lambda per costruire trasformazioni temporanee nei flussi di dati. In altre parole: quando hai una lista, un dizionario o una sequenza di record e vuoi applicare una modifica rapida senza creare una funzione separata, lambda può essere la scelta giusta.

Questo approccio è molto comune in operazioni come:

  • normalizzare valori prima di salvarli;
  • preparare dati per una stampa o un report;
  • convertire campi testuali in un formato uniforme;
  • usare funzioni come map(), sorted() o filter() con logica molto semplice.

Vediamo un esempio concreto: partiremo da una lista di prodotti e useremo lambda per trasformarne i dati in modo rapido, leggibile e riutilizzabile in un flusso di elaborazione.

Codice completo

from pprint import pprint

# Dataset di esempio: lista di prodotti
prodotti = [
    {"nome": " tastiera meccanica ", "prezzo": 89.90, "categoria": "periferiche"},
    {"nome": "mouse gaming", "prezzo": 39.50, "categoria": "periferiche"},
    {"nome": "monitor 27 pollici", "prezzo": 229.99, "categoria": "display"},
    {"nome": "cavo usb-c", "prezzo": 9.99, "categoria": "accessori"},
]

# 1) Lambda per normalizzare il nome: strip + title
normalizza_nome = lambda testo: testo.strip().title()

# 2) Lambda per applicare uno sconto del 10%
sconto_10 = lambda prezzo: round(prezzo * 0.90, 2)

# 3) Trasformazione dei dati: creiamo una nuova lista senza modificare l´originale
prodotti_formattati = [
    {
        "nome": normalizza_nome(prodotto["nome"]),
        "prezzo_scontato": sconto_10(prodotto["prezzo"]),
        "categoria": prodotto["categoria"].lower()
    }
    for prodotto in prodotti
]

# 4) Ordinamento dei prodotti per prezzo scontato usando lambda come chiave
prodotti_ordinati = sorted(prodotti_formattati, key=lambda p: p["prezzo_scontato"])

# 5) Creiamo una stringa di riepilogo per ogni prodotto
riepiloghi = list(
    map(
        lambda p: f´{p["nome"]} - {p["categoria"]} - €{p["prezzo_scontato"]}´,
        prodotti_ordinati
    )
)

print("Prodotti formattati:")
pprint(prodotti_formattati)

print("nProdotti ordinati per prezzo scontato:")
pprint(prodotti_ordinati)

print("nRiepilogo testuale:")
for riga in riepiloghi:
    print("-", riga)

Spiegazione

La sintassi di una lambda in Python è molto semplice:

lambda argomenti: espressione

Una lambda è quindi una funzione anonima che contiene una sola espressione. Non può includere blocchi complessi con più istruzioni, cicli o assegnazioni tradizionali come una funzione definita con def.

1. Normalizzazione del testo

Nel codice abbiamo creato:

normalizza_nome = lambda testo: testo.strip().title()

Questa lambda riceve una stringa, rimuove gli spazi iniziali e finali con strip() e converte il testo in formato titolo con title(). È utile quando i dati arrivano da form, file CSV o API e non sono uniformi.

2. Calcolo rapido di uno sconto

La seconda lambda:

sconto_10 = lambda prezzo: round(prezzo * 0.90, 2)

applica uno sconto del 10% e arrotonda a due decimali. Questo è un caso tipico in cui una lambda è perfetta: la logica è breve, immediata e leggibile.

3. Trasformazione dei dati con list comprehension

La lista prodotti_formattati viene costruita con una list comprehension. Qui la lambda non viene usata direttamente nella comprehension, ma attraverso due funzioni già definite. Questo rende il codice più chiaro e aiuta a separare le responsabilità:

  • la lambda normalizza il nome;
  • la lambda calcola il prezzo scontato;
  • la comprehension costruisce la nuova struttura dati.

4. Ordinamento con lambda come chiave

Una delle applicazioni più frequenti delle lambda è come funzione key in sorted():

prodotti_ordinati = sorted(prodotti_formattati, key=lambda p: p["prezzo_scontato"])

Qui la lambda dice a sorted() come confrontare gli elementi: in base al campo prezzo_scontato. È un uso molto comune perché evita di scrivere una funzione separata solo per estrarre un valore da confrontare.

5. map() per generare un output testuale

Infine, map() applica una trasformazione a tutti gli elementi della lista:

map(lambda p: f´{p["nome"]} - {p["categoria"]} - €{p["prezzo_scontato"]}´, prodotti_ordinati)

In questo caso la lambda converte ogni dizionario in una stringa leggibile. Anche qui il vantaggio è la compattezza: la trasformazione è semplice e non richiede una funzione nominata.

Best practice

  • Usa lambda solo per logiche brevi: se la funzione cresce troppo, passa a def. Una lambda lunga perde leggibilità molto in fretta.
  • Dai un nome alla lambda quando serve riutilizzo: assegnarla a una variabile, come normalizza_nome, aiuta a capire il suo scopo.
  • Evita lambda annidate o troppo compatte: codice “furbo” non significa codice migliore.
  • Preferisci lambda in contesti funzionali: sorted(), map(), filter(), min(), max() sono i casi d’uso più naturali.
  • Non usarle per nascondere logica complessa: se dentro la lambda devi fare troppi calcoli, controlli o conversioni, meglio una funzione normale con nome esplicito.
  • Ricorda che una lambda restituisce un’espressione: non può contenere più istruzioni separate. Se ti serve un flusso articolato, def è la scelta corretta.

Riepilogo

Le funzioni lambda in Python sono uno strumento piccolo ma molto utile quando devi applicare una trasformazione rapida ai dati. In questo tutorial le abbiamo usate per:

  • normalizzare stringhe;
  • calcolare valori derivati come uno sconto;
  • ordinare strutture dati con sorted();
  • generare output testuale con map().

Il messaggio principale è semplice: lambda è ottima per operazioni brevi e locali. Se il codice diventa troppo articolato, una funzione tradizionale è quasi sempre più chiara, testabile e manutenibile.

Approfondisci con risorse ufficiali

SHARE