Ciclo for e range
In questa pagina 7
In questa pagina 7
Sintassi
Definizione (ciclo for e iterabili)
for elemento in iterabile: corpoA ogni iterazione
elementoviene legato al successivo valore dell'iterabile (lista, stringa, tupla, range, dizionario, file...). Il ciclo termina quando gli elementi finiscono. A differenza del C, ilfordi Python non ha un contatore implicito: scorre valori.
Esempio. for c in "ciao" scorre c, i, a, o; [x * 2 for x in [3, 1, 4]] vale [6, 2, 8].
for c in "ciao":
print(c) # c, i, a, o su righe diverse
for x in [3, 1, 4]:
print(x * 2)range
Definizione (range).
range(start, stop, step)produce gli interi dastart(incluso) astop(escluso) con passostep. 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
Esempio. list(range(2, 6)) vale [2, 3, 4, 5], list(range(0, 10, 3)) vale [0, 3, 6, 9] e list(range(5, 0, -1)) vale [5, 4, 3, 2, 1].
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()Proprietà (cicli annidati). 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 →).
breakesce solo dal ciclo interno.
Esempio. for i in range(3): con dentro for j in range(4): esegue il corpo volte.
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).
Versione ripasso
Sintassi
for elemento in iterabile:
corpoScorre gli elementi di un iterabile (lista, stringa, tupla, range, dizionario, file). Non ha un contatore implicito.
range
range(start, stop, step) produce interi da start a stop (escluso) con passo step. Genera i valori al bisogno (non crea una lista).
range(5)0, 1, 2, 3, 4range(2, 6)2, 3, 4, 5range(0, 10, 3)0, 3, 6, 9range(5, 0, -1)5, 4, 3, 2, 1
Funzioni utili con for
enumerate(lista): restituisce indice e valore insieme.zip(nomi, voti): scorre sequenze in parallelo (si ferma alla più corta).reversed(lista): scorre al contrario.sorted(lista): scorre in ordine, senza modificare la lista.
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 →: l'else viene eseguito se il ciclo termina senza break.
Cicli annidati
Il ciclo interno viene eseguito per intero a ogni iterazione dell'esterno ( esecuzioni totali, 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.while: il numero di iterazioni dipende da una condizione dinamica.
Errori tipici
- Dimenticare che
range(1, n)escluden. - Modificare la variabile del ciclo (
i += 1) dentro ilfornon altera l'iterazione. - Modificare la lista (aggiungere/rimuovere elementi) mentre la si scorre.
for x in lista: x = 0non modifica la lista.