Ciclo for e range
In questa pagina 7
Sintassi
for elemento in iterabile:
corpoA ogni iterazione elemento viene legato al successivo valore dell'iterabile (lista, stringa, tupla, range, dizionario, file...). Il ciclo termina quando gli elementi finiscono. A differenza del C, il for di Python non ha un contatore implicito: scorre valori.
for c in "ciao":
print(c) # c, i, a, o su righe diverse
for x in [3, 1, 4]:
print(x * 2)range
range(start, stop, step) produce gli interi da start (incluso) a stop (escluso) con passo step. Non crea una lista: genera i valori al bisogno.
| Chiamata | Valori |
|---|---|
range(5) |
0, 1, 2, 3, 4 |
range(2, 6) |
2, 3, 4, 5 |
range(0, 10, 3) |
0, 3, 6, 9 |
range(5, 0, -1) |
5, 4, 3, 2, 1 |
range(5, 0) |
nessuno |
for i in range(len(lista)): # serve l'indice (es. per modificare lista[i])
lista[i] *= 2Funzioni utili con for
for i, x in enumerate(lista): # indice e valore insieme
print(i, x)
for nome, voto in zip(nomi, voti): # due sequenze in parallelo (si ferma alla più corta)
print(nome, voto)
for x in reversed(lista): ... # al contrario
for x in sorted(lista): ... # in ordine, senza modificare listaPreferire enumerate a range(len(...)) quando servono sia indice sia valore.
break, continue, else
Funzionano come nel Ciclo whileCiclo while, cicli controllati da contatore, da sentinella e da condizione; break, continue, else; terminazione e invariante di ciclo.Ciclo while →: else viene eseguito se il ciclo arriva in fondo senza break.
for x in lista:
if x < 0:
print("trovato un negativo:", x)
break
else:
print("nessun negativo")Cicli annidati
# tabellina 1..9
for i in range(1, 10):
for j in range(1, 10):
print(f"{i * j:3}", end="")
print()Il ciclo interno viene eseguito per intero a ogni iterazione dell'esterno: iterazioni esterne × interne = esecuzioni del corpo (vedi Complessità computazionaleCosto di un algoritmo in funzione della dimensione dell'input; caso peggiore, migliore e medio; notazione O-grande e classi di crescita; come contare i passi di cicli e ricorsioni; costo delle operazioni Python.Complessità computazionale →). break esce solo dal ciclo interno.
for o while?
for: si conosce l'insieme dei valori da scorrere (elementi di una sequenza, intervallo di interi).while: il numero di iterazioni dipende da una condizione che si scopre durante l'esecuzione (convergenza, input dell'utente, ricerca con uscita anticipata in strutture non sequenziali).
Errori tipici
- Aspettarsi che
range(1, n)includan. - Modificare la variabile del ciclo sperando di saltare elementi:
i += 1dentrofor i in range(...)non ha effetto sull'iterazione successiva. - Aggiungere o togliere elementi alla lista che si sta scorrendo: elementi saltati o ciclo infinito. Scorrere una copia (
for x in lista[:]) o costruire una nuova lista. for x in lista: x = 0non modifica la lista (rilega solo il nomex).