E' usata anch'essa per i cicli, in particolare quando serve una variabile contatore. L'istruzione
crea tale variabile automaticamente, e la fa variare nell'insieme degli elementi di una lista. Se abbiamo
bisogno di una variabile contatore che vari su un certo insieme numerico basta usare la funzione
range()
.
Come esempio riprendiamo il programma tabelline.py
e cambiamolo così:
n = int(input("Quale tabellina vuoi stampare? "))
for i in range(1, 11): # i numeri da 1 a 10
print (n, "x", i, "=", n*i)
Quando il programma arriva all'istruzione for
crea automaticamente la variabile contatore
i
e le assegna il primo elemento della lista (cioè 1). Quando si arriva alla fine del ciclo le
assegna il valore successivo (2, 3, ...) e ripete finchè non si è arrivati all'ultimo elemento. Come vedete,
rispetto al while
non c'è bisogno di inizializzare la variabile nè di incrementarla, perchè
tutto viene fatto automaticamente dal for
. Un altro vantaggio è che il contatore non è ristretto
a soli valori numerici ma può "scorrere" sugli elementi di qualsiasi lista (in Inglese si usa la parola
iterator).
citta_grandi = ["Roma", "Milano", "Napoli"]
citta_piccole = ["Tivoli", "Palombara", "Marcellina"]
for i in citta_grandi:
print(i, "e' una grande citta'")
for i in citta_piccole:
print(i, "e' una piccola citta'")
Qui alla variabile i
vengono assegnate direttamente le stringhe che compongono le due liste.
Quando dobbiamo iterare su tutti gli elementi di una lista abbiamo due alternative.
Se per i nostri calcoli non abbiamo bisogno degli indici degli elementi possiamo far variare l'iteratore direttamente sugli elementi della lista, come abbiamo fatto nel programma precedente:
# in questo esempio i contiene gli elementi della lista (stringhe)
prima_z = ["Abbotti", "Bombetti", "Casini", "De Rompis", "Frittolini", "Grufolo",
"Lolletti", "Mollacchi", "Nonnazzo", "Paraponzi", "Rottura", "Scarsone" ]
for i in prima_z:
print(i)
Se invece ci servono anche gli indici degli elementi possiamo far variare l'iteratore sui numeri da 0
alla lunghezza della lista meno 1, usando la funzione range()
. Per fare riferimento agli
elementi basterà usare le parentesi quadre. Aggiungete queste righe al programma:
# in questo esempio i contiene gli indici degli elementi (0, 1, 2, ... n-1)
for i in range(len(prima_z)): # range: i va da 0 alla lunghezza meno 1
print(i + 1, prima_z[i]) # prima_z[i] e' l' i-esimo elemento
# notate: ho usato i+1 per avere i numeri da 1 a n
Notate che scrivendo for i in range(len(lista))
siamo sicuri che tutto sia a posto, perchè
gli indici nella lista variano da 0 alla lunghezza meno 1, ed il range
restituirà proprio
l'insieme di indici voluti.
Anche per il for
è possibile usare le istruzioni break, continue, else
come per il while
.
while
possono ora essere
implementati più facilmente con il for
. Modificate i programmi:
divisibilita.py
: attenzione ai parametri del
range()
: il contatore deve partire da 2 e arrivare a n // 2
incluso.prova_continue.py
: notate che in questo
caso l'incremento del contatore poteva portare ad un ciclo senza fine se inserito nel posto sbagliato
(rianalizzate quello che fa il programma ...). Con il for
il problema svanisce: la
variabile contatore viene comunque incrementata anche se non si arriva fino alla fine del ciclo.statistiche_voti.py
abbiamo
due cicli while
da sostituire con dei for
.statistiche_voti.py
in modo che conti le insufficenze (voti < 6). SUGGERIMENTO: è
necessaria un'altra variabile insuff
inizializzata a 0: basta scorrere tutti i voti e
incrementarla ogni volta che si trova un'insufficienza. Alla fine, tra le statistiche, il programma
dovrebbe stampare:Hai 2 insufficienze
Bravo! Non hai nessuna insufficienza
citta = ["Torino", "Milano", "Venezia", "Bologna", "Firenze", "Roma", "Napoli", "Bari"]
temp
inizialmente vuotaint
) ed
aggiungetela alla lista temp
for
il cui iteratore può variare direttamente sugli
elementi della lista, mentre per il passo 4 è necessario far variare l'iteratore sugli indici.E' possibile scrivere due o più cicli (con variabili contatore diverse) uno all'interno dell'altro. In questo caso il ciclo più interno sarà ripetuto ad ogni incremento del contatore di quello più esterno. Vediamo un esempio:
for i in (1, 2, 3):
for j in ("a", "b", "c"):
print("i =", i, "e j =", j)
L'output di questo programma è:
i = 1 e j = a
i = 1 e j = b
i = 1 e j = c
i = 2 e j = a
i = 2 e j = b
i = 2 e j = c
i = 3 e j = a
i = 3 e j = b
i = 3 e j = c
Notate che il ciclo interno (con il contatore j
) viene ripetuto tre volte, una per ogni incremento del contatore
i
nel ciclo esterno.
Fine della lezione