Articolo originale: Python While Loop Tutorial – While True Syntax Examples and Infinite Loops

Se vuoi imparare come funzionano i loop while in Python, questo è l'articolo che fa per te.

L'iterazione while è uno strumento di programmazione molto importante che puoi utilizzare per ripetere delle sequenze di codice.

In quest'articolo, imparerai:

  • Cosa sono i loop while.
  • A cosa servono.
  • Quando dovrebbero essere utilizzati.
  • Come funzionano in background.
  • Come scrivere un loop while in Python.
  • Cosa sono i loop infiniti e come interromperli.
  • Come while True viene utilizzato e la sua sintassi di base.
  • Come utilizzare il comando break per interrompere un loop while.

Imparerai come i loop funzionano dietro le quinte con esempi, tabelle, e diagrammi.

Sei pronto? Iniziamo. 🔅

🔹 Scopo e casi in cui utilizzare i loop while

Partiamo dallo scopo dei loop while. A cosa servono?

Vengono utilizzati per ripetere delle sequenze di codice un numero imprecisato di volte, finché una determinata condizione è verificata (True), mentre l'iterazione si ferma quando la condizione diventa falsa (False).

Quando scriviamo un loop while, non definiamo in modo esplicito il numero di iterazioni che devono essere eseguite, ma solamente la condizione che deve risultare vera (o falsa) per far sì che il processo continui (o si interrompa).

💡 Suggerimento: se la condizione di loop non diventa mai falsa, allora il loop sarà infinito e, teoricamente, non si fermerà mai senza un intervento esterno.

Ecco alcuni esempi pratici dell'utilizzo del loop while:

  • Input utente: quando richiediamo un input di un utente, è necessario controllare che il valore immesso sia valido ma non è possibile sapere quante volte l'input inserito non sarà corretto prima che il programma possa proseguire. Così, questo è un caso in cui questo tipo di loop si applica alla perfezione.
  • Ricerca: la ricerca di un elemento all'interno di una struttura di dati è un altro caso in cui l'utilizzo del loop while risulta particolarmente indicato. Non possiamo sapere a priori quante iterazioni saranno necessarie per trovare il valore cercato, ad esempio, l'algoritmo di ricerca binaria può essere attuato tramite l'uso di un loop while.
  • Giochi: in un gioco, un loop while può essere utilizzato per mantenere attiva la logica di base finchè un giocatore non perde o il gioco finisce. Anche in questo caso, l'uso di questo tipo di loop e molto appropriato perché non si può sapere esattamente cosa accadrà.

🔸 Come funziona un loop while

Adesso che sappiamo per cosa vengono utilizzati, vediamo qual è la logica di base dei loop while e come funzionano dietro le quinte. Consideriamo il diagramma:

image-24
Loop while

Analizziamo il processo nel dettaglio:

  • Il processo inizia nel momento in cui il loop while viene raggiunto durante l'esecuzione del programma.
  • La condizione viene valutata per verificare se sia vera (True) o falsa (False).
  • Se la condizione è vera (True), il blocco di istruzioni che appartiene  al loop viene eseguito.
  • La condizione di loop viene valutata nuovamente.
  • Se la condizione è ancora verificata (True), la sequenza di istruzioni viene eseguita di nuovo e il processo si ripete.
  • Quando la condizione non è più verificata (False), l'iterazione si interrompe e l'esecuzione del programma prosegue oltre il loop.

Una delle caratteristiche più importanti dei loop while è che le variabili all'interno della condizione di loop non vengono aggiornate automaticamente, ma dobbiamo aggiornarle esplicitamente scrivendo il codice in modo appropriato per far sì che il loop si interrompa quando la condizione di loop diventa falsa.

🔹  Sintassi di base dei loop while

Abbiamo visto qual è la logica alla base di un loop while. Adesso, diamo un'occhiata a come scriverne il codice  in Pyhton:

tabwhile5

Ecco gli elementi principali (in ordine):

  • La keyword while (seguita da uno spazio).
  • La condizione che determina se il loop viene eseguito o no in base al suo valore (True o False ).
  • Due punti (:) alla fine della prima riga.
  • La sequenza che dovrà essere ripetuta. Questo blocco di codice è chiamato "corpo" del loop e deve avere un'indentazione, altrimenti non viene considerato come parte del loop (osserva lo schema qui sotto).
tabwhile4

💡 Suggerimento: La Python style guide (PEP 8) raccomanda di usare 4 spazi per livello di indentazione. L'indentazione con tab dovrebbe essere utilizzata soltanto per mantenere la coerenza con del codice già indentato con tab.

