Introduzione
I cicli for e while sono tra gli strumenti più usati in Python per automatizzare attività ripetitive. Oltre agli esempi classici con liste e numeri, esiste un caso d’uso molto pratico e spesso sottovalutato: gestire input dell’utente e ripetere un’operazione finché non si ottiene un dato valido.
Questo scenario è comune in programmi interattivi, script da terminale, tool di configurazione, menu testuali e piccole utility. In pratica, il ciclo non serve solo a “ripetere”, ma a controllare il flusso di un’interazione, evitando errori, input vuoti o valori fuori formato.
In questo tutorial vedremo come usare for e while per costruire un piccolo programma robusto: un sistema che chiede dati all’utente, li valida, e continua a richiederli finché non sono corretti. È un sotto-argomento utile, concreto e diverso dai classici esempi già visti su iterazione di liste, sequenze numeriche o gestione di dizionari.
Codice completo
def chiedi_intero(prompt, minimo=None, massimo=None):
"""
Chiede all´utente un numero intero e continua a richiederlo
finché il valore non è valido e, se presenti, rientra nei limiti.
"""
while True:
valore = input(prompt).strip()
# Controllo base: l´input non deve essere vuoto
if not valore:
print("Errore: devi inserire un valore.")
continue
# Tentativo di conversione in intero
try:
numero = int(valore)
except ValueError:
print("Errore: inserisci un numero intero valido.")
continue
# Validazione opzionale del range
if minimo is not None and numero massimo:
print(f"Errore: il valore deve essere al massimo {massimo}.")
continue
return numero
def chiedi_si_no(prompt):
"""
Chiede una risposta sì/no e normalizza l´input.
Usa un ciclo while per ripetere la richiesta finché la risposta non è valida.
"""
while True:
risposta = input(prompt).strip().lower()
if risposta in ("s", "si", "sì"):
return True
if risposta in ("n", "no"):
return False
print("Risposta non valida: scrivi ´sì´ oppure ´no´.")
def calcola_sconto(importo, percentuale):
"""Calcola il prezzo scontato."""
return importo - (importo * percentuale / 100)
def menu_principale():
print("=== Calcolatore di sconto ===")
# Esempio di ciclo for: mostra un piccolo elenco di opzioni
opzioni = [
"1) Calcola un nuovo sconto",
"2) Esci"
]
for voce in opzioni:
print(voce)
while True:
scelta = chiedi_intero("Scegli un´opzione (1-2): ", 1, 2)
if scelta == 2:
print("Uscita dal programma.")
break
importo = chiedi_intero("Inserisci l´importo iniziale: ", minimo=1)
percentuale = chiedi_intero("Inserisci la percentuale di sconto: ", minimo=0, massimo=100)
prezzo_finale = calcola_sconto(importo, percentuale)
print(f"Prezzo finale: {prezzo_finale:.2f} euro")
continua = chiedi_si_no("Vuoi calcolare un altro sconto? (sì/no): ")
if not continua:
print("Grazie per aver usato il programma.")
break
if __name__ == "__main__":
menu_principale() Spiegazione
Il codice sopra combina while e for in modo complementare.
1. Il ciclo while per ripetere finché i dati non sono validi
La funzione chiedi_intero() usa while True per mantenere attivo il ciclo finché non ottiene un valore corretto. Questo è un pattern molto comune quando si lavora con input dell’utente.
La logica è semplice:
- leggi l’input con
input(); - rimuovi spazi inutili con
strip(); - se l’input è vuoto, mostra un messaggio di errore e ripeti;
- prova a convertire il testo in intero con
int(); - se la conversione fallisce, intercetta
ValueErrore ripeti; - se sono presenti limiti minimo/massimo, verifica che il numero rientri nell’intervallo;
- se tutto è corretto, restituisci il numero con
return.
In questo modo il programma non va in crash e guida l’utente verso un input valido.
2. Il ciclo for per mostrare un elenco di opzioni
Nel menu principale, il for viene usato per stampare le voci della lista opzioni. Questo è un uso classico ma molto utile: quando hai una collezione di elementi da mostrare, il for è la scelta più naturale.
Qui il ciclo non serve a controllare la validazione, ma a presentare in modo ordinato le opzioni dell’interfaccia testuale.
3. Un secondo while per gestire il flusso del programma
Nel menu principale, il ciclo while True mantiene il programma attivo. L’utente può scegliere di calcolare uno sconto oppure uscire. Se seleziona 2, il ciclo termina con break. Anche se questo tutorial si concentra sulla validazione, è utile notare come il ciclo possa anche governare il comportamento generale dell’applicazione.
4. Perché questa struttura è pratica
Separare la validazione in funzioni dedicate rende il codice più leggibile e riutilizzabile. Ad esempio, chiedi_intero() può essere usata in altri programmi senza riscrivere la stessa logica ogni volta.
Inoltre, il programma è più robusto perché:
- non accetta valori vuoti;
- non si interrompe con input non numerici;
- può imporre limiti precisi;
- fornisce messaggi chiari all’utente;
- mantiene il flusso sotto controllo.
Best practice
Quando usi cicli for e while per validare input o gestire interazioni, ci sono alcune buone pratiche da seguire.
- Usa funzioni dedicate: evita di scrivere la validazione direttamente nel corpo principale del programma. Una funzione come
chiedi_intero()è più pulita e riutilizzabile. - Non abusare di while True: è utile, ma deve sempre esserci una condizione di uscita chiara. Altrimenti rischi un ciclo infinito.
- Fornisci messaggi di errore specifici: dire “input non valido” è meno utile di “inserisci un numero intero tra 1 e 100”.
- Normalizza l’input: usa
strip()e, quando serve,lower()per semplificare il confronto. - Gestisci le eccezioni: quando converti tipi o lavori con dati esterni, intercetta gli errori prevedibili con
try/except. - Separa presentazione e logica: il
forpuò stampare opzioni, ma la logica decisionale deve restare in punti ben definiti. - Rendi il codice estendibile: se domani vuoi aggiungere un nuovo menu o un nuovo tipo di validazione, la struttura deve permetterlo senza riscrivere tutto.
Un errore comune è usare un ciclo solo per “riprovare” senza controlli adeguati. In realtà, un buon ciclo interattivo deve sempre rispondere a una domanda precisa: quando continuo, quando mi fermo e perché?
Riepilogo
I cicli for e while non servono solo a scorrere liste o generare sequenze. Sono fondamentali anche per costruire programmi interattivi affidabili, soprattutto quando bisogna validare l’input dell’utente.
In questo tutorial abbiamo visto un caso pratico molto utile:
- while per ripetere una richiesta finché il dato non è valido;
- for per mostrare opzioni o elementi di una lista;
- funzioni dedicate per rendere il codice più ordinato;
- gestione delle eccezioni per evitare errori di esecuzione;
- controlli su vuoto, tipo e range per migliorare l’esperienza utente.
Questo approccio è molto utile in script reali: calcolatori, configuratori, form testuali, menu da terminale e piccoli strumenti da riga di comando.
Approfondisci con risorse ufficiali
- Python Tutorial - Control Flow Tools: documentazione ufficiale sui cicli e sul controllo del flusso
- Python Built-in Functions: per approfondire
input(),print(),int()e altre funzioni base - Python Exceptions: guida ufficiale alla gestione delle eccezioni con
tryeexcept - PEP 8: stile di codice Python consigliato per scrivere programmi leggibili e mantenibili
