Un ciclo che osserva una condizione
Mentre for itera su una sequenza nota, while continua a ripetere finché una condizione è vera. Lo usi quando non sai in anticipo quante iterazioni ti serviranno: riprovare finché qualcosa non funziona, leggere l'input finché l'utente non dice basta, interrogare un servizio finché non risponde.
La forma è semplice:
Questo stampa i numeri da 0 a 4. Python controlla la condizione all'inizio di ogni iterazione. Se è vera, il corpo viene eseguito. Poi la controlla di nuovo. Quando la condizione diventa falsa, il ciclo termina.
Nota che count += 1 è fondamentale. Senza, la condizione resterebbe vera per sempre: un ciclo infinito. È la trappola principale di while, e il motivo principale per preferire for quando puoi usarlo.
Quando while è lo strumento giusto
Alcuni casi d'uso classici:
Riprovare fino al successo.
Leggere l'input finché l'utente non esce.
Elaborare una coda.
Il filo conduttore: stai aspettando un cambiamento di stato invece di iterare sugli elementi.
while True va benissimo
Vedrai spesso questo pattern:
È Python idiomatico quando la condizione di uscita "vera" si trova dentro il corpo del ciclo, e non è qualcosa di pulito che puoi verificare all'inizio. È più facile da leggere che inventarsi un flag should_continue che aggiorni in un punto e controlli in un altro.
L'unica regola: assicurati che ci sia un break (o un return, o un'eccezione sollevata) che il codice prima o poi raggiungerà. Un while True: incondizionato senza via d'uscita è il modo classico per bloccare un programma.
Evitare il ciclo infinito
I cicli infiniti si verificano quando la condizione resta vera per sempre. I soliti sospetti:
- Hai dimenticato di aggiornare la variabile.
while count < 5:ha bisogno di qualcosa nel corpo che modifichicount. - Hai aggiornato la variabile sbagliata.
while i < 10:e poij += 1all'interno: facile da non notare se il tuo codice ha più di qualche variabile. - Confronto tra numeri in virgola mobile.
while x != 1.0:può girare all'infinito sexsi avvicina soltanto a 1.0. Usa invece<=oppureabs(x - 1.0) < tolerance.
Se resti bloccato in un ciclo infinito in un terminale, premi Ctrl+C. Questo invia un segnale di interruzione e Python ferma qualunque cosa stia facendo.
break, continue ed else
while supporta gli stessi tre strumenti di "flusso" di for:
breakesce subito dal ciclo.continuepassa all'iterazione successiva (quindi la condizione viene controllata di nuovo).elseviene eseguito se il ciclo è terminato senza unbreak.
È un semplice controllo di primalità. Se scatta il break interno, il numero è composto. Se il ciclo esce in modo naturale (la condizione diventa falsa), viene eseguito l'else, che dichiara il numero primo.
while o for: quale scegliere?
Un rapido test mentale:
- Hai una collezione da scorrere? →
for. - Devi ripetere un numero fisso di volte? →
for i in range(n):. - Stai ripetendo finché una condizione non cambia? →
while.
Nel codice Python dei primi tempi scoprirai che for copre il 90% dei cicli. while compare quando fai cose come polling, nuovi tentativi o la costruzione di un semplice REPL. Se usi while per scorrere una lista con un indice, è il segnale che dovresti passare a for + enumerate.
Un programma pratico con while
Un gioco in cui indovinare un numero è un esempio classico, perché il numero di iterazioni dipende da come gioca l'utente:
Non puoi sapere in anticipo quanti tentativi serviranno: dipende dalle risposte dell'utente. È proprio la ragione d'essere di while.
Cosa viene dopo
Ora conosci i due tipi di ciclo che Python ti mette a disposizione. Prossimo passo: range() nel dettaglio. Compare in quasi ogni ciclo for che conta, e vale la pena capirne le piccole sfumature prima di passare alle collezioni.
Domande frequenti
Quando conviene usare un ciclo while invece di un ciclo for?
Usa while quando non sai in anticipo quante iterazioni ti servono: per esempio, per riprovare finché qualcosa non riesce, o per leggere l'input finché l'utente non scrive 'quit'. Usa for quando scorri una collezione nota.
Come evito un ciclo infinito in Python?
Assicurati che qualcosa dentro il ciclo, prima o poi, renda falsa la condizione. La causa più comune dei cicli infiniti è dimenticarsi di aggiornare la variabile da cui dipende la condizione. Se ci finisci dentro, premi Ctrl+C nel terminale per fermarlo.
Usare while True è una cattiva pratica?
while True è una cattiva pratica?Non di per sé. while True: con un break chiaro al suo interno è un pattern del tutto normale per "ripeti finché non incontriamo una condizione di uscita precisa". È più pulito che inventarsi un flag booleano da gestire in due punti diversi.