Controllo di flusso - Cicli for

Introduzione

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.

Referimenti:

Che fare

  • scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:

control-flow
    flow1-if.ipynb
    flow1-if-sol.ipynb
    flow2-for.ipynb
    flow2-for-sol.ipynb
    flow3-while.ipynb
    flow3-while-sol.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 flow2-for.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. Gli esercizi sono graduati per difficoltà, da una stellina ✪ a quattro ✪✪✪✪

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

Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):

  1. for i in [1,2,3]:
        print(i)
    
  2. for x in 7:
        print(x)
    
  3. for x in [7]:
        print(x)
    
  4. for x in ['a','b','c']:
        x
    
  5. for i in []:
        print('GURB')
    
  6. for i in [1,2,3]:
        print(type(i))
    
  7. for i in '123':
        print(type(i))
    
  8. for i in 'abc':
        print(i)
    
  9. for x in ((4,5,6)):
        print(x)
    
  10. for x in [[1],[2,3],[4,5,6]]:
        print(x)
    
  11. x = 5
    for x in ['a','b','c']:
        print(x)
    print(x)
    
  12. for x in ['a','b','c']:
        pass
    print(x)
    
  13. for x in [1,2,3,4,5,6,7,8]:
        if x % 2 == 0:
            print(x)
    
  14. 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
Mostra soluzione
[10]:
viaggio1 = ['Marrakesh','Fez','Bazaar','Kasbah']
viaggio2 = ['Koutoubia', 'El Badii', 'Chellah']


# scrivi qui


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

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
Mostra soluzione
[11]:
numeri = [3,4,1,5,12,7,9]

# scrivi qui


16

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
Mostra soluzione
[12]:
s = "birbantello"

# scrivi qui


B b
I i
R r
B b
A a
N n
T t
E e
L l
L l
O o

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
Mostra soluzione
[13]:

parola = 'dirigibile'

belli = 'abcd'
brutti = 'efgh'
cattivi = 'ilm'

# scrivi qui


d è bello
i è cattivo
r non mi interessa
i è cattivo
g è brutto
i è cattivo
b è bello
i è cattivo
l è cattivo
e è brutto

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
Mostra soluzione
[14]:
coda = ['Console','Notaio','Scheletro','Rettore','Goblin','Vampiro', 'Gioielliere']
sgraditi = {'Vampiro','Goblin','Scheletro'}
ammessi = []

# scrivi qui


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

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
Mostra soluzione
[15]:
recipienti = [5,1,7,4,3,9,5,2,7,3]
capienza = 15

# scrivi qui


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

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):

  1. for x in range(1):
        print(x)
    
  2. for i in range(3):
        i
    
  3. for i in range(3):
    print(i)
    
  4. for x in range(-1):
        print(x)
    
  5. for 'm' in range(3):
        print('m')
    
  6. for i in range(3):
        i-1
    
  7. for x in range(6,4,-1):
        print(x)
    
  8. for x in range(1,0,-1):
        print(x)
    
  9. for x in range(3,-3,-2):
        print(x)
    
  10. for x in 3:
        print(x)
    
  11. x = 3
    for i in range(x):
        print(i)
    for i in range(x,2*x):
        print(i)
    
  12. 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
Mostra soluzione
[21]:
n = 4
# scrivi qui


il doppio di 0 è 0
il doppio di 1 è 2
il doppio di 2 è 4
il doppio di 3 è 6

Esercizio - multipli e non

✪✪ Scrivi del codice che dati due numeri interi positivi k e b:

  • prima stampa tutti i numeri da k INCLUSO a b INCLUSO che sono multipli di k

  • poi stampa tutti i numeri da k ESCLUSO a b ESCLUSO che NON sono multipli di k

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
Mostra soluzione
[22]:
k,b = 3,15

# scrivi qui


Multipli di 3
3
6
9
12
15

