I cicli for e while

I cicli for e while#

I cicli sono fondamentali per automatizzare operazioni che richiedono una ripetizione di alcune istruzioni. Ad esempio, durante il corso utilizzeremo più volte i cicli per implementare algoritmi iterativi, con lo scopo di risolvere un problema di algebra lineare.

In Python, ci sono due tipologie principali di cicli: i cicli a orizzonte determinato (ciclo for), e quelli a orizzonte indeterminato (ciclo while).

Ciclo for#

La sintassi del ciclo for è la seguente:

for <VARIABILE> in <ITERABILE>:
    <RIPETIZIONE>

Andiamo a spiegare i singoli termini che compaiono nell’algoritmo sopra. La definizione del ciclo inizia definendo una variabile (sopra indicata dal placeholder <VARIABILE>, che viene inizializzata all’interno del ciclo e non deve, quindi, essere già stata utilizzata precedentemente nel codice), assieme ad un iterabile (una lista, tupla, stringa o un generatore). All’inizio del ciclo, <VARIABILE> viene inizializzata col primo valore dell’iterabile, e il codice all’interno del corpo del ciclo viene eseguito assegnando tale valore alla variabile.

Dopodiché, il valore di <VARIABILE> si aggiorna, acquisendo il valore del secondo termine di <ITERABILE>, e il corpo del ciclo viene ripetuto col nuovo valore. Questa operazione viene ripetuta finché <VARIABILE> non assume l’ultimo valore presente in <ITERABILE>. A quel punto, il ciclo termina e l’esecuzione del codice continua tranquillamente.

# Inizializzo un iterabile
iterable = (2, 1, 4, 3)
for n in iterable:
    print(n)
2
1
4
3

L’utilizzo più comune del ciclo for vuole che la variabile del ciclo assuma valori crescenti, partendo da 0 e arrivando ad un certo valore prefissato. Per ottenere questo risultato, è possibile utilizzare la funzione Python range(START, STOP, STEP) che ritorna un generatore contenente valori numerici da START (incluso) a STOP (escluso) con passo uguale a STEP. Ad esempio:

# Stampa i numeri da 0 a 4
for i in range(5): # quando un solo valore è specificato -> START = 0, STEP = 1.
    print(i)
0
1
2
3
4

Note

Il numero di iterazioni del ciclo NON viene pre-calcolato. Quindi, allungare o accorciare l’iterabile durante le iterazioni modifica il numero di iterazioni del ciclo.

Ad esempio, il seguente codice (se eseguito) genera un ciclo infinito.

"""
# Definisco un iterabile
iterable = [1, 2, 3, 4, 5]
for i in iterable:
    print(i)
    iterable.insert(i+1, i-1)
    iterable.append(i)
print(iterable)
"""
'\n# Definisco un iterabile\niterable = [1, 2, 3, 4, 5]\nfor i in iterable:\n    print(i)\n    iterable.insert(i+1, i-1)\n    iterable.append(i)\nprint(iterable)\n'

Ciclo while#

La sintassi del ciclo while è la seguente:

while <CONDIZIONE>:
    <RIPETIZIONE>

e il suo funzionamento è estremamente intuitivo: finché la condizione (che DEVE essere una variabile booleana) continua a valere True, il ciclo continua ad eseguirsi.

# Inizializzo la condizione
continua: bool = True

# Inizializzo una variabile intera (per esempio)
i = 0

# Ciclo while
while continua:
    if i == 5:
        continua = False
    print(i)

    # Aggiornamento della variabile
    i = i + 1
0
1
2
3
4
5

Warning

Uno degli aspetti più delicati del ciclo while è la possibilità di cadere in un ciclo infinito (che avviene quando la variabile <CONDIZIONE> rimane sempre True). Per evitare che questo accada, è buona norma definire una condizione di arresto per numero massimo di cicli.

Questo può essere ottenuto anche tramite il comando Python break che, quando invocato, termina immediatamente il ciclo in corso (vale sia per cicli for che while).

# Inizializzo la condizione
continua: bool = True
maxiter: int = 10 # Numero massimo di iterazioni del ciclo

# Inizializzo una variabile intera (per esempio)
i = 0

# Ciclo while
while continua:
    if i < 0: # NON si verificherà mai
        continua = False
    print(i)

    # Aggiornamento della variabile
    i = i + 1

    # Stoppo il codice se supera le iterazioni massime
    if i == maxiter:
        break
0
1
2
3
4
5
6
7
8
9