Salta al contenuto principale

Funzioni e lambda in Python

Profile picture for user luca77king

Python, con la sua sintassi elegante e la sua filosofia di leggibilità, offre strumenti potenti per manipolare dati e automatizzare processi. Tra questi strumenti, le funzioni e le espressioni lambda rivestono un ruolo fondamentale, permettendo di raggiungere un elevato livello di astrazione e riutilizzabilità del codice. Capire a fondo la loro natura e le loro differenze è essenziale per padroneggiare la programmazione in Python.

Le funzioni, in termini semplici, sono blocchi di codice riutilizzabili che eseguono un compito specifico. Pensatele come delle piccole macchine: fornitegli un input (argomenti), ed esse vi restituiranno un output (valore di ritorno). Questa capacità di incapsulare un processo in un'unità autonoma è alla base della programmazione strutturata, consentendo di scomporre problemi complessi in sotto-problemi più gestibili. In Python, una funzione si definisce utilizzando la parola chiave def, seguita dal nome della funzione, tra parentesi gli argomenti (eventualmente con valori di default) e, infine, due punti che introducono il corpo della funzione indentato.

def somma(a, b):
  """Questa funzione somma due numeri."""
  risultato = a + b
  return risultato

print(somma(5, 3))  # Output: 8

Questo semplice esempio mostra la struttura di una funzione Python. La docstring (la stringa tra tre virgolette), sebbene opzionale, è una buona pratica per documentare lo scopo e il funzionamento della funzione. Il return specifica il valore che la funzione restituirà dopo l'esecuzione. L'importanza delle funzioni va oltre la semplice ripetizione di codice: esse contribuiscono a rendere il codice più leggibile, manutenibile e riutilizzabile in diversi punti del programma, o addirittura in progetti differenti. L'astrazione fornita dalle funzioni ci permette di concentrarci sul "cosa" fa una parte del codice, senza doverci preoccupare del "come" lo fa. Questo aspetto è cruciale per la gestione di progetti software di grandi dimensioni.

Le espressioni lambda, anche note come funzioni anonime, sono un modo più conciso per definire funzioni semplici, in genere costituite da una singola espressione. A differenza delle funzioni definite con def, le lambda non hanno un nome esplicito e sono definite in una riga sola. La loro sintassi è caratterizzata dalla parola chiave lambda, seguita dagli argomenti, un doppio punto e l'espressione che costituisce il corpo della funzione.

somma_lambda = lambda a, b: a + b
print(somma_lambda(5, 3))  # Output: 8

In questo esempio, somma_lambda è una funzione lambda che esegue la stessa operazione della funzione somma definita precedentemente. La sua brevità la rende particolarmente adatta per situazioni in cui si necessita di una funzione semplice e immediata, senza la necessità di una definizione più elaborata. Tuttavia, la semplicità delle lambda ha dei limiti: possono contenere solo una singola espressione e non possono includere istruzioni complesse come cicli for o while o istruzioni condizionali if-else multiple. In questi casi, una funzione definita con def è la scelta più appropriata.

Un utilizzo frequente delle funzioni lambda è in combinazione con funzioni di ordine superiore, come map, filter e reduce. Queste funzioni accettano altre funzioni come argomenti, permettendo di applicare operazioni a iterabili (liste, tuple, ecc.) in modo elegante e conciso.

map applica una funzione a ogni elemento di un iterabile, restituendo un nuovo iterabile con i risultati.

numeri = [1, 2, 3, 4, 5]
quadrati = list(map(lambda x: x**2, numeri))
print(quadrati)  # Output: [1, 4, 9, 16, 25]

filter filtra gli elementi di un iterabile in base a una condizione specificata da una funzione.

numeri_pari = list(filter(lambda x: x % 2 == 0, numeri))
print(numeri_pari)  # Output: [2, 4]

reduce (disponibile nel modulo functools) applica una funzione cumulativamente agli elementi di un iterabile, riducendoli a un singolo valore.

from functools import reduce
somma_totale = reduce(lambda x, y: x + y, numeri)
print(somma_totale)  # Output: 15

Questi esempi illustrano come le funzioni lambda, grazie alla loro sintassi compatta, rendono il codice più leggibile ed espressivo quando utilizzate con funzioni di ordine superiore. Tuttavia, è fondamentale mantenere un equilibrio: l'uso eccessivo di lambda in situazioni complesse può compromettere la leggibilità del codice. La scelta tra funzioni definite con def e funzioni lambda dipende dal contesto: per funzioni semplici e di uso limitato, le lambda sono ideali; per funzioni più complesse e riutilizzabili, è preferibile utilizzare la definizione tradizionale con def. In definitiva, la padronanza sia delle funzioni che delle lambda costituisce un elemento chiave per scrivere codice Python efficiente, leggibile e manutenibile. La scelta tra le due dipende dall'equilibrio tra la necessità di concisone e la chiarezza del codice, un aspetto fondamentale nella pratica della programmazione.