Non divisibili per 3
4
5
7
8
10
11
13
14

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 di b, 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
Mostra soluzione
[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


5
6
7
8
9

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:

[24]:
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
Mostra soluzione
[25]:
cucina = ['dado', 'minestra', 'uova', 'torta', 'sugo', 'pasta', 'ragù', 'lasagne']

# scrivi qui


dado minestra
uova torta
sugo pasta
ragù lasagne

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
Mostra soluzione
[26]:

la = ['n','e','o','n']
lb = ['s','h','o','w']

# scrivi qui


n s
e h
o o
n w

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
Mostra soluzione
[27]:
emozioni = ['Paura', 'Rabbia','Tristezza','Gioia','Disgusto','Estasi']
grado =     [-1,       -1,     -1,          1,     -1,         1]

# scrivi qui


Paura : negativa
Rabbia : negativa
Tristezza : negativa
Gioia : positiva
Disgusto : negativa
Estasi : positiva

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
Mostra soluzione
[28]:
s = 'organetto'

# scrivi qui


netto
etto
tto
to
o

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
Mostra soluzione
[29]:
s = 'sghiribizzo'
# scrivi qui


s
 ghiribizzo
sg
  hiribizzo
sgh
   iribizzo
sghi
    ribizzo
sghir
     ibizzo
sghiri
      bizzo
sghirib
       izzo
sghiribi
        zzo
sghiribiz
         zo
sghiribizz
          o
sghiribizzo

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
Mostra soluzione
[30]:

s1 = "ATACATATAGGGCCAATTATTATAAGTCAC"
s2 = "CGCCACTTAAGCGCCCTGTATTAAAGTCGC"

# scrivi qui


ATACATATAGGGCCAATTATTATAAGTCAC
   ||  || |  |  |   |  ||||| |
CGCCACTTAAGCGCCCTGTATTAAAGTCGC

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
[31]:
s = 'sportello'  # sportELLO
#s = 'maglia'     # magLIA

# scrivi qui


s
p
o
r
t
E
L
L
O

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!
Mostra soluzione
[32]:

versi = {'cane':'Bau!',
         'gatto':'Miao!',
         'mucca':'Muu!',
         'pecora':'Bee!'}

stanze = [('cane', 'pecora'),
          ('gatto','mucca'),
          ('mucca', 'cane')]

# scrivi qui


Nella stanza 1 si sentono Bau! e Bee!
Nella stanza 2 si sentono Miao! e Muu!
Nella stanza 3 si sentono Muu! e Bau!

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
Mostra soluzione
[33]:
#               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


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

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 risposta

X 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:

[34]:
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?

[35]:
lista
[35]:
['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']
Mostra soluzione
[36]:
la = ['a','b','c']

# scrivi qui


['a', 'b', 'c', 'a', 'b', 'c']

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

Mostra soluzione
[37]:

la = ['m', 'a', 'r', 't', 'e', 'l', 'l', 'o']

# scrivi qui


['z', 'a', 'z', 't', 'z', 'l', 'z', 'o']

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 stringa

  • SUGGERIMENTO: 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
Mostra soluzione
[38]:
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 tutti

  • i 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 variabile cesta

  • Modo 2 (difficile, lento, sconsigliabile ma istruttivo): MODIFICA la lista cesta originale, usando il metodo pop e senza mai riassegnare cesta, quindi niente righe che iniziano con cesta =

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!

Mostra soluzione
[39]:
# MODO 1

cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ]
preferita = {'ciliegia', 'mela', 'fragola'}
piatto = []

# scrivi qui


cesta: ['melone', 'anguria', 'melone', 'anguria']
piatto: ['fragola', 'ciliegia', 'mela', 'mela']
Mostra soluzione
[40]:
# MODO 2

cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ]
preferita = {'ciliegia', 'mela', 'fragola'}
piatto = []

# scrivi qui


cesta: ['melone', 'anguria', 'melone', 'anguria']
piatto: ['fragola', 'ciliegia', 'mela', 'mela']

Iterare un insieme

Dato un insieme, possiamo esaminare la sequenza di elementi con un ciclo for.

ATTENZIONE: l’ordine di iterazione negli insiemi non è prevedibile !

Per capire meglio il perchè, puoi rivedere la guida sugli insiemi

[41]:
for elemento in {'questo', 'è', 'un', 'insieme'}:
    print(elemento)
un
questo
è
insieme

Domande - insiemi

Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):

  1. s = set()
    s.add('pan')
    s.add('de')
    s.add('mo')
    s.add('nio')
    print(s)
    
  2. for x in {'a',12,'34',56,34}[2:4]:
        print(x)
    
  3. for x in set(['a']) | set(['b']):
        print(x)
    
  4. for x in set(['a']) & set(['b']):
        print(x)
    

Iterare un dizionario

Dato un dizionario, possiamo esaminare la sequenza di chiavi, di valori o entrambi con un ciclo for.

ATTENZIONE: l’ordine di iterazione delle chiavi non è prevedibile !

Proviamo a scorrere le chiavi:

[42]:
diz = {
    'bignè':5,
    'brioche':8,
    'krapfen':2
}
[43]:
for chiave in diz:
    print('Trovata chiave', chiave)
    print('    con valore', diz[chiave])
Trovata chiave bignè
    con valore 5
Trovata chiave krapfen
    con valore 2
Trovata chiave brioche
    con valore 8

Ad ogni iterazione, alla variabile chiave che abbiamo dichiarato viene assegnata una chiave presa dal dizionario, in un ordine che possiamo considerare non prevedibile.

Possiamo anche ottenere direttamente nel for sia la chiave che il valore corrispondente con questa notazione

[44]:
for chiave, valore in diz.items():
    print('Trovata chiave', chiave)
    print('    con valore', diz[chiave])
Trovata chiave bignè
    con valore 5
Trovata chiave krapfen
    con valore 2
Trovata chiave brioche
    con valore 8

