Python: usare i cicli for e while per cercare elementi e generare report

by theArchitect
SHARE
Python: usare i cicli for e while per cercare elementi e generare report
© Guida-HTML5.it

Introduzione

I cicli for e while sono tra gli strumenti più importanti di Python quando devi automatizzare attività ripetitive. In molti tutorial si mostrano esempi base come stampare numeri o scorrere liste, ma un uso molto più utile nella pratica è la ricerca di elementi in una collezione e la generazione di un report sintetico a partire dai dati trovati.

Questo approccio è comune in applicazioni reali: controllare ordini in un negozio online, filtrare utenti attivi, individuare transazioni sospette, trovare il primo record valido in un elenco di input, oppure calcolare statistiche su un insieme di valori. In questi casi il ciclo non serve solo a “ripetere”, ma a esplorare i dati con una logica precisa, fermandosi quando necessario e producendo un risultato utile.

In questo tutorial vedrai come usare for e while per:

  • cercare un elemento in una lista di dizionari;
  • interrompere la ricerca appena trovi il risultato desiderato;
  • costruire un report con i dati selezionati;
  • usare un ciclo while per gestire una ricerca progressiva, utile quando i dati arrivano a blocchi o quando non sai in anticipo quante iterazioni serviranno.

Codice completo

# Esempio: ricerca di ordini e generazione di un report sintetico

ordini = [
    {"id": 101, "cliente": "Anna", "totale": 120.50, "stato": "spedito"},
    {"id": 102, "cliente": "Marco", "totale": 49.90, "stato": "in lavorazione"},
    {"id": 103, "cliente": "Giulia", "totale": 250.00, "stato": "spedito"},
    {"id": 104, "cliente": "Luca", "totale": 19.99, "stato": "annullato"},
    {"id": 105, "cliente": "Sara", "totale": 89.00, "stato": "spedito"},
]

# 1) Cerchiamo il primo ordine spedito con totale superiore a 100
ordine_trovato = None

for ordine in ordini:
    if ordine["stato"] == "spedito" and ordine["totale"] > 100:
        ordine_trovato = ordine
        break

if ordine_trovato is not None:
    print("Primo ordine che soddisfa i criteri:")
    print(f"ID: {ordine_trovato[´id´]}")
    print(f"Cliente: {ordine_trovato[´cliente´]}")
    print(f"Totale: €{ordine_trovato[´totale´]:.2f}")
else:
    print("Nessun ordine trovato.")

print("n" + "-" * 40 + "n")

# 2) Generiamo un report sugli ordini spediti
report = {
    "totale_ordini": 0,
    "totale_valore": 0.0,
    "clienti": []
}

for ordine in ordini:
    if ordine["stato"] == "spedito":
        report["totale_ordini"] += 1
        report["totale_valore"] += ordine["totale"]
        report["clienti"].append(ordine["cliente"])

print("Report ordini spediti")
print(f"Numero ordini: {report[´totale_ordini´]}")
print(f"Valore complessivo: €{report[´totale_valore´]:.2f}")
print("Clienti coinvolti:")
for cliente in report["clienti"]:
    print(f"- {cliente}")

print("n" + "-" * 40 + "n")

# 3) Ricerca progressiva con while:
# simuliamo il controllo di pagine di risultati fino a trovare un ordine specifico
pagine = [
    [{"id": 201, "cliente": "Elena"}, {"id": 202, "cliente": "Paolo"}],
    [{"id": 203, "cliente": "Marta"}, {"id": 204, "cliente": "Nadia"}],
    [{"id": 205, "cliente": "Davide"}, {"id": 206, "cliente": "Irene"}],
]

pagina_corrente = 0
ordine_cercato = 205
trovato = None

while pagina_corrente < len(pagine) and trovato is None:
    pagina = pagine[pagina_corrente]
    print(f"Controllo pagina {pagina_corrente + 1}...")

    for ordine in pagina:
        if ordine["id"] == ordine_cercato:
            trovato = ordine
            break

    pagina_corrente += 1

if trovato:
    print(f"Ordine trovato con while: ID {trovato[´id´]}, cliente {trovato[´cliente´]}")
else:
    print("Ordine non trovato in nessuna pagina.")

