Lezione 4 Python Funzioni

      Nessun commento su Lezione 4 Python Funzioni

Chiamata a Funzioni

Ed eccoci a parlare di un argomento molto importante, ovvero le funzioni:

Abbiamo già visto finora un esempio di chiamata di funzione:

>>> type(“32”)

<type ’string’>

Il nome della funzione è type e mostra il tipo di valore della variabile. Il valore della variabile, che è chiamato argomento della funzione, deve essere racchiuso tra parentesi. E` comune dire che una funzione “prende” o “accetta” un argomento e “ritorna” o “restituisce” un risultato. Il risultato è detto valore di ritorno. Invece di stampare il valore di ritorno possiamo assegnarlo ad una variabile:

[code lang=”objc”]
&lt;pre&gt;&gt;&gt;&gt; giuseppe = type(&quot;32&quot;)
&gt;&gt;&gt; print giuseppe
&lt;type ’string’&gt;
[/code]

Come esempio ulteriore, la funzione id prende un valore o una variabile e ritorna un intero che agisce come un identificatore unico del valore:

[code lang=”objc”]
&gt;&gt;&gt; id(3)
134882108
&gt;&gt;&gt; giuseppe = 3
&gt;&gt;&gt; id(giuseppe)
134882108
[/code]

Ogni valore ha un id unico che rappresenta dove è depositato nella memoria del computer. L’id di una variabile è l’id del valore della variabile cui essa si riferisce.

Conversione di tipo

Python fornisce una raccolta di funzioni interne che converte valori da un tipo all’altro. La funzione int prende ogni valore e lo converte, se possibile, in intero. Se la conversione non è possibile mostra un messaggio d’errore:

[code lang=”objc”]

&lt;pre&gt;&gt;&gt;&gt; int(&quot;32&quot;)
32
&gt;&gt;&gt; int(&quot;Hello&quot;)
ValueError: invalid literal for int(): Hello
[/code]

int può anche convertire valori in virgola mobile in interi, ma ricordate che nel farlo tronca (cioè toglie) la parte decimale.

[code lang=”objc”]

&lt;pre&gt;&gt;&gt;&gt; int(3.99999)
3
&gt;&gt;&gt; int(-2.3)
-2
[/code]

La funzione float converte interi e stringhe in numeri in virgola mobile:

[code lang=”objc”]
&gt;&gt;&gt; float(32)
32.0
&gt;&gt;&gt; float(&quot;3.14159&quot;)
3.14159
[/code]

Infine str converte al tipo stringa:

[code lang=”objc”]
&gt;&gt;&gt; str(32)
’32’
&gt;&gt;&gt; str(3.14149)
’3.14149’
[/code]

Può sembrare strano il fatto che Python distingua il valore intero 1 dal corrispondente valore in virgola mobile 1.0. Questi rappresentano effettivamente uno stesso numero ma appartengono a tipi differenti (rispettivamente intero e in virgola mobile) e quindi vengono rappresentati in modo diverso all’interno della memoria del computer.

Funzioni Matematiche

In matematica avete probabilmente visto funzioni del tipo sin e log, ed avete imparato a calcolare espressioni quali sin(π/2) e log(1/x). Innanzitutto dovete calcolare il valore dell’espressione tra parentesi (l’argomento). Nell’esempio π/2 è approssimativamente 1.571 e se x vale 10.0, 1/x è 0.1.

Poi valuti la funzione stessa tramite calcoli o tabelle. sin di 1.571 è circa 1, e log in base 10 di 0.1 è -1.

Questo processo può essere applicato ripetutamente per valutare espressioni complesse del tipo log(1/sin(π/2)). In questo caso devi iniziare dall’espressione piu` interna π/2, calcolando poi il seno con sin, seguito dall’inverso del seno 1/x e dal logaritmo dell’inverso log(x).

Python è provvisto di un modulo matematico che permette di eseguire le più comuni operazioni matematiche. Un modulo è un file che contiene una raccolta di funzioni raggruppate.

Prima di poter usare le funzioni di un modulo dobbiamo dire all’interprete di caricare il modulo in memoria. Questa operazione viene detta “importazione”:

>>> import math

Per chiamare una funzione di un modulo dobbiamo specificare il nome del modulo che la contiene e il nome della funzione separati da un punto. Questo formato è chiamato notazione punto.

[code lang=”objc”]
&gt;&gt;&gt; decibel = math.log10 (17.0)
&gt;&gt;&gt; angolo = 1.5
&gt;&gt;&gt; altezza = math.sin(angolo)
[/code]