🔸 Esempi di loop while

Finora abbiamo visto come funziona un loop while e come scriverne uno in Python. Adesso proviamo a capire con qualche esempio cosa accade dietro le quinte.

Funzionamento base di un loop while

Consideriamo il loop while che restituisce il valore i finché i è minore di 8 (i < 8):

i = 4

while i < 8:
    print(i)
    i += 1

Eseguendo il codice, otterremo i seguenti output:

4
5
6
7

Vediamo cosa succede in background durante l'esecuzione del codice:

tabwhile3-5
  • Iterazione 1: all'inizio, il valore di i è 4, la condizione di loop  i < 8 risulta vera (True) e l'iterazione viene eseguita. Il valore 4 viene restituito come output e incrementato di 1 per rivalutare la veridicità della condizione di loop.
  • Iterazioni 2: il valore di i è 5 e la condizione i < 8 è ancora verificata. il corpo del loop viene eseguito e il valore di i restituito è 5. i viene incrementato di 1 e il loop riparte di nuovo.
  • Iterazioni 3 e 4: Lo stesso processo viene ripetuto per la terza e la quarta iterazione, restituendo gli interi 6 e 7.
  • Prima della quinta iterazione, il valore di i è 8 e la condizione di loop i < 8 risulta falsa (False), così che il loop si interrompe.

💡 Suggerimento: se la condizione di loop è falsa all'inizio della prima iterazione, il loop non viene eseguito.

Input dell'utente usando un loop While

Vediamo un esempio di come utilizzare un loop while in un programma che gestisce un input utente. Vogliamo che la funzione input richieda all'utente di inserire un intero, che verrà aggiunto ad una lista soltanto se pari.

Ecco il codice:

# Definisci la lista
nums = []

# Il loop verrà eseguito finché la lunghezza della
# lista nums è minore di 4
while len(nums) < 4:
    # Chiedi all'utente un input e memorizzalo in una variabile come intero.
    user_input = int(input("Inserisci un intero: "))
    # Se l'input è un numero pari aggiungilo alla lista
    if user_input % 2 == 0:
        nums.append(user_input)

La condizione del loop è len(nums) < 4, così che il loop viene eseguito finché la lunghezza della lista nums è strettamente minore di 4.

Analizziamo il programma nel dettaglio:

  • Iniziamo definendo una lista vuota e assegnandola alla variabile nums.
nums = []
  • Poi, definiamo il loop while che verrà eseguito finché len(nums) < 4.
while len(nums) < 4:
  • Con la funzione input() chiediamo un input utente da memorizzare nella variabile user_input.
user_input = int(input("Inserisci un intero: "))

💡 Suggerimento: prima di assegnare il valore inserito dall'utente alla variabile, dobbiamo convertirlo in un intero tramite la funzione int() perché la funzione input() restituisce una stringa (fonte).

  • Verifica che il valore sia pari o dispari.
if user_input % 2 == 0:
  • Se è pari, lo aggiungiamo alla lista nums.
nums.append(user_input)
  • Se è dispari, il loop riparte e la condizione viene esaminata di nuovo per determinare se l'iterazione deve proseguire o meno.

Se eseguiamo il codice con degli specifici input di utenti, otteniamo i seguenti output:

Inserisci un intero: 3
Inserisci un intero: 4    
Inserisci un intero: 2    
Inserisci un intero: 1
Inserisci un intero: 7
Inserisci un intero: 6    
Inserisci un intero: 3
Inserisci un intero: 4    

Questa tabella riassume ciò che accade in background durante l'esecuzione del codice:

tabwhile2

💡 Suggerimento: il valore di partenza di len(nums) è 0 perché la lista è inizialmente vuota. L'ultima colonna della tabella mostra la lunghezza della lista alla fine dell'iterazione corrente. Questo è il valore che viene utilizzato per valutare la condizione di loop prima che inizi l'iterazione successiva.

Come puoi vedere nella tabella, l'utente inserisce un intero pari nella seconda, terza, sesta e ottava iterazione e questi valori vengono aggiunti alla lista nums.

Prima che inizi la "nona" iterazione, la condizione viene valutata di nuovo ma questa volta risulta falsa perché la lista nums contiene già quattro elementi e il loop si interrompe.

Se controlliamo il valore della lista nums quando il processo è terminato, osserveremo:

>>> nums
[4, 2, 6, 4]

Come atteso, il loop while si è interrotto quando la condizione len(nums) < 4 è risultata False.

Adesso conosci il funzionamento in background dei loop while e ne hai visto l'applicazione in qualche esempio pratico. Il prossimo passo è parlare dell'elemento chiave di questo strumento: la condizione del loop.

