Cicli For in Python
Scopri come funzionano i cicli for in Python: sintassi, range(), enumerate(), break, continue, else, cicli annidati e iterazione su liste, stringhe e dizionari.
Un ciclo for in Python itera su ogni elemento di una sequenza — una lista, una tupla, una string, un dizionario, un insieme o qualsiasi altro iterabile — ed esegue un blocco di codice una volta per ogni elemento. A differenza di altri linguaggi dove for tipicamente conta i numeri, il for di Python è un ciclo for-each che attraversa gli elementi direttamente.
Questo capitolo tratta:
- Sintassi di base e come funziona la variabile del ciclo
- La funzione
range()per i cicli con contatore break,continuee la clausolaelseenumerate()ezip()per un'iterazione più ricca- Iterazione su stringhe, dizionari e strutture annidate
- Cicli
forannidati - L'istruzione
passcome segnaposto
Sintassi di base
for variable in iterable:
# block executed once per itemvariable viene assegnata a ogni elemento successivo dell'iterable. Il blocco indentato viene eseguito una volta per ogni elemento.
Iterare su una lista
Output:
apple
banana
cherryIl ciclo assegna "apple" a fruit, esegue print(fruit), poi passa a "banana", e così via finché tutti gli elementi non sono esauriti.
Iterare su una string
Una string è essa stessa un iterabile — ogni carattere è un elemento:
for ch in "Python":
print(ch)Output:
P
y
t
h
o
nLa funzione range()
range() genera una sequenza di interi su richiesta. È il modo più comune per eseguire un ciclo un numero specifico di volte.
range(stop)
range(start, stop)
range(start, stop, step)| Parametro | Predefinito | Significato |
|---|---|---|
start | 0 | Primo valore (incluso) |
stop | obbligatorio | Limite superiore (escluso) |
step | 1 | Incremento tra i valori |
Contare da 1 a 5
Output:
1
2
3
4
5range(1, 6) produce 1, 2, 3, 4, 5 — il valore di stop 6 non è incluso.
Contare a passi
for i in range(0, 10, 2):
print(i)Output:
0
2
4
6
8Contare al contrario
Un passo negativo itera in ordine inverso:
for i in range(10, 0, -2):
print(i)Output:
10
8
6
4
2L'istruzione break
break esce dal ciclo immediatamente, prima che tutti gli elementi siano stati visitati.
for i in range(1, 6):
if i == 3:
break
print(i)Output:
1
2Quando i è uguale a 3, break si attiva e il ciclo si interrompe — 3, 4 e 5 non vengono mai stampati.
Quando usare break: per cercare in una lista e fermarsi non appena si trova una corrispondenza; per uscire anticipatamente da un calcolo lungo.
L'istruzione continue
continue salta il resto dell'iterazione corrente e passa direttamente all'elemento successivo.
for i in range(1, 6):
if i == 3:
continue
print(i)Output:
1
2
4
5Quando i è uguale a 3, continue salta print(i) e passa a i = 4.
La clausola else
Il ciclo for di Python supporta un blocco else opzionale che viene eseguito solo se il ciclo è terminato normalmente (cioè non è stato interrotto da break).
for i in range(1, 4):
print(i)
else:
print("Loop finished")Output:
1
2
3
Loop finishedSe il ciclo termina tramite break, il blocco else viene saltato:
for i in range(1, 6):
if i == 3:
break
print(i)
else:
print("Loop finished without break")Output:
1
2La clausola else è utile per segnalare se una ricerca ha avuto successo — se usi break quando trovi una corrispondenza, il blocco else viene eseguito solo quando non è stata trovata nessuna corrispondenza.
enumerate() — ciclo con indice e valore
enumerate() abbina ogni elemento al suo indice di posizione, così si ottengono entrambi in un unico ciclo senza una variabile contatore separata.
colors = ["red", "green", "blue"]
for index, color in enumerate(colors):
print(index, color)Output:
0 red
1 green
2 bluePer iniziare a contare da un numero diverso, passa start:
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits, start=1):
print(i, fruit)Output:
1 apple
2 banana
3 cherryzip() — iterare su due sequenze contemporaneamente
zip() abbina gli elementi di due (o più) iterabili fianco a fianco:
names = ["Alice", "Bob", "Charlie"]
scores = [95, 87, 92]
for name, score in zip(names, scores):
print(name, score)Output:
Alice 95
Bob 87
Charlie 92zip() si ferma quando l'iterabile più corto è esaurito.
Iterare sui dizionari
Iterare su un dizionario per impostazione predefinita restituisce le sue chiavi:
person = {"name": "Alice", "age": 30, "city": "Paris"}
for key in person:
print(key, ":", person[key])Output:
name : Alice
age : 30
city : ParisUsa .items() per ottenere le coppie chiave-valore insieme:
for key, value in person.items():
print(key, ":", value)Output:
name : Alice
age : 30
city : ParisVedi anche il capitolo Loop Dictionaries per altri pattern.
Cicli for annidati
Un ciclo for può essere inserito all'interno di un altro ciclo for. Il ciclo interno viene eseguito completamente per ogni singola iterazione del ciclo esterno.
Output:
red apple
red banana
red cherry
big apple
big banana
big cherry
tasty apple
tasty banana
tasty cherryAttenzione: break all'interno di un ciclo annidato esce solo dal ciclo interno, non da entrambi. Per uscire da entrambi i cicli contemporaneamente è necessaria una variabile flag oppure bisogna riorganizzare il codice in una funzione e usare return.
L'istruzione pass
pass è un segnaposto che non esegue alcuna operazione. Usala quando un ciclo for è richiesto sintatticamente ma non hai ancora nulla da inserire nel corpo:
for i in range(3):
pass # TODO: implement laterSenza pass, Python solleverebbe un IndentationError perché un blocco vuoto è sintassi non valida.
Cicli for vs list comprehension
Un pattern comune è costruire una nuova lista all'interno di un ciclo for:
squares = []
for x in range(1, 6):
squares.append(x ** 2)
print(squares)Output: [1, 4, 9, 16, 25]
Python offre un'alternativa più concisa chiamata list comprehension:
squares = [x ** 2 for x in range(1, 6)]
print(squares)Output: [1, 4, 9, 16, 25]
Le list comprehension sono idiomatiche per trasformazioni semplici; usa un ciclo for ordinario quando il corpo è complesso o ha effetti collaterali.
Scegliere tra for e while
| Situazione | Preferire |
|---|---|
| Conosci il numero di iterazioni o hai un iterabile | for |
| Iteri finché una condizione cambia | while |
| Hai bisogno di indice e valore | for + enumerate() |
| Iteri su due liste contemporaneamente | for + zip() |