Nelle precedenti lezioni abbiamo visto diversi tipi built-in disponibili in Python. Questi tipi risulteranno molto utili in svariate situazioni ed è pertanto essenziale imparare ad usarli nel modo più opportuno. In questa lezione ne faremo un riepilogo, offrendo una carrellata di tutti i tipi disponibili in Python.
Tabella riassuntiva
Tipo di dato | Nome | Descrizione | Esempi |
---|---|---|---|
Intero | int |
Intero di dimensione arbitraria | -42 , 0 , 1200 , 999999999999999999 |
Reale | float |
Numero a virgola mobile | 3.14 , 1.23e-10 , 4.0E210 |
Booleano | bool |
Per valori veri o falsi | True , False |
Complesso | complex |
Numeri complessi con parte reale e immaginaria | 3+4j , 5.0+4.1j , 3j |
Stringhe | str |
Usata per rappresentare testo | '' , 'stefano' , "l'acqua" |
Bytes | bytes |
Usata per rappresentare bytes | b'' , b'\x00\x01\x02' , b'Python' |
Liste | list |
Una sequenza mutabile di oggetti | [] , [1, 2, 3] , ['Hello', 'World'] |
Tuple | tuple |
Una sequenza immutabile di oggetti | () , (1, 2, 3) , ('Python', 3) |
Insiemi | set /frozenset |
Un'insieme di oggetti unici | {1, 2, 3} , {'World', 'Hello'} |
Dizionari | dict |
Una struttura che associa chiavi a valori | {} , {'nome': 'Ezio', 'cognome': 'Melotti'} |
Nelle lezioni precedenti, abbiamo visto che i tipi di dato possono essere immutabili o mutabili. I numeri (int
, float
, complex
, bool
), le stringhe (str
), i bytes
, e i frozenset
sono immutabili; le liste (list
), gli insiemi (set
), e i dizionari (dict
) sono invece mutabili.
La maggior parte di questi tipi possono essere definiti usando i literals, cioè una sintassi dedicata che si può vedere nella tabella sotto la colonna "Esempi". Ci sono tuttavia delle eccezioni: non esiste una forma literal per definire insiemi vuoti (si può usare set()
) e frozenset
(si possono creare a partire da altri tipi, come ad esempio frozenset({1, 2, 3})
).
È anche possibile creare nuovi oggetti "chiamando" i tipi elencati nella seconda colonna della tabella. Se durante la chiamata non viene passato nessun argomento, il valore ritornato sarà 0 nel caso dei numeri o un oggetto vuoto negli altri casi: ad esempio float()
restituirà 0.0
e list()
restituirà []
.
Conversione tra tipi
Al contrario di altri linguaggi come il C, dove il tipo di dato è legato alla variabile che lo contiene, In Python il tipo è legato all'oggetto stesso e non può essere cambiato. Questo vuol dire che non è possibile convertire (cast) una variabile o un oggetto da un tipo ad un altro. Dato che il tipo di un oggetto non può essere cambiato, in Python la conversione non modifica l'oggetto originale, ma ne crea di nuovi a partire da oggetti già esistenti.
Questa operazione può essere effettuata passando l'oggetto che vogliamo convertire al tipo in cui lo vogliamo convertire. Ad esempio, se vogliamo convertire una lista in un insieme possiamo usare set(lista)
:
>>> mylist = [1, 2, 3, 2, 1] # definisco una lista
>>> myset = set(mylist) # creo un nuovo insieme a partire dalla lista
>>> myset # l'insieme contiene gli stessi elementi (senza duplicati)
{1, 2, 3}
>>> mylist # la lista originale esiste ancora
[1, 2, 3, 2, 1]
Se vogliamo, invece, convertire una stringa in numero, possiamo procedere come segue:
>>> mystr = '3.14' # definisco una stringa
>>> myfloat = float(mystr) # creo un nuovo float a partire dalla stringa
>>> myfloat # il float corrisponde al numero della stringa
3.14
>>> mystr # la stringa originale esiste ancora
'3.14'
È anche possibile convertire una lista di tuple in un dizionario:
>>> mylist = [('a', 1), ('b', 2), ('c', 3)]
>>> mydict = dict(mylist)
>>> mydict
{'c': 3, 'a': 1, 'b': 2}
Ogni tipo accetta diversi input, ma non tutte le conversioni sono possibili. Ad esempio, non è possibile convertire una lista in intero, o un intero in lista. Se passiamo un oggetto che non può essere convertito, Python restituirà un TypeError
o un ValueError
:
>>> int('un milione') # str è un tipo valido, ma il valore non può essere convertito
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: 'un milione'
>>> int([1, 2, 3]) # list non è un tipo valido, quindi un TypeError viene restituito
Traceback (most recent call last):
File "", line 1, in
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
È anche possibile creare copie di un oggetto senza cambiarne il tipo. Ad esempio:
>>> mylist1 = [1, 2, 3] # creo una lista
>>> mylist2 = list(mylist1) # creo una nuova lista (una copia) partendo da mylist1
>>> mylist2 # la copia contiene gli stessi elementi dell'originale
[1, 2, 3]
>>> mylist1.append(4) # posso modificare l'originale aggiungendo un elemento
>>> mylist1 # l'elemento viene aggiunto alla lista originale
[1, 2, 3, 4]
>>> mylist2 # ma non alla copia
[1, 2, 3]
Altri tipi di dato
Tutti i tipi elencati nella tabella all'inizio di questa lezione sono built-in, cioè sono sempre disponibili senza bisogno di importare nulla. In aggiunta a questi tipi di dato built-in, esistono anche diversi altri tipi non built-in che possono essere importati da moduli della standard library, tra cui:
- il modulo
decimal
definisce un tipoDecimal
che permette di lavorare con numeri a virgola mobile accuratamente, superando alcune limitazioni dei numerifloat
; - il modulo
fractions
definisce un tipoFraction
che consente di rappresentare e lavorare con numeri razionali usando le frazioni; - il modulo
collections
definisce diversi tipi di contenitori, tra cuinamedtuple
(una tupla che consente l'accesso agli elementi per nome, invece che per posizione),OrderedDict
(un dizionario che mantiene l'ordine di inserimento degli elementi),defaultdict
(un dizionario che permette di specificare un valore di default),Counter
(un dizionario che conta il numero di occorrenze di ogni elemento).
Prima di poter utilizzare questi tipi è necessario importarli usando import
, come vedremo meglio in una delle prossime lezioni.