Passare degli argomenti alle funzioni
Nella sezione precedente abbiamo visto come definire una funzione che generi su output i primi 10 numeri della sequenza di Fibonacci. Se analizziamo bene la funzione appena creata risulta subito qualcosa che non è proprio così efficiente. Infatti la funzione ha una staticità che ben non si addice a questo tipo di funzione.
Infatti la funzione che abbiamo scritto fa sempre la stessa cosa: generare i primi 10 numeri della serie di Fibonacci. Ma se volessimo stampare n numeri di Fibonacci, e al momento della definizione della funzione non sappiamo bene che valori abbia questo n?
Bene possiamo passare la variabile n come argomento della funzione. Spetterà poi alle operazioni interne alla funzione a gestire correttamente questo valore. Abbiamo introdotto la dinamicità di una funzione.
Al momento della dichiarazione della funzione non sappiamo quante numeri di Fibonacci generare,
def fibonacci (n):
...
ma solo al momento della chiamata decideremo quanti valori generare.
fibonacci(7)
oppure
n = 7
fibonacci(n)
Vediamo come modificare la dichiarazione della funzione precedente:
def fibonacci(x):
i = 1
n1 = 0
n2 = 1
print ( n1 + n2)
while i < x:
n = n1 + n2
print( n )
n1 = n2
n2 = n
i += 1
n = 7
fibonacci(n)
Eseguendo il codice sopra otterremo i primi 7 numeri della serie di Fibonacci
>>>
1
1
2
3
5
8
13
Visibilità delle variabili
Nota: Ho utilizzato appositamente la variabile n come argomento della funzione per farvi capire un altro concetto fondamentale. La variabile n utilizzata all’esterno della funzione non ha niente a che fare con la variabile n utilizzata all’interno della funzione per il calcolo dei numeri di Fibonacci. Questo è legato al concetto della visibilità delle variabili. Le variabili definite all’esterno della funzione hanno valore anche all’interno della funzione, le variabili utilizzate internamente alla funzione non hanno visibilità all’esterno (non possono essere utilizzate all’esterno) e si distruggono non appena l’esecuzione esce fuori dalle operazioni interne alla funzione. Le variabili definite all’interno della funzione vengono create per poter essere utilizzate limitatamente allo svolgimento della funzione.
Vediamo meglio questo concetto:
Le variabili definite esternamente alla funzione sono visibili anche all’interno (senza essere passate come argomenti):
a = 3
def foo():
print(a)
foo()
>>>
3
ma non sono modificabili all’interno della funzione
a = 3
def foo():
print(a)
a = 1
print(a)
print(a)
foo()
print(a)
>>>
1
3
Al momento che andiamo a fare una assegnazione sulla variabile a all’interno della funzione, andiamo a creare una nuova variabile con lo stesso nome. In questo modo il valore della variabile a esterno rimane immutato.
Domanda interessante
Ma se le variabili definite esternamente hanno visibilità anche all’interno, perché passare gli argomenti ad una funzione? Non li possiamo utilizzare direttamente all’interno?
Parametri ed argomenti
Generalmente questi due termini vengono utilizzati indiscriminatamente, in realtà ci sono delle differenze. I parametri sono le variabili utilizzate nella definizione di una funzione, e gli argomenti sono i valori posti nella chiamata di una funzione.