Controllo di flusso - Cicli for

Scarica zip esercizi

Naviga file online

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

  1. 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.

  1. 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

  2. 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]:
Python Tutor visualization

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

  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

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

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

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

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

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

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

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

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

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

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

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

# MODO 1 cesta = ['fragola', 'melone', 'ciliegia', 'anguria', 'mela', 'melone','anguria', 'mela', ] preferita = {'ciliegia', 'mela', 'fragola'} piatto = [] # scrivi qui

Mostra soluzione
[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]:
Python Tutor visualization

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

musica = ['unz','pa','pa','tud','unz','pa','pa','tud','unz','boom','boom','tud'] # scrivi qui

Prosegui

Continua con esercizi su for e stringhe

[ ]: