Salta al contenuto
Note per Studenti Ciclo for e range

Ciclo for e range

In questa pagina 7
In questa pagina 7

Sintassi

Definizione (ciclo for e iterabili)

for elemento in iterabile:
    corpo

A 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.

Esempio. for c in "ciao" scorre c, i, a, o; [x * 2 for x in [3, 1, 4]] vale [6, 2, 8].

python
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 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

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].

python
for i in range(len(lista)):   # serve l'indice (es. per modificare lista[i])
    lista[i] *= 2

Funzioni utili con for

python
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 lista

Preferire 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.

python
for x in lista:
    if x < 0:
        print("trovato un negativo:", x)
        break
else:
    print("nessun negativo")

Cicli annidati

python
# 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: nn iterazioni esterne × mm interne = n⋅mn \cdot m 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.

Esempio. for i in range(3): con dentro for j in range(4): esegue il corpo 3⋅4=123\cdot4=12 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) includa n.
  • Modificare la variabile del ciclo sperando di saltare elementi: i += 1 dentro for 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 = 0 non modifica la lista (rilega solo il nome x).

Versione ripasso

Sintassi

python
for elemento in iterabile:
    corpo

Scorre 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) →\rightarrow 0, 1, 2, 3, 4
  • range(2, 6) →\rightarrow 2, 3, 4, 5
  • range(0, 10, 3) →\rightarrow 0, 3, 6, 9
  • range(5, 0, -1) →\rightarrow 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 (n×mn \times m 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) esclude n.
  • Modificare la variabile del ciclo (i += 1) dentro il for non altera l'iterazione.
  • Modificare la lista (aggiungere/rimuovere elementi) mentre la si scorre.
  • for x in lista: x = 0 non modifica la lista.

Esercizi su questo argomento

Teoria collegata