Salta al contenuto
Note per Studenti Tuple e unpacking

Tuple e unpacking

In questa pagina 5

Tuple

Una tuple è una sequenza immutabile di oggetti qualsiasi.

python
p = (3, 4)
q = 3, 4             # le parentesi sono facoltative: è la virgola che crea la tupla
singola = (5,)       # tupla di un elemento: serve la virgola; (5) è solo l'intero 5
vuota = ()
t = tuple([1, 2])    # da lista

Indici, slicing, len, in, +, *, count, index come per le Liste in Pythonlist come sequenza mutabile (array dinamico); indici, slicing e assegnamento a fette; metodi e loro costo; aliasing, copia superficiale e profonda; list comprehension; liste annidate e matrici.Liste in Python →; nessun metodo che modifica (append, sort...). p[0] = 1 → TypeError.

Immutabile riguarda i riferimenti, non gli oggetti: ([1], 2) contiene una lista che si può modificare.

Quando una tupla e quando una lista

  • Tupla: numero fisso di campi con significato per posizione (coordinate, record (nome, cognome, voto), valori di ritorno multipli); dati che non devono cambiare; chiavi di dizionario.
  • Lista: collezione omogenea di lunghezza variabile.

Le tuple sono hashable (se lo sono i loro elementi) e quindi possono essere chiavi di dizionario o elementi di insieme; le liste no (vedi Dizionari e insiemi in PythonADT mappa e insieme; dict con chiavi hashable, accesso, get, iterazione, conteggi e raggruppamenti; set e operazioni insiemistiche; tabelle hash e costo O(1) medio; Counter e defaultdict.Dizionari e insiemi in Python →).

python
distanze = {("Padova", "Venezia"): 37, ("Padova", "Verona"): 85}

Unpacking (spacchettamento)

python
x, y = p                     # x = 3, y = 4
a, b = b, a                  # scambio: a destra si crea la tupla (b, a)
nome, _, voto = ("Ada", "Lovelace", 30)   # _ per un valore da ignorare
primo, *resto = [1, 2, 3, 4]              # primo = 1, resto = [2, 3, 4]
*inizio, ultimo = "ciao"                  # inizio = ['c', 'i', 'a'], ultimo = 'o'

Il numero di nomi deve corrispondere al numero di elementi (salvo l'asterisco): altrimenti ValueError: too many values to unpack.

Unpacking nei cicli:

python
punti = [(0, 0), (1, 2), (3, 1)]
for x, y in punti:
    print(x + y)

for i, (x, y) in enumerate(punti):
    ...

Valori di ritorno multipli

python
def min_max(valori):
    return min(valori), max(valori)      # restituisce una tupla

lo, hi = min_max([4, 8, 1])              # lo = 1, hi = 8

Errori tipici

  • (5) invece di (5,) per una tupla di un elemento.
  • Virgola finale accidentale: x = 3, crea la tupla (3,).
  • Spacchettare con un numero sbagliato di variabili.

Teoria collegata