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.
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.