Lezione 9: Ciclo for e funzione range() ✅

Benvenuto/a! In questa lezione impari ad usare ciclo for e funzione range in Python per iterare su intervalli, stringhe e liste in modo chiaro e “pitonico”. Lavoreremo con esempi pratici (💪 tabelline, ➕ somma da 1 a n) e vedremo utili estensioni come enumerate() e zip() per scrivere codice pulito e leggibile.


🔗 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 installazione Python → https://www.saperesemplice.com/installazione-python-prime-basi/
• Percorso corsi Python → https://www.saperesemplice.com/corsi-informatica/corsi-di-informatica-python/


Dettagli lezione

⏱️ Tempo stimato: 30–40 minuti
🧩 Difficoltà: Facile
🎯 Obiettivi specifici

  • Comprendere la sintassi del ciclo for in Python e quando preferirlo a while.
  • Usare range(start, stop, step) per creare intervalli efficienti.
  • Iterare su stringhe e liste in modo “pitonico”, evitando contatori manuali inutili.
  • Applicare enumerate() (indice + valore) e zip() (iterazione parallela).
  • Risolvere gli esercizi tabelline e somma dei numeri da 1 a n.

🧠 Perché il for di Python è speciale

A differenza di altri linguaggi, il for di Python itera direttamente sugli elementi di una sequenza o qualunque iterabile (liste, stringhe, tuple, set, dizionari, file, generatori…). Non serve specificare contatore, condizione e incremento come in C.

# Itera direttamente sugli elementi
colors = ["red", "green", "blue"]
for c in colors:
    print(c)  # red, green, blue

📌 Concetto chiave: un iterabile fornisce i propri elementi uno alla volta; il for si occupa del “contatore” per te.

Domanda per te: in quali scenari preferisci iterare sugli elementi piuttosto che sugli indici?


🔢 La funzione range()

range() genera una sequenza di interi lazy (non crea subito una lista in memoria) utile per iterazioni numeriche.

# range(stop): 0, 1, 2, ..., stop-1
for i in range(5):
    print(i)

# range(start, stop)
for i in range(2, 5):
    print(i)  # 2, 3, 4

# range(start, stop, step)
for i in range(10, 0, -2):
    print(i)  # 10, 8, 6, 4, 2

Note pratiche:

  • stop è escluso.
  • step può essere negativo (conti alla rovescia).
  • range restituisce un oggetto range efficiente; se ti serve una lista: list(range(5)).

💡 Usa range per intervalli numerici; per liste/stringhe itera direttamente sugli elementi quando possibile.

Domanda per te: quando ti è utile creare range con step personalizzato (es. 2, 5, −1)?


🧵 Iterazione su stringhe

Una stringa è una sequenza: puoi percorrerla char per char.

text = "Python"
for ch in text:
    print(ch)

Se ti serve anche l’indice:

for idx, ch in enumerate(text):
    print(idx, ch)

✨ Suggerimento: usa enumerate() invece di gestire un contatore a mano. È più leggibile e meno soggetto a errori.


📦 Iterazione su liste

Itera sugli elementi; prendi l’indice solo quando serve davvero.

nums = [10, 20, 30]
for n in nums:
    print(n)

Indice + valore:

for i, n in enumerate(nums, start=1):
    print(i, n)  # 1 10 / 2 20 / 3 30

Iterazione parallela su due liste con zip():

names = ["Alice", "Bob", "Carol"]
scores = [88, 91, 79]
for name, score in zip(names, scores):
    print(f"{name}: {score}")

🔍 Curiosità: su dizionari, usa .items() per coppie chiave, valore.


🧮 Esempi pratici

1) Tabelline con for + range

n = 7
for i in range(1, 11):
    print(f"{n} x {i} = {n*i}")

2) Somma dei numeri da 1 a n

n = 100
s = 0
for i in range(1, n + 1):
    s += i
print("Sum from 1 to n:", s)  # 5050 se n = 100

💡 Extra: la somma da 1 a n ha anche formula chiusa n*(n+1)/2.

3) Iterare sulle lettere di una parola

word = "developer"
for ch in word:
    if ch in "aeiou":
        print("Vowel:", ch)

4) Contare elementi che soddisfano una condizione

nums = [3, 10, 15, 21, 22]
count = 0
for x in nums:
    if x % 5 == 0:
        count += 1
print("Multiples of 5:", count)

Domanda per te: come riscriveresti l’esempio 4 usando una list comprehension? (Anticipo della lezione sulle sequenze!)


✂️ Strumenti utili: enumerate() e zip()

enumerate(iterable, start=0) → ti dà coppie (indice, valore).

animals = ["cat", "dog", "fox"]
for i, a in enumerate(animals, start=1):
    print(i, a)

zip(a, b, ...) → itera in parallelo più sequenze (si ferma alla più corta).

