Cicli While in Python: Una Guida Completa
Padroneggia i cicli while in Python: sintassi, break, continue, clausola else, cicli annidati, cicli infiniti ed esempi pratici con spiegazioni chiare.
Un ciclo while esegue ripetutamente un blocco di codice finché una condizione è True. A differenza di un ciclo for, che itera su una sequenza nota di elementi, un ciclo while è la scelta giusta quando non si sa in anticipo quante iterazioni sono necessarie — ad esempio, quando si legge l'input dell'utente, si svuota una coda, o si ripete un'operazione finché non riesce.
Questo capitolo tratta:
- Sintassi di base e come viene valutata la condizione
break— esce dal ciclo anticipatamentecontinue— passa alla prossima iterazione- La clausola
else— codice che viene eseguito quando il ciclo termina normalmente - Cicli
whileannidati - Il segnaposto
pass - Cicli infiniti e come evitarli
- Quando scegliere
whilevsfor
Sintassi di base
while condition:
# block executed while condition is TruePython valuta condition prima di ogni iterazione. Se è True, il blocco indentato viene eseguito. Quando il blocco termina, la condizione viene verificata di nuovo. Il ciclo esce non appena la condizione diventa False.
Contare da 1 a 5
Output:
1
2
3
4
5Qui i parte da 1. Dopo ogni print, i aumenta di 1. Quando i raggiunge 6, la condizione i <= 5 diventa False e il ciclo si ferma.
La variabile contatore deve essere aggiornata all'interno del ciclo. Dimenticare i += 1 (o un aggiornamento equivalente) significa che la condizione non diventa mai False e si ottiene un ciclo infinito.
Esempio di conto alla rovescia
count = 5
while count > 0:
print(count)
count -= 1
print("Liftoff!")Output:
5
4
3
2
1
Liftoff!Il codice dopo il blocco while viene eseguito una volta che il ciclo è terminato — in questo caso print("Liftoff!") non è all'interno del ciclo.
Iterare finché una lista è vuota
Qualsiasi oggetto che ha un valore booleano funziona come condizione. Una lista vuota è falsy, quindi è possibile svuotare una lista in modo naturale:
stack = [1, 2, 3]
while stack:
print(stack.pop())Output:
3
2
1while stack è un'abbreviazione di while len(stack) > 0. Una volta che la lista è vuota, è falsy e il ciclo termina.
L'istruzione break
break esce dal ciclo immediatamente, indipendentemente dalla condizione.
Output:
0
1
2
3
4Quando num è uguale a 5, break viene eseguito e il ciclo termina — i valori da 5 a 9 non vengono mai raggiunti.
Quando usare break: fermare una ricerca non appena si trova una corrispondenza; interrompere un ciclo quando si verifica una condizione di errore; uscire da un ciclo di menu quando l'utente sceglie "quit".
L'istruzione continue
continue salta il resto dell'iterazione corrente e torna direttamente alla verifica della condizione.
i = 0
while i < 8:
i += 1
if i % 2 == 0:
continue
print(i)Output:
1
3
5
7Quando i è pari, continue salta print(i) e il ciclo torna a valutare la condizione con il valore aggiornato di i.
Importante: incrementa il contatore prima del controllo continue, non dopo. Se i += 1 fosse posto dopo continue, i rimarrebbe sempre pari e il ciclo girerebbe all'infinito.
La clausola else
Il ciclo while di Python supporta un blocco else opzionale. Viene eseguito solo se il ciclo è terminato normalmente — cioè la condizione è diventata False — e viene saltato se il ciclo è uscito tramite break.
Completamento normale
i = 1
while i <= 3:
print(i)
i += 1
else:
print("Done!")Output:
1
2
3
Done!Ciclo interrotto da break
i = 1
while i <= 5:
if i == 3:
break
print(i)
i += 1
else:
print("No break")Output:
1
2"No break" non viene mai stampato perché break ha terminato il ciclo prima che la condizione potesse diventare False.
Uso pratico: ricerca lineare
La clausola else è particolarmente utile per i pattern di ricerca. Il blocco else viene eseguito solo quando il target non è stato trovato:
numbers = [4, 7, 2, 9, 1]
target = 9
i = 0
while i < len(numbers):
if numbers[i] == target:
print("Found", target, "at index", i)
break
i += 1
else:
print(target, "not found")Output:
Found 9 at index 3Cicli while annidati
Un ciclo while può contenere un altro ciclo while al suo interno. Il ciclo interno completa tutte le sue iterazioni per ogni singola iterazione del ciclo esterno.
row = 1
while row <= 3:
col = 1
while col <= 3:
print(row * col, end=" ")
col += 1
print()
row += 1Output:
1 2 3
2 4 6
3 6 9 Attenzione: un break all'interno del ciclo interno esce solo dal ciclo interno. Per uscire da entrambi i cicli contemporaneamente, usa una variabile flag o ristruttura il codice in una funzione e usa return.
L'istruzione pass
pass è un segnaposto no-op. Usalo quando un ciclo while è richiesto sintatticamente ma il corpo non è ancora implementato:
i = 0
while i < 3:
pass # TODO: add logic later
i += 1Senza pass, Python solleverebbe un IndentationError perché un blocco vuoto è sintassi non valida.
Cicli infiniti
Un ciclo infinito gira all'infinito perché la sua condizione non diventa mai False. Questo è quasi sempre un bug — ma esistono anche usi intenzionali.
Ciclo infinito accidentale
# WARNING: this loop never ends — do not run
i = 1
while i <= 5:
print(i)
# forgot to increment iSenza i += 1, i rimane 1, la condizione è sempre True e il ciclo gira finché non si ferma il programma manualmente (Ctrl+C).
Ciclo infinito intenzionale con break
# WARNING: intentional infinite loop — requires Ctrl+C to stop outside an app
while True:
answer = input("Type 'quit' to exit: ")
if answer == "quit":
break
print("You typed:", answer)while True è un idioma deliberato per "continua finché non viene fermato esplicitamente." Bisogna avere sempre un break (o un return) da qualche parte all'interno, altrimenti il programma si bloccherà.
Consulta il capitolo Input Utente in Python per altri pattern che coinvolgono cicli interattivi.
Cicli while vs cicli for
| Situazione | Preferire |
|---|---|
| Si conosce il numero di iterazioni o si ha una sequenza | for |
| Si itera finché una condizione cambia | while |
| È necessario leggere l'input finché l'utente esce | while True + break |
| Si vuole indice e valore da una lista | for + enumerate() |
| Si vuole svuotare o consumare una struttura dati | while |
Usa for quando puoi; passa a while quando la condizione di uscita è dinamica o sconosciuta all'inizio del ciclo.