2.8. Tuple¶
Una tupla è una sequenza ordinata e immutabile di valori. Una volta creata, gli elementi al suo interno non possono essere aggiunti, rimossi o modificati.
2.8.1. Creare tuple¶
Usa le parentesi tonde (o semplicemente le virgole) per creare una tupla:
empty = ()
point = (3, 4)
triple = 1, 2, 3 # parentheses are optional
mixed = (1, "two", 3.14)
nested = ((1, 2), (3, 4))
2.8.1.1. Il tranello dell’elemento singolo¶
Le parentesi tonde attorno a un valore sono solo parentesi; ciò che effettivamente crea una tupla è la virgola. Una tupla di un solo elemento ha bisogno di una virgola finale:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. Lunghezza, indicizzazione e slicing¶
Come per le liste e le stringhe – len(), indicizzazione, slicing, in e + / * funzionano tutti allo stesso modo:
>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
2.8.3. Immutabilità¶
Le tuple non hanno append, pop, sort o qualsiasi altro metodo in posizione. L’assegnazione tramite indice solleva TypeError:
>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment
Per «modificare» una tupla, costruiscine una nuova con i valori cambiati.
2.8.4. Spacchettamento¶
Il superpotere principale di una tupla è lo spacchettamento: assegnare ciascun elemento a una variabile separata in un’unica istruzione.
Lo spacchettamento lega ciascun elemento di una tupla a una variabile denominata in un’unica assegnazione.¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
Il lato destro può essere qualsiasi iterabile – una lista, una stringa, il valore restituito di una funzione:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
Un * iniziale raccoglie «il resto» di uno spacchettamento in una lista:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. Valori di ritorno multipli¶
Una funzione può restituire una tupla per consegnare più valori in una volta sola; il chiamante li spacchetta al momento dell’ingresso:
def size_of(rect):
return (rect[2] - rect[0], rect[3] - rect[1])
width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120
Le parentesi sul return sono opzionali – anche un semplice return a, b è una tupla.
2.8.6. Tupla vs lista¶
Una guida pratica per capire a quale ricorrere:
Tupla per dati di forma fissa, spesso eterogenei: punti
(x, y), colori(r, g, b), valori di ritorno multipli, argomenti di funzione impacchettati per un uso successivo.Lista per dati di lunghezza variabile, spesso omogenei: una lista di misurazioni, una coda di elementi da elaborare, qualsiasi cosa a cui prevedi di aggiungere in coda.
Le tuple sono anche hashable (purché ogni elemento al loro interno sia hashable), quindi possono essere usate come chiavi in un dict.