vuoi
o PayPal
tutte le volte che vuoi
ARGOMENTI DELLA FUNZIONE:
Guardare gli aromenti della funzione come variabili
Le variabili hanno un campo di visibilità (scope) e un periodo di vitalità (liveness)
- Non sono viste da tutti e per sempre
1. A T1 -> abbiamo creato un ogg 5
2. A T2 -> istruzione di assegnamento
o A destra pero c’e un espr che coinvolge la chiamata a funzione di cube
o Si associa x=y (x è la variabile in def cube(x))
▪ Non viene pero creato un nuovo oggetto uguale a 5 perche esiste gia e
quindi sia x che y vengono associate all’ogg 5
3. A T3 -> viene creata una variabile z con istruzione di assegnamento
a. Z = x**3 a cui si associa il valore di x al cubo in questo caso 125
4. A T4 -> le VARIABILI LOCALI (negli argomenti formali della funzione e quelle associate nel
corpo della funzione cioè z e x) vengono annullate e si tiene solo la variabile t e y
a. 125 viene associata alla variabile t
b. T e y sono VARIABILI GLOBALI (scope globale)
c. X e z esistono solo durante la chiamata della funzione e basta
d. T e y esistono SEMPREEEEE
Esempio 2: (cube anche se la funzione non è associata all’elevazione
al cubo)
2. T2 -> assegno a x l’oggetto assegnato a variabile y
- x e y puntano alla stessa lista -> unico oggetto esistente
-> modifico l’elemento alla posizione x[1] = 100
-> se chiamo la variabile y mi torna la sostituzione del
valore 100 all’elemento in posizione 1 della lista
VARIABILI LOCALI E GLOBALI:
concetti di esistenza e visbilita
- Globali esistono sempre
1. definisco la funzione
SHELL: 0. Assegnamento y=5
1. Assegnmaneto t = alla funzione foo(y) -> associo a x e y l’oggetto 5
a. X è una variabile locale e scomparira una volta terminata la funzione foo
b. 125 viene associata a t -> non scompare
c. A print(t) -> z e x non esistono piu perche la funzione foo è terminata
i. Se avessi scritto print(x/z) sarebbe uscito errore
2. Faccio un’altra chiamata a foo con valore diverso 2
a. Cosa succede? Genero un’istruzione di assegnamento
b. Genero una variabile x a cui associo l’oggetto 2 e rieseguo lo stesso corpo di
istruzioni della funzione e quindi viene creata di nuovo la z con istruzioe x**3
- Y e t esistono sempre da quando vengono definite
- X e z definite solo durante la chiamata della funzione foo
o La loro visibilità è ristretta alla sola funzione -> non posso usarle al di fuori della
funzione foo
▪ se provo a scrivere print(x o z) non funziona -> ERR
esempio:
1. posto A1 -> y = 5 -> scope GLOBALE
2. A2 -> chiamo la funzione foo
a. Assegnamento x=y
b. A3 -> esisterà una var x che associa a 5
c. Se però assegno a y il valore 10
▪ Non sto modificando la variabile y=5 ma sto creando un una nuova variabile
y uguale a quella globale che associa a 10
• questa però è all’interno della funzione foo -> scope LOCALE
• -> è solo leggibile all’interno della funzione foo, ma non trascrivibile
▪ Il valore di y in a1 non viene modificata
▪ Se faccio return di y quale y viene ritornata? Quella LOCALE
• Variabile locale ha la precendeza
• Ogni volta che usero y nella funzione uso quella locale non quella
globale
3. A t viene associato il valore 10 e y sarà sempre 5 perche l’assegnamento y=10 non modifica il
suo valore
esempio 3
- Z= y (o anche x) + 5 -> usata la y globale in lettura solo se non esiste un’altra variabile con lo
stesso nome con assegnamento (come es precedente)
o Se l’assegno definisce una nuova variabile locale con stesso nome e userà sempre
quella locale sia x lettura che x scrittura
Esempio 4
PROGRAMMA A:
➢ Phyton da errore perche viene assegnato un nuovo valore a y -> variabile locale
➢ Conflitto di nome:
o Phyton visita il corpo della funzione e guarda se y viene usata a sinistra di un
assegnamento
o Se c’è una a sinistra -> phyton le trattera tutte come variabili locali anche quelle
prima dell’istruzione di assegnamento
PROGRAMMA B:
➢ Phyton guarda TUTTO il corpo della funzione
o Y appare a sinistra in y= 10 quindi non viene usata la y globale ma quella locale
o Viene però errore perche y è definita dopo l’istruzione in cui viene messa y
nell’espressione
▪ Se avessi scritto y= 1° prima di x= y+5 non ci sarebbero stati problemi
o Se la variabile y compare almeno una volta a sinistra in un’istruzione di
assegnamento all’interno del corpo della funzione
▪ Se si la funzione definisce una variabile locale e per la funzione phyton userà
solo la variabile locale x tutta la funzione
▪ Bisogna però definire prima la variabile locale y prima dell’istruzione x = y +
5
PROGRAMMA A AGAIN:
➢ Visita tutto il corpo della funzione
➢ Y appare a sinistra nella stessa istruzione -> usero quindi sempre y locale sia in scrittura che
lettura, la globale non la uso piu
➢ Viene errore però perche y non è ancora stata definita essendo il risultato dell’istruzione y+5
USO PROPRIETA GLOBAL
➢ se tolgo global y -> avro un errore perche cercherebbe y locale che viene dopo l’istruzione
(vedi porgramma A e B precedenti)
➢ 10 viene associato a t ma non viene stampato, stampo y e torna 100 perchè in funzione c’è
l’assegnamento -> y = 100
esempio