.items() ritorna una lista di coppie chiave/valore, e ad ogni iterazione una coppia viene assegnata alle variabili chiave e valore.

Domande iterazione dizionari

Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):

ATTENZIONE: Ricordati che l’ordine è IMPOSSIBILE da prevedere, quello che è importante è indovinare tutto quello che verrà stampato

  1. for x in {'a':1,'b':2,'c':3}:
        print(x)
    
  2. for x in {1:'a',2:'b',3:'c'}:
        print(x)
    
  3. diz = {'a':1,'b':2,'c':3}
    for x in diz:
        print(x[diz])
    
  4. diz = {'a':1,'b':2,'c':3}
    for x in diz:
        print(diz[x])
    
  5. diz = {'a':1,'b':2,'c':3}
    for x in diz:
        if x == 'b':
            print(diz[x])
    
  6. for k,v in {1:'a',2:'b',3:'c'}:
        print(k,v)
    
  7. for x in {1:'a',2:'b',3:'c'}.values():
        print(x)
    
  8. for x in {1:'a',2:'b',3:'c'}.keys():
        print(x)
    
  9. for x in {1:'a',2:'b',3:'c'}.items():
        print(x)
    
  10. for x,y in {1:'a',2:'b',3:'c'}.items():
        print(x,y)
    

Domande - Sono equivalenti?

Guarda i seguenti frammenti di codice: in ciascuno, vi sono due parti, A e B. In ciascun frammento, cerca di indovinare se la parte A stamperà esattamente quello che stampa il codice nella parte B

  • PRIMA pensa alla risposta

  • POI prova ad eseguire

Sono equivalenti ? postin

diz = {
    'p':'t',
    'o':'i',
    's':'n',
}

print('A:')
for x in diz.keys():
    print(x)

print('\nB:')
for y in diz:
    print(y)

Sono equivalenti ? cortel

diz = {
    'c':'t',
    'o':'e',
    'r':'l',
}

print('A:')
for p,q in diz.items():
    print(q)

print('\nB:')
for x in diz.values():
    print(x)

Sono equivalenti ? - gel

diz = {
    'g':'l',
    'e':'e',
    'l':'g',
}

print('A:')
for x in diz.values():
    print(x)

print('\nB:')
for z in diz.items():
    print(z[0])

Sono equivalenti ? - giri

diz = {
    'p':'g',
    'e':'i',
    'r':'r',
    'i':'i',
}

print('A:')
for p,q in diz.items():
    if p == q:
        print(p)

print('\nB:')
for x in diz:
    if x == diz[x]:
        print(x)

Sono equivalenti? - Trovato

Prima pensa se sono equivalenti, poi verifica con tutti i valori di k proposti.

Fai bene attenzione a questo esercizio !

Capire questo vuol dire aver veramente capito i dizionari ;-)

k = 'p'
#k = 'e'
#k = 'r'
#k = 'z'

diz = {
    'p':'c',
    'e':'h',
    'r':'è',
}

print('A:')
for x in diz:
    if x == k:
        print('Trovato', diz[x])

print('\nB:')
if k in diz:
    print('Trovato', diz[k])
Mostra risposta

Esercizio - colore di cuori

✪ Scrivi del codice che dato un dizionario semi, per ogni seme stampa il suo colore.

Esempio - dato:

semi = {
    'cuori':'rosso',
    'picche':'nero',
    'quadri':'rosso',
    'fiori':'nero'
}

stampa:

ATTENZIONE: non ti preoccupare dell’ordine in cui vengono stampati i valori!

Sul tuo computer potresti vedere dei risultati diversi, l’importante è che vengano stampate tutte le righe.

Il colore di fiori è nero
Il colore di cuori è rosso
Il colore di picche è nero
Il colore di quadri è rosso
Mostra soluzione
[45]:
semi = {
    'cuori':'rosso',
    'picche':'nero',
    'quadri':'rosso',
    'fiori':'nero'
}

# scrivi qui


Il colore di cuori è rosso
Il colore di picche è nero
Il colore di quadri è rosso
Il colore di fiori è nero

Esercizio - preziosi

✪ Nel dizionario preziosi alcune chiavi sono uguali ai rispettivi valori. Scrivi del codice che trova tali chiavi e le stampa.

Esempio - dato:

preziosi = {
    'rubini': 'giada',
    'opali':'topazi',
    'gemme':'gemme',
    'diamanti': 'gemme',
    'rubini':'rubini'
}

stampa

coppia di elementi uguali: rubini e rubini
coppia di elementi uguali: gemme e gemme
Mostra soluzione
[46]:
preziosi = {
    'rubini': 'giada',
    'opali':'topazi',
    'gemme':'gemme',
    'diamanti': 'gemme',
    'rubini':'rubini'
}

# scrivi qui


coppia di elementi uguali: rubini e rubini
coppia di elementi uguali: gemme e gemme

