Niente paragrafi, partiamo subito con un esercizio che ovviamente
dovete provare sui vostri computer :=) :
L'onnipresente output:
onetoten = range(1,11)
for count in onetoten:
print count
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:
1
2
3
4
5
6
7
8
9
10
Ecco a voi alcuni esempi per capire meglio il
funzionamento di range:
for count in range(1,11):
print count
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.>>> 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)
[]
Ecco un'altra dimostrazione:
Output:
demolist = ['life',42, 'the universe', 6,'and',7,'everything']
for item in demolist:
print "The Current item is:",
print item
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:
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
L'output sarà semplicemente:
list = [2,4,6,8]
sum = 0
for num in list:
sum = sum + num
print "The sum is: ",sum
Altrimenti potreste scrivere un semplice programma
per trovare i duplicati in una lista. Ad esempio:
The sum is: 20
Il cui output è ovviamente:
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
Va bene, allora come funziona? Scriviamo il programma in
modo che ritorni un risultato passaggio per
passaggio, qualcosa di molto simile al debugging:
Duplicate of 7 found
l'output è cambiato:
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
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à).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
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:
con il sorprendente output:a = 1
b = 1
for c in range(1,10):
print a,
n = a + b
a = b
b = n
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.