13: L'ISTRUZIONE for

L'ISTRUZIONE for

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

NUOVO PROGRAMMA: citta_grandi_piccole.py

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.

SCORRERE GLI ELEMENTI DI UNA LISTA

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:

NUOVO PROGRAMMA: prima_z.py

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

ESERCIZIO 13.1 Molti dei vecchi programmi in cui abbiamo usato il while possono ora essere implementati più facilmente con il for. Modificate i programmi: ESERCIZIO 13.2 Modificare ancora il programma 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
oppure
Bravo! Non hai nessuna insufficienza

ESERCIZIO 13.3 PROGRAMMA PASSO PASSO: temperature.py
  1. Copiate nel programma questa lista:
    citta = ["Torino", "Milano", "Venezia", "Bologna", "Firenze", "Roma", "Napoli", "Bari"]
  2. Create una lista temp inizialmente vuota
  3. Per ogni città chiedete all'utente di inserire la temperatura del giorno (numero int) ed aggiungetela alla lista temp
  4. Alla fine stampate il nome di ogni città con la sua temperatura
SUGGERIMENTO: per il passo 3 serve un for il cui iteratore può variare direttamente sugli elementi della lista, mentre per il passo 4 è necessario far variare l'iteratore sugli indici.
SOLUZIONI

CICLI ANNIDATI

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:

NUOVO PROGRAMMA: cicli_annidati.py

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