Esercizio - potenze

✪ Dato un numero n, scrvi del codice che crea un NUOVO dizionario diz contenente come chiavi i numeri da 1 a n INCLUSI, associando ad ogni chiave il suo quadrato.

Esempio - dato:

n = 5

dopo il tuo codice, deve risultare:

>>> print(diz)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Mostra soluzione
[47]:
n = 5

# scrivi qui


{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Esercizio - fiori

✪ Data una lista fiori, scrivi del codice che crea un NUOVO dizionario diz che associa ad ogni fiore True se il nome del fiore è scritto tutto in maiuscolo, e False altrimenti

  • SUGGERIMENTO: per verificare se una stringa è tutta in maiuscolo, usa il metodo .isupper()

fiori = ['girasole','GAROFANO', 'tulipano', 'VIOLA', 'ROSA', 'violetta']

stampa (sono in ordine alfabetico perchè stampiamo con pprint):

>>> from pprint import pprint
>>> pprint(diz)
{'GAROFANO': True,
 'ROSA': True,
 'VIOLA': True,
 'girasole': False,
 'tulipano': False,
 'violetta': False}
Mostra soluzione
[48]:

fiori = ['girasole','GAROFANO', 'tulipano', 'VIOLA', 'ROSA', 'violetta']

# scrivi qui


{'GAROFANO': True,
 'ROSA': True,
 'VIOLA': True,
 'girasole': False,
 'tulipano': False,
 'violetta': False}

Esercizio - arte

✪ Un artista ha dipinto una serie di opere con diverse tecniche. Nel dizionario prezzi per ciascuna tecnica segna il prezzo. L’artista intende fare una serie di esposizioni, e in ognuna presenterà una particolare tecnica. Supponendo che per ciascuna tecnica abbia prodotto q quadri, mostrare quanto guadagnerà in ciascuna esposizione (supponendo venda tutto).

Esempio - dati:

q = 20

esposizioni = ['acquerello', 'olio', 'murale', 'tempera', 'carboncino','inchiostro']

prezzi = {'acquerello': 3000,
          'olio':6000,
          'murale': 2000,
          'tempera':4000,
          'carboncino':7000,
          'inchiostro':1000
}

Stampa - questa volta l’ordine conta!!

Guadagni previsti:
  esposizione acquerello : 60000 €
  esposizione olio : 120000 €
  esposizione murale : 40000 €
  esposizione tempera : 80000 €
  esposizione carboncino : 140000 €
  esposizione inchiostro : 20000 €
Mostra soluzione
[49]:
q = 20

esposizioni = ['acquerello', 'olio', 'murale', 'tempera', 'carboncino','inchiostro']

prezzi = {'acquerello': 3000,
          'olio':6000,
          'murale': 2000,
          'tempera':4000,
          'carboncino':7000,
          'inchiostro':1000
}

# scrivi qui


Guadagni previsti:
  esposizione acquerello : 60000 €
  esposizione olio : 120000 €
  esposizione murale : 40000 €
  esposizione tempera : 80000 €
  esposizione carboncino : 140000 €
  esposizione inchiostro : 20000 €

Esercizio - cartolerie

✪ Un proprietario di due negozi di cartoleria per riorganizzare il magazzino vuole sapere i materiali in comune disponibili nei negozi che possiede. Dati quindi due dizionari cartoleria1 e cartoleria2 che associano oggetti alla loro quantità, scrivi del codice che trova tutte le chiavi in comune e per ciascuna stampa la somma delle quantità trovate.

Esempio - dati:

cartoleria1 = {'penne':10,
               'cartelle':20,
               'carta':30,
               'forbici':40}

cartoleria2 = {'penne':80,
               'cartelle':90,
               'goniometri':130,
               'forbici':110,
               'righelli':120,
               }

stampa (l’ordine non importa):

materiali in comune:
   penne : 90
   cartelle : 110
   forbici : 150
Mostra soluzione
[50]:
cartoleria1 = {'penne':10,
        'cartelle':20,
        'carta':30,
        'forbici':40}

cartoleria2 = {'penne':80,
        'cartelle':90,
        'goniometri':130,
        'forbici':110,
        'righelli':120,
        }

# scrivi qui


materiali in comune:
   forbici : 150
   cartelle : 110
   penne : 90

Esercizio - legumi

✪ Un magazzino ha scaffali numerati, ciascuno contenente una quantità di legumi espressa in chili. Rappresentiamo magazzino come una lista. E’ disponibile anche un registro come dizionario che associa ai nomi dei legumi il numero dello scaffale in cui sono contenuti nel magazzino.

Scrivi del codice che data una lista di nomi di legumi, mostra la somma dei chili presenti in magazzino per quei legumi.

Esempio - dati

legumi = ['ceci', 'soia']

#            0  1  2  3  4  5
magazzino = [50,90,70,10,20,50]

registro = {'piselli':3,
            'soia':1,
            'lenticchie':5,
            'ceci':4,
            'fave':2,
            'fagioli':0,
}

dopo il tuo codice, deve stampare (l’ordine non importa):

Cerco ceci e soia ...
Trovati 20 kg di ceci
Trovati 90 kg di soia
Totale: 110 kg
Mostra soluzione
[51]:
legumi = ['ceci', 'soia']     # 110
#legumi = ['fagioli', 'fave', 'lenticchie']   # 170

#            0  1  2  3  4  5
magazzino = [50,90,70,10,20,50]

registro = {'piselli':3,
            'soia':1,
            'lenticchie':5,
            'ceci':4,
            'fave':2,
            'fagioli':0,
}

# scrivi qui


Cerco ceci e soia ...
Trovati 20 kg di ceci
Trovati 90 kg di soia
Totale: 110 kg

Esercizio - smog

✪ Scrivi del codice che dati due dizionari smog e preposizioni che associano a luoghi rispettivamente valori di smog e preposizioni, stampa tutti i luoghi indicando:

  • ‘PREPOSIZIONE LUOGO l’inquinamento è eccessivo’ se il valore di smog è superiore a 30

  • ‘PREPOSIZIONE LUOGO l’inquinamento è tollerabile’ altrimenti

  • NOTA: nella stampa la prima lettera delle preposizioni deve essere maiuscola: per trasformare la stringa puoi usare il metodo .capitalize()

Esempio - dati:

smog = {'strada':40,
        'ciclabile': 20,
        'autostrada': 90,
        'parco': 15,
        'lago':5
       }

preposizioni = {
    'autostrada':'in',
    'ciclabile':'alla',
    'lago':'al',
    'parco':'al',
    'strada':'in',
}

stampa (l’ordine non importa):

In strada l'inquinamento è eccessivo
Al parco l'inquinamento è tollerabile
In autostrada l'inquinamento è eccessivo
Al lago l'inquinamento è tollerabile
Alla ciclabile l'inquinamento è tollerabile
Mostra soluzione
[52]:
smog = {'strada':40,
        'ciclabile': 20,
        'autostrada': 90,
        'parco': 15,
        'lago':5
       }

preposizioni = {
    'autostrada':'in',
    'ciclabile':'alla',
    'lago':'al',
    'parco':'al',
    'strada':'in',
}

# scrivi qui


In autostrada l'inquinamento è eccessivo
Al parco l'inquinamento è tollerabile
Al lago l'inquinamento è tollerabile
In strada l'inquinamento è eccessivo
Alla ciclabile l'inquinamento è tollerabile

Esercizio - sport

✪✪ Scrivi del codice che dato un dizionario sport in cui persone sono associate allo sport che preferiscono, crea un NUOVO dizionario conteggi che associa ad ogni sport il numero di persone che lo preferiscono.

Esempio - dato:

diz = {'Gianni':'calcio',
       'Paolo':'tennis',
       'Sara':'pallavolo',
       'Elena':'tennis',
       'Roberto':'calcio',
       'Carla':'calcio',
}

Dopo il tuo codice, deve risultare:

>>> print(conteggi)
{'calcio': 3, 'pallavolo': 1, 'tennis': 2}
Mostra soluzione
[53]:
sport = {'Gianni':'calcio',
         'Paolo':'tennis',
         'Sara':'pallavolo',
         'Elena':'tennis',
         'Roberto':'calcio',
         'Carla':'calcio',
}

# scrivi qui


{False: 3, True: 3}

Modificare un dizionario durante l’iterazione

Supponi di avere un dizionario delle province

province = {'tn': 'Trento',
 'mi':'Milano',
 'na':'Napoli',
}

e di volerlo MODIFICARE in modo che dopo il tuo codice risultino aggiunte le sigle in maiuscolo:

>>> print(province)
{'tn': 'Trento',
 'mi':'Milano',
 'na':'Napoli',
 'TN': 'Trento',
 'MI':'Milano',
 'NA':'Napoli',
}

Potrebbe venirti l’idea di scrivere qualcosa del genere:

for chiave in province =:
    province[chiave.upper()] = province[chiave]    # ATTENZIONE !

DOMANDA: Vedi forse un problema?

Mostra risposta

X COMANDAMENTO: Non aggiungerai o toglierai mai elementi da una sequenza su cui stai iterando con un for!

In questo caso, se proviamo ad eseguire il codice, otterremo un errore esplicito:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-26-9b20900057e8> in <module>()
----> 1 for chiave in diz:
      2     diz['chiave'.upper()] = diz[chiave]    # ATTENZIONE !

RuntimeError: dictionary changed size during iteration

ma in altri casi (come per esempio con le liste) effettuare modifiche può produrre 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.

Supponiamo di voler togliere qualunque coppia che abbia come valore 'Trento'

province = {
    'tn': 'Trento',
    'mi':'Milano',
    'na':'Napoli',
}

affinchè risulti

>>> print(province)
{'mi':'Milano',
 'na':'Napoli'}

Se proviamo ad eseguire qualcosa del genere per fortuna Python si accorge e ci lancia un’eccezione:

province = {
    'tn': 'Trento',
    'mi':'Milano',
    'na':'Napoli',
}

for chiave in province:
    if province[chiave] == 'Trento':
        del province[chiave]   # PESSIMA IDEA
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-23-5df0fd659120> in <module>()
      5     'na':'Napoli'
      6 }
