06. Istruzioni if, elif ed else

In questa lezione continueremo il discorso iniziato in precedenza sul controllo del flusso parlando di tre istruzioni (in inglese statement) fondamentali: if, elif ed else.

Direi di ripartire dal diagramma di flusso analizzato nella lezione precedente:

flowchart_lamp_FIX.png


Come ricorderete si tratta di uno schema che illustra un insieme di possibili azioni che si possono prendere rendendosi conto che una lampada di casa propria non funziona. Abbiamo imparato che i Si e No del diagramma sono rappresentati dai due valori True e False del tipo di dato booleano.

In questa lezione andremo a fondo nella tana del Bianconiglio focalizzandoci su come sia possibile delineare i diversi blocchi di controllo delle condizioni. Se finora avete pensato ai diagrammi di flusso come a delle mappe del vostro programma, potete immaginare ciò che spiegheremo ora come delle specie di incroci stradali su queste mappe.

La prima istruzione di controllo che analizzeremo è l'istruzione if.


L'istruzione if in Python

Aprite Visual Studio Code (o il vostro editor di scelta) e aggiungete questo codice in un nuovo file, salvandolo con estensione .py in maniera analoga a quanto fatto nella lezione dove abbiamo scritto il nostro primo programma.

age = 26
if age >= 18: 
    print("Sei maggiorenne")

Eseguiamo lo script da terminale col comando python nome_file.py ed ecco che in output otteniamo:

Sei Maggiorenne

Analizziamo da vicino i dettagli del funzionamento del nostro codice tramite la lettura del suo diagramma di flusso:

diagramma di flusso istruzione if

In Italiano, if si traduce con se.

Se la condizioneage >= 18 risulta veritiera, quindi se il risultato di questa espressione restituisce valore booleano True, il programma esegue questa porzione di codice e restituisce la stringa "Sei Maggiorenne". Se invece la condizione fosse risultata falsa, quindi se alla variabile age fosse stato assegnato un valore numerico inferiore a 18, l'esecuzione sarebbe saltata direttamente alla fine del programma, ignorando questa porzione di codice.

Verifichiamo questa possibilità andando ad alterare la variabile age, assegnandole ora il valore 16:

age = 16 
if age >= 18: 
    print("Sei maggiorenne")

Lanciamo nuovamente lo script.

Python ignora ora la porzione di codice col print('Sei maggiorenne') saltando direttamente alla fine (senza quindi restituirci nulla in output!) perché, ripetiamolo, la condizione di controllo age >= 18 ha restituito valore booleano False


L'indentazione in Python è obbligatoria

In Python, i blocchi di codice vengono delineati tramite quella che in programmazione chiamiamo indentazione, ovvero l'aggiunta di spazi (tipicamente 4) o tab (pressioni del tasto corrispondente nella tastiera!) come delimitatore della nuova porzione di codice.

È importante specificare che a differenza di altri linguaggi di programmazione l'indentazione in Python è obbligatoria, e non rispettarla comporta la comparsa di errori.

Modifichiamo ora il codice precedente togliendo lo spazio davanti alla chiamata alla funzione print():

age = 16 
if age >= 18:
print("Sei maggiorenne")

Provate ad eseguire: come noterete Python si rifiuta di eseguire il codice perché non correttamente indentato: non rispetta cioè i suoi standard di logica!


Curiosità: nonostante Python sia un linguaggio molto permissivo nella scelta delle "unità" di indentazione utilizzabili, richiedendo come requisito fondamentale sostanzialmente solo il mantenimento di uno stile uniforme (potete usare anche 1 spazio, 2 spazi ecc), le linee guida per lo stile ufficiali del linguaggio definite nel documento PEP8 prevedono l'utilizzo di indentazione a blocchi di 4 spazi. Tuttavia oggigiorno, l'impiego di tab è estremamente comune e anche tutti gli esempi di questo sito sono indentati in questo modo.


L'istruzione else in Python

Come fare ad eseguire del codice selezionato qualora la condizione di controllo restituisca invece False?

Per questo scopo ci viene in aiuto l'istruzione else, traducibile in Italiano con altrimenti o diversamente.

diagramma di flusso istruzione else

Ora, se l'espressione restituisce un valore booleano False, viene eseguito un altro blocco di codice prima che il programma finisca. Il blocco else è sempre l'ultimo ad essere analizzato e eseguito solo se tutte le condizioni precedenti ad else sono risultate false. Modifichiamo il nostro codice in maniera appropriata:

age = 16 
if age >= 18: 
    print("Sei maggiorenne")
else:
    print("Sei minorenne")

Eseguiamo lo script:

Sei minorenne

...e come vedete, ora ci viene restituita la stringa "Sei minorenne" prima che il programma finisca!


L'istruzione elif in Python

Ci saranno dei momenti in cui i vostri programmi dovranno essere pronti a poter fronteggiare più di due possibili strade, come un incrocio stradale un po' più complesso.

Per fare questo entra in gioco l'istruzione elif, che significa ELse IF, ovvero altrimenti se che come per magia vi permette di aggiungere tanti possibili blocchi di controllo quanti ne avete bisogno.

L'istruzione elif viene eseguita solo se la sua espressione di controllo restituisce True e l'if o eventuali elif precedenti hanno restituito False.

Ad esempio, rendiamo un po' più complesso il nostro programma, aggiungendo una variabile license (patente) e l'operatore booleano and:

age = 18
license = False 

if age >= 18 and license == True:
    print("Puoi noleggiare una Ferrari!")
elif age >= 18 and license == False:
    print("Fatti prima la patente!")
else:
    print("Ripassa tra qualche anno!")

In accordo con questo esempio, il diagramma di flusso potrebbe essere simile a questo:

diagramma di flusso per noleggiare una Ferrari


L'istruzione pass

L'istruzione pass viene utilizzata quando è necessario specificare un'istruzione in un determinato punto del codice, ma non si vuole eseguire alcuna operazione. Ad esempio, può essere utilizzata come segnaposto quando si sta lavorando su una struttura di controllo del flusso (come un'istruzione if) e si desidera evitare un errore di sintassi. Ecco un esempio di come utilizzarla:

if x < 0:
    pass # Qui potrebbe essere inserito del codice in futuro
else:
    print("x è maggiore o uguale a 0")

In questo caso, se x è minore di zero, l'istruzione pass viene eseguita e il flusso del programma continua senza fare nulla. Se invece x è maggiore o uguale a zero, viene stampato il messaggio.

L’istruzione si può utilizzare in qualsiasi contesto, anche nei loop o come segnaposto quando si definisce una classe o una funzione ma le si vuole implementare in futuro lasciando vuoto il blocco di codice.