Il ciclo (loop) for è uno dei cicli di iterazione messi a disposizione dal linguaggio Python, si tratta in sostanza di un costrutto, comune anche ad altri linguaggi, che consente di ripetere un’operazione un certo numero di volte, più tecnicamente "iterare una sequenza o un oggetto", fino alla soddisfazione di una determinata condizione (implicita) che terminerà il ciclo.
Per chiarire tale dinamica sarà possibile proporre un semplice esempio basato sull’impiego delle liste, queste ultime sono un tipo di dato supportato da Python che verrà analizzato nel dettaglio in seguito, per il momento basti sapere che una lista permette di gestire un insieme di valori di diversa natura (stringhe, interi, decimali) delimitati da parentesi quadre e separati tramite una virgola. Il codice proposto di seguito permetterà di ciclare e visualizzare in output tutti gli elementi presenti in una lista definita dallo sviluppatore.
# Ciclare gli elementi presenti in una lista tramite il ciclo for
# definizione della lista
fibonacci = [1,1,2,3,5,8,13,21,34,55,89,144]
# iterazione dei valori in lista
for val in fibonacci:
# stampa dei valori iterati
print(val)
Nell’esempio mostrato la condizione da soddisfare per la terminazione del ciclo sarà quindi quella di stampare fino all’ultimo valore presente nella lista passata come argomento, nel nostro caso "fibonacci". Un fattore sintattico molto importante da tenere a mente riguarda il fatto che nella digitazione di un ciclo for l’engine di Python si aspetta che l’istruzione associata al ciclo venga indentata (si noti infatti la presenza di una tabulazione prima del comando print()), ignorando tale regola in fase di esecuzione si assisterà alla generazione di un errore segnalato tramite la notifica:
SyntaxError: expected an indented block
Cicli e istruzioni condizionali
E’ interessante notare come il ciclo for possa essere sfruttato anche per eseguire operazioni più complesse rispetto alla semplice stampa a video degli elementi che compongono una sequenza; a tal proposito si potrà modificare la piccola applicazione precedentemente proposta in modo che quest’ultima sommi tutti i valori presenti nella lista restituendo in output il totale ottenuto.
# Sommare gli elementi presenti in una lista
# tramite il ciclo for
# definizione della lista
fibonacci = [1,1,2,3,5,8,13,21,34,55,89,144]
# variabile per l'archiviazione della somma
# dei valori in lista
totale = 0
# sommatoria dei valori in lista
for val in fibonacci:
totale = totale + val
# stampa della somma ottenuta
print(totale)
Nel caso specifico la condizione di terminazione del ciclo è il raggiungimento del totale tra tutti i valori degli elementi in lista, ma sarebbe possibile rendere il sorgente più articolato introducendo un controllo basato su if che escluda dalla somma determinati valori:
# Sommare gli elementi presenti in una lista
# tramite il ciclo for
# escludendo tutti i valori inferiori a 3
# definizione della lista
fibonacci = [1,1,2,3,5,8,13,21,34,55,89,144]
# variabile per l'archiviazione della somma
# dei valori in lista
totale = 0
# sommatoria dei valori in lista
for val in fibonacci:
# controllo sul valore degli elementi sommati
if val > 3:
totale = totale + val
# controllo sul totale ottenuto
if totale == 369:
# stampa della somma ottenuta
print("Il totale della somma è " + str(totale))
else:
# istruzione alternativa in caso
# di esito negativo del controllo
print ("Valore differente da quello atteso.")
Modificando il codice utilizzato è mutata anche la condizione per la terminazione del ciclo, questa volta infatti dovranno essere sommati tutti gli elementi presenti in lista tranne quelli di valore inferiore a "3". L’output dell’applicazione originale era pari a "376", ma dato che nella sequenza sono presenti quattro valori inferiori o uguali a "3" ("1, 1, 2 e 3"), dopo le modifiche apportare il risultato sarà "369", cioè l’output iniziale meno il totale dei valori ora esclusi.
Ciclo for applicato agli intervalli di valori
La funzione range() permette di non dover digitare sequenze di valori eccessivamente lunghe e consente di definire un intervallo di valori sulla base di due parametri: un valore iniziale e un valore di terminazione; è poi possibile passare alla funzione un terzo argomento (step) che rappresenta le posizioni che dovranno essere ignorate all’interno dell’intervallo. A titolo di esempio si esegua l’istruzione seguente:
# Stampa di un intervallo di valori compresi tra 5 e 20
for val in range(5,20):
print (val)
Il risultato ottenuto sarà rappresentato da tutti i valori interni all’intervallo che va da "5" a "19", in quanto valore di terminazione "20" viene considerato invece al di fuori dell’intervallo e non verrà restituito dall’applicazione. Detto questo, è possibile definire anche uno step che influenzerà direttamente la generazione dell’output:
# Stampa di un intervallo di valori compresi tra 5 e 20
# escludendo due posizioni ad ogni iterazione
for val in range(5,20,2):
print (val)
Questa volta la presenza del terzo parametro permetterà di escludere dal risultato un numero di posizioni pari al valore associato a tale argomento per ogni iterazione del ciclo, motivo per il quale non si otterrà più la sequenza "5 6 7 8 .. 19" ma "5 7 9 11 .. 19".