Python: cicli for e while per validare input e ripetere operazioni in modo sicuro

by theArchitect
SHARE
Python: cicli for e while per validare input e ripetere operazioni in modo sicuro
© Guida-HTML5.it

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 ValueError e 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 for può 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 try e except
  • PEP 8: stile di codice Python consigliato per scrivere programmi leggibili e mantenibili

SHARE