titles = ["Mr", "Ms", "Dr"]
names = ["Smith", "Taylor", "Lee", "Extra"]
for t, n in zip(titles, names):
    print(t, n)

ℹ️ Non sono obbligatori per questa lezione, ma migliorano la leggibilità del tuo for.


⚠️ Errore comune da evitare

Off‑by‑one con range (confondere estremi inclusi/esclusi) e uso superfluo dell’indice.

# ❌ stampa 10 volte ma volevi 9
for i in range(0, 10 + 1):
    print(i)

# ✅ fermati a 9 (stop escluso)
for i in range(0, 10):
    print(i)

Altro errore: iterare sugli indici quando bastano gli elementi.

# ❌ Meno leggibile
for i in range(len(nums)):
    print(nums[i])

# ✅ Più pitonico
for x in nums:
    print(x)

Domanda per te: in quale scenario l’indice è realmente necessario? (Es.: posizione per stampare un ranking.)


📖 Sezione teorica

  • Ciclo for in Python: itera sugli elementi di sequenze/iterabili.
  • range(): genera intervalli numerici lazy — stop è escluso; usa start/stop/step.
  • Stringhe e liste sono sequenze: puoi iterarle direttamente; usa enumerate() per indice/valore, zip() per camminare in parallelo.
  • Evita errori di off‑by‑one e contatori manuali non necessari.

📚 Glossario tecnico

  • Iterabile: oggetto che può fornire i propri elementi uno alla volta in un for.
  • Iteratore: oggetto con __iter__() e __next__() che produce elementi.
  • Sequenza: collezione ordinata indicizzabile (es. stringhe, liste, tuple).
  • range: oggetto iterabile per progressioni aritmetiche.
  • enumerate: wrapper che aggiunge un contatore all’iterazione.
  • zip: aggrega più iterabili iterando in parallelo.

📝 Esercizio finale

Realizza un programma che, dato un intero n, stampi:

  1. La tabellina del 7 fino a 7*n.
  2. La somma dei numeri da 1 a n.
  3. Il numero di vocali presenti in una stringa s.

Requisiti:

  • Usa for e range dove appropriato.
  • Stampa messaggi in inglese.
  • Per il conteggio vocali, ignora maiuscole/minuscole.

Schema d’aiuto (esempio):

n = 10
s = "Programming"
# Your code here...

🧠 Quiz finale

Non guardare le risposte subito! Sono più sotto 👇

  1. Cosa produce range(3)?
    A) [0, 1, 2, 3]
    B) 0, 1, 2
    C) 1, 2, 3
  2. Cosa stampa?
for i in range(2, 7, 2):
    print(i)

A) 2 3 4 5 6 7
B) 2 4 6
C) 3 5 7

  1. Qual è il modo più pitonico per iterare una lista nums?
    A) for i in range(len(nums)):
    B) for n in nums:
    C) while i < len(nums):
  2. A cosa serve enumerate()?
    A) A creare intervalli numerici
    B) A iterare in parallelo due liste
    C) A ottenere indice e valore durante il for
  3. Qual è l’errore nel codice?
for i in range(1, 10):
    print(i)
print(i)

A) i non esiste fuori dal ciclo
B) Nessun errore: i vale 9 dopo il ciclo
C) Serve global i

  1. Come ottieni un conto alla rovescia da 5 a 1?
    A) range(1, 6, -1)
    B) range(5, 0, -1)
    C) range(5, 1, -1)
  2. Cosa fa zip(a, b)?
    A) Unisce due stringhe
    B) Crea coppie di elementi in parallelo
    C) Restituisce indici a partire da 1

❓ FAQ

1) Quando uso for vs while?
Usa for per iterazioni con numero noto di passi o su collezioni; while per cicli guidati da condizione (finché succede X).

2) range crea una lista?
No, ritorna un oggetto range che genera i numeri on‑demand (efficiente in memoria). Usa list(range(...)) se ti serve la lista.

3) Posso iterare un dizionario?
Sì: su chiavi (for k in d:), valori (for v in d.values()), o coppie (for k, v in d.items():).

4) Come evito off‑by‑one?
Ricorda che lo stop è escluso: verifica bene gli estremi e, se serve, aggiungi +1 al limite superiore.

5) È meglio usare range(len(seq))?
Solo quando ti serve l’indice. Altrimenti itera direttamente sugli elementi o usa enumerate().



Esterni
• Python Tutorial – For statements (Control Flow)
• Python Library – Built‑in Functions (range, enumerate)
• Approfondimento didattico – For Loops in Python (Real Python)

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 10: Liste e tuple – sequenze in Python
(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

  1. B
  2. B
  3. B
  4. C
  5. B
  6. B
  7. B

📅 Aggiornato il 27/08/2025

Lascia un commento