Spiegazione

Il primo blocco usa un ciclo for per scorrere una lista di dizionari. Ogni dizionario rappresenta un ordine con informazioni come ID, cliente, totale e stato. La condizione dentro l’if seleziona solo gli ordini spediti e con totale superiore a 100. Appena trova il primo elemento valido, il ciclo si ferma con break. Questo è molto efficiente perché evita di continuare a controllare dati inutili.

La variabile ordine_trovato parte da None, che in Python è un valore utile per indicare “nessun risultato ancora trovato”. Dopo il ciclo, si controlla se il valore è cambiato. Questo è un pattern molto comune e leggibile: inizializzi una variabile, la aggiorni quando trovi il dato cercato e poi verifichi il risultato finale.

Il secondo blocco mostra come usare un ciclo for per costruire un report. In questo caso non stiamo cercando un singolo elemento, ma stiamo aggregando informazioni. Per ogni ordine spedito:

  • incrementiamo il conteggio totale;
  • sommiamo il valore economico;
  • salviamo il nome del cliente in una lista.

Questo è un esempio tipico di elaborazione dati: il ciclo attraversa la collezione una sola volta, ma produce più risultati utili. È una tecnica semplice e molto efficace quando devi sintetizzare informazioni da un dataset piccolo o medio.

Il terzo blocco introduce il ciclo while. Qui simuliamo una ricerca su “pagine” di risultati, come avviene spesso nelle API o nei sistemi che restituiscono dati a blocchi. Non sappiamo in anticipo in quale pagina si troverà l’ordine cercato, quindi il ciclo continua finché:

  • non esauriamo le pagine disponibili;
  • oppure non troviamo il risultato desiderato.

Questa è una situazione perfetta per while, perché il numero di iterazioni dipende da una condizione dinamica, non da una sequenza fissa. All’interno del ciclo, un for esplora gli elementi della pagina corrente. Se trova l’ordine, assegna il valore alla variabile trovato e interrompe la ricerca interna.

In sintesi:

  • for è ideale quando sai su quale collezione iterare;
  • while è ideale quando la ripetizione dipende da una condizione che può cambiare durante l’esecuzione;
  • combinare i due cicli è spesso la soluzione più pulita per problemi reali.

Best practice

  • Usa nomi chiari per le variabili: ad esempio ordine_trovato, pagina_corrente, report. Il codice diventa più facile da leggere e mantenere.
  • Inizializza sempre il risultato con un valore neutro, come None, prima di cercarlo in un ciclo.
  • Interrompi il ciclo appena possibile quando hai trovato ciò che ti serve. Riduci lavoro inutile e migliori le prestazioni.
  • Usa while solo quando serve davvero. Se sai già quante volte iterare, spesso for è più semplice e meno soggetto a errori.
  • Evita condizioni troppo complesse dentro il ciclo. Se necessario, spezzale in variabili intermedie per rendere il codice più leggibile.
  • Controlla sempre il caso “nessun risultato”. Nei programmi reali, non trovare un elemento è una situazione normale e va gestita con attenzione.

Riepilogo

I cicli for e while non servono solo a ripetere istruzioni: sono strumenti fondamentali per cercare dati, filtrare elementi e costruire report. Il ciclo for è perfetto quando devi scorrere una collezione, mentre while è la scelta giusta quando la ripetizione dipende da una condizione variabile.

In questo tutorial hai visto un esempio concreto con ordini, report e ricerca progressiva. Questo tipo di approccio è molto vicino ai casi reali che incontrerai nello sviluppo Python: analisi di dati, automazione di controlli e gestione di risultati parziali. Se impari a combinare bene for, while, break e variabili di stato, scriverai codice più chiaro, robusto ed efficiente.

Approfondisci con risorse ufficiali

  • Python Tutorial - Control Flow Tools: documentazione ufficiale sui cicli e sul controllo del flusso.
  • Python Standard Library: utile per esplorare strutture dati e strumenti per l’elaborazione di collezioni.
  • PEP 8: guida stilistica ufficiale per scrivere codice Python leggibile e coerente.
  • Python Docs - Data Structures: approfondimento su liste, dizionari e altre strutture fondamentali per lavorare con i cicli.

SHARE