Funzioni come variabili
In Python qualsiasi cosa può essere considerato come una variabile, persino le funzioni. Infatti, anche se può essere all’inizio poco intuitivo è possibile assegnare una funzione ad una variabile, in questo modo è come se avessimo dato un nuovo nome alla variabile.
def foo():
print("Hello World")
variabile = foo
variabile()
Eseguendo si ottiene
>>>
Hello World
L’assegnazione di una variabile di una funzione è ben riconoscibile rispetto all’assegnazione di un valore restituito di una funzione ad una variabile, poichè il nome della funzione compare senza parentesi tonde.
variabile = foo # funzione come valore della variabile
variabile = foo() # valore restituito della funzione come valore della variabile
Funzioni come argomenti di altre funzioni
Attenzione a non confondersi anche qui con il caso del valore restuito. Qui è l’intera funzione che viene passata come argomento di una funzione. Riconoscibile anche qui per il fatto che la funzione non presenta le parentesi tonde.
def mix(a,b):
return (a * b)/2
def foo(func,x,y):
return func(x,y)
print(foo(mix,2,3))
Eseguendo questo codice si ottiene
>>>
3.0
⇐ Vai a Lezione 3.5 – Commenti e Docstrings
A parte i complimenti per chi ha messo in piedi questo sito, vorrei portare la mia esperienza con questa lezione:
ho perso tutto il pomeriggio a capire una cosa banale e spiegata bene, nonostante fosse spiegata non capivo cosa stava succedendo.
Qunidi il primo def:
def mix(a,b):
return (a * b)/2
non ha bisogno di spiegazioni
il secondo def:
def foo(func,x,y):
return func(x,y)
la scritta func poteva essere una lettera qualsiasi.
Quando si richiama la seconda f.ne:
print (foo(mix,3,2))
si è andato a compilare di fatto il secondo return:
return func(x,y) > return mix(3,2)
Come spiegato da “meccanismocomplesso” occhio alle parentesi tonde:
Avevo letto ma non avevo capito e ci ho messo un pomeriggio, che testa dura:
“Riconoscibile anche qui per il fatto che la funzione non presenta le parentesi tonde”
Perché nel primo esercizio non è stato usato:
print (variabile())
ma solo:
variabile()
? perché?