Capitolo 9. Cicli For

Niente paragrafi, partiamo subito con un esercizio che ovviamente dovete provare sui vostri computer :=) :

onetoten = range(1,11)
for count in onetoten:
        print count
L'onnipresente output:
1
2
3
4
5
6
7
8
9
10
L'output è familiare ma il codice è diverso. La prima linea utilizza la funzione range che richiede due argomenti, proprio come nell'esempio: range (inizio, fine). inizio è il primo numero che viene prodotto mentre fine è maggiore di 1 dell'ultimo numero prodotto. Questo programma avrebbe anche potuto essere scritto più brevemente:
for count in range(1,11):
        print count
Ecco a voi alcuni esempi per capire meglio il funzionamento di range:
>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)
[-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> range(21,5)
[]
Avrete certamente notato la presenza di una nuova struttura di controllo, gli esempi infatti usano la struttura for. La sintassi del controllo for è: for variabile nella lista:. La lista viene quindi attraversata dal primo elemento all'ultimo e mentre il ciclo for compie il suo tragitto ogni elemento viene inserito in una variabile.

Ecco un'altra dimostrazione:

demolist = ['life',42, 'the universe', 6,'and',7,'everything']
for item in demolist:
    print "The Current item is:",
    print item
Output:
The output is:
The Current item is: life
The Current item is: 42
The Current item is: the universe
The Current item is: 6
The Current item is: and
The Current item is: 7
The Current item is: everything
Osservate come il ciclo for scorra tutti gli elementi nella lista. (Provate ad esempio a togliere la virgola alla fine dell'istruzione print o a cambiare il testo all'interno della stessa... smanettateci un po' insomma :=) ). Quindi, a cosa serve? Beh, serve a scorrere uno ad uno tutti gli elementi di una lista e a fare qualcosa con ognuno di essi. Per esempio potete sommare tutti gli elementi:
list = [2,4,6,8]
sum = 0
for num in list:
        sum = sum + num
print "The sum is: ",sum
L'output sarà semplicemente:
The sum is: 20
Altrimenti potreste scrivere un semplice programma per trovare i duplicati in una lista. Ad esempio:
list = [4, 5, 7, 8, 9, 1,0,7,10]
list.sort()
prev = list[0]
del list[0]
for item in list:
        if prev == item:
                print "Duplicate of ",prev," Found"
        prev = item
Il cui output è ovviamente:
Duplicate of 7 found
Va bene, allora come funziona? Scriviamo il programma in modo che ritorni un risultato passaggio per passaggio, qualcosa di molto simile al debugging:
l = [4, 5, 7, 8, 9, 1,0,7,10]
print "l = [4, 5, 7, 8, 9, 1,0,7,10]","\tl:",l
l.sort()
print "l.sort()","\tl:",l
prev = l[0]
print "prev = l[0]","\tprev:",prev
del l[0]
print "del l[0]","\tl:",l
for item in l:
        if prev == item:
                print "Duplicate of ",prev," Found"
        print "if prev == item:","\tprev:",prev,"\titem:",item
        prev = item
        print "prev = item","\t\tprev:",prev,"\titem:",item
l'output è cambiato:
l = [4, 5, 7, 8, 9, 1,0,7,10]   l: [4, 5, 7, 8, 9, 1, 0, 7, 10]
l.sort()        l: [0, 1, 4, 5, 7, 7, 8, 9, 10]
prev = l[0]     prev: 0
del l[0]        l: [1, 4, 5, 7, 7, 8, 9, 10]
if prev == item:        prev: 0         item: 1
prev = item             prev: 1         item: 1
if prev == item:        prev: 1         item: 4
prev = item             prev: 4         item: 4
if prev == item:        prev: 4         item: 5
prev = item             prev: 5         item: 5
if prev == item:        prev: 5         item: 7
prev = item             prev: 7         item: 7
Duplicate of  7  Found
if prev == item:        prev: 7         item: 7
prev = item             prev: 7         item: 7
if prev == item:        prev: 7         item: 8
prev = item             prev: 8         item: 8
if prev == item:        prev: 8         item: 9
prev = item             prev: 9         item: 9
if prev == item:        prev: 9         item: 10
prev = item             prev: 10        item: 10
La ragione per cui ho inserito così tanti print nel codice è che in questo modo riuscite a vedere il comportamento del programma linea per linea (quindi se non riuscite ad immaginare il problema di un programma malfunzionante tentate di mettere molti print per individuarlo con più facilità).

Il programma inizia con la nostra solita noiosa e vecchia lista che ordina nella seconda linea a seconda del valore degli elementi (dal minore al maggiore) in modo che ogni duplicato, se ce ne sono, sia vicino all'"originale". Dopo questi primi passi viene inizializzata una variabile prev(ious). Il primo elemento della lista (0) viene cancellato perché altrimenti sarebbe incorrettamente sembrato un duplicato della variabile prev. La linea successiva, come potete vedere, è un ciclo for. Ogni singolo elemento della lista viene in questo modo testato e confrontato con il precedente per riconoscere eventuali duplicati. Questo avviene memorizzando il valore del precedente elemento della lista nella variabile prev e confrontando quest'ultima con l'elemento corrente. prev viene quindi di volta in volta (ad ogni ciclo) riassegnato in modo che l'elemento corrente venga sempre confrontato con quello appena precedente nella lista.

Osservate anche come viene utilizzato /t per stampare una tabulazione.

Un'altro modo per utilizzare un ciclo for è ripetere la stessa azione un determinato numero di volte. Ecco il codice per visualizzare i primi 11 numeri della serie di Fibonacci:

a = 1
b = 1
for c in range(1,10):
        print a,
        n = a + b
        a = b
        b = n
con il sorprendente output:

1 1 2 3 5 8 13 21 34

Tutto quello che potete fare con i cicli for potete farlo anche con while ma grazie ai cicli for è più semplice scorrere tra tutti gli elementi di una lista o compiere un'azione un determinato numero di volte.