Tutti i linguaggi di programmazione permettono di usare delle variabili, cioè dei nomi alfanumerici ai quali possiamo assegnare un valore. Apriamo IDLE e scriviamo:
>>> a = 5
Notiamo per prima cosa che questa volta IDLE non ci risponde scrivendo qualcosa. Infatti quella che abbiamo scritto non è un'espressione, ma un'istruzione di tipo diverso detta assegnazione.
Un'istruzione di assegnazione è data dalla sintassi:
nome_variabile = espressione
Quando Python incontra questo tipo di istruzione calcola il risultato dell'espressione a destra del segno
=
e lo assegna alla variabile a sinistra di esso.
Per vedere il valore della nostra variabile basterà digitarne il nome (infatti anche il singolo nome di una variabile è per Python un'espressione). Continuiamo a scrivere:
>>> a
5
>>> b = 3 * 5**2 >>> b
75
>>> c = "Mamma" >>> c
'Mamma'
>>> d = False >>> d
False
Notate che a c
è stato assegnata la stringa "Mamma"
(scritta tra virgolette),
mentre a d
il valore booleano False
(senza virgolette, non è una stringa).
Una volta che abbiamo assegnato un valore ad una variabile, possiamo poi usarla nelle espressioni. Possiamo anche assegnarle un nuovo valore, che sostituisce quello precedente. Continuiamo così:
>>> 2 * a
10
>>> a + b
80
>>> x = a * (b - 50) >>> x
125
>>> x = 2 >>> x
2
>>> 4 * c
'MammaMammaMammaMamma'
>>> c and (1 > 0)
False
Non possiamo, invece, usare una variabile se prima non le abbiamo assegnato un valore. La regola è semplice:
La prima volta che usiamo una nuova variabile, essa deve comparire a sinistra in un'istruzione di assegnazione.
Notiamo che quando assegniamo un valore ad una variabile IDLE "ricorda" quel valore anche nelle istruzioni successive (in effetti in questa lezione sto presupponendo che voi scriviate le linee di codice nei vari riquadri nell'ordine in cui le sto presentando, senza mai uscire dall'applicazione). Se vogliamo che IDLE "dimentichi" tutte le variabili possiamo usare la voce di menu Shell=>Restart Shell (per il momento non fatelo).
Proviamo invece questo:
>>> a = y + 2
Traceback (most recent call last): File "<pyshell#41>", line 1, in <module> a = y + 2 NameError: name 'y' is not defined
Abbiamo usato la variabile y
senza prima assegnarle un valore: Python ci risponde con un
NameError mostrandoci la linea di codice che ha causato l'errore e dandocene una descrizione
(il nome y
non è definito).
In informatica i nomi delle variabili non sono limitati ad una lettera, ma possono essere lunghi quanto vogliamo in modo da poter creare dei nomi che ci ricordino il contenuto della variabile. Abbiamo delle semplici regole per formare tali nomi:
Vediamo qualche esempio:
>>> peppe = 5
>>> peppe123 = 6
>>> peppe_e_pippo = 3
>>> Peppe = 2
Queste sono OK. peppe
e Peppe
sono due variabili diverse (peppe
contiene 5 e Peppe
2).
>>> 123mamma = 2
SyntaxError: invalid syntax
>>> while = 1
SyntaxError: invalid syntax
>>> peppe@pippo = 4
SyntaxError: invalid syntax
Queste invece non vanno bene; while
è una parola riservata di Python (la vedremo tra poco).
Il segno =
in un'assegnazione assomiglia al segno di uguaglianza che si trova tra i due membri di
un'equazione in matematica. Ribadiamo però che esso non ha niente a che vedere con l'eguaglianza tra i due
membri, ma significa che prima l'espressione a destra di esso viene calcolata e poi il suo risultato viene
immagazzinato nella variabile a sinistra. Ciò è particolarmente evidente quando assegniamo ad una variabile
il risultato di un'espressione che contiene la variabile stessa, cosa che in matematica non avrebbe senso.
>>> a = 5 >>> a = a + 2 >>> a
7
>>> a = a + 3 >>> a
10
c = "Mamma" >>> c = "Ciao " + c + "!" >>> c
'Ciao Mamma!'
Volendo essere pedanti non dovremmo leggere il primo esempio come "a
uguale
a
più due", ma "a
riceve il valore a
più due".
Per questo motivo Python usa due simboli diversi: =
in una assegnazione ed
==
in un'espressione booleana: scrivendo 3 = 5
si ottiene un errore, perchè Python
lo interpreta come un tentativo di assegnare il valore 5 non ad una variabile, ma ad
una costante (il numero 3).
Le assegnazioni come a = a + 1
sono così frequenti che in Python esiste un'apposita
sintassi abbreviata. Così a = a + 2
si può abbreviare con a += 2
, a = a * 3
si abbrevia con a *= 3
e così via per ogni operatore matematico (come al solito non si possono
lasciare spazi tra +=
perchè essi rappresentano un unico operatore).
>>> a = 4 >>> a += 1 >>> a
5
>>> a -= 10 >>> a
-5
Prima di continuare è necessario soffermarsi un attimo a riflettere sulle analogie e diversità tra numeri
e stringhe. Abbiamo visto che possiamo fare operazioni su di entrambi: sommando due numeri il risultato
è quello che ci aspettiamo nella matematica, sommando due stringhe otteniamo la loro concatenazione.
Possiamo moltiplicare due numeri tra loro, ma non due stringhe tra loro (se tentiamo otteniamo un errore).
Usando le variabili le cose si complicano: l'istruzione a * b
potrebbe essere lecita (se a
e b
sono due numeri o un numero e una stringa) oppure dare un errore (se sono due stringhe).
Diciamo che un numero ed una stringa sono due tipi di dato differenti.
In informatica il tipo di un dato determina quali valori esso può assumere e quali operazioni si possono fare su di esso.
Quando noi assegnamo un valore ad una variabile Python ricorda che tipo di dato è conservato in essa. Digitiamo in IDLE queste espressioni, stando attenti alle parentesi (chiariremo nella prossima lezione la loro sintassi e il loro significato).
>>> type("Mamma")
<class 'str'>
>>> a = 1234 >>> type(a)
<class 'int'>
>>> b = 12.34 >>> type(b)
<class 'float'
>>> c = True >>> type(c)
<class 'bool'>
Python ci ha risposto che "Mamma"
è di tipo 'str'
cioè stringa, a
è di tipo 'int'
(numero intero), b
è un float
(numero con la
virgola) e c
è un bool
.
Notiamo che gli interi e i numeri con la virgola sono per Python due diversi tipi di dato:
questo deriva dall'architettura interna della memoria e del processore. Per il computer è molto più facile
e veloce maneggiare numeri interi che numeri con la virgola. Tenete presente che un processore a 64 bit come
quelli che attualmente equipaggiano un PC può sommare in una sola istruzione due numeri interi fino a
264, mentre deve compiere numerose operazioni ad esempio per la somma 0,1 + 0,01 tra due numeri con
la virgola. Quindi Python, come quasi tutti i linguaggi di programmazione, distingue tra numeri int
e
float
.
Ad esempio IDLE scriverà 4
se sta considerando 4 un int
e 4.0
se lo sta
considerando un float
.
Se quanto ho detto vi sembra un po' oscuro non preoccupatevi: Python cerca sempre di evitare le complicazioni e
quindi in generale non dovremo preoccuparci molto di questa distinzione. Infatti sui due tipi di
numeri si possono fare le stesse operazioni (quello che cambia è solo il modo in cui Python le esegue internamente);
inoltre Python converte automaticamente i valori quando è necessario: in tutte le operazioni basta che uno dei due operandi
sia float
perchè anche il risultato venga convertito in float
; fa eccezione la divisione il cui
risultato è sempre float
. Ecco alcuni esempi (osservate che i numeri senza puntino sono int
, quelli
col puntino float
):
>>> 15 / 5
3.0
>>> 15 // 5
3
>>> 10 + 15 / 5
13.0
>>> 10 + 15 // 5
13
>>> 10.0 + 15 // 5
13.0
Alcuni linguaggi di programmazione (ad esempio il C) sono molto rigorosi riguardo ai tipi di dato e
richiedono la dichiarazione delle variabili: prima di usare una variabile a
è necessario scrivere un'istruzione che dica al linguaggio "Intendo usare una variabile a
che conterrà un intero", dopodichè in quella variabile potrò mettere solo numeri interi. Questo permette
al linguaggio di sapere in anticipo quanta memoria occuperà la variabile a
e quindi di facilitarne
la memorizzazione.
Python, come abbiamo visto, non richiede la dichiarazione (bisogna solo ricordarsi di assegnare sempre un valore alla variabile prima di farne qualsiasi altro uso) e permette anche di assegnare tipi diversi alla stessa variabile. E' proprio della "filosofia" di Python cercare di nascondere tutto il lavoro che lui fa nella memoria del computer in modo che l'utente non se ne debba preoccupare.
>>> a = 5
>>> a = 6.0
>>> a = "Mamma"
Abbiamo assegnato alla stessa variabile prima un intero, poi un float
e poi una stringa. Python
ha probabilmente fatto un notevole lavoro in memoria, allocando e rilasciando celle, ma noi non ce ne
accorgiamo minimamente.
'SaSoSoSaSaSaSaSoSo'
'Zio Zio Zio Nonna Nonna Zio'
(SUGGERIMENTO: usa delle variabili stringa)media
e reddito
assegnando loro dei valori, poi creare
un'espressione booleana che sia vera se lo studente soddisfa i requisiti. Provare a cambiare il valore
delle variabili e a rivalutare l'espressione in conseguenza.and
e or
).Fine della lezione