In questa lezione vedremo come implementare istruzioni condizionali in Python usando il costrutto if-elif-else
. Le istruzioni condizionali vengono utilizzate quando vogliamo eseguire un blocco di codice solo nel caso in cui una condizione sia vera o falsa.
if-elif-else
Il costrutto if-elif-else
permette di eseguire istruzioni o gruppi di istruzioni diverse a seconda del verificarsi di una o più condizioni.
La forma più semplice prevede l'uso di un if
seguito da una condizione, dai due punti (:
) e da un blocco di codice indentato che viene eseguito solo se la condizione è vera:
if condizione:
# gruppo di istruzioni eseguite
# se la condizione è vera
Per esempio, per calcolare il valore assoluto di un numero, possiamo procedere così:
n = int(input('Inserisci un numero: '))
if n < 0: # se il numero è negativo
n = -n # rendilo positivo
print('Il valore assoluto è', n)
In questo caso il blocco di codice indentato sotto l'if
(cioè n = -n
) è eseguito solo se il numero è negativo. Se il numero è invece positivo, il programma procede ad eseguire l'istruzione che segue l'if
, cioè il print()
.
Aggiungendo un else
seguito dai due punti (:
) possiamo anche specificare un blocco di codice eseguito quando la condizione dell'if
è falsa:
if condizione:
# gruppo di istruzioni eseguite
# se la condizione è vera
else:
# gruppo di istruzioni eseguite
# se la condizione è falsa
In questo caso Python eseguirà il primo blocco se la condizione è vera, oppure il secondo blocco se la condizione è falsa. Ad esempio:
n = int(input('Inserisci un numero: '))
if n < 0: # se il numero è negativo
print(n, 'è negativo')
else: # altrimenti (se non è negativo)
print(n, 'è positivo')
In questo caso il programma eseguirà uno dei due print()
: il primo se il numero inserito dall'utente è negativo, il secondo se invece è positivo.
È infine possibile aggiungere 1 o più elif
, ognuno seguito da una condizione, dai due punti (:
) e da un blocco di codice indentato che viene eseguito solo se la condizione è vera. È anche possibile aggiungere un singolo else
alla fine che viene eseguito se tutte le condizioni precedenti sono false:
if condizione1:
# gruppo di istruzioni eseguite
# se la condizione1 è vera
elif condizione2:
# gruppo di istruzioni eseguite
# se la condizione2 è vera
elif condizioneN:
# gruppo di istruzioni eseguite
# se la condizioneN è vera
else:
# gruppo di istruzioni eseguite
# se tutte le condizioni sono false
Si noti che solo uno di questi blocchi viene eseguito: se una delle condizioni è vera, il blocco corrispondente viene eseguito; se invece tutte le condizioni sono false e un else
è presente, solo il blocco dell'else
viene eseguito. Nel caso ci siano più condizioni vere, verrà eseguito solo il blocco corrispondente alla prima condizione vera.
n = int(input('Inserisci un numero: '))
if n < 0:
print(n, 'è negativo')
elif n > 0:
print(n, 'è positivo')
else:
print(n, 'è zero')
Questo programma usa if
ed elif
per verificare rispettivamente se il numero inserito dall'utente è negativo o positivo. Se entrambe le condizioni sono false (cioè quando il numero è uguale a 0), l'else
viene eseguito.
Indentazione
In una delle precedenti lezioni abbiamo visto che linguaggi come il C usano le parentesi graffe ({}
) per delimitare blocchi di codice, mentre in Python basta usare l'indentazione, aggiungendo o togliendo 4 spazi per ogni livello. Nei due esempi che seguono, vedremo che codice apparentemente simile ha significati diversi a seconda dell'indentazione.
In questo primo esempio, l'else
ha lo stesso livello di indentazione del secondo if
, e viene quindi eseguito quando cond1
è vera e cond2
è falsa:
if cond1:
print('cond1 è vera')
if cond2:
print('cond1 è vera, cond2 è vera')
else:
print('cond1 è vera, cond2 è falsa')
In quest'altro esempio, l'else
ha lo stesso livello di indentazione del primo if
, e viene quindi eseguito quando cond1
è falsa:
if cond1:
print('cond1 è vera')
if cond2:
print('cond1 è vera, cond2 è vera')
else:
print('cond1 è falsa')
Possiamo notare che il blocco di codice indentato sotto all'else
viene eseguito quando la condizione dell'if
corrispondente (cioè quello con lo stesso livello di indentazione dell'else
) è falsa.
Nel seguente esempio, vediamo come sia possibile usare più if-else
per ottenere lo stesso risultato di un if-elif-else
:
n = int(input('Inserisci un numero: '))
if n == 0:
# se il numero è zero
print(n, 'è zero')
else:
# se il numero non è zero
if n > 0:
print(n, 'è positivo')
else:
print(n, 'è negativo')
Possiamo notare che:
- il primo
print()
è indentato sotto l'if
, e quindi viene eseguito solo se la condizionen == 0
è vera; - il primo
else
ha lo stesso livello di indentazione del primoif
, quindi viene eseguito solo se la condizionen == 0
non è vera; - indentato sotto il primo
else
c'è un blocco di codice di 4 righe, che include un altroif-else
; - il secondo
print()
ha 2 livelli di indentazione, quindi viene eseguito solo quando la prima condizione (n == 0
) è falsa e la seconda (n > 0
) è vera; - il secondo
else
ha lo stesso livello di indentazione del secondoif
, quindi viene eseguito solo se la condizionen > 0
non è vera; - il terzo e ultimo
print()
ha 2 livelli di indentazione, quindi viene eseguito solo quando la prima (n == 0
) e la seconda (n > 0
) condizione sono false.
Sostituire lo "switch-case"
Un altro costrutto condizionale presente in diversi altri linguaggi è lo switch-case
. Lo switch-case
consente di specificare una variabile, seguita da diversi casi che vengono eseguiti in base al valore della variabile.
Il seguente esempio mostra parte di un programma in C che in base al valore delle variabile n
, esegue diversi blocchi di codice:
// esempio in C
switch (n) {
case 0:
printf('zero\n');
break;
case 1:
case 2:
printf('uno o due\n');
break;
case 3:
printf('tre\n');
break;
default:
printf('numero diverso da 0, 1, 2, 3\n');
break;
}
Questo programma C stampa zero
se il valore di n
è 0, uno o due
se il valore è 1 o 2, tre
se il valore è 3, altrimenti stampa numero diverso da 0, 1, 2, 3
.
In Python non esiste il costrutto switch-case
, ma è tuttavia possibile ottenere lo stesso risultato semplicemente usando un if-elif-else
:
# esempio in Python
if n == 0:
print('zero')
elif n == 1 or n == 2:
print('uno o due')
elif n == 3:
print('tre')
else:
print('numero diverso da 0, 1, 2, 3')
Esiste anche un caso particolare di utilizzo dello switch
dove per ogni case corrisponde una chiamata ad una funzione.
Il seguente esempio mostra parte di un programma in C che converte la variabile num
in binario, ottale, o esadecimale a seconda della lettera indicata dalla variabile conv
:
// esempio in C
switch (conv) {
// binario
case 'b':
res = bin(num);
break;
// ottale
case 'o':
res = oct(num);
break;
// esadecimale
case 'x':
res = hex(num);
break;
default:
printf('Conversione non valida');
break;
}
Un risultato simile si può ottenere in Python usando i dizionari:
# esempio in Python
num = int(input('Inserisci un numero: '))
conv = input('Inserisci tipo di conversione [b/o/x]: ')
funcs = dict(b=bin, o=oct, x=hex)
if conv in {'b', 'o', 'x'}:
func = funcs[conv]
res = func(num)
print('Il risultato della conversione è:', res)
else:
print('Conversione non valida')
Questo esempio:
- chiede all'utente di inserire
num
econv
; - definisce un dizionario
funcs
che mappa le lettere b/o/x alle funzioni di conversione corrispondenti; - verifica se la conversione specificata è valida o meno;
- se lo è, ottiene la funzione corrispondente (
func
) alla lettera (conv
) e la usa per convertire il numero; - se non lo è, stampa un messaggio d'errore.
Nella prossima lezione vedremo come utilizzare i cicli.