In questa lezione impari a usare il ciclo while in Python per ripetere un blocco di codice finché una condizione è vera. Vedremo contatori, condizioni d’arresto, l’uso di break e continue, la clausola else sui cicli e una serie di esempi pratici per evitare i classici loop infiniti. Chiuderemo con un esercizio guidato e un mini‑progetto.
🔗 Ripassi consigliati:
• Lezione 2 – Il tuo primo script: Hello, Python! → https://www.saperesemplice.com/primo-script-python-hello/
• Lezione 3 – Variabili e Tipi di Dato → https://www.saperesemplice.com/variabili-tipi-dato-python/
• Guida all’installazione di Python 3 → https://www.saperesemplice.com/installazione-python-prime-basi/
• Percorso Corsi Python – Programmare da zero → https://www.saperesemplice.com/corsi-informatica/corsi-di-informatica-python/
Dettagli lezione
⏱️ Tempo stimato: 30–35 minuti
🧩 Difficoltà: Facile
🎯 Obiettivi specifici
- Comprendere la sintassi del ciclo
whilee quando usarlo rispetto afor. - Applicare contatori e condizioni d’arresto per evitare loop infiniti.
- Usare in modo corretto
break,continuee la clausolaelsedei cicli. - Riconoscere e risolvere errori comuni (condizioni sempre vere, contatore non aggiornato).
- Realizzare un mini‑progetto: contatore tentativi login con
while,break,continue.
🧠 Teoria: come funziona il ciclo while
# Sintassi generale
while <condizione>:
# blocco da ripetere
...
else:
# opzionale: eseguito quando il ciclo termina *senza* break
...
- La condizione è valutata prima di ogni iterazione.
- Se è subito falsy, il corpo non viene eseguito.
- L’
elsedel ciclo (while ... else) si esegue solo se il ciclo termina naturalmente (condizione diventa falsa) e non perbreak.
Domanda per te: quando useresti while invece di for? Pensa a loop a sentinella (finché l’utente non scrive “quit”), polling, retry e validazione input.
🔢 Contatori e condizioni d’arresto
i = 1
while i <= 5:
print("Step", i)
i += 1 # contatore: evita loop infinito
print("Done")
Loop con sentinella
Ripeti finché l’utente non inserisce un valore speciale (es. "q"):
user = ""
while user != "q":
# In un vero script leggeresti da input()
user = "q" # simulazione
print("Looping...")
print("Goodbye")
Condizione composta
Combina controlli con and / or per fermare il ciclo in base a più fattori:
attempts = 0
max_attempts = 3
logged_in = False
while (attempts < max_attempts) and (not logged_in):
attempts += 1
print("Try #", attempts)
# Simulazione di verifica credenziali
logged_in = (attempts == 2)
print("Success:" if logged_in else "Failed")
🧩 Suggerimento: per chiarezza, preferisci variabili booleane con nomi parlanti (
has_time,has_items) quando la condizione diventa complicata.
⛔ break, continue e clausola else sui cicli
break: esce subito dal ciclo più interno.continue: salta al giro successivo (riesegue il test della condizione).while ... else: l’elsesi esegue solo se il ciclo non è terminato dabreak.
# Esempio: cerca il primo multiplo di 7
n = 1
found = None
while n < 50:
if n % 7 == 0:
found = n
break # interrompi appena trovato
n += 1
if found is not None:
print("Found:", found)
else:
print("Not found")
# Esempio: salta numeri dispari (continue)
i = 0
while i < 10:
i += 1
if i % 2 == 1:
continue # salta il resto del blocco
print("Even:", i)
# Esempio: while-else
x = 10
while x > 0:
x -= 3
if x == 1:
break
else:
print("Loop ended naturally") # si stampa solo se NON c'è stato break
💡 Nota tecnica:
breakecontinuerispettano blocchitry/finally: eventualifinallyvengono eseguiti prima di uscire o continuare il ciclo.
Domanda per te: in quale scenario reale l’else del ciclo ti aiuterebbe a distinguere tra “trovato” e “non trovato” senza usare un flag aggiuntivo?
⚠️ Errore comune da evitare
Dimenticare di aggiornare il contatore o la variabile della condizione, provocando un loop infinito.
# ❌ Loop infinito (i non cambia mai)
i = 0
while i < 3:
print("Hello")
# manca i += 1
Soluzione: aggiorna sempre le variabili che influenzano la condizione, oppure usa un timeout o un max_attempts come salvagente.
Altri errori diffusi:
- Confondere
=(assegnazione) con==(confronto) nella condizione. - Usare
breakpensando che l’elsedel ciclo si esegua comunque. - Usare
continuesenza aggiornare il contatore prima delcontinue.
🔶 Esempi pratici guidati
1) Contatore semplice (da 1 a 5)
i = 1
while i <= 5:
print("Counter:", i)
i += 1
print("Done")
2) Somma finché l’utente non inserisce 0 (sentinella)
total = 0
values = [5, 7, 0] # simulazione input
idx = 0
while True:
value = values[idx]
idx += 1
if value == 0:
break
total += value
print("Total:", total)
3) Filtro con continue (salta valori negativi)
nums = [3, -2, 5, -1, 4]
i = 0
while i < len(nums):
n = nums[i]
i += 1 # aggiorna PRIMA di eventuale continue
if n < 0:
continue
print("Positive:", n)
4) Ricerca con while-else (nessun break → else)
numbers = [2, 4, 6, 9, 12]
i = 0
while i < len(numbers):
if numbers[i] % 5 == 0:
print("Found a multiple of 5")
break
i += 1
else:
print("No multiples of 5")
Domanda per te: qual è la differenza di comportamento tra while True con break e while <condizione>? Quando preferisci l’uno o l’altro?
🧪 Mini‑progetto: Sistema di login base (con tentativi)
Scopo: gestire un login con numero massimo di tentativi, saltando input vuoti e bloccando l’account dopo troppi errori.
Requisiti funzionali
max_attempts = 3.- Se username o password sono stringhe vuote, salta l’iterazione (
continue) e mostra un messaggio. - Se le credenziali sono corrette → stampa “Login successful” e esci (
break). - Se finiscono i tentativi → stampa “Account locked”.
EXPECTED_USER = "admin"
EXPECTED_PASS = "1234"
attempt = 0
max_attempts = 3
while attempt < max_attempts:
attempt += 1
# Simulazione input (sostituisci con input() in un vero script)
username = "admin"
password = "1234" if attempt == 2 else "" # primo giro vuoto, secondo corretto
if not username or not password:
print("Empty fields. Please try again.")
continue # non consumare un tentativo aggiuntivo qui
if username == EXPECTED_USER and password == EXPECTED_PASS:
print("Login successful")
break
print("Invalid credentials. Attempts left:", max_attempts - attempt)
else:
print("Account locked") # si esegue se NON c'è stato break
💡 Estensioni possibili: estrai funzioni
read_credentials(),check_credentials(), aggiungi delay progressivo tra tentativi, registra i log dei tentativi.
📖 Sezione teorica
- Ciclo
while: ripete finché la condizione è vera. - Contatori e sentinelle: controllano l’arresto e prevengono i loop infiniti.
breakinterrompe;continuesalta la singola iterazione;while-elsesi attiva solo se non c’è statobreak.- Usa variabili booleane e parentesi per condizioni complesse; aggiorna sempre il contatore prima di
continue.
📚 Glossario tecnico
- Loop a sentinella: ciclo che termina alla comparsa di un valore speciale (es.
"q"). - Contatore: variabile che tiene traccia delle iterazioni (
i += 1). - Loop infinito: ciclo che non può terminare perché la condizione resta sempre vera.
while-else: clausola eseguita solo se il ciclo non termina conbreak.
📝 Esercizio finale
Scrivi un programma che chieda (puoi simulare con variabili) numeri interi e sommi solo quelli positivi finché l’utente non inserisce 0 oppure finché non superi una soglia di 100.
Requisiti:
- Usa un ciclo
whilecon sentinella0. - Usa
continueper saltare i numeri negativi. - Se la somma supera 100, interrompi con
break. - Stampa un riepilogo in inglese: “Total:”, total, “Stopped by threshold” oppure “Stopped by sentinel”.
Schema d’aiuto:
total = 0
numbers = [20, -5, 40, 60, 0] # simula input
# Your code here...
🧠 Quiz finale
Non guardare le risposte subito! Sono più sotto 👇
- Cosa fa il ciclo
while?
A) Esegue un blocco un numero fisso di volte
B) Ripete finché una condizione è vera
C) Esegue una volta sola - Qual è l’errore più comune con i contatori?
A) Usare==
B) Dimenticarei += 1
C) Stampare messaggi in inglese - Cosa fa
breakin unwhile?
A) Salta al prossimo giro
B) Esce dal ciclo
C) Resetta il contatore - Cosa fa
continue?
A) Esce dal ciclo
B) Salta il resto del blocco e passa al prossimo giro
C) Esegue l’else - Quando si esegue l’
elsedi un ciclowhile?
A) Sempre
B) Solo se non è stato eseguitobreak
C) Solo se c’ècontinue - Quale codice porta più facilmente a un loop infinito?
A)
i = 0
while i < 3:
print(i)
i += 1
B)
i = 0
while i < 3:
print(i)
C)
i = 3
while i > 0:
i -= 1
- In quale punto è più sicuro aggiornare il contatore quando usi
continue?
A) Dopo ilcontinue
B) Prima di possibilicontinue
C) Non serve aggiornarlo
❓ FAQ
1) while True è una cattiva pratica?
Non necessariamente. È comodo con break come condizione d’uscita nel corpo. Importante: assicurarsi che ci sia sempre un percorso d’uscita.
2) Posso usare while-else al posto di un flag?
Sì. È utile, ad esempio, nella ricerca: l’else si esegue se non si è mai eseguito break (quindi non trovato).
3) Differenza tra continue e pass?continue salta al giro successivo; pass non fa nulla ed è un segnaposto sintattico.
4) break/continue funzionano con try/finally?
Sì: eventuali blocchi finally vengono eseguiti prima di uscire/continuare. [Concetto avanzato]
5) Meglio while o for per scorrere una lista?
Di solito for è più pitonico e sicuro. Usa while quando non sai a priori quante iterazioni serviranno o stai aspettando un evento/condizione.
🔗 Link utili
Esterni
• Python Tutorial – Control Flow (sezione su break/else sui cicli) → https://docs.python.org/3/tutorial/controlflow.html
• Python Reference – Compound statements (while, for, else sui cicli) → https://docs.python.org/3/reference/compound_stmts.html
• Python Reference – Simple statements (break, continue) → https://docs.python.org/3/reference/simple_stmts.html
Interni
• Lezione 2 – Primo script Python → https://www.saperesemplice.com/primo-script-python-hello/
• Lezione 3 – Variabili e Tipi di Dato → https://www.saperesemplice.com/variabili-tipi-dato-python/
• Guida Installazione Python → https://www.saperesemplice.com/installazione-python-prime-basi/
• Percorso “Corsi Python – Programmare da zero” → https://www.saperesemplice.com/corsi-informatica/corsi-di-informatica-python/
🔁 Collegamento alla lezione successiva
➡️ Prosegui alla Lezione 9: Ciclo for e funzione range()
(Il link verrà inserito non appena l’articolo sarà online.)
🗨️ Hai dubbi? Lascia un commento!
📩 Vuoi il PDF della lezione? Scrivici!
🔗 Condividi con un compagno di corso.
🧪 Risposte del quiz
- B
- B
- B
- B
- B
- B
- B
🗓️ Changelog
📅 Aggiornato il 25/08/2025
