Vai al contenuto
eLearner.app
Modulo 3 · Lezione 2 di 410/36 nel corso~10 min
Lezioni del modulo (2/4)

Tuple e unpacking

Una tuple è una sequenza ordinata e immutabile: una volta creata, non puoi più cambiarne gli elementi. Si scrive con le parentesi tonde (anche se in realtà a definirla è la virgola).

Creare una tuple

Python
vuota = ()
una = (42,)             # ATTENZIONE: senza virgola, (42) è solo 42 fra parentesi
coords = (10, 20)
mista = ("Ada", 36, True)

L'accesso per indice e lo slice funzionano esattamente come per le liste: coords[0], coords[-1], mista[:2].

Quando usare una tuple invece di una lista

  • Quando il valore rappresenta una collezione fissa che non deve cambiare (coordinate, una data come (anno, mese, giorno), una versione (1, 2, 3)).
  • Quando ti serve usare il valore come chiave di dict o elemento di set: solo gli oggetti immutabili (hashable) possono esserlo.
  • Quando vuoi segnalare a chi legge il codice che quel valore è "congelato".

Unpacking: la feature che cambia il modo di scrivere Python

Python
nome, anni = ("Ada", 36)
nome   # 'Ada'
anni   # 36

Funziona anche senza parentesi (è la virgola a definire la tuple):

Python
x, y = 10, 20

E ti permette lo swap senza variabile temporanea, idiom puro Python:

Python
a, b = 1, 2
a, b = b, a
a, b   # (2, 1)

Unpacking con * (resto)

Quando vuoi catturare "il primo e il resto" o "il primo, l'ultimo, il mezzo":

Python
primo, *resto = [1, 2, 3, 4, 5]
primo   # 1
resto   # [2, 3, 4, 5]

primo, *centro, ultimo = [1, 2, 3, 4, 5]
centro  # [2, 3, 4]

Si chiama starred assignment: la stella raccoglie tutto ciò che resta in una lista.

La trappola della tuple di un solo elemento

(42) non è una tuple, è il numero 42 fra parentesi. Per fare una tuple di un solo elemento serve la virgola: (42,). Senza, qualunque operazione fallisce in modo confuso.

Python
x = (42)
type(x)   # <class 'int'>
x = (42,)
type(x)   # <class 'tuple'>

Tuple a singolo elemento

Per creare una tupla contenente un solo elemento, non basta racchiuderlo tra parentesi tonde: devi inserire una virgola alla fine, ad esempio t = (42,). Senza la virgola, Python tratterà le parentesi come semplice espressione aritmetica, creando un semplice intero 42.

Prova tu

Esercizio#python.m3.l2.e1
Tentativi: 0Caricamento…

Dati `a = 1` e `b = 2`, scambia i loro valori con una sola riga (tuple unpacking) e valuta la tuple (a, b).

Caricamento editor…
Mostra suggerimento

a, b = b, a

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m3.l2.e2
Tentativi: 0Caricamento…

Dalla lista `voti = [7, 5, 8, 6, 9]`, estrai con unpacking il primo voto in `primo`, l'ultimo in `ultimo` e i restanti in `centro`. Valuta `(primo, centro, ultimo)`.

Caricamento editor…
Mostra suggerimento

primo, *centro, ultimo = voti → primo=7, centro=[5,8,6], ultimo=9.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m3.l2.e3
Tentativi: 0Caricamento…

Data la tupla `point = (4, 5, 6)`, usa l'unpacking per assegnare i tre elementi rispettivamente alle variabili `x`, `y`, `z`. Calcola poi la somma di `x`, `y` e `z` e salvala in `coord_sum`. Valuta infine `coord_sum`.

Caricamento editor…
Mostra suggerimento

Usa x, y, z = point per estrarre le tre coordinate in un solo colpo.

Soluzione disponibile dopo 3 tentativi