Controllo di flusso - Cicli for
Scarica zip esercizi
Se vogliamo compiere una o più azioni per ogni elemento di una sequenza avremo bisogno del cosiddetto ciclo for
, che ci permette di iterare su una sequenza.
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
for
for1-intro.ipynb
for1-intro-sol.ipynb
for2-strings.ipynb
for2-strings-sol.ipynb
for3-lists.ipynb
for3-lists-sol.ipynb
for4-tuples.ipynb
for4-tuples-sol.ipynb
for5-sets.ipynb
for5-sets-sol.ipynb
for6-dictionaries.ipynb
for6-dictionaries-sol.ipynb
for7-nested.ipynb
for7-nested-sol.ipynb
for8-chal.ipynb
jupman.py
ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.
apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook
for1-intro.ipynb
Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.
Scorciatoie da tastiera:
Per eseguire il codice Python dentro una cella di Jupyter, premi
Control+Invio
Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+Invio
Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+Invio
Se per caso il Notebook sembra inchiodato, prova a selezionare
Kernel -> Restart
Iterazione per elemento
Se abbiamo una sequenza come per esempio una lista:
[2]:
sport = ['pallavolo', 'tennis', 'calcio', 'nuoto']
e vogliamo in qualche modo usare ogni elemento della lista (per esempio stamparli), li possiamo scorrere (o meglio, iterare) con un ciclo for
:
[3]:
for elemento in sport:
print('Trovato un elemento!')
print(elemento)
print('Finito!')
Trovato un elemento!
pallavolo
Trovato un elemento!
tennis
Trovato un elemento!
calcio
Trovato un elemento!
nuoto
Finito!
Vediamo cosa succede in Python Tutor:
[4]:
# AFFINCHE' PYTHON TUTOR FUNZIONI, RICORDATI DI ESEGUIRE QUESTA CELLA con Shift+Invio
# (basta eseguirla una volta sola, la trovi anche all'inizio di ogni foglio)
import jupman
[5]:
sport = ['pallavolo', 'tennis', 'calcio', 'nuoto']
for elemento in sport:
print('Trovato un elemento!')
print(elemento)
print('Finito!')
jupman.pytut()
Trovato un elemento!
pallavolo
Trovato un elemento!
tennis
Trovato un elemento!
calcio
Trovato un elemento!
nuoto
Finito!
[5]:
Nomi variabili nei for
Ad ogni iterazione, un elemento della lista viene assegnato alla variabile elemento
.
Come nome per la variabile possiamo scegliere quello che ci pare, per esempio questo codice è totalmente equivalente al precedente:
[6]:
sport = ['pallavolo', 'tennis', 'calcio', 'nuoto']
for nome in sport:
print('Trovato un elemento!')
print(nome)
print('Finito!')
Trovato un elemento!
pallavolo
Trovato un elemento!
tennis
Trovato un elemento!
calcio
Trovato un elemento!
nuoto
Finito!
Bisogna però fare attenzione ad una cosa:
II COMANDAMENTO: Quando inserisci una variabile in un ciclo for
, questa variabile deve essere nuova
Se hai definito la variabile prima, non la reintrodurrai in un for
, perchè ciò portebbe gran confusione.
Per esempio:
[7]:
sport = ['pallavolo', 'tennis', 'calcio', 'nuoto']
prova = 'ciao'
for prova in sport: # perdi la variabile prova originale
print(prova)
print(prova) # stampa 'nuoto' invece di 'ciao'
pallavolo
tennis
calcio
nuoto
nuoto
Iterare in stringhe
Le stringhe sono sequenze di caratteri perciò possiamo iterarle con il for
:
[8]:
for carattere in "ciao":
print(carattere)
c
i
a
o
Iterare in tuple
Anche le tuple sono sequenze quindi possiamo iterarle:
[9]:
for parola in ('sto', 'visitando', 'una', 'tupla'):
print(parola)
sto
visitando
una
tupla
Domande - iterazione
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
for i in [1,2,3]: print(i)
for x in 7: print(x)
for x in [7]: print(x)
for x in ['a','b','c']: x
for i in []: print('GURB')
for i in [1,2,3]: print(type(i))
for i in '123': print(type(i))
for i in 'abc': print(i)
for x in ((4,5,6)): print(x)
for x in [[1],[2,3],[4,5,6]]: print(x)
x = 5 for x in ['a','b','c']: print(x) print(x)
for x in ['a','b','c']: pass print(x)
for x in [1,2,3,4,5,6,7,8]: if x % 2 == 0: print(x)
la = [4,5,6] for x in la: print(x) la.reverse() for x in la[1:]: print(x)
Esercizio - tappeto magico
✪ Qualche mese fa hai acquistato un tappeto da un venditore ambulante. Tempo dopo, alla fine di un giorno particolarmente stressante, esclami ‘Ah quanto vorrei andare in vacanza in qualche posto esotico, che so, a Marrakesh!’ Con sorpresa, il tappeto si alza in aria e risponde: ‘Ho sentito e obbedisco!’
Scrivi del codice che data le liste di luoghi vaggio1
e viaggio2
stampa tutte le tappe visitate.
Esempio - dati:
viaggio1 = ['Marrakesh','Fez','Bazaar','Kasbah']
viaggio2 = ['Koutoubia', 'El Badii', 'Chellah']
Stampa:
Inizia il primo viaggio
Tu: Andiamo a Marrakesh !
Tappeto: Ho sentito e obbedisco!
Tu: Andiamo a Fez !
Tappeto: Ho sentito e obbedisco!
Tu: Andiamo a Bazaar !
Tappeto: Ho sentito e obbedisco!
Tu: Andiamo a Kasbah !
Tappeto: Ho sentito e obbedisco!
Fine del primo viaggio
Inizia il secondo viaggio
Tu: Andiamo a Koutoubia !
Tappeto: Ho sentito e obbedisco!
Tu: Andiamo a El Badii !
Tappeto: Ho sentito e obbedisco!
Tu: Andiamo a Chellah !
Tappeto: Ho sentito e obbedisco!
Fine del secondo viaggio
[10]:
viaggio1 = ['Marrakesh','Fez','Bazaar','Kasbah']
viaggio2 = ['Koutoubia', 'El Badii', 'Chellah']
# scrivi qui
Esercizio - sommapari
✪ Data la lista numeri
, scrivi del codice che calcola e stampa la somma degli elementi pari (non gli elementi ad indici pari !)
Esempio - data:
numeri = [3,4,1,5,12,7,9]
trova 4
e 12
quindi deve stampare:
16
[11]:
numeri = [3,4,1,5,12,7,9]
# scrivi qui
Esercizio - birbantello
✪ Data una stringa in minuscolo, scrivere del codice che stampa ogni carattere in maiuscolo seguito dal carattere in minuscolo.
SUGGERIMENTO: per ottenere caratteri in maiuscolo usa il metodo
.upper()
Esempio - data:
s = "birbantello"
Stampa:
B b
I i
R r
B b
A a
N n
T t
E e
L l
L l
O o
[12]:
s = "birbantello"
# scrivi qui
Esercizio - dirigibile
✪ A Pierino viene fatta imparare una nuova parola
. Pierino conosce tante lettere dell’alfabeto ma non tutte. Per ricordarsi quelle che conosce, le tratta come personaggi che divide in 3 categorie: belli
, brutti
e cattivi
. Scrivi del codice che data una parola
stampa tutti i caratteri e per ciascuno indica se è bello, brutto o cattivo. Se un carattere non è conosciuto da Pierino, stampa ‘non mi interessa’.
Esempio - dati:
parola = 'dirigibile'
belli = 'abcd'
brutti = 'efgh'
cattivi = 'ilm'
Stampa:
d è bello
i è cattivo
r non mi interessa
i è cattivo
g è brutto
i è cattivo
b è bello
i è cattivo
l è cattivo
e è brutto
[13]:
parola = 'dirigibile'
belli = 'abcd'
brutti = 'efgh'
cattivi = 'ilm'
# scrivi qui
Esercizio - gala
✪ Ad un evento di gala vengono invitate figure altolocate della società. All’inizio della serata sono aperte le porte e gli ospiti si mettono in coda
all’ingresso. Sfortunatamente, a queste occasioni cercano sempre di presentarsi anche personaggi poco raccomandabili, perciò al concierge nell’atrio viene consegnato un insieme di ospiti sgraditi
. Qualora un ospite sia riconosciuto come non gradito, verrà affidato alle capaci mani del buttafuori Ferruccio. Gli ospiti illustri vengono invece
segnati nella lista ammessi
.
Scrivi del codice che stampa i vari passi del ricevimento.
Esempio - dati:
coda = ['Console','Notaio','Scheletro','Rettore','Goblin','Vampiro', 'Gioielliere']
sgraditi = {'Vampiro','Goblin','Scheletro'}
ammessi = []
Stampa:
Aprite le porte!
Buonasera Signor Console
Prego Eccellenza, entri pure
Avanti il prossimo !
Buonasera Signor Notaio
Prego Eccellenza, entri pure
Avanti il prossimo !
Buonasera Signor Scheletro
Ferruccio, vuoi prenderti cura del signor Scheletro ?
Avanti il prossimo !
Buonasera Signor Rettore
Prego Eccellenza, entri pure
Avanti il prossimo !
Buonasera Signor Goblin
Ferruccio, vuoi prenderti cura del signor Goblin ?
Avanti il prossimo !
Buonasera Signor Vampiro
Ferruccio, vuoi prenderti cura del signor Vampiro ?
Avanti il prossimo !
Buonasera Signor Gioielliere
Prego Eccellenza, entri pure
Avanti il prossimo !
Sono stati ammessi i signori Console, Notaio, Rettore, Gioielliere
[14]:
coda = ['Console','Notaio','Scheletro','Rettore','Goblin','Vampiro', 'Gioielliere']
sgraditi = {'Vampiro','Goblin','Scheletro'}
ammessi = []
# scrivi qui
Esercizio - bilancia
✪✪ E’ stato fatto un raccolto di sementi, che verranno messe in un certo numero di sacchi
da capienza
kg l’uno (es 15
).
Le sementi arrivano in recipienti
di capacità variabile. Ogni recipiente viene messo su una bilancia e il suo contenuto versato nel sacco corrente. Nel momento in cui si arriva alla quantità capienza
, la bilancia si svuota, il sacco viene sostituito con uno nuovo e si comincia a riempire quello nuovo partendo dagli eventuali resti in eccesso dal riempimento precedente. Scrivi del codice che stampa il procedimento.
Esempio - dati:
recipienti = [5,1,7,4,3,9,5,2,7,3]
capienza = 15
Stampa:
Raccolto 5 kg
La bilancia segna 5 kg
Raccolto 1 kg
La bilancia segna 6 kg
Raccolto 7 kg
La bilancia segna 13 kg
Raccolto 4 kg
La bilancia segna 17 kg
Abbiamo raggiunto la capienza di 15 kg, avanzano 2 kg
Raccolto 3 kg
La bilancia segna 5 kg
Raccolto 9 kg
La bilancia segna 14 kg
Raccolto 5 kg
La bilancia segna 19 kg
Abbiamo raggiunto la capienza di 15 kg, avanzano 4 kg
Raccolto 2 kg
La bilancia segna 6 kg
Raccolto 7 kg
La bilancia segna 13 kg
Raccolto 3 kg
La bilancia segna 16 kg
Abbiamo raggiunto la capienza di 15 kg, avanzano 1 kg
Abbiamo riempito 3 sacchi
[15]:
recipienti = [5,1,7,4,3,9,5,2,7,3]
capienza = 15
# scrivi qui
Contare con range
Se abbiamo bisogno di contare a quale iterazione siamo, possiamo usare la sequenza iterabile range
, che produce una serie di numeri interi da 0
INCLUSO fino al numero specificato ESCLUSO:
[16]:
for i in range(5):
print(i)
0
1
2
3
4
Nota come non abbia stampato l’estremo 5
.
Quando chiamiamo range
possiamo anche specificare l’indice di partenza, che viene INCLUSO nella sequenza generata, mentre l’indice di arrivo è sempre ESCLUSO:
[17]:
for i in range(3,7):
print(i)
3
4
5
6
Contare a intervalli: possiamo specificare l’incremento da applicare al contatore ad ogni iterazione passando un terzo parametero, qua per esempio specifichiamo un incremento di 2
(nota come l’indice finale 18
rimanga ESCLUSO dalla sequenza):
[18]:
for i in range(4,18,2):
print(i)
4
6
8
10
12
14
16
Ordine inverso: Si può contare al contrario usando un incremento negativo:
[19]:
for i in range(5,0,-1):
print(i)
5
4
3
2
1
Nota come il limite 0
non sia stato raggiunto, per arrivarci occorre scrivere
[20]:
for i in range(5,-1,-1):
print(i)
5
4
3
2
1
0
Domande - range
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
for x in range(1): print(x)
for i in range(3): i
for i in range(3): print(i)
for x in range(-1): print(x)
for 'm' in range(3): print('m')
for i in range(3): i-1
for x in range(6,4,-1): print(x)
for x in range(1,0,-1): print(x)
for x in range(3,-3,-2): print(x)
for x in 3: print(x)
x = 3 for i in range(x): print(i) for i in range(x,2*x): print(i)
for x in range(range(3)): print(x)
Esercizio - stampadoppi
✪ Dato un numero positivo n
(per es n=4
) scrivi del codice che stampa:
il doppio di 0 è 0
il doppio di 1 è 2
il doppio di 2 è 4
il doppio di 3 è 6
[21]:
n = 4
# scrivi qui
Esercizio - multipli e non
✪✪ Scrivi del codice che dati due numeri interi positivi k
e b
:
prima stampa tutti i numeri da
k
INCLUSO ab
INCLUSO che sono multipli dik
poi stampa tutti i numeri da
k
ESCLUSO ab
ESCLUSO che NON sono multipli dik
Esempio - dati
k,b = 3,15
deve stampare:
Multipli di 3
3
6
9
12
15
Non divisibili per 3:
4
5
7
8
10
11
13
14
[22]:
k,b = 3,15
# scrivi qui
Esercizio - intervallo ab
✪✪ Data due interi a
e b
maggiori o uguali a zero , scrivere del codice che stampa tutti i numeri interi tra i due estremi INCLUSI
NOTA:
a
può essere maggiore, uguale o minore dib
, il tuo codice deve gestire tutti i casi.
Esempio 1 - dati
a,b = 5,9
deve stampare
5
6
7
8
9
Esempio 2 - dati
a,b = 8,3
deve stampare
3
4
5
6
7
8
[23]:
a,b = 5,9 # 5 6 7 8 9
#a,b = 8,3 # 3 4 5 6 7 8
#a,b = 6,6 # 6
# scrivi qui
Esercizio - FizzBuzz
Scrivi del codice che stampa i numeri da 1 a 35 INCLUSI, ma se un numero è divisibile per 3 stampa invece FIZZ, se è divisibile per 5 stampa BUZZ, e se è divisibile sia per 3 che per 5 stampa FIZZBUZZ.
Output atteso:
1
2
FIZZ
4
BUZZ
FIZZ
7
8
FIZZ
BUZZ
11
FIZZ
13
14
FIZZBUZZ
16
17
FIZZ
19
BUZZ
FIZZ
22
23
FIZZ
BUZZ
26
FIZZ
28
29
FIZZBUZZ
31
32
FIZZ
34
BUZZ
[24]:
# scrivi qui
Iterare per indici
Se abbiamo una sequenza come una lista, a volte è necessario conoscere in quale cella si è durante l’iterazione: per farlo serve tener traccia degli indici. Possiamo generare gli indici da controllare con range
, e usarli per accedere ad una lista:
[25]:
sport = ['pallavolo', 'tennis', 'calcio', 'nuoto']
for i in range(len(sport)):
print('posizione', i)
print(sport[i])
posizione 0
pallavolo
posizione 1
tennis
posizione 2
calcio
posizione 3
nuoto
Nota come abbiamo passato a range
la dimensione della lista con len
Esercizio - cucina
✪ Scrivi del codice che data una lista di stringhe cucina
in numero pari, stampa le coppie di elementi che si possono trovare in sequenza, una riga alla volta
Esempio - dati:
cucina = ['dado', 'minestra', 'uova', 'torta', 'sugo', 'pasta', 'ragù', 'lasagne']
Stampa:
dado minestra
uova torta
sugo pasta
ragù lasagne
[26]:
cucina = ['dado', 'minestra', 'uova', 'torta', 'sugo', 'pasta', 'ragù', 'lasagne']
# scrivi qui
Esercizio - neon
✪ Date due liste la
e lb
di uguale lunghezza \(n\), scrivi del codice che stampa su \(n\) righe i loro caratteri separati da uno spazio
Esempio - dati:
la = ['n','e','o','n']
lb = ['s','h','o','w']
stampa
n s
e h
o o
n w
[27]:
la = ['n','e','o','n']
lb = ['s','h','o','w']
# scrivi qui
Esercizio - emozioni
✪ Date una lista di stringhe emozioni
e una grado
contenente numeri -1
e 1
, scrivi del codice che stampa le emozioni affiancandole a ‘positivo’ se il corrispondente grado è un numero maggiore di zero e ‘negativa’.
Esempio - dati:
emozioni = ['Paura', 'Rabbia','Tristezza','Gioia','Disgusto','Estasi']
grado = [-1, -1, -1, 1, -1, 1]
stampa:
Paura : negativa
Rabbia : negativa
Tristezza : negativa
Gioia : positiva
Disgusto : negativa
Estasi : positiva
[28]:
emozioni = ['Paura', 'Rabbia','Tristezza','Gioia','Disgusto','Estasi']
grado = [-1, -1, -1, 1, -1, 1]
# scrivi qui
Esercizio - organetto
✪ Data una stringa s
, scrivi del codice che stampa tutte le sottostringhe ottenibili partendo dalla posizione della lettera 'n'
e che terminino con l’ultimo carattere di s
.
Esempio - data:
s = 'organetto'
Stampa:
netto
etto
tto
to
o
[29]:
s = 'organetto'
# scrivi qui
Esercizio - sghiribizzo
Scrivi del codice che data la stringa s
stampa tutte le possibili combinazioni di coppie di righe tali per cui una riga inizia con i primi caratteri di s
e la successiva continua con i restanti caratteri.
Esempio - data
s = 'sghiribizzo'
stampa:
s
ghiribizzo
sg
hiribizzo
sgh
iribizzo
sghi
ribizzo
sghir
ibizzo
sghiri
bizzo
sghirib
izzo
sghiribi
zzo
sghiribiz
zo
sghiribizz
o
sghiribizzo
[30]:
s = 'sghiribizzo'
# scrivi qui
Esercizio - dna
Date due stringhe di DNA s1
e s2
di uguale lunghezza, scrivi del codice che stampa tra la prima e la seconda stringa un’altra stringa costituita da spazi ` ` e pipe \(|\) in corrispondenza dei caratteri uguali.
SUGGERIMENTO: crea una lista contenente i caratteri spazio o il carattere \(|\), e alla fine converti a stringa usando il metodo
join
delle stringhe (fare così è molto più efficiente che continuare a generare stringhe con l’operatore+
)
Esempio - date:
s1 = "ATACATATAGGGCCAATTATTATAAGTCAC"
s2 = "CGCCACTTAAGCGCCCTGTATTAAAGTCGC"
Stampa:
ATACATATAGGGCCAATTATTATAAGTCAC
|| || | | | | ||||| |
CGCCACTTAAGCGCCCTGTATTAAAGTCGC
[31]:
s1 = "ATACATATAGGGCCAATTATTATAAGTCAC"
s2 = "CGCCACTTAAGCGCCCTGTATTAAAGTCGC"
# scrivi qui
Esercizio - sportello
✪✪ Data una stringa s
, stampa la prima metà di caratteri in minuscolo e la seguente metà in maiuscolo.
se la stringa è di lunghezza dispari, la prima metà deve avere un carattere in più rispetto alla seconda
Esempio - data:
s = 'sportello'
Il tuo codice deve stampare:
s
p
o
r
t
E
L
L
O
(nota che ‘sportello’ ha lunghezza dispari e ci sono cinque caratteri nella prima metà e quattro nella seconda)
Mostra soluzione[32]:
s = 'sportello' # sportELLO
#s = 'maglia' # magLIA
# scrivi qui
Esercizio - fattoria
✪✪ Dato un dizionario versi
che associa nomi di animali ai versi che fanno, e una lista stanze
di tuple da 2 elementi contenenti nomi di animali, scrivi del codice che per ogni stanza stampa i versi che si sentono passandoci davanti.
NOTA: le stanze da stampare sono numerate a partire da 1
Esempio - dati:
versi = {'cane':'Bau!',
'gatto':'Miao!',
'mucca':'Muu!',
'pecora':'Bee!'}
stanze = [('cane', 'pecora'),
('gatto','mucca'),
('mucca', 'cane')]
Stampa:
Nella stanza 1 si sentono Bau! e Bee!
Nella stanza 2 si sentono Miao! e Muu!
Nella stanza 3 si sentono Muu! e Bau!
[33]:
versi = {'cane':'Bau!',
'gatto':'Miao!',
'mucca':'Muu!',
'pecora':'Bee!'}
stanze = [('cane', 'pecora'),
('gatto','mucca'),
('mucca', 'cane')]
# scrivi qui
Esercizio - pokemon
✪✪✪ Data una lista pokemon
e un numero g
di gruppi, scrivi del codice per stampare g
righe mostrando i componenti di ogni gruppo. Forma i gruppi prendendo i pokemon nell’ordine in cui li trovi nella lista.
SUGGERIMENTO 1: per ottenere il numero di componenti in un gruppo dovrai usare la divisione intera
//
SUGGERIMENTO 2: per stampare i componenti di un gruppo, usa il metodo
join
delle stringhe
Esempio 1 - dati
# 0 1 2 3 4 5
pokemon = ['Charizard','Gengar','Arcanine','Bulbasaur','Blaziken','Umbreon',
# 6 7 8 9 10 11
'Lucario','Gardevoir','Eevee','Dragonite', 'Volcarona', 'Sylveon' ]
g = 3
stampa
gruppo 1 : Charizard e Gengar e Arcanine e Bulbasaur
gruppo 2 : Blaziken e Umbreon e Lucario e Gardevoir
gruppo 3 : Eevee e Dragonite e Volcarona e Sylveon
Esempio 2 - dati
# 0 1 2 3 4 5
pokemon = ['Charizard','Gengar','Arcanine','Bulbasaur','Blaziken','Umbreon',
# 6 7 8 9 10 11
'Lucario','Gardevoir','Eevee','Dragonite', 'Volcarona', 'Sylveon' ]
g = 4
stampa
gruppo 1 : Charizard e Gengar e Arcanine
gruppo 2 : Bulbasaur e Blaziken e Umbreon
gruppo 3 : Lucario e Gardevoir e Eevee
gruppo 4 : Dragonite e Volcarona e Sylveon
[34]:
# 0 1 2 3 4 5 6 7 8
pokemon = ['Charizard','Gengar','Arcanine','Bulbasaur','Blaziken','Umbreon', 'Lucario','Gardevoir','Eevee',
# 9 10 11
'Dragonite', 'Volcarona', 'Sylveon' ]
g = 3
#g = 4
# scrivi qui
Modificare durante l’iterazione
Supponi di avere una lista la
contente caratteri, e ti viene chiesto di duplicare tutti gli elementi, per esempio se hai
la = ['a','b','c']
dopo il tuo codice, deve risultare
>>> print(la)
['a','b','c','a','b','c']
Forte delle conoscenze acquisite per l’iterazione, potrebbe venirti l’idea di scrivere qualcosa del genere:
for elemento in la:
la.append(elemento) # ATTENZIONE !
DOMANDA: Vedi forse un problema?
Mostra rispostaX COMANDAMENTO: Non aggiungerai o toglierai mai elementi da una sequenza su cui stai iterando con un for
!
Abbandonarti in simil tentazioni produrrebbe comportamenti del tutto imprevedibili (conosci forse l’espressione tirare il tappeto da sotto i piedi?)
E rimuovere? Abbiamo visto che aggiungere è pericoloso, ma lo è anche togliere. Supponi di dover eliminare tutti gli elementi di una lista, potresti essere tentato di scrivere qualcosa del genere:
[35]:
lista = ['a','b','c','d','e']
for el in lista:
lista.remove(el) # PESSIMA IDEA
Guarda bene il codice. Credi che abbiamo rimosso tutto, eh?
[36]:
lista
[36]:
['b', 'd']
O_o'
Il risultato assurdo è legato all’implementazione interna di Python, la mia versione di Python dà questo risultato, la tua potrebbe darne uno completamente diverso. Quindi attenzione !
Se proprio devi rimuovere elementi dalla sequenza su cui stai iterando, usa un ciclo while o effettua prima una copia della sequenza originale.
Esercizio - duplica
✪ Prova a scrivere del codice che MODIFICA una lista la
duplicandone gli elementi.
usa un ciclo
for
NON usare la moltiplicazione di liste
Esempio
la = ['a','b','c']
dopo il tuo codice, deve risultare
>>> la
['a','b','c','a','b','c']
[37]:
la = ['a','b','c']
# scrivi qui
Esercizio - martello
✪ Data una lista di caratteri la
, MODIFICA la lista cambiando tutti i caratteri ad indici pari con il carattere 'z'
Esempio - data:
la = ['m', 'a', 'r', 't', 'e', 'l', 'l', 'o']
Dopo il tuo codice, deve risultare:
>>> print(la)
['z', 'a', 'z', 't', 'z', 'l', 'z', 'o']
NOTA: qui non stiamo aggiungendo o togliendo celle dalla lista
[38]:
la = ['m', 'a', 'r', 't', 'e', 'l', 'l', 'o']
# scrivi qui
Esercizio - Orangutang
✪✪ Date due stringhe sa
e sb
, scrivi del codice che mette nella stringa sc
una stringa composta da tutte le lettere in sa
e sb
alternate
se una stringa è più corta dell’altra, in fondo a
sc
metti tutte le lettere restanti dell’altra stringaSUGGERIMENTO: sebbene sia possibile crescere una scringa un carattere alla volta ad ogni iterazione, ogni volta che lo fai viene creata una nuova stringa (perchè le stringhe sono immutabili). E’ quindi più efficiente crescere una lista e convertirla in stringa alla fine.
Esempio - dati:
sa,sb = 'gibbone', 'ORANGUTANG'
dopo il tuo codice deve risultare:
>>> print(sc)
gOiRbAbNoGnUeTANG
[39]:
sa,sb = 'gibbone', 'ORANGUTANG' # gOiRbAbNoGnUeTANG
#sa,sb = 'crociera', 'BARCA' # cBrAoRcCiAera
#sa,sb = '', '' #
# scrivi qui
Esercizio - cesta
✪✪✪ C’è una cesta
piena di frutta, che rappresentiamo come lista di stringhe. Vogliamo prendere dei frutti e metterli in un piatto, nello stesso ordine in cui li troviamo nella cesta. Bisogna prendere solo i frutti contenuti nell’insieme preferenze
.
La
cesta
può contenere duplicati, se sono nelle preferenze devi prenderli tuttii frutti vanno presi nello stesso ordine in cui sono trovati
Esempio - dati:
cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ]
preferita = {'ciliegia', 'mela', 'fragola'}
piatto = []
dopo il tuo codice, deve risultare:
>>> print(cesta)
['melone', 'anguria', 'melone', 'anguria']
>>> print(piatto)
['fragola', 'ciliegia', 'mela', 'mela']
Si può risolvere il problema in due modi:
Modo 1 (semplice e consigliabile): crea una lista
nuova_cesta
e infine la assegna alla variabilecesta
Modo 2 (difficile, lento, sconsigliabile ma istruttivo): MODIFICA la lista
cesta
originale, usando il metodo pop e senza mai riassegnarecesta
, quindi niente righe che iniziano concesta =
Prova a risolvere l’esercizio in entrambi i modi.
ATTENZIONE: Per entrambi i modi, ricordati il sacro
X COMANDAMENTO: Non aggiungerai o toglierai mai elementi da una sequenza che stai iterando con un for
!
[40]:
# MODO 1
cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ]
preferita = {'ciliegia', 'mela', 'fragola'}
piatto = []
# scrivi qui
[41]:
# MODO 2
cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ]
preferita = {'ciliegia', 'mela', 'fragola'}
piatto = []
# scrivi qui
Comandi break
e continue
Per avere ancora più controllo sull’esecuzione di un ciclo possiamo usare i comandi break
e continue
.
NOTA: Cerca di limitarne l’uso!
Quando vi è molto codice nel ciclo è facile ‘dimenticarsi’ della loro presenza trovandosi con bug difficili da scovare. D’altro canto, in alcuni casi selezionati possono rendere il codice più leggibile, quindi come in tutte le cose vanno usati con giudizio.
Terminare con un break
Per uscire immediatamente da un ciclo si può usare il comando break
:
[42]:
for x in 'lavato':
if x == 't':
print('break, esce dal ciclo!')
break
print('Dopo il break')
print(x)
print('Ciclo finito !')
l
a
v
a
break, esce dal ciclo!
Ciclo finito !
Nota come l’istruzione che stampa 'Dopo il break'
non sia stata eseguita.
Proseguire con continue
E’ possibile portare l’esecuzione immediatamente all’iterazione successiva chiamando continue
, che salta subito al successivo elemento della sequenza senza eseguire le istruzioni dopo il continue
.
[43]:
i = 1
for x in 'lavato':
if x == 'a':
print("continue, salta all'elemento successivo")
continue
print(x)
print('Ciclo finito !')
l
continue, salta all'elemento successivo
v
continue, salta all'elemento successivo
t
o
Ciclo finito !
Combinare break
e continue
Proviamo a vedere entrambi in Python Tutor:
[44]:
i = 1
for x in 'lavato':
if x == 'a':
print("continue, salta all'elemento successivo")
continue
if x == 't':
print('break, esce dal ciclo!')
break
print(x)
print('Ciclo finito !')
jupman.pytut()
l
continue, salta all'elemento successivo
v
continue, salta all'elemento successivo
break, esce dal ciclo!
Ciclo finito !
[44]:
Domande - break e continue
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
for x in ['a','b','c']: print(x) break
for x in ['a','b','c']: print(x) break print('GLAM')
for x in ['a','b','c']: print(x) break break
for x in ['a','b','c']: break print(x)
break for x in ['a','b','c']: print(x)
for x in ['a','b','c']: print(x) break
for x in ['a','b','c']: continue print(x)
for x in ['a','b','c']: print(x) continue
for x in ['a','b','c']: print(x) continue print('BAM')
continue for x in ['a','b','c']: print(x)
for x in ['a','b','c']: print(x) continue
for x in ['a','b','c']: break 1/0 print('BAD KARMA')
for x in ['a','b','c']: 1/0 break print('BAD KARMA')
for x in range(8): if x < 4: continue print('ZAM', x)
for x in range(8): if x >= 4: break print('ZUM', x)
for x in range(6): if x % 2 == 0: continue print(x)
for x in ['M','C','M']: print(x) for y in ['S','P','Q','R']: print(y) break
for x in ['M','C','M']: print(x) break for y in ['S','P','Q','R']: print(y)
for x in ['M','C','M']: print(x) for y in ['S','P','Q','R']: print(y) continue
for x in ['M','C','M']: print(x) continue for y in ['S','P','Q','R']: print(y)
Esercizio - continuamente
✪ Scrivi del codice che data una stringa parola
, stampa tutti i caratteri eccetto le vocali.
Esempio - data:
parola = 'continuamente'
stampa
c
n
t
n
m
n
t
[45]:
parola = 'continuamente'
#parola='aiuola'
# scrivi qui
Esercizio - breaking bad
✪ Scrivi del codice che stampa tutti i caratteri da stringa
finchè non incontra la stringa 'bad'
.
Esempio - data
stringa = 'cascapirillabadgnippobadzarpogno'
stampa
c
a
s
c
a
p
i
r
i
l
l
a
[46]:
stringa = 'cascapirillabadgnippobadzarpogno' # cascapirilla
#stringa = 'sobad' # 'so'
#stringa = 'bad' # ''
#stringa = 'badso' # ''
# scrivi qui
Esercizio - punto di rottura
✪✪ Data una frase, stampa le parole una per riga finchè trova un punto, e in tal caso si ferma.
NON usare
frase.split('.')
, ma split su altri caratteri sono consentite.
Esempio - data:
frase = 'Ad un certo punto bisogna fermarsi. Mai oltrepassare il limite.'
stampa
Ad
un
certo
punto
bisogna
fermarsi
[47]:
frase = 'Ad un certo punto bisogna fermarsi. Mai oltrepassare il limite.'
#frase = "Rispetta l'altolà. Non vorrai farci arrestare?"
#frase = 'Stop.'
#frase = 'No stop'
# scrivi qui
Esercizio - breakdance
✪✪ Sei un abile breakdancer e ti viene data della musica
come lista di suoni. Dovrai fare due balli:
al primo dovrai ripetere i suoni della musica fino a quando hai incontrato esattmente
3
suoni'pa'
, al che esclameraiBREAKDANCE!
.al secondo dovrai ripetere i suoni della musica al contrario fino a quando hai incontrato esattmente
3
suoni'pa'
, al che esclameraiBREAKDANCE!
NON modificare
musica
, quindi nientemusica.reverse()
Esempio - data:
musica = ['unz','pa','pa','tud','unz','pa','pa','tud','unz','boom','boom','tud']
Stampa:
unz
pa
pa
tud
unz
pa
BREAKDANCE!
tud
boom
boom
unz
tud
pa
pa
unz
tud
pa
BREAKDANCE!
[48]:
musica = ['unz','pa','pa','tud','unz','pa','pa','tud','unz','boom','boom','tud']
# scrivi qui
Prosegui
Continua con esercizi su for e stringhe
[ ]: