W3docs

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 anticipatamente
  • continue — passa alla prossima iterazione
  • La clausola else — codice che viene eseguito quando il ciclo termina normalmente
  • Cicli while annidati
  • Il segnaposto pass
  • Cicli infiniti e come evitarli
  • Quando scegliere while vs for

Sintassi di base

while condition:
    # block executed while condition is True

Python 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

python— editable, runs on the server

Output:

1
2
3
4
5

Qui 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
1

while 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.

python— editable, runs on the server

Output:

0
1
2
3
4

Quando 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
7

Quando 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 3

Cicli 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 += 1

Output:

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 += 1

Senza 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 i

Senza 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

SituazionePreferire
Si conosce il numero di iterazioni o si ha una sequenzafor
Si itera finché una condizione cambiawhile
È necessario leggere l'input finché l'utente escewhile True + break
Si vuole indice e valore da una listafor + enumerate()
Si vuole svuotare o consumare una struttura datiwhile

Usa for quando puoi; passa a while quando la condizione di uscita è dinamica o sconosciuta all'inizio del ciclo.


Esercizi

Pratica
What does the else clause of a while loop do?
What does the else clause of a while loop do?
Pratica
What are the functionalities of 'while' loops in Python as described in the W3Docs tutorial?
What are the functionalities of 'while' loops in Python as described in the W3Docs tutorial?
Pratica
Which of the following would cause a while loop to run forever?
Which of the following would cause a while loop to run forever?
Was this page helpful?