Bene eccoci al terzo appuntamento con Python.
Dunque, abbiamo visto come stampare a video, cosa siano variabili costanti, come ricevere un input dall’utente, come scrivere delle funzioni e come passare loro dei parametri.
Sebbene ci sia ancora molto lavoro da fare, già qualcosa siamo in grado di farlo.
Ora vediamo come giocare con i numeri.
>>> 10 + 20
30
>>> 10 – 5
5
>>> 10 * 2
20
>>> 10 / 2
5
>>> 11 / 2
5
Oops, sembra che qualcosa non abbia funzionato. 11 diviso 2 dovrebbe dare 5.5.
Per farlo dobbiamo dire all’interprete che almeno una delle due cifre è decimale. Proviamo così:
>>> 11.0 / 2
5.5
Possiamo anche farlo in maniera diversa:
>>> float( 11 ) / 2
5.5
Il metodo float (che è integrato nel sistema) è un casting, ovvero facciamo capire al sistema che il valore o la variabile vanno considerati come di un tipo diverso, nel nostro caso come cifra decimale invece che intera.
Per dire possiamo anche fare una cosa del tipo:
>>> float( “11” ) / 2
5.5
Eppure “11” è una stringa, se non ci credete potete scrivere
>>> type(“11”)
<type ‘str’>
Ma se è una stringa come può essere divisa per 2 e tornare per di più un valore decimale? E se scrivessimo
>>> int( “11” ) / 2
5
Questa operazione (casting) può essere fatta anche all’opposto, da numero a stringa, ecco un esempio:
>>> type(“11”)
<type ‘str’>
>>> type( 11 )
<type ‘int’>
>>> type( str( 11 ) )
<type ‘str’>
Python dove può esegue in automatico il casting, l’esempio della divisione (ma vale anche per le altre operazioni matematiche) ne è la prova: 11.0 è un numero decimale, 2 sarebbe un intero ma viene convertito (casting) in decimale (float) per poter eseguire correttamente l’operazione.
Ovviamente possiamo scrivere anche:
>>> 11 / 2.0
5.5
Se comunque volessimo conoscere il resto della divisione? Semplice
>>> 11 % 2
1
>>> 23 % 3
2
Attenzione, è il residuo, non la parte decimale.
Altri operatori che possiamo usare sono la divisione intera
>>> 13.0 // 2
6.0
Notate che se avessimo scritto invece
>>> 13.0 / 2
6.5
e l’elevamento a potenza
>>> 2 ** 2
4
>>> 2 ** 3
8
>>> 2 ** 4
16
>>> 2 ** 5
32
Gli operatori hanno delle precedenze, per l’esattezza abbiamo
**
/,*, %
+,-
Questo comporta che se scriviamo
>>> 15 % 6 * 2 + 3
9
In pratica
>>> 15 % 6
3
>>> 3 * 2
6
>>> 6 + 3
9
Se volessimo invece ottenere che il risultato di 15 % 6 sia moltiplicato per 2 + 3?
>>> 15 % 6 * (2 + 3)
15
Perché diventa
>>> 15 % 6
3
>>> 3 + 2
5
>>> 3 * 5
15
Le parentesi sono importantissime quindi per essere certi dell’ordine di elaborazione dei comandi.
Esistono anche altri operatori, i cosidetti operatori di shift (>> e <<) e di confronto bitwise (&, ^ e |) ma che per ora esulano da quanto ci interessa sapere.
Una considerazione: Python e’ un linguaggio typed, ovvero una variabile una volta assegnata prende il tipo con cui viene assegnata. Per capirci:
>>> a = 1
>>> type(a)
<type ‘int’>
>>> b = 12.2
>>> type(b)
<type ‘float’>
>>> c = True
>>> type(c)
<type ‘bool’>
>>> d = ‘ciao’
>>> type(d)
<type ‘str’>
Però se assegniamo alla variabile un differente tipo cosa accade?
La variabile (o meglio l’etichetta che gli abbiamo assegnato) viene collegata ad una nuova locazione di memoria (e quindi ad un differente valore).
Non ci credete? Vediamo:
>>> a = 1
>>> id(a)
34259288
>>> a = ‘ciao’
>>> id(a)
140531248445120
Ovviamente i valori che otterrete saranno differenti da quelli che ho mostrato, sono gli indirizzi di memoria dove sono memorizzati i valori.
Ma quello che conta è che al cambiare dell’assegnazione non abbiamo una sovrascrittura ma una riassegnazione del valore.
Altri linguaggi che prevedono che una variabile sia inizializzata ad un certo tipo (intero, virgola mobile, stringa, booleano etc.) poi non permettono di cambiare il tipo.
Ovviamente questo ha i suoi pro e i suoi contro.
Altra cosa importante sul casting è che se scriviamo
>>> a = 1
>>> b = ‘ciao’
>>> a+b
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
Questo perché abbiamo cercato di sommare/accodare due tipi tra loro non compatibili. Se scriviamo:
>>> a = 1
>>> b = 2.4
>>> a+b
3.4
Qui l’intero viene convertito automaticamente in float e poi i due numeri sono sommati tra loro.
Possiamo anche fare:
>>> a = ‘Ciao ‘
>>> b = ‘Guido’
>>> a+b
‘Ciao Guido’
Questo perché l’operatore + viene overloaded, ovvero cambia comportamento (sommare/accodare) a seconda dei casi. Volendo possiamo fare:
>>> a = 1
>>> b = ‘ ciao’
>>> str(a)+b
‘1 ciao’
Qui abbiamo eseguito un casting del numero in stringa e quindi l’operatore ha potuto valutare quale comportamento doveva avere (accodare).
Ultime cose: quando abbiamo provato a sommare/accodare un intero ed una stringa abbiamo ricevuto un messaggio di errore.
Il Traceback è un track dello stack degli errori che ci indica l’errore e dove si trova. Come vedremo prossimamnente se l’errore è in un file ci indicherà anche la riga esatta. Meglio di così.
Ultima cosa prima di chiudere, proviamo:
>>> 3 * ‘Ciao ‘
‘Ciao Ciao Ciao ‘
Se si moltiplica una stringa per un valore si ottiene la stringa ripetuta più volte. Ecco un esempio di quando torna particolarmente comodo:
>>> a = ‘Ciao \n’
>>> b = 20 * “-”
>>> print a + b
ciao
Arrivederci alla prossima settimana.
Altre letture utili:
Programmare con Python. Guida completa
Python
Programmare in Python
Lascia un commento