Come anticipato, le tuple sono dei costrutti che, come accade per le liste, possono contenere una raccolta di elementi; la differenza sostanziale tra le liste e le tuple sta però nel fatto che mentre nelle prime gli elementi che le costituiscono possono essere modificati, nelle tuple divengono immutabili. La sintassi per la definizione delle tuple prevede che gli elementi da inserire in esse vengano delimitati tra parentesi tonde e siano associati ad un nome tramite assegnazione (operatore "=").
Sostanzialmente, così come già visto per le liste, le tuple possono esistere, e quindi essere state definite, ma essere nel contempo vuote e dunque non presentare alcun elemento al proprio interno:
# Esempio di tuple vuota
nome_tuple = ()
Si faccia sempre attenzione alla regola che per assegnare un solo elemento ad una tuple impone che esso venga seguito da una virgola:
# Definizione di una tuple con un solo elemento
>>> nome_tuple = ('Homer')
>>> type(nome_tuple)
<class 'str'> # senza la virgola non viene identificata come una tuple
>>> nome_tuple = ('Homer',)
>>> type(nome_tuple)
<class 'tuple'>
Nel caso in cui una tuple non sia vuota verrà richiesto di separare gli elementi che la costituiscono tramite una virgola, si potranno quindi creare tuple destinate a contenere elementi associati ad un unico tipo di dato:
# Esempio di tuple contenente unicamente valori numerici
nome_tuple = (16, 26, 36, 46, 56)
# Esempio di tuple contenente unicamente delle stringhe
nome_tuple = ('Homer', 'Abraham', 'Lisa')
Nello stesso modo si potranno definire delle tuple che presentino elementi associati a tipi di dato differenti.
# Esempio di tuple contenente elementi di diverso tipo
# numeri e stringhe
nome_tuple = (66, 'Marge', 6.1)
Si potranno infine generare tuple annidate (nested tuple ), cioè tuple che hanno tra i propri elementi altre tuple.
# Esempio di tuple annidata
nome_tuple = ('Apu', 2.8, 15, (21, 31, 41))
Se lo si desidera, sarà possibile anche inserire una lista come elemento di una tuple.
# annidamento con inserimento di una lista nella tuple
nome_tuple = ('Homer', [7, 6, 5], ('a', 'b', 'c'))
La sintassi delle tuple supporta anche la loro creazione senza l’utilizzo di parentesi tonde e, in questo caso, parliamo di un’operazione chiamata tuple packing:
# Tuple packing
nome_tuple = 5, 8.7, 'Bart'
Indicizzazione degli elementi di una tuple
Così come già osservato per liste, anche le tuple prevedono che i loro elementi vengano indicizzati numericamente; l’indicizzazione partirà quindi da "0", motivo per il quale una tuple composta da soli tre elementi avrà come indici "0", "1" e "2". Un determinato elemento di una tuple potrà essere poi richiamato attraverso l’indice di riferimento:
# Accesso ad un elemento di una tuple
# attraverso il suo indice
# definizione degli elementi della tutple
>>> nome_tuple = ('z','y','x','w','v')
# accesso all'elemento con indice "2"
>>> nome_tuple[2]
L’elemento richiamato sarà in questo caso "x", cioè il terzo inserito nella tuple, infatti "z" è associato all’indice "0", "y" a "1" e di conseguenza "x" avrà "2" come indice. Si noti come l’indice sia stato specificato tra parentesi quadre e non tonde, riprendendo la medesima sintassi delle liste.
Una procedura alternativa per l’accesso agli elementi della tuple prevede di sfruttare l’indicizzazione negativa, in questo caso l’ultimo elemento avrà come indice "-1", il penultimo "-2" e così via, esattamente come per le liste. La chiamata seguente permetterà per esempio di accedere all’elemento "y".
# Accesso ad un elemento di una tuple
# attraverso il indice negativo
# definizione degli elementi della tuple
>>> nome_tuple = ('z','y','x','w','v')
# accesso all'elemento con indice "-4"
>>> nome_tuple[-4]
Si potrà inoltre accedere agli elementi di una lista definendo un intervallo di valori; le due componenti dell’intervallo corrisponderanno ai numeri indice, quindi un’espressione come quella proposta di seguito:
# Accesso a più elementi di una tuple
# attraverso un intervallo
# definizione degli elementi della tuple
>>> nome_tuple = ('z','y','x','w','v')
# accesso agli elementi con intervallo "0:3"
>>> nome_lista[0:3]
consentirà di accedere agli elementi "z", "y" e "x" , cioè a quelli il cui indice va da "0" a "3" escludendo quest’ultimo.
Il simbolo dei due punti (":") utilizzato anche nelle liste per la definizione dell’intervallo, cioè il già noto slicing operator, potr essere adottato anche per scopi differenti, per esempio con l’obbiettivo di definire l’indice dal quale partire per accedere agli elementi della tuple:
# Accesso a più elementi di una tuple
# a partire da un indice specifico
# definizione degli elementi della tuple
>>> nome_tuple = ('z','y','x','w','v')
# accesso agli ultimi due elementi della tuple ('z' e 'y') tramite indice negativo
# i primi 3 elementi verranno esclusi
>>> nome_tuple[:-3]
# accesso a partire dal secondo elemento fino all'ultimo
# 'y', 'x', 'v' e 'w'
>>> nome_tuple[2:]
# accesso a tutti gli elementi in lista
>>> nome_tuple[:]
Nel caso si voglia accedere ad un elemento di una tuple annidata all’interno di un’altra tuple, anche gli indici di riferimento dovranno essere annidati:
# Accesso ad un elemento di una tuple annidata
>>> nome_tuple = ('Apu', 2.8, 15, (21, 31, 41))
>>> nome_tuple[3][1]
Il risultato della chiamata sarà uguale a "31", cioè il secondo elemento (con indice "1") della tuple che rappresenta a sua volta il quarto elemento, con indice "3", della tuple in cui essa è annidata.