Condizionali - if else
Scarica zip esercizi
Possiamo usare il comando condizionale if
ogni volta che il computer deve prendere una decisione in base al valore di qualche condizione. Se la condizione viene valutata come vera (cioè come il booleano True
) allora verrà eseguito un blocco di codice, altrimenti ne verrà eseguito un altro.
Riferimenti:
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
if
if1.ipynb
if1-sol.ipynb
if2-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
flow1-if.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
Il comando base if else
Vediamo un programmino che prende decisioni diverse in base al valore di una variabile caramelle
:
[2]:
caramelle = 20
if caramelle > 10 :
print('Abbiamo trovato...')
print('Tante caramelle!')
else:
print("Purtroppo ci sono.. ")
print('Poche caramelle!')
print()
print('Cerchiamo altri dolci!')
Abbiamo trovato...
Tante caramelle!
Cerchiamo altri dolci!
La condizione qui è caramelle > 10
[3]:
caramelle > 10
[3]:
True
ATTENZIONE: Subito dopo la condizione vanno messi due punti :
if caramelle > 10:
Dato che nell’esempio sopra caramelle
vale 20
, la condizione è valutata a True
e viene quindi eseguito il blocco di codice subito dopo la riga con l’if
.
Proviamo invece a mettere un numero piccolo, come caramelle = 5
:
[4]:
caramelle = 5
if caramelle > 10 :
print('Abbiamo trovato...')
print('Tante caramelle!')
else:
print("Purtroppo ci sono.. ")
print('Poche caramelle!')
print()
print('Cerchiamo altri dolci!')
Purtroppo ci sono..
Poche caramelle!
Cerchiamo altri dolci!
In questo caso è stato eseguito il blocco di codice dopo la riga con else:
ATTENZIONE all’indentazione nei blocchi !
Come tutti i blocchi di codice in Python, sono preceduti da spazi. Di solito si usano 4 spazi (in qualche progetto Python puoi trovarne solo 2, ma è sconsigliato dalle linee guida di Python)
else
è opzionale
Non è obbligatorio indicare l’else
. Se lo omettiamo e la condizione risulta False
, il controllo passa direttamente ai comandi allo stesso livello di indentazione dell’if
(senza errori):
[5]:
caramelle = 5
if caramelle > 10 :
print('Abbiamo trovato...')
print('Tante caramelle!')
print()
print('Cerchiamo altri dolci!')
Cerchiamo altri dolci!
DOMANDA: Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
x = 3 if x > 2 and if x < 4: print('ABBA')
x = 3 if x > 2 and x < 4 print('ABBA')
x = 3 if x > 2 and x < 4: print('ABBA')
x = 2 if x > 1: print(x+1, x):
x = 3 if x > 5 or x: print('ACDC')
x = 7 if x == 7: print('GLAM')
x = 7 if x < 1: print('BIM') else: print('BUM') print('BAM')
x = 30 if x > 8: print('DOH') if x > 10: print('DUFF') if x > 20: print('BURP')
if not True: print('sottosopra') else: print('soprasotto')
if False: else: print('ZORB')
if False: pass else: print('ZORB')
if 0: print('Brandy') else: print('Rum')
if False: print('illustrissimo') else: print('esimio') else: print('dottore')
if 2 != 2: 'ATTENTO' else: 'STOLTO'
if 2 != 2: print('ATTENTO') else: print('STOLTO')
x = [1,2,3] if 4 in x: x.append(4) else: x.remove(3) print(x)
if 'False': print('OCCHIO ALLA STRINGA') else: print('CRUDELE')
Esercizio - senza benza
Si vuole fare un viaggio in auto e servono almeno 30
litri. Scrivi del codice che:
se la variabile
benzina
è inferiore a30
, stampa'Senza benza, faccio il pieno'
e incrementabenzina
di20
litriAltrimenti, stampa
Ho abbastanza carburante!
In ogni caso, alla fine stampa
'Si parte con '
seguito dalla quantità di benzina finale.
Esempio - data:
benzina = 5
Dopo il tuo codice, deve stampare:
Senza benza, faccio il pieno
Si parte con 25 litri
[6]:
benzina = 5
#benzina = 30
# scrivi qui
Il comando if - elif - else
Esaminando il programmino delle caramelle di prima ti sarai forse chiesto cosa stampare quando non ci sono proprio caramelle. Per farlo, potremmo usare più condizioni in cascata con il comando elif
(abbreviazione di else if):
[7]:
caramelle = 0 # METTIAMO ZERO
if caramelle > 10:
print('Abbiamo trovato...')
print('Tante caramelle!')
elif caramelle > 0:
print("Purtroppo ci sono.. ")
print('Poche caramelle!')
else:
print("Che sfortuna! ")
print('Non ci sono caramelle!')
print()
print('Cerchiamo altri dolci!')
Che sfortuna!
Non ci sono caramelle!
Cerchiamo altri dolci!
ESERCIZIO: Prova a cambiare i valori di caramelle
nella cella qua sopra e guarda cosa succede
Il programmino si comporta esattamente come i precedenti e quando nessuna condizione è soddisfatta viene eseguito l’ultimo blocco di codice dopo l’else:
Possiamo aggiungere quanti elif
vogliamo, quindi potremmo essere ancora più specifici e mettere un elif x == 0:
e nell’else
gestire tutti gli altri casi, anche quelli imprevisti o assurdi come per esempio un numero di caramelle negativo. Perchè mai dovremmo farlo? Gli imprevisti possono sempre succedere, ne avrai trovati in giro di programmi buggati … (vedremo meglio come gestire queste situazioni nel tutorial Gestione errori e
testing)
[8]:
caramelle = -2 # PROVIAMO UN NUMERO NEGATIVO
if caramelle > 10:
print('Abbiamo trovato...')
print('Tante caramelle!')
elif caramelle > 0:
print("Purtroppo ci sono.. ")
print('Poche caramelle!')
elif caramelle == 0:
print("Che sfortuna! ")
print('Non ci sono caramelle!')
else:
print('Qualcosa è andato MOLTO storto! Abbiamo trovato', caramelle, 'caramelle')
print()
print('Cerchiamo altri dolci!')
Qualcosa è andato MOLTO storto! Abbiamo trovato -2 caramelle
Cerchiamo altri dolci!
ESERCIZIO: Prova a cambiare i valori di caramelle
nella cella qua sopra e guarda cosa succede
Domande
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
y = 2 if y < 3: print('bingo') elif y <= 2: print('bango')
z = 'q' if not 'quando'.startswith(z): print('BAR') elif not 'spqr'[2] == z: print('WAR') else: print('ZAR')
x = 1 if x < 5: print('BARCHE') elif x < 3: print('ZATTERE') else: print('SCIALUPPE')
x = 5 if x < 3: print('ORO') else if x >= 3: print('ARGENTO')
if 0: print(0) elif 1: print(1)
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, per ogni valore delle variabili da cui dipendono.
PRIMA pensa alla risposta
POI prova ad eseguire con ciascuno dei valori delle variabili suggerite
Sono equivalenti? - fragole
Prova a cambiare il valore di fragole
togliendo i commenti
fragole = 5
#fragole = 2
#fragole = 10
print('fragole =', fragole)
print('A:')
if fragole > 5:
print("Le fragole sono > 5")
elif fragole > 5:
print("Ho detto che le fragole sono > 5!")
else:
print("Le fragole sono <= 5")
print('B:')
if fragole > 5:
print("Le fragole sono > 5")
if fragole > 5:
print("Ho detto che le fragole sono > 5!")
if fragole <= 5:
print("Le fragole sono <= 5")
Sono equivalenti? - max
x, y = 3, 5
#x, y = 5, 3
#x, y = 3, 3
print('x =', x)
print('y =', y)
print('A:')
if x > y:
print(x)
else:
print(y)
print('B:')
print(max(x,y))
Sono equivalenti? - min
x, y = 3, 5
#x, y = 5, 3
#x, y = 3, 3
print('x =',x)
print('y =', y)
print('A:')
if x < y:
print(y)
else:
print(x)
print('B:')
print(min(x,y))
Sono equivalenti? - grande piccolo
x = 2
#x = 4
#x = 3
print('x =',x)
print('A:')
if x > 3:
print('grande')
else:
print('piccolo')
print('B:')
if x < 3:
print('piccolo')
else:
print('grande')
Sono equivalenti? - Cippirillo
x = 3
#x = 10
#x = 11
#x = 15
print('x =', x)
print('A:')
if x % 5 == 0:
print('cippirillo')
if x % 3 == 0:
print('cippirillo')
print('B:')
if x % 3 == 0 or x % 5 == 0:
print('cippirillo')
Esercizio - fattoria
Data una stringa s
, scrivi del codice che stampa 'BAU!'
se la stringa inizia con cane
, stampa 'CHICCHIRICHI!'
se le stringa inizia con 'gallo'
, e stampa '???'
in tutti gli altri casi
[9]:
s = 'cane dalmata'
#s = 'gallo cedrone'
#s = 'sghirimpo'
print(s)
# scrivi qui
Esercizio - accenti
Scrivi del codice che stampa se una parola
termina o meno con una lettera accentata.
Per determinare se una lettera è accentata, usa le stringhe di accenti
acuti
egravi
il tuo codice deve funzionare con qualunque
parola
[10]:
acuti = "áéíóú"
gravi = "àèìòù"
parola = 'urrà' # termina con una accentata
#parola = 'martello' # non termina con una accentata
#parola = 'ahó' # termina con una accentata
#parola = 'però' # termina con una accentata
#parola = 'capitaneria' # non termina con una accentata
#parola = 'viceré' # termina con una accentata
#parola = 'cioè' # termina con una accentata
#parola = 'chéto' # non termina con una accentata
#parola = 'Chi dice che la verità è una sòla?' # non termina con una accentata
# scrivi qui
Esercizio - arcani
Dato un arcano
espresso come una stringa e delle liste di arcani maggiori
e minori
, stampare a quale categoria appartiene arcano
. Se arcano
non appartiene a nessuna categoria, stampare è un mistero
.
[11]:
arcano = 'La Ruota' # La Ruota è un Arcano maggiore
#arcano = "L'Appeso" # maggiore
#arcano = 'Asso di Spade' # minore
#arcano = 'Due di Denari' # minore
#arcano = 'Il Coding' # mistero
maggiori = ['La Ruota','Il Carro', "L'Appeso"]
minori = ['Asso di Spade', 'Due di Denari', 'Regina di Coppe']
# scrivi qui
if
annidati
I comandi if
sono blocchi perciò possono essere annidati come qualunque altro blocco.
Facciamo un esempio. Se hai un punto con coordinate x
e y
e vuoi sapere in quale quadrante risiede:
Potresti scrivere qualcosa del genere:
[12]:
x,y = 5,9
#x,y = -5,9
#x,y = -5,-9
#x,y = 5,-9
print('x =',x,'y =', y)
if x >= 0:
if y >= 0:
print('primo quadrante')
else:
print('quarto quadrante')
else:
if y >= 0:
print('secondo quadrante')
else:
print('terzo quadrante')
x = 5 y = 9
primo quadrante
ESERCIZIO: prova le varie coppie di punti suggeriti togliendo i commenti e convinciti che il codice funziona come atteso.
NOTA: A volte gli if
annidati possono essere evitati scrivendo sequenze di elif
con espressioni booleane che verificano due condizioni alla volta:
[13]:
x,y = 5,9
#x,y = -5,9
#x,y = -5,-9
#x,y = 5,-9
print('x =',x,'y =', y)
if x >= 0 and y >= 0:
print('primo quadrante')
elif x >= 0 and y < 0:
print('quarto quadrante')
elif x < 0 and y >= 0:
print('secondo quadrante')
elif x < 0 and y < 0:
print('terzo quadrante')
x = 5 y = 9
primo quadrante
Esercizio - ascisse e ordinate 1
Il codice che abbiamo visto non è molto preciso, perchè non considera il caso di punti che giacciono sugli assi. In questi casi invece del numero del quadrante dovrebbe stampare:
‘origine’ quando
x
ey
sono uguali a0
‘ascissa’ quando
y
è0
‘ordinata’ quando
x
è0
Scrivi qui sotto una versione modificata del codice con if annidati che consideri anche questi casi, poi testalo togliendo i commenti alle varie coppie di coordinate suggerite.
Mostra soluzione[14]:
x,y = 0,0 # origine
#x,y = 0,5 # ordinata
#x,y = 5,0 # ascissa
#x,y = 5,9 # primo
#x,y = -5,9 # secondo
#x,y = -5,-9 # terzo
#x,y = 5,-9 # quarto
print('x =',x,'y =', y)
# scrivi qui
Esercizio - ascisse e ordinate 2
Volendo essere ancora più specifici, invece che stampare genericamente ‘ascissa’ o ‘ordinata’, potremmo stampare:
‘ascissa tra il primo e quarto quadrante’
‘ascissa tra il secondo e terzo quadrante’
‘ordinata tra il primo e il secondo quadrante’
‘ordinata tra il terzo e il quarto quadrante’
Copia qui sotto il codice dell’esercizio precedente modificandolo per considerare anche questi casi.
Mostra soluzione[15]:
x,y = 0,0 # origine
#x,y = 0,5 # ordinata tra il primo e il secondo quadrante
#x,y = 0,-5 # ordinata tra il terzo e il quarto quadrante
#x,y = 5,0 # ascissa tra il primo e il quarto quadrante
#x,y = -5,0 # ascissa tra il secondo e il terzo quadrante
#x,y = 5,9 # primo
#x,y = -5,9 # secondo
#x,y = -5,-9 # terzo
#x,y = 5,-9 # quarto
print('x =',x,'y =', y)
# scrivi qui
Esercizio - autobus
Devi correre a prendere l’autobus, e hai poco tempo. Per fare il viaggio:
ti serve lo zaino, altrimenti resti a casa
ti servono anche dei soldi per il biglietto, oppure la tessera trasporti (o tutte due). Altrimenti resti a casa.
Scrivi del codice che date tre variabili booleane zaino
, soldi
e tessera
, stampa quello che vedi nei commenti a seconda dei vari casi. Una volta scritto il codice, togli i commenti alle assegnazioni per provare i risultati
SUGGERIMENTO: per tener traccia degli oggetti posseduti, ti conviene creare una lista di stringhe dove mettere gli oggetti trovati
[16]:
zaino, soldi, tessera = True, False, True
# Non ho i soldi !
# Ho trovato: zaino,tessera
# Posso partire !
#zaino, soldi, tessera = False, False, True
# Non ho lo zaino, non posso partire !
#zaino, soldi, tessera = True, True, False
# Non ho la tessera !
# Ho trovato: zaino,soldi
# Posso partire !
#zaino, soldi, tessera = True, True, True
# Ho trovato: zaino,soldi,tessera
# Posso partire !
zaino, soldi, tessera = True, False, False
#Non ho i soldi !
#Non ho la tessera !
#Non ho la tessera nè i soldi, non posso partire !
# scrivi qui
Esercizio - cronometro
Un cronometro segna le ore, minuti e secondi trascorsi dalla mezzanotte di un certo giorno in una stringa cronometro
, in cui i numeri delle ore, minuti e secondi sono separati da due punti :
.
Scrivi del codice che in base al numero di ore trascorse, stampa la fase del giorno:
dalle ore 6 incluse alle ore 12 escluse : stampa
mattino
dalle ore 12 incluse alle ore 18 escluse : stampa
pomeriggio
dalle ore 18 incluse alle ore 21 escluse : stampa
sera
dalle ore 21 incluse alle ore 6 escluse : stampa
notte
USA
elif
con espressioni booleane multipleIl tuo codice DEVE funzionare anche se il cronometro supera le 23:59:59, vedi esempi
SUGGERIMENTO: per avere ore che vadano solo dalle 0 alle 23, usa l’operatore modulo
%
[17]:
cronometro = '10:23:43' # mattina
#cronometro = '12:00:00' # pomeriggio
#cronometro = '15:56:02' # pomeriggio
#cronometro = '19:23:27' # sera
#cronometro = '21:45:15' # notte
#cronometro = '02:45:15' # notte
#cronometro = '27:45:30' # notte
#cronometro = '32:28:30' # mattina
# scrivi qui
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, per ogni valore di x
.
PRIMA pensa alla risposta
POI prova ad eseguire con ciascuno dei valori di
x
suggeriti.
Sono equivalenti? - dentro fuori 1
x = 3
#x = 4
#x = 5
print('x =',x)
print('A:')
if x > 3:
if x < 5:
print('dentro')
else:
print('fuori')
else:
print('fuori')
print('B:')
if x > 3 and x < 5:
print('dentro')
else:
print('fuori')
Sono equivalenti? - stelle pianeti
x = 2
#x = 3
#x = 4
print('x =', x)
print('A:')
if not x > 3:
print('stelle')
else:
print('pianeti')
print('B:')
if x > 3:
print('pianeti')
else:
print('stelle')
Sono equivalenti? - verde rosso
x = 10
#x = 5
#x = 0
print('x =',x)
print('A:')
if x >= 5:
print('verde')
if x >= 10:
print('rosso')
print('B:')
if x >= 10:
if x >= 5:
print('verde')
print('rosso')
Sono equivalenti? - cerchi quadrati
x = 4
#x = 3
#x = 2
#x = 1
#x = 0
print('x =', x)
print('A:')
if x > 3:
print('cerchi')
else:
if x > 1:
print('quadrati')
else:
print('triangoli')
print('B:')
if x <= 1:
print('triangoli')
elif x <= 3:
print('quadrati')
else:
print('cerchi')
Sono equivalenti? - dentro fuori 2
x = 7
#x = 0
#x = 15
print('x =', x)
print('A:')
if x > 5:
if x < 10:
print('dentro')
else:
print('fuori')
else:
print('fuori')
print('B:')
if not x > 5 and not x < 10:
print('fuori')
else:
print('dentro')
Sono equivalenti? - Ciabanga
x = 4
#x = 5
#x = 6
#x = 9
#x = 10
#x = 11
print('x =', x)
print('A:')
if x < 6:
print('Ciabanga!')
else:
if x >= 10:
print('Ciabanga!')
print('B:')
if x <= 5 or not x < 10:
print('Ciabanga!')
Esercizio - Il massimo
Scrivi del codice che stampa il massimo fra tre numeri x
, y
e z
usa if annidati
NON usare la funzione
max
NON creare variabili che si chiamano
max
(violerebbe il V Comandamento: non ridifinerai mai funzioni di sistema)
[18]:
x,y,z = 1,2,3
#x,y,z = 1,3,2
#x,y,z = 2,1,3
#x,y,z = 2,3,1
#x,y,z = 3,1,2
#x,y,z = 3,2,1
# scrivi qui
Operatore ternario
In qualche caso è conveniente inizializzare una variabile con valori diversi a seconda di una condizione
Esempio:
Lo sconto che si applica ad un’acquisto dipende dalla quantità acquistata. Crea una variabile sconto
mettendo il suo valore a 0 se la variabile spesa
è minore di 100€, oppure 10%
se è maggiore.
[19]:
spesa = 200
sconto = 0
if spesa > 100:
sconto = 0.1
else:
sconto = 0 # non necessario
print("spesa:", spesa, " sconto:", sconto)
spesa: 200 sconto: 0.1
Il codice precedente può essere scritto più concisamente così:
[20]:
spesa = 200
sconto = 0.1 if spesa > 100 else 0
print("spesa:", spesa, " sconto:", sconto)
spesa: 200 sconto: 0.1
La sintassi dell’operatore ternario è:
VARIABILE = VALORE if CONDIZIONE else ALTRO_VALORE
col significato che VARIABILE
è inizializzata a VALORE
se la CONDIZIONE
è True
, altrimenti viene inizializzata ad ALTRO_VALORE
Domande if ternari
Guarda i seguenti frammenti di codice, e per ciascuno cerca di indovinare quale risultato produce (o se da errore):
y = 3 x = 8 if y < 2 else 9 print(x)
y = 1 z = 2 if y < 3
y = 10 z = 2 if y < 3 elif y > 5 9
Esercizio - scarpe
Scrivere del codice che data la variabile numerica scarpe
, se scarpe
è minore di 10 viene incrementata di 1
, altrimenti viene decrementata di 1
Usa SOLO l’if ternario
Il tuo codice deve funzionare per qualsiasi valore di
scarpe
Esempio 1 - dato:
scarpe = 2
Dopo il tuo codice, deve risultare:
>>> print(scarpe)
3
Esempio 2 - dato:
scarpe = 16
Dopo il tuo codice, deve risultare:
>>> print(scarpe)
15
[21]:
scarpe = 2
#scarpe = 16
# scrivi qui
Esercizio - trenino
Scrivi del codice che date 3 stringhe sa
, sb
e sc
assegna alla variabile x
la stringa 'CIUFCIUF'
se è possibile comporre sa
, sb
e sc
per ottenere la scritta 'trenino'
, altrimenti mette la stringa ':-('
USA un if ternario
il tuo codice deve funzionare per qualsiasi terna di stringhe
NOTA: ci interessa sapere SE è possibile comporre le scritte come
'trenino'
, NON in che ordine vanno composteSUGGERIMENTO: ti è consentito creare una lista di appoggio
Esempio 1 - date:
sa,sb,sc = "ni","no","tre"
dopo il tuo codice, deve risultare:
>>> print(x)
CIUFCIUF
Esempio 2 - date:
sa,sb,sc = "quattro","ni","no"
dopo il tuo codice, deve risultare:
>>> print(x)
:-(
[22]:
sa,sb,sc = "ni","no","tre" # CIUFCIUF
#sa,sb,sc = "ni","tre","no" # CIUFCIUF
#sa,sb,sc = "quattro","ni","no" # :-(
#sa,sb,sc = "na","tre","no" # :-(
# scrivi qui
Prosegui
Continua con if - prime challenge
[ ]: