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
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
nome, anni = ("Ada", 36)
nome # 'Ada'
anni # 36Funziona anche senza parentesi (è la virgola a definire la tuple):
x, y = 10, 20E ti permette lo swap senza variabile temporanea, idiom puro 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":
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.
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
Dati `a = 1` e `b = 2`, scambia i loro valori con una sola riga (tuple unpacking) e valuta la tuple (a, b).
Mostra suggerimento
a, b = b, a
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
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)`.
Mostra suggerimento
primo, *centro, ultimo = voti → primo=7, centro=[5,8,6], ultimo=9.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
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`.
Mostra suggerimento
Usa x, y, z = point per estrarre le tre coordinate in un solo colpo.
Soluzione disponibile dopo 3 tentativi