----> 7 for chiave in province:
      8     if province[chiave] == 'Trento':
      9         del province[chiave]   # PESSIMA IDEA

RuntimeError: dictionary changed size during iteration

Se proprio devi rimuovere elementi dalla sequenza su cui stai iterando, usa un ciclo while o effettua prima una copia della sequenza originale.

Esercizio - zazb

✪✪ Scrivere del codice che dato un dizionario diz con caratteri come chiavi, MODIFICA il dizionario affinchè gli vengano aggiunte chiavi uguali a quelle esistenti ma precedute dal carattere 'z' - come valore associato alle nuove chiavi, poni l’intero 10

Esempio - dato:

diz = {
    'a':3,
    'b':8,
    'c':4
}

dopo il tuo codice, diz dovrebbe risultare MODIFICATO così:

>>> diz
{   'a':3,
    'b':8,
    'c':4,
    'za':10,
    'zb':10,
    'zc':10
}

DOMANDA: E’ forse il caso di scrivere una soluzione come quella qua sotto? Leggi bene questo:

diz = {
    'a':3,
    'b':8,
    'c':4
}

for chiave in diz:
    diz['z'+chiave] = 10    # ATTENZIONE !! GUAI IN VISTA !!
Mostra rispostaMostra soluzione
[54]:

