# Python/Sequenze

Python
Copertina Tutti i moduli · Sviluppo
* IntroduzionePython/Introduzione
* SintassiPython/Sintassi
* Tipi di DatiPython/Tipi di Dati
** NumeriPython/Numeri
** SequenzePython/Sequenze
** DizionariPython/Dizionari
** FilePython/File
* Strutture di controllo
** SelezionePython/Selezione
** IterazionePython/Iterazione
* LibreriePython/Librerie
* Strumenti utiliPython/Strumenti
* EsempiPython/Esempi
Modifica il sommario
Tra i dati messi a disposizione da Python, alcuni hanno delle caratteristiche in comune: sono le sequenze. Le sequenze sono dei contenitori di oggetti che mantengono l'ordine. Sono sequenze le liste, le tuple e le stringhe.

## Liste

Una lista è un contenitore ordinato di oggetti Python. Può essere costruita usando le parentesi quadre:
o il costruttore list:
A volte può essere utile costruire una lista vuota da riempire in seguito:
oppure
La funzione range(<n>) restituisce una lista formata dai primi <n> numeri naturali:
Si può osservare qui che Python restituisce una lista formata effettivamente da 10 elementi da zero compreso a dieci escluso.
Python mette a disposizione un comodo metodo per costruire liste, la 'list comprehension'. Se ad esempio voglio una lista con i quadrati dei primi 10 numeri naturali posso scrivere:
Nella costruzione di liste si può aggiungere anche una condizione. Se ad es. volessi i quadrati dei soli numeri pari:
Le liste sono oggetti modificabili, quindi è possibile inserire, cancellare o cambiare gli oggetti contenuti in una lista:
Il metodo più utilizzato per popolare liste, dopo la list comprehension è l'uso del metodo append:
Tutti i metodi delle liste si possono ottenere con l'istruzione:

## Tuple

Le tuple sono contenitori ordinati di oggetti Python. A differenza delle lista non sono modificabili, quindi una volta costruita una tupla non si può cancellare, cambiare o inserire un elemento. Può essere costruita usando le parentesi tonde:
o il costruttore tuple:
Una tupla vuota risulta piuttosto inutile dato che, essendo immutabile, non può essere popolata.
La scelta di usare lo stesso simbolo per le parentesi delle espressioni e per indicare le tuple, ha portato ad un problema di ambiguità. Con l'espressione:
potremmo voler associare ad a il risultato dell'espressione (6) o la tupla che contiene il solo elemento 6. GVR ha dato la precedenza all'espressione. Per realizzare una tupla formata da un solo elemento dobbiamo aggiungere una virgola:
Tutti i metodi delle tuple si possono ottenere con l'istruzione:

## Stringhe

Le stringhe sono sequenze di caratteri. Anche le stringhe non sono modificabili, quindi una volta costruita una stringa non la si può modificare. Può essere costruita usando gli apici, singoli o doppi in diversi modi:
Le ultime due stringhe possono essere scritte anche su più righe. La funzione str permette di convertire altri oggetti in stringhe:
Altro modo per costruire stringhe componendo diversi elementi:
I simboli %s, presenti nella stringa, sono dei segnaposto che vengono sostituiti, ordinatamente, dagli elementi presenti nella tupla che segue l'operatore %.
Tutti i metodi delle stringhe si possono ottenere con l'istruzione:

## Scorrere le sequenze

È possibile scorrere tutti gli elementi di una sequenza usando un iteratore. Python mette a disposizione molti iteratori, ma il più usato è: for.
La sintassi è:
un semplice esempio di uso dell'iteratore for è:
Anche i file di testo e altri oggetti Python si possono scorrere come le sequenze. Ad esempio se abbiamo un file di testo "commedia.txt" le istruzioni:
insieme alla funzione scritta sopra, permetteranno di stampare il suo contenuto una riga sotto l'altra.

## Accedere ai singoli elementi

Si può accedere ai singoli elementi di una sequenza indicandone la posizione tra parentesi quadre. Si deve tenere presente che in Python ogni sequenza inizia dalla posizione zero quindi il primo elemento ha indice 0 il secondo 1 e così via:
Il meccanismo dell'indicizzazione può essere usato con tutte le sequenze quindi funziona allo stesso modo anche con liste e tuple:
L'ultima istruzione stampa l'elemento di posto 1 dell'elemento di posto 2 di lista. L'ultima istruzione indica il meccanismo per trattare matrici a enne dimensioni. Nel caso di una matrice a due dimensioni possiamo scrivere una funzione che ne visualizzi gli elementi:
La stringa "\t" indica un tabulatore.
È anche possibile usare come indici numeri negativi, in questo caso -1 indica l'ultimo elemento, -2 il penultimo e così via:

## Affettare sequenze (slicing)

Data una sequenza è possibile ricavarne un'altra che contenga parte dei suoi elementi. La sintassi assomiglia a quella dell'indicizzazione, si usano sempre parentesi quadrate, ma questa volta devono essere presenti due indici che individuano la fetta da copiare. I due indici devono essere separati dal simbolo ":". Nei prossimi esempi mi riferisco a una stringa ma funzionano allo stesso modo con qualunque sequenza, quindi anche con liste o tuple.
Coerentemente con il resto del linguaggio il primo indice è compreso nel risultato il secondo è escluso quindi l'istruzione precedente estrae la sottostringa dal carattere di posto 4 compreso al carattere di posto 11 escluso, 11 - 4 = 7 caratteri. Se devo estrarre i primi elementi di una sequenza posso sottintendere il primo indice:
Allo stesso modo per estrarre gli ultimi elementi di una sequenza posso omettere il secondo indice:
Nell'ultimo caso sarebbe stato più comodo usare un indice negativo:
La sintassi dell'affettamento può accettare un terzo argomento che indica un intervallo, così se voglio estrarre solo le lettere di posto pari della parola 'civette':
A volte è utile avere una copia di una lista che è un oggettio mutabile, la si può ottenere con l'istruzione:
Non c'è bisogno di costruire copie di un oggetto immutabile, ma perché con le liste questo può servire? Consideriamo la seguente porzione di codice:
Sembrerebbe che il programma abbia realizzato la copia di lista0 e l'abbia assegnata alla variabile lista1. Ma le cose non sono così: il programma ha creato un nuovo identificatore che si riferisce sempre allo stesso oggetto lista. Ora se modifico un elemento della lista: e stampo di nuovo gli oggetti collegati a lista0 e lista1 ottengo:
Questo avviene perché ho modificato l'oggetto lista che è collegato sia a lista0 sia a lista1. Il seguente programma crea invece un nuovo oggetto lista che collega all'identificatore lista1:
Il programma precedente ha costruito una sola lista collegata a due identificatori diversi, il secondo, dopo aver costruito una lista collegata all'identificatore lista0, ne costruisce un'altra, con gli stessi elementi e la collega all'identificatore lista1. In questo modo le modifiche effettuate sull'oggetto collegato all'identificatore lista0 non hanno effetto sull'oggetto collegato a lista1.