Cicli: for e while

Bentornato.
Nella lezione precedente hai imparato le condizioni.
I tuoi programmi hanno imparato a prendere decisioni con:
if
else
elif
Molto bene.
Ora il tuo programma può scegliere percorsi diversi.
Ma c’è ancora un grande problema.
E se dobbiamo ripetere qualcosa?
Per esempio:
Stampare qualcosa 10 volte.
Chiedere all’utente finché non scrive la password corretta.
Calcolare totali per diversi prodotti.
Mostrare i numeri da 1 a 100.
Processare molti elementi uno per uno.
Senza cicli, dovresti scrivere questo:
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")
Funziona.
Ma è brutto.
Molto brutto.
Come copiare lo stesso messaggio cinque volte perché il computer si rifiuta di essere utile.
I cicli risolvono questo problema.
I cicli permettono al programma di ripetere azioni.
Python fa la ripetizione noiosa.
Tu conservi la sanità mentale.
Più o meno.
Cosa imparerai
In questa lezione imparerai:
- cosa sono i cicli;
- perché i cicli sono utili;
- come usare
for; - come usare
range(); - come funzionano le variabili del ciclo;
- come ripetere codice un numero preciso di volte;
- come scorrere il testo;
- come usare
while; - come fermare un ciclo con una condizione;
- come usare contatori;
- come evitare cicli infiniti;
- come usare
break; - come usare
continue; - errori comuni dei principianti;
- come costruire semplici programmi basati sui cicli.
Alla fine di questa lezione i tuoi programmi potranno ripetere lavoro automaticamente.
Questo è un passo enorme.
Perché i computer sono molto bravi nella ripetizione.
Non si annoiano.
Non si lamentano.
Non sospirano drammaticamente dopo il terzo compito.
A differenza degli esseri umani.
Specialmente di lunedì.
Cos’è un ciclo?
Un ciclo è un modo per ripetere codice.
Invece di scrivere:
print("Hello")
print("Hello")
print("Hello")
puoi scrivere:
for number in range(3):
print("Hello")
Output:
Hello
Hello
Hello
Il codice dentro il ciclo viene eseguito più volte.
Questo è molto utile.
Un ciclo dice:
Fai questa azione ancora e ancora.
Non per sempre.
A meno che tu non faccia un errore.
Allora sì, forse per sempre.
Ne parleremo.
Molto importante.
Molto leggermente terrificante.
Il tuo primo ciclo for
Crea un file:
loops.py
Scrivi:
for number in range(5):
print("Hello from Python!")
Eseguilo:
python loops.py
oppure:
python3 loops.py
Output:
Hello from Python!
Hello from Python!
Hello from Python!
Hello from Python!
Hello from Python!
La riga:
for number in range(5):
significa:
Ripeti il codice indentato 5 volte.
La riga indentata:
print("Hello from Python!")
appartiene al ciclo.
Quindi Python la esegue 5 volte.
Molto utile.
Molto pulito.
Molto “finalmente il computer fa cose da computer”.
L’indentazione conta ancora
Proprio come con if, l’indentazione conta nei cicli.
Corretto:
for number in range(3):
print("Hello")
Sbagliato:
for number in range(3):
print("Hello")
Python mostrerà:
IndentationError
Il codice dentro il ciclo deve essere indentato.
Python usa l’indentazione per capire cosa appartiene al ciclo.
I tuoi spazi non sono decorazione.
Sono struttura.
Piccola architettura.
Di nuovo.
Python ama davvero i mobili organizzati.
I due punti sono obbligatori
Anche un ciclo for ha bisogno dei due punti:
for number in range(3):
Sbagliato:
for number in range(3)
print("Hello")
Corretto:
for number in range(3):
print("Hello")
I due punti dicono a Python:
Qui inizia un blocco di codice ripetuto.
Simbolo piccolo.
Grande responsabilità.
I due punti sono come una piccola porta dentro il ciclo.
Dimentichi la porta, e nessuno entra.
Capire range()
range() crea una sequenza di numeri.
Esempio:
for number in range(5):
print(number)
Output:
0
1
2
3
4
Dettaglio importante:
range(5)
parte da 0 e si ferma prima di 5.
Quindi dà:
0, 1, 2, 3, 4
Non:
1, 2, 3, 4, 5
Questo sorprende molti principianti.
Python inizia a contare da zero.
I computer amano lo zero.
Nessuno sa perché siano così emotivamente legati a lui.
In realtà gli sviluppatori lo sanno.
Ma oggi non apriamo quella caverna.
Contare da 1
Se vuoi contare da 1 a 5, scrivi:
for number in range(1, 6):
print(number)
Output:
1
2
3
4
5
Qui:
range(1, 6)
significa:
Inizia da 1.
Fermati prima di 6.
Quindi l’ultimo numero è 5.
Molto importante.
Il secondo valore non è incluso.
Questo è comune in Python.
All’inizio sembra strano.
Poi diventa normale.
Poi inizi a spiegarlo ai principianti e sembri sospettosamente calmo.
range(start, stop, step)
range() può usare anche uno step.
Esempio:
for number in range(0, 10, 2):
print(number)
Output:
0
2
4
6
8
Questo significa:
Inizia da 0.
Fermati prima di 10.
Vai avanti di 2.
Altro esempio:
for number in range(10, 0, -1):
print(number)
Output:
10
9
8
7
6
5
4
3
2
1
Questo conta all’indietro.
Molto drammatico.
Come il lancio di un razzo.
Ma con meno fuoco.
Speriamo.
La variabile del ciclo
Guarda questo:
for number in range(5):
print(number)
La variabile number cambia ogni volta che il ciclo viene eseguito.
Primo giro:
number = 0
Secondo giro:
number = 1
Terzo giro:
number = 2
E così via.
La variabile del ciclo salva il valore corrente.
Puoi chiamarla anche in modo diverso:
for i in range(5):
print(i)
Funziona anche così.
Molti sviluppatori usano i per semplici contatori.
Ma i nomi chiari spesso sono migliori:
for product_number in range(5):
print(product_number)
Usa nomi che abbiano senso.
Il tuo io futuro sta ancora guardando.
E giudicando.
Un po’.
Ripetere un messaggio con numeri
Prova:
for number in range(1, 6):
print(f"Message number {number}")
Output:
Message number 1
Message number 2
Message number 3
Message number 4
Message number 5
Ora il ciclo non ripete soltanto.
Usa anche il numero corrente.
Questo è molto utile.
I cicli non sono solo fotocopiatrici.
Possono cambiare qualcosa a ogni giro.
Un po’.
Come gli esseri umani che imparano dagli errori.
Ma più velocemente.
Somma semplice con un ciclo
Puoi usare un ciclo per calcolare un totale.
Esempio:
total = 0
for number in range(1, 6):
total = total + number
print(f"Total: {total}")
Output:
Total: 15
Cosa succede?
Inizia con total a 0.
Aggiungi 1.
Aggiungi 2.
Aggiungi 3.
Aggiungi 4.
Aggiungi 5.
Stampa il totale finale.
Questo è uno schema molto comune.
Inizia con un risultato vuoto.
Scorri i valori.
Aggiorna il risultato.
Stampa o usa il risultato.
Molto utile.
Molto programmazione.
Molto “piccoli passi diventano qualcosa di più grande”.
Aggiornamento totale più corto
Questo:
total = total + number
può essere scritto così:
total += number
Quindi il programma diventa:
total = 0
for number in range(1, 6):
total += number
print(f"Total: {total}")
Output:
Total: 15
Entrambe le versioni sono corrette.
La versione corta è comune.
Usala quando capisci cosa significa.
Non scrivere codice corto solo per sembrare professionale.
Il codice professionale non è codice misterioso.
Il codice professionale è codice che funziona e può essere capito più tardi.
Molto noioso.
Molto vero.
Scorrere il testo
Puoi scorrere una stringa con un ciclo.
Esempio:
word = "Python"
for letter in word:
print(letter)
Output:
P
y
t
h
o
n
Una stringa è fatta di caratteri.
Un ciclo può attraversarli uno per uno.
Qui:
letter
salva il carattere corrente.
Prima:
P
Poi:
y
Poi:
t
E così via.
Python smonta la parola come una piccola macchina educata.
Nessuna violenza.
Solo caratteri.
Contare lettere
Prova:
word = input("Enter a word: ")
letter_count = 0
for letter in word:
letter_count += 1
print(f"The word has {letter_count} letters.")
Esempio:
Enter a word: Python
Output:
The word has 6 letters.
Questo conta le lettere manualmente.
Più avanti imparerai modi più semplici.
Ma farlo con un ciclo ti aiuta a capire come funzionano i cicli.
A volte facciamo le cose nel modo più lungo per imparare.
Non perché Python ami guardarci soffrire.
Probabilmente.
Ciclo con condizioni
Puoi usare if dentro un ciclo.
Esempio:
for number in range(1, 11):
if number % 2 == 0:
print(f"{number} is even")
Output:
2 is even
4 is even
6 is even
8 is even
10 is even
Questa riga:
number % 2 == 0
controlla se il numero è pari.
L’operatore % dà il resto.
Se un numero diviso per 2 ha resto 0, è pari.
Esempio:
4 % 2 = 0
5 % 2 = 1
Molto utile.
Molto classico.
Molto matematico, ma non troppo spaventoso.
Il drago della matematica sta ancora dormendo.
Numeri pari e dispari
Crea un file:
even_odd.py
Scrivi:
for number in range(1, 11):
if number % 2 == 0:
print(f"{number} is even")
else:
print(f"{number} is odd")
Output:
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
10 is even
Ora il ciclo ripete.
La condizione decide.
Insieme rendono il programma più potente.
Cicli e condizioni sono come un piccolo motore di programmazione.
Non glamour.
Ma molto forte.
Come un vecchio furgone diesel che si rifiuta di morire.
Cos’è un ciclo while?
Un ciclo while ripete codice mentre una condizione è vera.
Esempio:
count = 1
while count <= 5:
print(count)
count += 1
Output:
1
2
3
4
5
Questo significa:
Mentre count è minore o uguale a 5, ripeti il blocco.
Ogni volta aumentiamo count di 1.
Alla fine count diventa 6.
Allora la condizione diventa falsa.
Il ciclo si ferma.
Molto importante.
Un ciclo while deve avere un modo per fermarsi.
Altrimenti diventa un ciclo infinito.
E il tuo computer inizia a guardarti con delusione.
for vs while
Usa for quando sai quante volte vuoi ripetere.
Esempio:
for number in range(5):
print(number)
Usa while quando vuoi ripetere finché qualcosa cambia.
Esempio:
password = ""
while password != "secret":
password = input("Password: ")
print("Access granted.")
Regola semplice:
for ripeti su una sequenza conosciuta
while ripeti mentre una condizione è vera
Questa regola non è perfetta per ogni situazione.
Ma è molto buona per principianti.
Il tuo primo ciclo while
Crea un file:
while_loop.py
Scrivi:
count = 1
while count <= 5:
print(f"Count: {count}")
count += 1
Eseguilo.
Output:
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Cosa succede?
count parte da 1.
Python controlla se count <= 5.
Se è vero, stampa.
Poi count aumenta di 1.
Python controlla di nuovo.
Alla fine count diventa 6.
La condizione è falsa.
Il ciclo si ferma.
Questo è lo schema base di while.
Inizia.
Controlla.
Ripeti.
Aggiorna.
Fermati.
Bellissimo.
Come una lavatrice con logica.
Cicli infiniti
Un ciclo infinito è un ciclo che non finisce mai.
Esempio:
count = 1
while count <= 5:
print(count)
Questo è pericoloso.
Perché?
Perché count non cambia mai.
È sempre 1.
Quindi:
count <= 5
è sempre vero.
Il ciclo gira per sempre.
O finché non fermi il programma.
Questo si chiama ciclo infinito.
Errore molto comune per principianti.
Molto fastidioso.
Ottimo modo per far sembrare il terminale posseduto.
Come fermare un ciclo infinito
Se il programma resta bloccato in un ciclo infinito, premi:
Ctrl + C
Questo interrompe il programma.
Il terminale può mostrare qualcosa tipo:
KeyboardInterrupt
Va bene.
Significa che hai fermato il programma.
Non elegante.
Ma efficace.
Come staccare la spina a un robot confuso.
Evita i cicli infiniti assicurandoti che la condizione possa diventare falsa.
Molto importante.
Ciclo password
Un buon uso di while è chiedere finché l’utente dà la risposta corretta.
Crea un file:
password_loop.py
Scrivi:
password = ""
while password != "python123":
password = input("Enter password: ")
print("Access granted.")
Esempio:
Enter password: banana
Enter password: hello
Enter password: python123
Access granted.
Il ciclo continua mentre la password non è corretta.
Quando l’utente scrive:
python123
la condizione diventa falsa.
Il ciclo si ferma.
Poi il programma stampa:
Access granted.
Molto utile.
Molto semplice.
Molto pessimo come sicurezza reale.
Di nuovo, non proteggere una banca con la lezione 5.
Usare break
break ferma immediatamente un ciclo.
Esempio:
while True:
answer = input("Type q to quit: ")
if answer == "q":
break
print(f"You typed: {answer}")
print("Program ended.")
Questo ciclo inizia con:
while True:
Significa:
Ripeti per sempre.
Ma dentro il ciclo usiamo:
break
per fermarci quando l’utente scrive "q".
Esempio:
Type q to quit: hello
You typed: hello
Type q to quit: test
You typed: test
Type q to quit: q
Program ended.
break è utile.
Ma usalo in modo chiaro.
Un ciclo con troppe uscite segrete diventa un labirinto.
E a nessuno piace fare debugging in un labirinto.
Tranne forse persone molto strane.
Usare continue
continue salta il resto del giro corrente e passa all’iterazione successiva.
Esempio:
for number in range(1, 6):
if number == 3:
continue
print(number)
Output:
1
2
4
5
Quando number è 3, Python esegue:
continue
Quindi salta:
print(number)
per quel giro.
Poi il ciclo continua con 4.
continue è utile quando vuoi saltare certi casi.
Come dire:
Non questo. Il prossimo.
Molto pratico.
Molto leggermente scortese.
break vs continue
Differenza semplice:
break ferma completamente il ciclo
continue salta questo giro e continua con il prossimo
Esempio con break:
for number in range(1, 6):
if number == 3:
break
print(number)
Output:
1
2
Il ciclo si ferma a 3.
Esempio con continue:
for number in range(1, 6):
if number == 3:
continue
print(number)
Output:
1
2
4
5
Il ciclo salta 3 ma continua.
Parole piccole.
Comportamento diverso.
Non confonderle, a meno che tu non ami le sorprese.
Errore comune: dimenticare di aggiornare la variabile while
Sbagliato:
count = 1
while count <= 5:
print(count)
Questo non finisce mai.
Corretto:
count = 1
while count <= 5:
print(count)
count += 1
Chiediti sempre:
Come si fermerà questo ciclo while?
Se non sai rispondere, il tuo ciclo potrebbe diventare immortale.
Codice immortale sembra figo.
Non lo è.
Di solito è un bug con il mantello.
Errore comune: range() sbagliato
Aspettativa del principiante:
for number in range(5):
print(number)
Output atteso dal principiante:
1
2
3
4
5
Output reale:
0
1
2
3
4
Ricorda:
range(5)
parte da 0 e si ferma prima di 5.
Se vuoi da 1 a 5:
for number in range(1, 6):
print(number)
Questo dà:
1
2
3
4
5
Python non sbaglia.
È semplicemente Python.
Questa frase diventerà utile molte volte.
Errore comune: indentazione sbagliata
Sbagliato:
for number in range(3):
print(number)
Corretto:
for number in range(3):
print(number)
Il codice dentro un ciclo deve essere indentato.
Se più righe appartengono al ciclo, indenta tutte:
for number in range(3):
print("Current number:")
print(number)
Entrambe le righe print() vengono eseguite dentro il ciclo.
Se una riga non è indentata, è fuori dal ciclo.
Esempio:
for number in range(3):
print(number)
print("Done")
Output:
0
1
2
Done
Done viene stampato una sola volta dopo la fine del ciclo.
Molto importante.
L’indentazione decide l’appartenenza.
Come i documenti per i blocchi di codice.
Errore comune: usare while quando for è più semplice
Questo funziona:
count = 0
while count < 5:
print(count)
count += 1
Ma questo è più semplice:
for count in range(5):
print(count)
Usa for quando conosci il numero di ripetizioni.
Usa while quando il ciclo dipende da una condizione.
Non usare un cacciavite come cucchiaio.
Può funzionare.
Ma le persone faranno domande.
Mini programma: tabellina
Crea un file:
multiplication_table.py
Scrivi:
number = int(input("Enter a number: "))
for i in range(1, 11):
result = number * i
print(f"{number} x {i} = {result}")
Esempio:
Enter a number: 5
Output:
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
Questo è un programma classico con i cicli.
Molto utile.
Molto semplice.
Molto scuola, ma nel senso buono.
Più o meno.
Mini programma: somma di numeri
Crea un file:
sum_numbers.py
Scrivi:
limit = int(input("Add numbers from 1 to: "))
total = 0
for number in range(1, limit + 1):
total += number
print(f"Total: {total}")
Esempio:
Add numbers from 1 to: 5
Output:
Total: 15
Perché:
1 + 2 + 3 + 4 + 5 = 15
Nota:
range(1, limit + 1)
Perché limit + 1?
Perché range() si ferma prima del secondo valore.
Se l’utente inserisce 5, ci serve:
range(1, 6)
Piccolo dettaglio.
Grande importanza.
Python ama queste piccole trappole.
Trappole educative.
Ma sempre trappole.
Mini programma: indovina il numero
Crea un file:
guess_number.py
Scrivi:
secret_number = 7
guess = 0
while guess != secret_number:
guess = int(input("Guess the number: "))
if guess < secret_number:
print("Too low.")
elif guess > secret_number:
print("Too high.")
else:
print("Correct!")
Esempio:
Guess the number: 3
Too low.
Guess the number: 10
Too high.
Guess the number: 7
Correct!
Questo programma usa:
- variabili;
- input;
- conversione di tipo;
while;- condizioni;
- operatori di confronto.
Molte lezioni insieme.
È così che la programmazione cresce.
Un’idea si collega a un’altra.
Come cavi.
Speriamo etichettati.
Mini programma: menu con ciclo
Crea un file:
menu.py
Scrivi:
choice = ""
while choice != "q":
print("----- Menu -----")
print("1. Say hello")
print("2. Say goodbye")
print("q. Quit")
choice = input("Choose an option: ").lower()
if choice == "1":
print("Hello!")
elif choice == "2":
print("Goodbye!")
elif choice == "q":
print("Exiting...")
else:
print("Unknown option.")
Questo programma continua a mostrare il menu finché l’utente scrive:
q
I menu con cicli sono molto comuni.
Molti programmi da terminale funzionano così.
Il programma chiede.
L’utente sceglie.
Il programma reagisce.
Poi chiede di nuovo.
È nata una piccola applicazione da riga di comando.
Molto carina.
Molto utile.
Non darle da mangiare dopo mezzanotte.
Pratica
Crea un file:
practice_loops.py
Scrivi un programma che:
- chiede all’utente un numero;
- stampa tutti i numeri da 1 a quel numero;
- dice se ogni numero è pari o dispari;
- calcola la somma totale.
Esempio:
limit = int(input("Enter a number: "))
total = 0
for number in range(1, limit + 1):
total += number
if number % 2 == 0:
print(f"{number} is even")
else:
print(f"{number} is odd")
print(f"Total sum: {total}")
Output esempio:
Enter a number: 5
1 is odd
2 is even
3 is odd
4 is even
5 is odd
Total sum: 15
Questa è ottima pratica.
Combina:
- input;
- cicli;
- condizioni;
- aritmetica;
- variabili;
- output formattato.
Esercizio molto forte per principianti.
Non facile.
Ma molto utile.
Mini sfida
Crea un file:
shopping_total.py
Il tuo programma deve:
- chiedere quanti prodotti vuole inserire il cliente;
- ripetere quel numero di volte;
- chiedere il nome del prodotto;
- chiedere il prezzo del prodotto;
- aggiungere il prezzo al totale;
- stampare il totale finale.
Soluzione esempio:
product_count = int(input("How many products? "))
total = 0
for number in range(1, product_count + 1):
print(f"Product {number}")
product_name = input("Name: ")
price = float(input("Price: "))
total += price
print(f"Added {product_name}: {price:.2f}")
print("----- Total -----")
print(f"Total price: {total:.2f}")
Esempio di interazione:
How many products? 3
Product 1
Name: Keyboard
Price: 70
Added Keyboard: 70.00
Product 2
Name: Mouse
Price: 25
Added Mouse: 25.00
Product 3
Name: Notebook
Price: 5.5
Added Notebook: 5.50
----- Total -----
Total price: 100.50
Questo è vicino alla logica reale.
Un negozio.
Una lista di prodotti.
Un totale.
Niente database ancora.
Niente web app ancora.
Ma l’idea è reale.
Piccolo programma da terminale.
Grande fondazione.
Molto Python.
Sfida extra: password con tentativi
Crea un file:
password_attempts.py
Il tuo programma deve:
- salvare una password segreta;
- permettere solo 3 tentativi;
- stampare
"Access granted."se è corretta; - stampare
"Access denied."dopo 3 tentativi sbagliati.
Soluzione esempio:
secret_password = "python123"
attempts = 0
max_attempts = 3
access_granted = False
while attempts < max_attempts:
password = input("Password: ")
attempts += 1
if password == secret_password:
access_granted = True
break
else:
print("Wrong password.")
if access_granted:
print("Access granted.")
else:
print("Access denied.")
Questo programma usa:
while;- contatore;
break;- flag booleano;
- condizione dopo il ciclo.
Ottima pratica.
Questa è logica più seria.
Ancora non è sicurezza reale.
Ma è ottimo apprendimento.
La banca non è ancora al sicuro.
Per favore, tieni la banca lontana da questa lezione.
Checklist per principianti
Quando il tuo ciclo non funziona, controlla:
Ho salvato il file?
Ho usato i due punti dopo for o while?
Il corpo del ciclo è indentato?
Il mio ciclo while ha un modo per fermarsi?
Ho aggiornato il contatore?
Sto usando range() correttamente?
Mi serve range(1, limit + 1)?
Ho messo per sbaglio codice fuori dal ciclo?
Ho usato break quando volevo fermare il ciclo?
Ho usato continue quando volevo saltare solo un giro?
I cicli sono potenti.
Ma possono creare bug confusi.
Specialmente i cicli while.
Chiediti sempre:
Cosa cambia a ogni giro?
Quando si ferma il ciclo?
Se sai rispondere a queste due domande, sei molto più al sicuro.
Se no, preparati al caos.
Caos educativo.
Ma sempre caos.
Riassunto
Oggi hai imparato:
- i cicli ripetono codice;
- i cicli
forsono utili quando sai su quale sequenza ripetere; range()crea una sequenza di numeri;range(5)dà da0a4;range(1, 6)dà da1a5;- la variabile del ciclo cambia a ogni iterazione;
- le stringhe possono essere percorse carattere per carattere;
- i cicli possono contenere condizioni;
whileripete mentre una condizione è vera;- i cicli
whilehanno bisogno di un modo per fermarsi; - i cicli infiniti succedono quando la condizione non diventa mai falsa;
Ctrl + Cpuò fermare un programma bloccato;breakferma immediatamente un ciclo;continuesalta l’iterazione corrente;- i cicli sono utili per totali, contatori, menu, password e input ripetuti.
Questo è un passo enorme.
I tuoi programmi ora possono ripetere lavoro.
Possono contare.
Possono chiedere di nuovo.
Possono calcolare totali.
Possono mostrare menu.
Possono processare molti valori.
Qui la programmazione diventa molto più potente.
Perché i computer amano la ripetizione.
E gli esseri umani amano non fare ripetizioni noiose manualmente.
Una bellissima collaborazione.
Più o meno.
Prossima lezione
Nella prossima lezione impareremo le liste.
Le liste ti permettono di salvare molti valori in una sola variabile.
Invece di scrivere:
product1 = "Keyboard"
product2 = "Mouse"
product3 = "Notebook"
scriverai:
products = ["Keyboard", "Mouse", "Notebook"]
Poi cicli e liste lavoreranno insieme.
Ed è lì che Python inizia a diventare molto più utile.
Progresso molto forte.
Molto Python.