🔹 Suggerimenti per la condizione in loop while

Prima di iniziare con i loop while, dovresti sapere che la condizione del loop svolge un ruolo fondamentale al suo funzionamento.

image-25

Dovresti prestare molta attenzione agli operatori di confronto che scegli di utilizzare in quanto sono una fonte di bug molto comune.

Ad esempio, errori comuni includono:

  • L'utilizzo di < (minore) invece di <= (minore o uguale) (o vice versa).
  • L'utilizzo > (maggiore) invece di >= (maggiore o uguale) (o vice versa).

Un utilizzo errato può avere effetto sul numero di iterazioni del loop e anche sui suoi output.

Vediamo un esempio:

Se scriviamo la condizione del loop i < 9:

i = 6

while i < 9:
    print(i)
    i += 1

Otteniamo i seguenti output:

6
7
8

Le iterazioni che vengono completate sono tre, e il loop si interrompe quando i è uguale a 9.

La tabella mostra cosa accade in background durante l'esecuzione del codice:

tabwhile1
  • Prima della prima iterazione, il valore i è 6, la condizione i < 9 è True e il loop viene eseguito. Il valore di i viene restituito e poi incrementato di 1.
  • Nella seconda iterazione, il valore di i è 7, la condizione i < 9 è True. Il corpo del loop viene eseguito, il valore di i viene restituito e poi incrementato di 1.
  • Nella terza iterazione, il valore di i è 8, la condizione i < 9 è True. Il corpo del loop viene eseguito, il valore di i viene restituito e poi incrementato di 1.
  • La condizione viene valutata ancora prima della quarta iterazione, ma adesso il valore di i è 9, quindi i < 9 è False e il loop si interrompe.

In questo caso, abbiamo utilizzato < come operatore di confronto nella condizione. Cosa accadrebbe se utilizzassimo invece <=?

i = 6

while i <= 9:
    print(i)
    i += 1

In questo caso gli output sono:

6
7
8
9

Il loop completa un'iterazione in più perché stiamo utilizzando l'operatore "minore o uguale" (<=) , quindi la condizione è ancora True quando i è uguale a 9.

Questa tabella mostra cosa accade in background:

tabwhile

Quattro iterazioni vengono completate e la condizione viene valutata nuovamente prima della "quinta" iterazione. A questo punto, il valore di 1 è 10, la condizione i <= 9 risulta False e l'esecuzione del loop termina.

🔸 Loop while infiniti

Adesso che sai come funziona un loop while, cosa pensi che accada se la condizione del loop non risulta mai False?

image-109

Cosa sono i loop while infiniti?

Ricorda che i loop while non aggiornano automaticamente le variabili (siamo noi a doverlo fare in modo esplicito con un apposito blocco di codice), quindi non c'è garanzia che il loop si interrompa finché non scriviamo la parte di codice necessaria a far sì che, a un certo punto durante l'esecuzione, la condizione risulti falsa.

Se non lo facciamo, la condizione risulta sempre vera e il loop sarà infinito, poiché (in teoria) verrà eseguito indefinitamente.

I loop infiniti sono il tipico risultato di un bug, ma possono anche essere generati intenzionalmente quando vogliamo ripetere una sequenza di istruzioni indefinitamente fino a raggiungere un comando break.

Vediamo questi due tipi di loop infiniti negli esempi a seguire.

💡 Suggerimento: un bug è un errore nel programma che causa risultati non corretti o inattesi.

Esempi di loop infiniti

Ecco un esempio di un loop non intenzionale causato da un bug nel programma:

# Definisci una variabile
i = 5

# Esegui il loop finché i è minore di 15
while i < 15:
    # Restituisci un messaggio
    print("Hello, World!")
    

Analizzando il codice, non credi che manchi qualcosa nel corpo del loop? Esatto!

Il valore della variabile i non viene mai aggiornato (resta sempre 5), quindi la condizione i < 15 è sempre True e il loop non termina mai.

Se eseguiamo questo codice, l'output sarebbe una sequenza infinita di Hello, World! perché il corpo del loop print("Hello, World!") viene eseguito indefinitamente.

Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
.
.
.
# Continua indefinitamente

Per fermare il programma, occorre interrompere il loop manualmente premendo CTRL + C.

Una volta fatto questo, vedremo un messaggio di errore KeyboardInterrupt simile al seguente:

image-116

Per sistemare questo loop, dobbiamo aggiornare il valore della variabile i nel corpo del loop per far sì che la condizione i < 15 risulterà infine False.

Una possibile soluzione è incrementare il valore di i di 2 ad ogni iterazione:

