back to top

Funzioni Lambda e ricorsione in Python

Funzioni anonime

In Python le funzioni Lamba sono dei particolari costrutti sintattici derivati dal linguaggio Lisp e chiamati anche funzioni anonime; rispetto alle comuni funzioni definite dallโ€™utente esse non sono associate ad un nome, da qui la caratteristica di essere "anonime", non vengono introdotte dalla parola chiave def, prevedendo invece la keyword lambda, e possono essere seguite soltanto da unโ€™unica espressione.

Una delle caratteristiche della funzioni Lambda risiede nel fatto che esse non sono assolutamente necessarie, infatti qualsiasi risultato possa essere ottenuto con una funzione anonima sarร  raggiungibile anche tramite una funzione definita dallโ€™utente, ma possono diventare estremamente comode per la risoluzione di piccoli problemi che non di redo si presentano durante la scrittura del codice. Sostanzialmente esse migliorano la produttivitร  del coding in quanto possono essere definite "al volo", in corso dโ€™opera, senza influire pesantemente sulla struttura di unโ€™applicazione.

Pubblicitร 

Le funzioni Lambda accettano un numero indefinito di argomenti ma, come anticipato, supportano una sola espressione; questโ€™ultima verrร  elaborata dallโ€™interprete di Python ai fini della generazione dellโ€™output. Nellโ€™esempio seguente viene proposta una semplice funzione anonima finalizzata alla divisione del valore di una variabile ("dividendo") per un divisore dal valore costante ("5" nel caso specifico).

# Esempio di funzione Lambda
# impiegata per un'operazione matematica

dividi = lambda dividendo: dividendo / 5

print(dividi(10))

In sostanza, nel codice il compito della funzione Lambda รจ quello di assegnare allโ€™identificatore "dividi" (che non va confuso con il nome della funzione in quanto anonima) lโ€™oggetto restituito dalla funzione, cioรจ il risultato dellโ€™eleborazione dellโ€™espressione.

Come sostenuto in precedenza, per qualsiasi funzione Lambda รจ possibile creare una corrispondente funzione definita dallโ€™utente e neanche il caso proposto in precedenza farร  eccezione a questa regola:

# Esempio di funzione definita dall'utente
# impiegata per un'operazione matematica

def dividi(dividendo):
   return dividendo / 5

print(dividi(10))

Si noterร  come, in pratica, mentre nelle funzioni definite dallโ€™utente la chiamata alla funzione avviene tramite il loro nome, in quelle anonime viene utilizzato invece lโ€™identificatore; detto questo perรฒ le due procedure per la chiamata risultano identiche dal punto di vista sintattico.

Funzioni ricorsive

Il concetto della "ricorsione" รจ collegato a quello della ricorrenza, nel caso delle funzioni รจ possibile che una un funzione richiami unโ€™altra funzione che, a suo volta, richiamerร  indirettamente la prima, ma รจ anche possibile che una funzione richiami direttamente se stessa. In Python tale casistica rientra nella tipologia delle funzioni ricorsive, cioรจ funzioni per lโ€™auto-chiamata.

A livello pratico le funzioni ricorsive presentano il vantaggio di consentire la suddivisione di un problema complesso in problemi di minore entitร  e quindi piรน facilmente risolvibili, inoltre, in alcuni casi esse mettono al riparo dalla necessitร  di digitare sorgenti estremamente articolati, magari particolarmente ricchi di annidamenti dovuti allโ€™esigenza di definire lunghe procedure sequenziali, a tutto vantaggio della produttivitร  e della leggibilitร  del codice.

Nellโ€™esempio seguente verrร  presentata una semplice funzione ricorsiva inserita in unโ€™applicazione interattiva il cui scopo รจ quello di ottenere il fattoriale di un numero, cioรจ il prodotto di quel numero per tutti i suoi antecedenti; "24" รจ per esempio il fattoriale di "4" in quanto risultato dellโ€™espressione "1x2x3x4". Essa in sostanza eviterร  allo sviluppatore di dover specificare tutte le permutazioni necessarie per ottenere lo stesso risultato, cosa non particolarmente sensata quando ci si trova a gestire un caso come quello proposto di seguito, dove lโ€™input al programma, cioรจ il valore del quale si dovrร  ottenere il fattoriale, verrร  stabilito arbitrariamente dallโ€™utilizzatore.

# Utilizzo delle funzioni ricorsive
# per il calcolo del fattoriale di un numero

def fattoriale(n):
   """Il fattoriale di un numero
   indica il prodotto di
   quel numero per tutti i suoi antecedenti"""

   if n == 1:
       return 1
   else:
       return (n * fattoriale(n-1))

res = int(input("Inserisci un numero: "))
if res >= 1:
   print("Il fattoriale di", res, "รจ", fattoriale(res))

Fattore necessario per il funzionamento delle funzioni ricorsive รจ lโ€™esistenza di una condizione per la terminazione delle ricorrenze, tale condizione farร  in modo che in un determinato momento la funzione non necessiti di ulteriori ricorrenze, avendo in sostanza esaurito il suo compito. Nellโ€™esempio proposto, dato che il valore di "n" subisce un decremento ad ogni ricorrenza ed รจ previsto un controllo nel caso in cui "n" sia uguale ad "1", la funzione troverร  la sua condizione di terminazione al raggiungimento di questโ€™ultimo.

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.