diz = {
    'a':3,
    'b':8,
    'c':4
}

# scrivi qui


for annidati

Quanto già detto in precedenza sul nome delle variabile vale ancor di più per i for annidati:

II COMANDAMENTO Quando inserisci una variabile in un ciclo for , questa variabile deve essere nuova

Se hai definito una variabile in un for esterno, non la reintrodurrai in un for interno, perchè ciò portebbe gran confusione. Per esempio qua s è introdotta sia in quello esterno che in quello interno:

[55]:
for s in ['pallavolo', 'tennis', 'calcio', 'nuoto']:

    for s in range(3):  # inferno da debuggare, perdi la s del ciclo for esterno
        print(s)

    print(s)  # stampa 2 invece che uno sport !
0
1
2
2
0
1
2
2
0
1
2
2
0
1
2
2

Domande - for annidati

Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):

  1. for y in for x in range(3):
        print(x,y)
    
  2. for y in for x in range(2) in range(3):
        print(x,y)
    
  3. for y in range(3):
        for x in range(2):
            print(x,y)
    
  4. for x in range(2):
        for x in range(3):
            print(x)
        print(x)
    
  5. for x in range(2):
        for y in range(3):
            print(x,y)
        print(x,y)
    
  6. for x in range(1):
        for y in range(1):
            print(x,y)
    
  7. for x in range(2):
        for y in range(3):
            print(x,y)
    
  8. la = 'abc'
    for x in la:
        for y in la:
            print(x)
    
  9. for x in 'ab':
        for y in 'cd':
            print(x,y)
        for y in 'ef':
            print(x,y)
    
  10. for x in 'abc':
        for y in 'abc':
            if x == y:
                print(x)
    
  11. for x in 'abc':
        for y in 'abc':
            if x != y:
                print(x,y)
    
  12. lista = []
    for x in 'a':
        for y in 'bc':
            lista.append(x)
            lista.append(y)
    print(lista)
    
  13. lista = []
    for x in 'abc':
        for y in 'de':
            lista.append('z')
    print(len(lista))
    
  14. c = 1
    for x in range(1,4):
        s = ''
        for y in range(1,4):
            s = s + str(c)
            c += 1
        print(s)
    

Esercizio - casting

✪ Si vuole lanciare una nuova produzione videoculturale italo-nipponica e perciò vengono convocati gli attori per i provini. Il regista vuole provare una scena con tutte le possibili coppie che si possono formare tra attrici e attori. Scrivi del codice che stampa tutte le coppie, mettendo anche messaggi di introduzione.

  • NOTA: il numero di attori e attrici può essere diverso

Esempio - dati:

attrici = ['Licia','Mila']
attori = ['Capitan Harlock', 'Lupin', 'Kenshiro']

stampa:

Entri in scena Licia !
   Entri in scena Capitan Harlock !
      Licia e Capitan Harlock si preparino... CIAK!
   Grazie Capitan Harlock - il prossimo !
   Entri in scena Lupin !
      Licia e Lupin si preparino... CIAK!
   Grazie Lupin - il prossimo !
   Entri in scena Kenshiro !
      Licia e Kenshiro si preparino... CIAK!
   Grazie Kenshiro - il prossimo !