i = 5

while i < 15:
    print("Hello, World!")
    # Aggiorna il valore di i
    i += 2

In pratica, per rimediare a un loop infinito causato da un bug, occorre soltanto scrivere il codice che garantisce che ad un certo punto la condizione del loop risulterà False.

E ora, occupiamoci dei loop infiniti intenzionali e di come funzionano.

🔹 Come creare un loop infinito con while True

Possiamo generare intenzionalmente un loop infinito utilizzando while True. In questo caso, il loop verrà eseguito un numero di volte indeterminato finché non verrà interrotto da un intervento esterno (CTRL + C) o in presenza di un'istruzione break (di cui parleremo a breve).

Questa è la sintassi di base:

image-3

Invece di scrivere la condizione del loop dopo la keyword while, scriviamo semplicemente il valore True per indicare che la condizione sarà sempre verificata.

Ecco un esempio:

>>> while True:
	print(0)

	
0
0
0
0
0
0
0
0
0
0
0
0
0
Traceback (most recent call last):
  File "<pyshell#2>", line 2, in <module>
    print(0)
KeyboardInterrupt

Il loop viene eseguito finché non viene interrotto manualmente premendo CTRL + C, ma può essere terminato anche tramite il comando break, inserito direttamente nel codice che scriviamo.

Il comando break

Questa istruzione viene utilizzata per fermare un loop immediatamente. Puoi pensare a break come a un segnale di stop che puoi utilizzare nel tuo codice per  avere un maggiore controllo sul comportamento del loop.

image-110

Secondo la Documentazione Python:

L'istruzione break , come in C, interrompe l'esecuzione del loop for o while più interno che la racchiude.

Questo diagramma illustra la logica alla base del comando break:

image-111
The break statement

Ecco la logica di base del comando break:

  • Il loop while viene eseguito solo se la condizione risulta True.
  • Se il comando break viene incontrato in un qualsiasi punto durante l'esecuzione, il loop termina immediatamente.
  • Se invece nessun break viene incontrato, il loop prosegue il suo normale funzionamento fino a che la condizione non risulta essere False.

Possiamo usare break per fermare un loop while quando una condizione viene incontrata in un punto particolare durante l'esecuzione. Tipicamente lo si può trovare in una istruzione condizionale come la seguente:

while True:
    # Codice
    if <condition>:
    	break
    # Codice

Questo termina immediatamente il loop una volta che la condizione risulta True.

💡 Suggerimento: in teoria puoi scrivere un comando break in qualsiasi punto del corpo del loop, senza che sia necessariamente parte di un'istruzione condizionale, ma comunemente viene utilizzato per fermare il loop quando una data condizione è vera.

Ecco un esempio dell'uso di break in un loop while True:

image-2

Osserviamo il codice nel dettaglio:

La prima riga definisce che il loop while True verrà eseguito all'infinito fino al break (o fino all'interruzione con CTRL + C).

while True:

La seconda riga richiede  un input dell'utente, che viene convertito in un intero e assegnato alla variabile user_input.

user_input = int(input("Enter an integer: "))

La terza riga valuta se l'intero è dispari.

if user_input % 2 != 0:

Se lo è, viene restituito il messaggio This number is odd e il comando break interrompe immediatamente il loop.

print("This number of odd")
break

Se invece l'input è pari, viene restituito il messaggio This number is even e il loop riparte di nuovo.

print("This number is even")

Il loop viene eseguito indefinitamente fino a quando non viene inserito un intero dispari perché è l'unico modo per incontrare il comando break.

Ecco un esempio con alcuni input:

Enter an integer: 4
This number is even
Enter an integer: 6
This number is even
Enter an integer: 8
This number is even
Enter an integer: 3
This number is odd
>>> 

🔸 In sintesi

  • I loop while sono strutture di programmazione utilizzate per ripetere sequenze di codice finché una condizione è True, è si interrompono quando la condizione diventa False.
  • Quando scrivi un loop while, devi necessariamente rendere esplicito nel tuo codice l'aggiornamento delle variabili per far sì che a un certo punto il loop termini.
  • Un loop infinito prosegue per un numero di iterazioni indeterminato e può essere interrotto solo da un intervento esterno o da un comando break presente nel codice.
  • Puoi interrompere un loop infinito con CTRL + C.
  • Puoi generare intenzionalmente un loop infinito utilizzando while True.
  • Il comando break può essere usato per fermare un loop immediatamente.

Spero davvero che quest'articolo ti sia piaciuto e che ti sia stato d'aiuto. Adesso sai come funzionano i loop while in Python.