07. Ciclo while, istruzioni break e continue

Anche questa è una puntata dedicata alla gestione del Flusso: introdurremo infatti uno dei due cicli di Python, il ciclo while, e due nuove istruzioni associate ai cicli: break e continue.

In programmazione, un loop (o ciclo) è un costrutto che permette di ripetere una o più istruzioni per un certo numero di volte o finché permane una determinata condizione.


L'Istruzione while in Python

Il nome while loop racchiude in se la spiegazione del suo funzionamento e il perché della sua esistenza.

La parola while può infatti essere tradotta in italiano come finché o mentre, e il ciclo while ci permette proprio di eseguire un blocco di codice finché una determinata condizione è e restaTrue.

Facciamo subito un esempio di codice per prendere familiarità con la sintassi e chiarirci le idee:

counter = 0

while counter <= 10:
    print(counter)
    counter += 1

Nota: il codice counter +=1 è equivalente a counter = counter + 1, e ci permette di riassegnare alla variabile counter il valore che aveva in precedenza + 1.

Eseguiamo il codice:

# output:

0
1
2
3
4
5
6
7
8
9
10

Che è successo? Diamo uno sguardo al diagramma di flusso:

flowchart_while_loop.png


L'istruzione while controlla se alla variabile counter è associato un valore minore o uguale a 10, e visto che la condizione risulta inizialmente veritiera, il programma entra nel loop, mandando in print la variabile counter, e quindi sommandoci 1.

Questo comportamento si ripete finché la condizione counter <= 10 risulta True, cioè fino a che nel contatore non è presente un valore superiore a 10, caso in cui il ciclo while verrà interrotto e il codice associato non verrà più eseguito. La differenza con quanto visto nella lezione precedente in merito all'istruzione if è quindi abbastanza evidente.

Modifichiamo il codice sostituendo while con if ed eseguiamolo nuovamente:

counter = 0

if counter <= 10:
    print(counter)
    counter += 1
# output:

0

Ecco che il programma si comporta come ci si poteva aspettare: il codice interno al blocco viene eseguito un'unica volta, e il programma quindi termina.


Cicli while Infiniti

Ma cosa succederebbe qualora la condizione di controllo restasse perennemente True? In questo caso otterremmo un un loop infinito. Proviamo ad innescarne uno:

while 15 == 15:
    print("dentro al ciclo!!!")

Eseguiamo:

# output:

dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
dentro al ciclo!!!
(...)

Per quanto questo infinite loop non sia un errore del linguaggio di programmazione ma anzi, possa dimostrarsi estremamente utile, qualora vi troviate ad averne innescato uno per errore, volendo bloccarlo vi basterà cliccare CTRL-C.

Per rendere il tutto ancora più esplicito possiamo volendo modificare il codice scritto in precedenza usando una variabile inizializzata usando il booleano True.

counter = 0
run = True

while run == True:
    print(counter)
    counter += 1

Notiamo inoltre come in questo caso avremmo potuto semplificare il nostro codice escludendo l'operatore "uguale a", in quanto stiamo facendo un controllo su un Booleano!

Per tanto possiamo fare:

counter = 0
run = True

while run:
    print(counter)
    counter += 1

Vi invito a scoprire da voi l'output di questo codice!

Per proseguire, come abbiamo accennato a inizio lezione, ci sono due istruzioni correlate al ciclo while di cui andremo ora a parlare, e sono l'istruzione break e l'istruzione continue.


L'istruzione break in Python

L'istruzione break serve per terminare un ciclo while prematuramente: non appena quest'espressione viene letta e processata all'interno del ciclo, Python blocca il loop istantaneamente.

Modifichiamo il codice usato in precedenza per usare anche l'istruzione break:

run = True
stop = 1000
counter = 0

while run == True:
    print(counter)
    counter += 1
    if counter > stop:
        print("Sto uscendo dal loop...")
        break

Una volta che nel contatore è presente il numero 1000, quando al loop successivo viene aggiunto un 1 portandolo ad 1001, la condizione relativa all'istruzione if diventa True e viene così processato il break, che blocca il ciclo infinito all'istante.


L'istruzione continue in Python

L'istruzione continue invece è simile a break, ma invece di interrompere il ciclo fa saltare tutto il codice dopo l'istruzione e fa ripartire Python dalla prima riga del ciclo.

Facciamo un esempio:

run = True
skip = 5
counter = 0

while counter < 10:
    counter += 1
    if counter == skip:
        print("Sto saltando " + str(skip))
        continue
    print(counter)

Quindi, counter sempre inizializzato a 0, a inizio ciclo viene incrementato, se però risulta uguale a 3, allora non viene passato a print() ma il ciclo si ripete dall'inizio. Quando in counter è presente 9, il valore viene incrementato portandolo a 10, e una volta mandato in output, il ciclo non risulta più True e il programma si ferma.

# output:

1
2
3
4
Sto saltando 5
6
7
8
9
10