Grazie Licia - la prossima !
Entri in scena Mila !
   Entri in scena Capitan Harlock !
      Mila e Capitan Harlock si preparino... CIAK!
   Grazie Capitan Harlock - il prossimo !
   Entri in scena Lupin !
      Mila e Lupin si preparino... CIAK!
   Grazie Lupin - il prossimo !
   Entri in scena Kenshiro !
      Mila e Kenshiro si preparino... CIAK!
   Grazie Kenshiro - il prossimo !
Grazie Mila - la prossima !

Fine delle audizioni!
Mostra soluzione
[56]:
attrici = ['Licia','Mila']
attori = ['Capitan Harlock', 'Lupin', 'Kenshiro']


# scrivi qui


Entri in scena Licia !
   Entri in scena Capitan Harlock !
      Licia e Capitan Harlock si preparino... CIAK!
   Grazie Capitan Harlock - il prossimo !
   Entri in scena Lupin !
      Licia e Lupin si preparino... CIAK!
   Grazie Lupin - il prossimo !
   Entri in scena Kenshiro !
      Licia e Kenshiro si preparino... CIAK!
   Grazie Kenshiro - il prossimo !
Grazie Licia - la prossima !
Entri in scena Mila !
   Entri in scena Capitan Harlock !
      Mila e Capitan Harlock si preparino... CIAK!
   Grazie Capitan Harlock - il prossimo !
   Entri in scena Lupin !
      Mila e Lupin si preparino... CIAK!
   Grazie Lupin - il prossimo !
   Entri in scena Kenshiro !
      Mila e Kenshiro si preparino... CIAK!
   Grazie Kenshiro - il prossimo !
Grazie Mila - la prossima !

Fine delle audizioni!

Esercizio - coprire il piano

✪ Dati gli interi a e b, scrivi del codice che stampa tutte le coppie possibili di numeri \(x\) e \(y\) tali che \(1 \leq x \leq a\) e \(1 \leq y \leq b\)

Per esempio, per

a,b = 5,3

deve stampare

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
4 3
5 1
5 2
5 3
Mostra soluzione
[57]:
a,b = 5,3

# scrivi qui


1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
4 3
5 1
5 2
5 3

Esercizio - triangolare

✪ Dato l’intero a, scrivi del codice che stampa tutte le coppie possibili di numeri \(x\) e \(y\) tali che \(0 \leq x \leq y < a\)

Per esempio, per

a = 5

deve stampare

0 0
0 1
0 2
0 3
0 4
1 1
1 2
1 3
1 4
2 2
2 3
2 4
3 3
3 4
4 4
Mostra soluzione
[58]:
a = 5
# scrivi qui


0 0
0 1
0 2
0 3
0 4
1 1
1 2
1 3
1 4
2 2
2 3
2 4
3 3
3 4
4 4

Esercizio - porto

✪ Scrivi del codice che data una lista parole e una lista lettere, per ogni parola calcola quante lettere contiene

  • vengono contati SOLO i caratteri presenti in lettere

  • stampa il risultato SOLO se il numero è maggiore di zero

Esempio - date:

parole = ['barca','molo','remo','nassa','vela','strascico']
lettere = ['a','c','s']

stampa:

barca contiene 2 a
barca contiene 1 c
nassa contiene 2 a
nassa contiene 2 s
vela contiene 1 a
strascico contiene 1 a
strascico contiene 2 c
strascico contiene 2 s
Mostra soluzione
[59]:
parole = ['barca','molo','remo','nassa','vela','strascico']
lettere = ['a','c','s']

# scrivi qui


barca contiene 2 a
barca contiene 1 c
nassa contiene 2 a
nassa contiene 2 s
vela contiene 1 a
strascico contiene 1 a
strascico contiene 2 c
strascico contiene 2 s

Esercizio - poligoni

✪✪ Data una lista poligoni con nomi di poligoni ordinati per numero di lati a partire dal triangolo, scrivi del codice che stampa tutte le possibili domande che si possono formare riguardo il numero di lati. Parti da un minimo di 3 lati fino ad un massimo corrispondente al numero di lati dell’ultimo poligono (ricordati che i nomi sono ordinati per numero di lati!)

Esempio - data:

#                  0              1             2             3
poligoni = ["Il triangolo","Il quadrato","Il pentagono", "L'esagono"]

stampa

