Condizionali - if else

Scarica zip esercizi

Naviga file online

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

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

  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 flow1-if.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

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

  1. x = 3
    if x > 2  and if x < 4:
        print('ABBA')
    
  2. x = 3
    if x > 2 and x < 4
        print('ABBA')
    
  3. x = 3
    if x > 2 and x < 4:
        print('ABBA')
    
  4. x = 2
    if x > 1:
        print(x+1, x):
    
  5. x = 3
    if x > 5 or x:
        print('ACDC')
    
  6. x = 7
    if x == 7:
    print('GLAM')
    
  7. x = 7
    if x < 1:
        print('BIM')
    else:
        print('BUM')
    print('BAM')
    
  8. x = 30
    if x > 8:
        print('DOH')
    if x > 10:
        print('DUFF')
    if x > 20:
        print('BURP')
    
  9. if not True:
        print('sottosopra')
    else:
        print('soprasotto')
    
  10. if False:
    else:
        print('ZORB')
    
  11. if False:
        pass
    else:
        print('ZORB')
    
  12. if 0:
        print('Brandy')
    else:
        print('Rum')
    
  13. if False:
        print('illustrissimo')
    else:
        print('esimio')
    else:
        print('dottore')
    
  14. if 2 != 2:
        'ATTENTO'
    else:
        'STOLTO'
    
  15. if 2 != 2:
        print('ATTENTO')
    else:
        print('STOLTO')
    
  16. x = [1,2,3]
    if 4 in x:
        x.append(4)
    else:
        x.remove(3)
    print(x)
    
  17. 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 a 30, stampa 'Senza benza, faccio il pieno' e incrementa benzina di 20 litri

  • Altrimenti, 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
Mostra soluzione
[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):

  1. y = 2
    if y < 3:
        print('bingo')
    elif y <= 2:
        print('bango')
    
  2. z = 'q'
    if not 'quando'.startswith(z):
        print('BAR')
    elif not 'spqr'[2] == z:
        print('WAR')
    else:
        print('ZAR')
    
  3. x = 1
    if x < 5:
        print('BARCHE')
        elif x < 3:
            print('ZATTERE')
            else:
                print('SCIALUPPE')
    
  4. x = 5
    if x < 3:
        print('ORO')
    else if x >= 3:
        print('ARGENTO')
    
  5. 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

Mostra soluzione
[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 e gravi

  • il tuo codice deve funzionare con qualunque parola

Mostra soluzione
[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.

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

quadrant iu34234

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 e y sono uguali a 0

  • ‘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

Mostra soluzione
[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 multiple

  • Il 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 %

Mostra soluzione
[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)

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

  1. y = 3
    x = 8 if y < 2 else 9
    print(x)
    
  2. y = 1
    z = 2 if y < 3
    
  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
Mostra soluzione
[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 composte

  • SUGGERIMENTO: 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)
:-(
Mostra soluzione
[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

[ ]: