Salta al contenuto
Note per Studenti Tuple e unpacking

Tuple e unpacking

In questa pagina 5
In questa pagina 4

Tuple

Definizione (tupla). Una tuple è una sequenza immutabile di oggetti qualsiasi.

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

Esempio. (5,) è una tupla di un elemento mentre (5) è l'intero 5; con p = (3, 4), p[0] = 1 solleva TypeError.

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.

Proprietà (tuple hashable come chiavi di dizionario). 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 →).

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

Esempio. {("Padova", "Venezia"): 37}[("Padova", "Venezia")] restituisce 37, mentre {[1]: 2} solleva TypeError (lista non hashable).

Unpacking (spacchettamento)

Definizione (unpacking)

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.

Esempio. primo, *resto = [1, 2, 3, 4] assegna primo = 1 e resto = [2, 3, 4]; a, b = b, a scambia i due valori.

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.

Versione ripasso

Tuple

Sequenza immutabile di oggetti qualsiasi.

python
p = (3, 4)
q = 3, 4             # è la virgola che crea la tupla
singola = (5,)       # un elemento: serve la virgola; (5) è l'intero 5

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. p[0] = 1 → TypeError. L'immutabilità riguarda i riferimenti, non gli oggetti interni.

Quando usare tuple o liste

  • Tupla: campi con significato per posizione, record, valori di ritorno multipli, dati immutabili, chiavi di dizionario.
  • Lista: collezione omogenea di lunghezza variabile.

Le tuple sono hashable (se lo sono i loro elementi) e possono essere chiavi di dizionario o elementi di insieme (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
nome, _, voto = ("Ada", "Lovelace", 30)   # _ per ignorare un valore
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 agli elementi (salvo l'asterisco): altrimenti ValueError.

Si usa anche nei cicli (for x, y in punti:) e per i valori di ritorno multipli: return min(valori), max(valori) restituisce una tupla, spacchettata con lo, hi = min_max(...).

Errori tipici

  • Dimenticare la virgola in una tupla di un elemento (5) invece di (5,).
  • Virgola finale accidentale: x = 3,.
  • Spacchettare con un numero errato di variabili.

Teoria collegata