Il triangolo ha 3 lati? True
Il triangolo ha 4 lati? False
Il triangolo ha 5 lati? False
Il triangolo ha 6 lati? False
Il quadrato ha 3 lati? False
Il quadrato ha 4 lati? True
Il quadrato ha 5 lati? False
Il quadrato ha 6 lati? False
Il pentagono ha 3 lati? False
Il pentagono ha 4 lati? False
Il pentagono ha 5 lati? True
Il pentagono ha 6 lati? False
L'esagono ha 3 lati? False
L'esagono ha 4 lati? False
L'esagono ha 5 lati? False
L'esagono ha 6 lati? True
Mostra soluzione
[60]:
#                 0              1              2             3
poligoni = ["Il triangolo","Il quadrato","Il pentagono", "L'esagono"]

# scrivi qui


Il triangolo ha 3 lati? True
Il triangolo ha 4 lati? False
Il triangolo ha 5 lati? False
Il triangolo ha 6 lati? False
Il quadrato ha 3 lati? False
Il quadrato ha 4 lati? True
Il quadrato ha 5 lati? False
Il quadrato ha 6 lati? False
Il pentagono ha 3 lati? False
Il pentagono ha 4 lati? False
Il pentagono ha 5 lati? True
Il pentagono ha 6 lati? False
L'esagono ha 3 lati? False
L'esagono ha 4 lati? False
L'esagono ha 5 lati? False
L'esagono ha 6 lati? True

Esercizio - bon jour

✪✪✪ Date due stringhe sa e sb in minuscolo, scrivi del codice che stampa a turno tutte le lettere di sa in maiuscolo seguite da tutte le possibili combinazioni di sb che abbiano UNA SOLA lettera maiuscola.

Esempio - date:

sa = 'bon'
sb = 'jour'

Deve stampare:

B Jour
B jOur
B joUr
B jouR
O Jour
O jOur
O joUr
O jouR
N Jour
N jOur
N joUr
N jouR
Mostra soluzione
[61]:
sa = 'bon'
sb = 'jour'

# scrivi qui


B Jour
B jOur
B joUr
B jouR
O Jour
O jOur
O joUr
O jouR
N Jour
N jOur
N joUr
N jouR

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:

[62]:
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.

[63]:
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:

[64]:
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 !
[64]:

Domande - break e continue

Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):

  1. for x in ['a','b','c']:
        print(x)
        break
    
  2. for x in ['a','b','c']:
        print(x)
        break
        print('GLAM')
    
  3. for x in ['a','b','c']:
        print(x)
        break
        break
    
  4. for x in ['a','b','c']:
        break
        print(x)
    
  5. break
    for x in ['a','b','c']:
        print(x)
    
  6. for x in ['a','b','c']:
        print(x)
    break
    
  7. for x in ['a','b','c']:
        continue
        print(x)
    
  8. for x in ['a','b','c']:
        print(x)
        continue
    
  9. for x in ['a','b','c']:
        print(x)
        continue
        print('BAM')
    
  10. continue
    for x in ['a','b','c']:
        print(x)
    
  11. for x in ['a','b','c']:
        print(x)
    continue
    
  12. for x in ['a','b','c']:
        break
        1/0
    print('BAD KARMA')
    
  13. for x in ['a','b','c']:
        1/0
        break
    print('BAD KARMA')
    
  14. for x in range(8):
        if x < 4:
            continue
        print('ZAM', x)
    
  15. for x in range(8):
        if x >= 4:
            break
        print('ZUM', x)
    
  16. for x in range(6):
        if x % 2 == 0:
            continue
        print(x)
    
  17. for x in ['M','C','M']:
        print(x)
        for y in ['S','P','Q','R']:
            print(y)
            break
    
  18. for x in ['M','C','M']:
        print(x)
        break
        for y in ['S','P','Q','R']:
            print(y)
    
  19. for x in ['M','C','M']:
        print(x)
        for y in ['S','P','Q','R']:
            print(y)
            continue
    
  20. 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
Mostra soluzione
[65]:
parola = 'continuamente'
#parola='aiuola'

# scrivi qui


c
n
t
n
m
n
t

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
[66]:
stringa = 'cascapirillabadgnippobadzarpogno'  # cascapirilla
#stringa = 'sobad'  # 'so'
#stringa = 'bad'  # ''
#stringa = 'badso'  # ''

for i in range(len(stringa)):
    if stringa[i:i+3] == 'bad':
        break
    else:
        print(stringa[i])
c
a
s
c
a
p
i
r
i
l
l
a

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
Mostra soluzione
[67]:
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


Ad
un
certo
punto
bisogna
fermarsi

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 esclamerai BREAKDANCE!.

  • al secondo dovrai ripetere i suoni della musica al contrario fino a quando hai incontrato esattmente 3 suoni 'pa', al che esclamerai BREAKDANCE!

  • NON modificare musica, quindi niente musica.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!
Mostra soluzione
[68]:
musica = ['unz','pa','pa','tud','unz','pa','pa','tud','unz','boom','boom','tud']

# scrivi qui


unz
pa
pa
tud
unz
pa
BREAKDANCE!

tud
boom
boom
unz
tud
pa
pa
unz
tud
pa
BREAKDANCE!
[ ]: