Menu

Ciclo for in Python: scorrere liste, stringhe, range e dizionari

Come funziona il ciclo for di Python: scorrere liste, stringhe, range, dizionari e qualsiasi altro iterabile, più break, continue ed else.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Il ciclo for di Python è un "per ogni"

Se hai usato un linguaggio in stile C, il ciclo for di Python ti sembrerà diverso. Non c'è lo schema con contatore for (i = 0; i < n; i++). Il for di Python è rigorosamente un ciclo per ogni: gli dai una collezione e lui ti passa gli elementi uno alla volta.

Stampa tre righe. Python legge la lista, estrae un elemento alla volta e lo associa a color mentre viene eseguito il corpo. Quando non resta niente, il ciclo termina.

Nota la forma: for <name> in <iterable>: seguito da un corpo indentato. Indentazione, due punti, corpo; la stessa struttura di if.

Cosa conta come iterabile

In pratica qualsiasi cosa contenga una sequenza di valori. Liste, tuple, stringhe, range, dict, set, file e la maggior parte degli oggetti personalizzati che costruirai.

Il bello è l'uniformità: una sola sintassi, tante forme di dati.

Contare con range()

Quando un contatore ti serve davvero ("fai questo dieci volte", oppure "scorri gli indici da 0 a 9"), usa range():

Stampa 0, 1, 2, 3, 4. range(stop) conta da 0 fino a stop escluso. range(start, stop) ti permette di impostare un valore iniziale, e range(start, stop, step) ti permette di controllare il passo:

Più avanti c'è una pagina dedicata a range, perché vale la pena capirlo un po' più a fondo. Per ora, range(n) ti dà n iterazioni numerate da 0 a n-1.

enumerate in Python: ciclo con indice

Un'esigenza comune: "voglio l'indice e il valore insieme". L'istinto del principiante è usare range(len(...)), ma Python ha uno strumento migliore:

enumerate() restituisce coppie (index, value). La doppia variabile dopo for spacchetta la coppia in due nomi, index e color. Molto più pulito di:

Se vuoi iniziare a contare da 1 invece che da 0, passa start=1:

zip in Python: scorrere due sequenze insieme

Quando hai due liste della stessa lunghezza e vuoi accoppiarne gli elementi:

zip si ferma alla sequenza più corta. Se vuoi che continui riempiendo con None, usa itertools.zip_longest.

Scorrere un dict

I dizionari ti lasciano scegliere su cosa fare il ciclo:

La maggior parte delle volte vuoi .items(): ottieni chiave e valore insieme in una riga leggibile.

break e continue

A volte vuoi uscire prima o saltare un'iterazione.

break esce subito dal ciclo:

Appena trova un numero maggiore di 6, il ciclo si ferma. Gli elementi rimanenti vengono ignorati.

continue salta il resto dell'iterazione corrente e passa alla successiva:

Vanno bene entrambi, anche se continue può rendere i cicli più difficili da seguire se ne hai più di uno. Spesso un semplice if/else si legge meglio.

La clausola else di un ciclo

Python ha una funzionalità che la maggior parte dei linguaggi non ha: una clausola else sui cicli. Viene eseguita quando il ciclo termina senza incontrare un break.

Utile, ma all'inizio confonde. Non sentirti obbligato a usarla: per chi legge il codice per la prima volta, un flag booleano fuori dal ciclo è spesso più chiaro.

Modificare una lista mentre la scorri

Una trappola da segnalare: non aggiungere né rimuovere elementi da una lista mentre ci fai un ciclo sopra. L'iterazione perde il conto di quali indici sono ancora validi, e finisci per saltare elementi o scatenare un errore. Lo schema sicuro è costruire una nuova lista:

Oppure, quando ci avrai preso la mano, una list comprehension fa la stessa cosa in una riga: la vedremo nel capitolo sulle collezioni.

Un piccolo esempio completo

Mettiamo insieme un po' di tutto: leggere una lista, filtrare, numerare, stampare:

Prossimo argomento: il ciclo while

for è la scelta giusta quando sai cosa stai scorrendo. while è la scelta giusta quando ripeti finché una condizione non cambia: è il prossimo argomento.

Domande frequenti

Come funziona un ciclo for in Python?

for item in sequence: esegue il corpo indentato una volta per ogni elemento della sequenza, e item assume a turno ciascun valore. Le sequenze includono liste, tuple, stringhe, dict, range e qualsiasi oggetto che definisca un iteratore.

Qual è la differenza tra break e continue?

break esce subito dal ciclo, saltando tutte le iterazioni rimanenti. continue salta il resto dell'iterazione corrente e passa alla successiva. break significa "ho finito"; continue significa "salta questo".

Come faccio un ciclo con l'indice in Python?

Avvolgi la sequenza in enumerate(...) per ottenere coppie (index, value): for i, item in enumerate(items):. È molto più pulito che gestire un contatore tuo con i += 1 in fondo al ciclo.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA