Variabili e tipi di dato#
Le variabili sono dei contenitori che permettono di memorizzare e manipolare dati, semplificando il processo di sviluppo e rendendo il codice più flessibile e leggibile.
A differenza della maggior parte dei linguaggi di programmazione (come ad esempio C, C++, Java, …), Python è un linguaggio dinamicamente tipizzato, il che significa che le variabili non richiedono una dichiarazione esplicita del tipo e possono cambiare tipo durante l’esecuzione del programma.
L’assegnazione di varabili in Python avviene come di consueto con l’operatore =
, che si occupa sia di instanziare la variabile nel caso in cui non esistesse, sia di attribuirgli il valore richiesto, inferendo in automatico il tipo di dato.
Vediamo come creare alcune tipologie di variabili.
a = 3 # Intera
x = 2.1 # Float
s = "pippo" # Stringa
b = True # Booleana
Per visualizzare il tipo di una variabile, si utilizza la funzione type()
.
print(type(a))
<class 'int'>
Una volta creata una variabile, questa può essere anche riassegnata ad un nuovo valore, o anche ad un valore di tipo diverso! L’interprete di Python si occuperà di gestire la conversione di tipo.
a = 3.6 # Assegnamo alla variabile un valore di tipo diverso
print(type(a)) # Osserviamo come cambia il tipo
<class 'float'>
E’ inoltre possibile forzare Python a cambiare il tipo di una variabile, utilizzando le funzioni di conversione. Per esempio, se chiamiamo la funzione di conversione a = int(a)
per convertire a
ad un valore intero, Python cercherà un modo di farlo. In questo caso, il risultato sarà che la parte decimale di a
verrà semplicemente troncata.
print(a)
print(int(a))
3.6
3
Note
I nomi delle varabili in Python sono case-sensitive, ovvero le variabili a
e A
saranno considerate come completamente diverse dall’interprete.
a = 3
A = "Ciao"
print(a)
print(A)
3
Ciao
Stringhe#
Le variabili di tipo stringa possono essere identificate con il carattere “ o equivalentemente con il carattere ‘. Tra le operazioni più comunemente utilizzate tra stringhe c’è sicuramente la concatenazione (ovvero l’unione di più stringhe in un’unica stringa). In Python, questo può essere fatto semplicemente utilizzando l’operatore +
.
s1 = "Ciao, "
s2 = "Come va?"
s = s1 + s2
print(s)
Ciao, Come va?
In questo corso, ci troveremo spesso ad utilizzare le stringhe per stampare il risultato di alcuni algoritmi, o per monitorarne la performance durante l’esecuzione. Per questo, sarà più volte necessario concatenare delle stringhe con dei valori numerici. Questo può essere fatto semplicemente convertendo il numero in stringa con la funzione str()
, e poi concatenando.
a = 5
s = "Il valore di a è: " + str(a)
print(s)
Il valore di a è: 5
Questa procedura è però particolarmente lenta. Un metodo più rapido per svolgere questa operazione è mediante l’utilizzo di f-stringhe
. Queste non sono altro che stringhe speciali, che permettono di inserire al suo interno il valore di altre variabili, utilizzando le parentesi graffe {}
come segnaposto.
a = 5
s = f"Il valore di a è: {a}."
print(s)
Il valore di a è: 5.
Notare come, utilizzando le f-stringhe, non è necessario convertire la variabile a
in stringa, poiché Python si occuperà autonomamente di questa operazione.
Un’ulteriore vantaggio delle f-stringhe è la formattazione. Infatti, è possibile inserire all’interno delle parentesi graffe una serie di impostazioni (precedute dal carattere :
), che descrivono come la variabile inserita dall’interno delle parentesi deve essere formattato. Ad esempio, questo può essere utile quando vogliamo visualizzare solo alcune cifre decimali del nostro risultato.
pi = 3.14159265358979323846
print(f"Il valore di pi-greco è: {pi:0.4f}.")
Il valore di pi-greco è: 3.1416.
Dove il comando 0.4f
indica che vogliamo visualizzare tutte le cifre intere e 4 cifre decimali, della variabile float
pi
. Una lista completa dei comandi che possono essere inseriti all’interno delle f-stringhe è disponibile al link: https://www.w3schools.com/python/python_string_formatting.asp.
Interi e float#
Come già detto, le variabili numeriche in Python possono essere di due tipologie: intere o float. Le due tipologie di variabili sono distinte dalla presenza del .
, che separa la parte intera dalla parte decimale.
Note
Una variabile del tipo a = 1.0
è di tipo float
, anche se tecnicamente rappresenta un numero intero. Infatti, come detto, la differenza tra i due tipi di variabile non è dato dal valore numerico in sè, ma dalla presenza o meno del .
. Per convertire una variabile intera nella sua controparte float è possibile utilizzare la funzione float()
.
a = 3 # Variabile intera
b = 2.7 # Variabile float
print(type(a))
print(type(b))
c = 3.0 # Variabile float (con valore intero)
print(type(c))
<class 'int'>
<class 'float'>
<class 'float'>
Ovviamente, una variabile intera e la sua controparte float, vengono riconosciute come uguali da Python. Questo può essere facilmente verificato utilizzando l’operatore di confronto ==
, che ritorna True
se le due variabili sono uguali, False
se sono diverse.
Warning
Attenzione alla differenza tra l’operatore di assegnazione =
, utilizzato per assegnare un valore ad una variabile, e l’operatore di confronto ==
, utilizzato per controllare se due valori sono uguali tra loro.
a = 3
b = float(a)
print(f"a = {a}, b = {b}, sono uguali? {a == b}.")
a = 3, b = 3.0, sono uguali? True.
Le operazioni numeriche tra variabili intere e float vengono eseguite in maniera naturale, con i soliti operatori:
+
è l’operatore di somma.-
è l’operatore di differenza.*
è l’operatore di moltiplicazione./
è l’operatore di divisione.//
è l’operatore di divisione intera.%
è l’operatore di resto.**
è l’operatore di potenza.
Inoltre, gli operatori di confronto, oltre al già citato ==
, sono:
==
è l’operatore di uguaglianza.!=
è l’operatore di non uguaglianza.>
,<
sono gli operatori di confronto stretti.>=
,<=
sono gli operatori di confronto con uguaglianza.
Questi ritornano il valore booleano True
quando la condizione è soddisfatta, False
quando questo non avviene.
a = 4
b = 2
print(f"a + b = {a+b}, a * b = {a*b}, a^b = {a ** b}.")
a + b = 6, a * b = 8, a^b = 16.
E’ importante osservare che, quando si applicano le operazioni tra una variabile intera e una float, Python convertirà automaticamente la variabile intera in float, così da poter svolgere l’operazione. Come risultato si avrà che l’output dell’operazione sarà una variabile di tipo float, indipendentemente dal fatto che il suo valore sia o meno intero.
a = 4.2
b = 2.1
print(f"a / b = {a/b}.")
a / b = 2.0.
Booleane#
Le variabili booleane possono assumere solo due valori: True
o False
(notare la lettera maiuscola). Ogni variabile numerica può essere convertita in booleana tramite la funzione bool()
, e assumerà il valore True
se il numero sarà diverso da 0, mentre varrà False
se il suo valore è 0.
Anche l’operazione inversa è possibile, utilizzando la funzione int()
su variabili booleane.
a = True
b = False
print(int(a))
print(int(b))
1
0
None#
Tra gli altri tipi di variabili in Python, un ruolo importante è svolto dalla variabile None
. Questa è utilizzata per rappresentare l’assenza di dati, e viene ad esempio data in output di default da funzioni che non ritornano alcun valore, come vedremo in seguito.
Per controllare se una data variabile è di tipo None
, si utilizza la seguente struttura:
a = None
b = "Hello"
print(a is None) # Check se "a" è None
print(b is None) # Check se "b" è None
True
False
Tipizzazione#
Sebbene, come già detto, non è in genere necessario dichiarare il tipo di variabile in Python, per semplificare la lettura e l’interpretazione del codice, è buona usanza dichiarare il tipo di variabile quando noto. Questo può essere fatto semplicemente facendo precedere l’operatore di assegnazione =
dalla scrittura :TIPO
.
a = 3
b: int = 3 # Sono equivalenti, ma questo è più chiaro!
Note
L’inizializzazione NON è vincolante. E’ sempre possibile assegnare ad una qualunque variabile tipizzata un qualunque valore, indipendentemente dal suo tipo. Dal punto di vista dell’interprete del codice, la tipizzazione è inutile. E’ semplicemente una buona pratica per scrivere del codice migliore.
# Definisco una variabile con tipizzazione intera e gli assegno una stringa
a: int = "pippo"
print(type(a))
<class 'str'>