venerdì 14 dicembre 2012

Le tuple

Ed eccoci arrivati alle tuple.
La tupla è una collezione ordinata di valori separati da virgole e racchiusa tra parentesi tonde.

Vediamo come si possono presentare le tuple.


tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")

tupla1 = ("Luigi,(3,4,5),"Marco",["Bari",10])

Come potete vedere, la tupla1 contiene anche un'altra tupla e una lista.

Una piccola curiosità. Quando preparo questi tipi di post, vengo assistito da mio nonno e Ciro, che vogliono capirci qualcosa. Mio nonno non ci sente molto bene, perciò quando parlo con lui devo gridare, col rischio che sente pure la vicina della porta accanto. Una pettegola di prima categoria. Questa volta mio nonno aveva capito che avremmo parlato del duplo. E dato che lui è diabetico, si stava un po' alterando. Prontamente l'amico Ciro, che essendo pastore di urla se ne intende, ha chiarito l'equivoco e sono riuscito ad andare avanti. 

Ritorniamo alle tuple.

Una tupla può essere costituita anche da un solo valore. In tal caso bisogna fare attenzione, il valore deve essere seguito da una virgola.

tupla = ("Agazio",)

perchè la virgola?

Ecco spiegato l'arcano mistero.

tupla1 = ("Agazio")


Per Python "Agazio" senza virgola non è una tupla, bensì una stringa.

La differenza tra tuple e liste sta nel fatto che le tuple sono immutabili. Per il resto vigono le stesse regole per entrambi.

Facciamo qualche esempio.

Per vedere un singolo valore di una tupla:

tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")


tupla [0]
tupla [1]
tupla [2]


Ricordate che Python inizia a contare da zero?

Per vedere una serie consecutiva di valori:

tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")

tupla[0:2]
tupla[2:4]


Abbiamo detto che le tuple, a differenza delle liste, sono immutabili.

Cosa comporta l'immutabilità delle tuple?

Se cerchiamo di modificarne un valore, Python si incavola come una bestia.

Facciamo un esempio. Cerchiamo di sostituire il valore Ennio con il Valore Luca.

tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")


tupla[2] = "Luca"

Ecco la risposta di Python

 Avete visto? TypeError: 'tuple' object does not support item assignment!!!
 
Se Python fa lo schizzinoso e non ci fa modificare un valore, esiste un trucco per aggiungerlo! (l'innestabilità delle tuple)

Eccolo

tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")

tupla = ("Luca",) + tupla[0:]

print tupla

Proprio perchè le tuple sono immodificabili, non funzionano i seguenti metodi: append(), reverse(), pop(), che valgono invece per le liste.

Come per le liste, anche della tupla possiamo sapere il numero degli elementi (valori) che contiene:

tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")

print len(tupla)


In genere le tuple sono utilizzate quando si vuole custodire una lista di valori, cioè senza che essi possano essere aggiunti, modificati o eliminati.
Inoltre, come abbiamo visto precedentemente, se una funzione ritorna più di un valore questi vengono impaccati in una tupla.

L'indice di "Mission Python" lo trovate qui.

Alla prossima! 

3 commenti:

  1. Mi è cascato l'occhio su questa frase: "Se Python fa lo schizzinoso e non ci fa modificare un valore, esiste un trucco per aggiungerlo! (l'innestabilità delle tuple)".

    Beh... insomma... non stai facendo la stessa cosa se invece di modificare un valore, lo aggiungi.

    Modificare un valore è prendere
    tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")
    e mettere "Marco" al posto di "Luigi", quindi quest'ultimo sparisce dalla tupla. Aggiungere "Marco" lascia invece "Luigi" al suo posto, sono due tuple differenti, così:

    tupla_modificata = ("Marco", "Nino", "Ennio", "Marco", "Giorgio")
    tupla_aggiunta = ("Marco", "Luigi", "Nino", "Ennio", "Marco", "Giorgio")

    In realtà non c'è possibilità di fare nulla di tutto ciò su una tupla: come hai già giustamente detto, le tuple una volta create sono oggetti immutabili.

    Quello che fai nell'esempio non è aggiungere un elemento alla tupla: crei invece un nuovo oggetto tupla.

    Crei la nuova tupla con ("Luca",), vi concateni il contenuto della vecchia tupla con + tupla[0:], e il nuovo oggetto che risulta dalla concatenazione lo metti nella stessa variabile di prima (in realtà vi metti solo il suo riferimento). Il vecchio oggetto tupla scompare dalla memoria perché reclamato dal garbage collector.

    Rimane perciò uguale solo il nome della variabile, il riferimento che questa contiene punta ad un oggetto tupla completamente nuovo.
    Basta controllare l'identità dell'oggetto con id(tupla) prima e dopo la concatenazione e vedrai l'id cambiare:

    >>> tupla = ("Luigi", "Nino", "Ennio", "Marco", "Giorgio")
    >>> id(tupla)
    140378628083984
    >>> tupla = ("Luca",) + tupla[0:]
    >>> id(tupla)
    140378627739480

    Ciao ciao. :)

    RispondiElimina
  2. Si, è chiaro che aggiungere e modificare non sono la stessa cosa. Magari non mi sono espresso molto bene. Mentre non sapevo il resto. Grazie :))

    RispondiElimina
  3. Ciao e grazie sia per il post che per la precisazione.
    Qualcuno racconta due parole su ID? Che cos'è, e quello che restituisce sarebbe l'indirizzo del puntatore, in decimale?

    RispondiElimina