Il flusso di esecuzione di un programma non è mai lineare. Il software deve far fronte a quello che accade, ai valori dei dati che si modificano durante l’esecuzione e prendere delle semplici decisioni.
Sarà compito del programmatore prevedere le situazioni in cui prendere delle decisioni in funzione dei dati presenti. Il più semplice test che possiamo incontrare è quello che valuta un’espressione e quindi, nel caso questa sia vera, attiva una certa porzione di codice. In Python implementiamo un test con l’istruzione if, definita “istruzione per il controllo di flusso”. L’if valuta un’espressione o predicato, cioè una scrittura che viene valutata e può assumere un valore pari a True o False. Se l’espressione è vera, allora sarà eseguito il gruppo di istruzioni che fanno parte del corpo dell’if. Come anticipato, in Python non abbiamo parentesi e possiamo delimitare dei blocchi di codice come “il corpo dell’if” usando degli spazi posti prima delle istruzioni. Ecco un semplice test che valuta il valore della variabile temperatura e nel caso questa superi i 20 gradi, scrive un messaggio a schermo.:
#definisco una variabile con il valore di temperatura temperatura = 21 if (temperatura > 20): print("Fa caldo!")
Listato 1.10 – Stampiamo un messaggio se la temperatura è superiore a venti gradi.
Nel test che abbiamo appena scritto e verificato, avrete osservato che il predicato che valutiamo contiene un confronto numerico: stiamo verificando se il valore di temperatura è superiore a 20. Per chiarezza l’espressione è stata racchiusa tra parentesi. Questa espressione, se valutata da Python, restituisce True o False. L’espressione va posta subito dopo la parola chiave if. La riga con l’istruzione if deve concludersi con il carattere “due punti”. Il corpo del test include solo l’istruzione print() e come potete osservare è rientrato (indentato) rispetto all’if. Potete far rientrare il codice premendo il tasto “TAB” (tabulazione) oppure inserendo quattro spazi. Cercate di utilizzare sempre lo stesso metodo d’indentazione per il codice.
Sono uguali?
Quando si comparano due numeri in Python, si utilizza una scrittura particolare: per verificare se la variabile A contiene il valore 10 scriveremo:
A = 10 if (A == 10): print(“A vale 10”)
L’espressione per il confronto contiene due volte il segno di uguale (=). Non è un errore! Se mettessimo infatti un solo uguale, il confronto non funzionerebbe e otterremmo un errore!
A = 20 if (A = 10): print(“A vale 10”)
Nei confronti dobbiamo usare due segni di uguale (==) perché altrimenti Python non saprebbe distinguerli da una assegnazione di valore ad una variabile.
Di fronte a un bivio
Proviamo ora a porci di fronte a un bivio. Valutando la verità di una espressione abbiamo due possibilità: o è vera o è falsa. Avremo quindi la possibilità di prendere due strade, cioè di eseguire due porzioni di codice differenti. Il costrutto che utilizzeremo è chiamato if-else. Ecco un esempio:
#chiedo la temperatura all’utilizzatore temperatura = int( input("temp: ") ) if (temperatura > 20): print("Fa caldo!") else: print("Fa freddo")
Listato 1.11 – Stampiamo un messaggio se la temperatura è superiore a venti gradi, altrimenti avremo una differente segnalazione.
Nel semplice programma richiediamo all’utilizzatore di indicare la temperatura con input(). Il risultato di input() è subito trasformato in un numero intero utilizzando int(). Incontriamo poi il blocco di controllo if-else. Subito di seguito alla parola chiave if abbiamo l’espressione da verificare che per chiarezza ho racchiuso tra parentesi tonde: confrontiamo la temperatura fornita e salvata nella variabile temperatura con il numero 20.
Il costrutto if-else prevede due alternative. A seguito della valutazione dell’espressione fornita all’if, abbiamo un primo blocco di codice che può essere eseguito. Nel caso la valutazione dell’espressione fornita abbia come risultato False, il blocco da eseguire sarà quello posto subito di seguito alla parola chiave else (seguita da un segno “due-punti”).
Qui le possibilità sono due e sono definite senza ambiguità: se la temperatura è superiore a 20°C, allora stamperemo un messaggio, in tutti gli altri casi (e quindi se è uguale o minore) avremo un diverso risultato, “coperto” dal codice collegato all’else.
Confrontare due numeri
Scriviamo un programma per confrontare due numeri e decidere quale dei due è il più grande. Utilizzeremo di nuovo la struttura di controllo if-else. Il programma sarà interattivo, quindi chiederemo all’utente due numeri a scelta utilizzando input() con int() per convertire le risposte in numeri interi. Ecco il listato:
num1 = int( input("primo numero: ") ) num2 = int( input("secondo numero: ") ) if (num1 > num2): print("Il primo è il maggiore"); print(num1); else: print("Il secondo è il maggiore"); print(num2);
Listato 1.12 – Confronto di due numeri.
Confrontare tre numeri
Rendiamo le cose più difficili e proviamo a scrivere un programma per confrontare tre numeri tra di loro e indicare quale dei tre è il maggiore. Mentre il confronto di due semplici numeri è semplice, quando ne dobbiamo comparare tre, le cose si complicano. Dobbiamo metterci nei panni del nostro computer che purtroppo può confrontare solo due numeri per volta, tra di loro. Quando ci presentano 3 numeri, es.: 1, 5 e 3, sappiamo subito dire che il 5 è il numero più grande. Purtroppo lo facciamo senza sapere quali processi siano attuati dalla nostra mente. Dovendo trovare una strategia replicabile con del codice dobbiamo considerare due numeri per volta. Iniziamo a confrontare i primi due numeri: 1 e 5. Il confronto, come abbiamo visto può essere fatto utilizzando un if. Memorizzando i due numeri all’interno di due variabili A e B avremo:
A = 1 B = 5 C = 3 if (A > B): print(f"{A} è maggiore di {B}") else: print(f"{B} è maggiore di {A}")
Dopo aver confrontato A e B possiamo dire quale delle due variabili contiene il numero maggiore. Ora dobbiamo coinvolgere il terzo numero, memorizzato nella variabile C. Nel primo caso individuato dall’if, sappiamo che A è maggiore di B: possiamo abbandonare B e confrontare A con C. Se C è superiore ad A, allora il numero più grande sarà C, altrimenti sappiamo che sarà A.
A = 5 B = 1 C = 3 if (A > B): if (A > C): print(f"{A} è maggiore di {B} e {C}") else: print(f"{C} è maggiore di {A} e {B}") else: print(f"{B} è maggiore di {A}")
Nel caso in cui B sia minore di A ci troviamo nell’else del primo if. Con un ragionamento analogo al precedente, in questa situazione sappiamo che B sarà maggiore di A. Possiamo tralasciare A e concentrarci sul confronto tra B e C. Ecco il codice completo:
A = 5 B = 1 C = 3 if (A > B): if (A > C): print(f"{A} è maggiore di {B} e {C}") else: print(f"{C} è maggiore di {A} e {B}") else: if (B > C): print(f"{B} è maggiore di {A} e {C}") else: print(f"{C} è maggiore di {A} e {B}")
Listato 1.13 – Confronto di tre numeri.
In questo esempio abbiamo inserito delle if all’interno di altre if. Abbiamo quindi realizzato delle “if innestate”.
Cose da provare
- Il listato 1.13 utilizza tre variabili per memorizzare i numeri da confrontare. Modificatelo così che i numeri siano chiesti ogni volta all’utilizzatore.
- Nei confronti verifichiamo solo che uno dei due numeri sia maggiore (o minore) dell’altro. Cosa succede se si forniscono due numeri uguali? Come si può migliorare il programma per contemplare anche il caso in cui due numeri siano uguali tra di loro?
- Cosa succede se A, B e C sono uguali?
Predisporre più alternative
Introducendo la parola speciale elif possiamo controllare più condizioni con un solo if. Immaginate di dover scrivere un programma di avventura testuale (erano molto in voga negli anni ‘80): il computer vi descrive una situazione e voi dovete decidere che azioni intraprendere o in che direzione muovervi. Ecco un esempio che utilizza elif:
print("Sei in una foresta magica e il sole sta tramontando.") print("Da che parte vai?") move = input("N, S, E, W? ") if (move == 'N'): print('sei uscito dalla foresta') elif (move == 'S'): print('la foresta ti circonda ancora') elif (move == 'E'): print('tra gli alberi appare una capanna') elif (move == 'W'): print('un lupo ti assale') else: print('Non ho capito dove vuoi andare')
Listato 1.14 – Un semplice programma di avventura testuale.
Introducendo elif possiamo controllare più situazioni e quindi realizzare un punto di scelta multiplo: non più un bivio, ma un incrocio con varie strade. Una elif si comporta come una if e deve essere seguita dall’espressione da valutare. Avremmo potuto realizzare il codice anche utilizzando delle if in sequenza ma in questo modo otterremo un codice ottimizzato e più efficiente. Dopo l’ultima istruzione elif abbiamo un’else in cui ricadiamo nel caso il giocatore abbia risposto con un carattere non previsto.