
Spacchettamento degli oggetti iterabili in Python
Lo spacchettamento, noto anche come "unpacking", è una delle caratteristiche distintive del linguaggio di programmazione Python.
A cosa serve? Ti offre un modo elegante e compatto per assegnare valori da oggetti iterabili a variabili. In questo tutorial, esploreremo le diverse sfaccettature dello spacchettamento e come può semplificare e arricchire la tua esperienza di codifica.
In termini semplici, lo spacchettamento ti permette di assegnare elementi di un oggetto iterabile, come una lista o una tupla, a variabili separate in una sola riga di codice.
Ecco un esempio pratico.
Digita questa riga sul terminale di Python.
a, b, c = [1, 2, 3]
Questo comando spacchetta la lista [1,2,3] assegnando il valore 1 alla variabile "a", il valore 2 alla variabile "b" e il valore 3 alla variabile "c".
print(a)
1
Le potenzialità dello spacchettamento però non si riducono solo a questi aspetti.
Lo scambio di variabili
Lo spacchettamento può semplificare operazioni come lo scambio di variabili.
Ad esempio, digita questo comando.
a, b = b, a
Tramite lo spacchettamento Python assegna alla variabile a il contenuto della variabile b, e viceversa, senza usare una terza variabile di appoggio.
a=1
b=2
a,b=b,a
print(a)
2
Lo spacchettamento nelle funzioni
Puoi usare lo spacchettamento anche essere utilizzato in funzioni che restituiscono più di un valore, facilitando l'assegnazione dei risultati.
Ecco un esempio pratico.
- def divisione_e_resto(a, b):
- div_int = a // b
- resto = a % b
- return div_int, resto
- div, res = divisione_e_resto(10, 3)
- print(f"Divisione intera: {div}, Resto: {res}")
In questo script viene definita una funzione che restituisce il quoziente e il resto della divisione.
Quando viene richiamata la funzione, lo spacchettamento ti permette di assegnare i due output a due variabili distinte: div e res.
Spacchettamento di stringhe
Le stringhe sono sequenze di caratteri e, quindi, sono oggetti iterabili.
Questo significa che puoi spacchettare una stringa nei suoi singoli caratteri:
x, y, z = 'abc'
Questo comando assegna i caratteri 'a', 'b' e 'c' rispettivamente alle variabili x, y e z.
print(x)
a
Spacchettamento di file
Puoi spacchettare le righe di testo di un file riga per riga.
Ecco un esempio pratico.
- with open('file.txt', 'r') as f:
- linea1, linea2, linea3 = f
La variabile linea1 riceve la prima riga di testo del file, linea2 la seconda e linea3 la terza.
Spacchettamento di dizionari
Mentre lo spacchettamento è comunemente associato a liste e tuple, può anche essere utilizzato con dizionari.
Tuttavia, lo spacchettamento di un dizionario assegna le sue chiavi, non i suoi valori.
x, y, z = {'nome': 'Giovanni', 'cognome': 'Bianchi', 'eta': 30}
Alla variabile x viene assegnata la prima chiave 'nome', alla variabile y la seconda chiave 'cognome' e alla variabile z la terza chiave 'eta'
print(x)
nome
Poiché i dizionari non conservano un ordine, l'ordine di spacchettamento non è garantito.
Lo spacchettamento esteso
Introducendo un asterisco * puoi assegnare a una variabile una lista di elementi.
Ad esempio, digita questo comando sul terminale di Python.
*x, y = [1, 2, 3, 4]
Alla variabile x viene assegnata la lista [1, 2, 3] mentre alla variabile y l'ultimo valore 4.
In pratica, alla variabile y viene assegnato l'ultimo valore della lista mentre alla variabile *x la lista dei restanti elementi
*x, y, z = [1, 2, 3, 4]
In questo caso, Python assegna 4 alla variabile z, 3 alla variabile y e la lista degli elementi restanti [1,2] alla variabile *x con l'asterisco.
Ovviamente, l'asterisco * puoi inserirlo davanti a qualsiasi variabile, non necessariamente alla prima.
x, *y, z = [1, 2, 3, 4]
Ora alle variabili x e z sono assegnati rispettivamente i valori 3 e 4, mentre alla variabile *y la lista [1,2]
Cosa accade se il numero delle etichette coincide con il numero dei valori?
*x, y, z = [1, 2, 3]
Se il numero dei valori coincide con quello delle variabili, alla variabile *x con l'asterisco viene assegnata la lista composta da un unico elemento ossia [1].
E se il numero delle etichette è insufficiente a contenere tutti gli elementi?
*x, y, z = [1, 2]
Se non ci sono valori restanti da assegnare, alla variabile *x con l'asterisco viene assegnata una lista vuota [ ]