La prima istruzione assegna a decibel il logaritmo di 17 in base 10. E` anche disponibile la funzione log che calcola il logaritmo naturale di un numero.

La terza istruzione trova il seno del valore della variabile angolo. sin e le altre funzioni trigonometriche (cos, tan, etc.) accettano argomenti in radianti e non i gradi. Per convertire da gradi in radianti devi dividere per 360 e moltiplicare per 2 π. Per esempio, per calcolare il seno di 45 gradi, prima trasforma l’angolo in radianti e poi usa la funzione seno:

[code lang=”objc”]
&gt;&gt;&gt; gradi = 45
&gt;&gt;&gt; angolo = gradi * 2 * math.pi / 360.0
&gt;&gt;&gt; math.sin(angolo)
[/code]

La costante pi fa già parte del modulo matematico math. Se conoscete un po’ di geometria puoi verificare il risultato confrontandolo con √2/2:

>>> math.sqrt(2) / 2.0
0.707106781187

Composizione

Così come in matematica anche in Python le funzioni possono essere composte, facendo in modo che il risultato di una possa essere usato come argomento di un’altra:

>>> x = math.cos(angolo + math.pi/2)

Questa istruzione prende il valore di π (math.pi), lo divide per 2 e somma il quoziente ad angolo. La somma è poi passata come argomento alla funzione cos che ne calcola il coseno.

>>> x = math.exp(math.log(10.0))

In quest’altro esempio l’istruzione log calcola il logaritmo naturale (in base e) di 10 e poi eleva e al valore precedentemente calcolato. Il risultato viene assegnato ad x.

Parametri e argomenti

Alcune delle funzioni che devi usare richiedono argomenti, i valori che control- lano come la funzione deve portare a termine il proprio compito. Per esempio, se volete trovare il seno di un numero devi indicare quale sia questo numero: sin si aspetta infatti un valore numerico come argomento.

Alcune funzioni prendono due o più parametri: pow si aspetta due argomenti che sono la base e l’esponente in un’operazione di elevamento a potenza. Dentro la funzione i valori che sono passati vengono assegnati a variabili chiamate parametri.

Eccovi un esempio di definizione di una funzione con un parametro:

def Stampa2Volte(Valore):
  print Valore, Valore

Questa funzione si aspetta un unico argomento e lo assegna ad un parametro chiamato Valore. Il valore del parametro (a questo punto del programma non sappiamo nemmeno di che tipo sar`a, se stringa, intero o di altro tipo) è stampato due volte. La stampa è poi conclusa con un ritorno a capo. Il nome Valore è stato scelto per ricordarvi che sta a voi sceglierne uno sufficientemente esplicativo, e di solito ne sceglierete qualcuno che ricordi l’uso della funzione o della variabile.

La funzione Stampa2Volte funziona per ogni tipo di dato che può essere stampato:

[code lang=”objc”]

&gt;&gt;&gt; Stampa2Volte(’Pippo’) Pippo Pippo
&gt;&gt;&gt; Stampa2Volte(5)
55
&lt;pre&gt;&gt;&gt;&gt; Stampa2Volte(3.14159)
3.14159 3.14159
[/code]

Nella prima chiamata di funzione l’argomento è una stringa, nella seconda un intero e nella terza un numero in virgola mobile (float).

Le stesse regole per la composizione che sono state descritte per le funzioni predefinite valgono anche per le funzioni definite da te, così che possiamo usare una qualsiasi espressione valida come argomento per Stampa2Volte:

[code lang=”objc”]
&gt;&gt;&gt; Stampa2Volte(&quot;Pippo&quot;*4)
PippoPippoPippoPippo PippoPippoPippoPippo
&gt;&gt;&gt; Stampa2Volte(math.cos(math.pi))
-1.0 -1.0
[/code]

Come al solito, l’espressione passata come argomento è valutata prima dell’esecuzione della funzione, così nell’esempio appena proposto Stampa2Volte ritorna il risultato PippoPippoPippoPippo PippoPippoPippoPippo invece di “Pippo”*4 “Pippo”*4.

Una nota per quanto riguarda le stringhe: le stringhe possono essere racchiuse sia da virgolette “ABC” che da apici ’ABC’. Il tipo di delimitatore NON usato per delimitare la stringa, l’apice se si usano le virgolette, le virgolette se si usa l’api- ce, pu`o essere usato all’interno della stringa. Ad esempio sono valide le stringhe “apice ’ nella stringa” e ’virgoletta ” nella stringa ‘, ma non lo sono ’apice ’ nella stringa’ e “virgoletta ” nella stringa”, dato che in questo caso l’interprete non riesce a stabilire quale sia il fine stringa desiderato dal programmatore.

Naturalmente possiamo usare una variabile come argomento di una funzione:
[code lang=”objc”]
&gt;&gt;&gt; Messaggio = ’Come va?’
&gt;&gt;&gt; Stampa2Volte(Messaggio)
Come va? Come va?
[/code]

Il nome della variabile che passiamo come argomento (Messaggio) non ha niente a che fare con il nome del parametro nella definizione della funzione (Valore). Non ha importanza conoscere il nome originale con cui sono stati identificati i parametri durante la definizione della funzione.

Variabili e parametri sono localiQuando crei una variabile locale all’interno di una funzione, essa esiste solo all’interno della funzione e non puoi usarla all’esterno. Per esempio:

[code lang=”objc”][/code]

def StampaUnite2Volte(Parte1, Parte2):
Unione = Parte1 + Parte2
Stampa2Volte(Unione)
[/code

Questa funzione prende due argomenti, li concatena e poi ne stampa il risultato due volte. Possiamo chiamare la funzione con due stringhe:

>>> Strofa1 = "Nel mezzo "
>>> Strofa2 = "del cammin"
>>> StampaUnite2Volte(Strofa1, Strofa2)
Nel mezzo del cammin Nel mezzo del cammin

Quando StampaUnite2Volte termina, la variabile Unione è distrutta. Se provate a stamparla quando il flusso di esecuzione si trova all’esterno della funzione StampaUnite2Volte otterremo un messaggio d’errore:

>>> print Unione
NameError: Unione

Anche i parametri sono locali: al di fuori della funzione StampaUnite2Volte, non esiste alcuna cosa chiamata messaggio. Se proverete ad usarla al di fuori della funzione dov’è definita Python vi mostrerà ancora una volta un messaggio d’errore.