Corso Python / Cicli while, break e continue

Un ciclo while ripete il corpo finché la condizione è vera. break esce dal ciclo più interno e continue salta il resto dell’iterazione corrente: controlla che ogni percorso possa aggiornare lo stato necessario a proseguire o terminare.

Scegliere una ripetizione basata sullo stato

Quando gli elementi sono già disponibili, un ciclo for è spesso la scelta più diretta. Usa while quando la ripetizione dipende da uno stato che cambia o da input successivi. while True non è automaticamente un errore: può esprimere un ciclo con una regola d’uscita chiara al suo interno.

Un while controlla la condizione prima di ogni iterazione e può non eseguire mai il corpo se la condizione è falsa fin dall’inizio. Con continue, il resto del corpo viene saltato e si torna al controllo della condizione. La specifica ufficiale di while descrive questo flusso.

Se un contatore o altro stato viene aggiornato soltanto dopo un continue, alcuni percorsi possono saltare l’aggiornamento e ripetersi senza fine. Per un programma da terminale che non risponde, premi Ctrl+C e controlla poi dove cambiano le variabili della condizione. Nell’esempio seguente l’input viene letto all’inizio di ogni iterazione, anche dopo un continue.

Leggere importi fino al comando di uscita

Salva il programma completo in UTF-8 come while_input.py dentro una cartella di esercitazione. Esegui python while_input.py con l’interprete del progetto. Su macOS o Ubuntu fuori dall’ambiente virtuale usa python3 se è il comando dell’interprete scelto. Non occorrono pacchetti esterni.

Digita nell’ordine 3500, una riga vuota, -1 e q, premendo Invio dopo ogni risposta:

total = 0
while True:
    text = input("amount or q: ").strip()
    if text == "q":
        break
    if text == "":
        continue
    amount = int(text)
    if amount < 0:
        print("skip negative")
        continue
    total += amount
print("total:", total)

Lo standard output del programma, senza i caratteri digitati dall’utente, è:

amount or q: amount or q: amount or q: skip negative
amount or q: total: 3500

In un terminale interattivo vedrai normalmente anche gli input e gli Invio; il blocco precedente raccoglie soltanto il testo scritto dal programma. Non è una trascrizione completa della schermata del terminale.

Seguire ogni input attraverso break e continue

Con 3500, int() converte il testo e l’importo viene sommato a total. La riga vuota, dopo strip(), attiva il primo continue: la conversione non viene eseguita e la successiva iterazione chiede un nuovo input. Con -1 il programma stampa skip negative, cioè «salta il negativo», ed esegue un altro continue senza aggiungere l’importo.

Con q viene eseguito break: il ciclo termina e la stampa finale mostra 3500. Il controllo di q deve precedere la conversione numerica, altrimenti q verrebbe passato a int() e causerebbe un errore. La specifica di break definisce l’uscita dal ciclo più interno.

Questo esempio ammette interi oppure il comando q. Con abc o 8000.5, int() genera ValueError e il programma termina senza stampare il totale finale. La conversione e il suo significato sono spiegati nella guida a input e output.

Prova anche 10 → 20 → q: il totale deve essere 30. Per permettere un nuovo tentativo dopo un input non numerico, puoi avvolgere soltanto la conversione in un blocco try, intercettare ValueError, mostrare la regola d’ingresso e continuare il ciclo. Il codice qui riportato non contiene ancora questa gestione: non confondere il comportamento della versione originale con quello di un’estensione da aggiungere.

Verificare uscita, zero e cicli annidati

  1. Avvia di nuovo il programma e inserisci subito q: il totale finale è 0, perché total viene inizializzato prima del ciclo.
  2. Inserisci 0 e poi q. La stringa "0" non è vuota e viene convertita correttamente; il totale resta zero.
  3. Inserisci Q maiuscolo: la versione originale lo distingue da q e tenta la conversione, generando ValueError. Se vuoi accettare entrambe le forme, decidi esplicitamente quali comandi normalizzare.
  4. Ripeti la sequenza originale per verificare di nuovo il totale 3500.

In cicli annidati, break termina soltanto il ciclo più interno in cui compare; il ciclo esterno può continuare. Anche continue riguarda il proprio ciclo. Per uscire da più livelli, progetta uno stato condiviso fra i controlli oppure un’uscita con return da una funzione, quando corrisponde al flusso desiderato.

Un programma interattivo può anche ricevere la fine dell’input, per esempio quando termina un flusso reindirizzato: in quel caso input può generare EOFError. L’esempio si aspetta q per una conclusione normale. Mantieni evidente la regola d’uscita e tratta soltanto gli errori previsti quando aggiungi la gestione degli input.