3: VARIABILI - TIPI DI DATO

VARIABILI

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).

LA DIFFERENZA TRA = ED ==

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

TIPI DI DATO

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.

ESERCIZIO 3.1 Scrivere in IDLE due divisioni che abbiano per risultato 5 e 5.0
ESERCIZIO 3.2 Scrivere in IDLE un'espressione che abbia come risultato:
'SaSoSoSaSaSaSaSoSo'
'Zio Zio Zio Nonna Nonna Zio'
(SUGGERIMENTO: usa delle variabili stringa)
ESERCIZIO 3.3 Il comune di Roccabella ha deciso di assegnare una borsa di studio agli studenti meritevoli. I requisiti per avere la borsa sono:
   a) Avere una media scolastica > 8.0
   b) Avere un reddito familiare < 30000 euro
Creare in IDLE due variabili 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.
ESERCIZIO 3.4 (più difficile) Il comune ha deciso di aiutare gli studenti meno abbienti abbassando i requisiti. Si può avere la borsa di studio con una media > 8.0 ed un reddito < 30000 euro, oppure con una media > 7.5 ed un reddito < 20000 euro.
Creare in IDLE un'altra espressione booleana che sia vera se lo studente può avere la borsa di studio, per una condizione o per l'altra (SUGGERIMENTO: servono le parentesi e gli operatori and e or).
SOLUZIONI

Fine della lezione