Introduzione
Le istruzioni if, elif ed else permettono a un programma Python di prendere decisioni. Invece di eseguire sempre le stesse istruzioni, possiamo scegliere un comportamento diverso in base ai dati ricevuti.
In questo tutorial costruiremo un piccolo sistema per classificare la priorità di un ticket di assistenza tecnica. L’esempio è realistico: un’applicazione potrebbe ricevere la descrizione di un problema, il suo livello di impatto e il numero di utenti coinvolti. In base a queste informazioni, il programma assegnerà una priorità:
- Critica, se il servizio è completamente inutilizzabile;
- Alta, se il problema coinvolge molti utenti;
- Media, se il problema è importante ma non blocca il servizio;
- Bassa, negli altri casi.
Questo scenario mostra come ordinare correttamente le condizioni e come usare un ramo finale else per gestire tutti i casi non intercettati in precedenza.
Codice completo
# Dati del ticket ricevuti dall´applicazione
servizio_bloccato = False
utenti_coinvolti = 35
impatto = "funzionalità ridotta"
# Classificazione della priorità
if servizio_bloccato:
priorita = "Critica"
tempo_risposta = "15 minuti"
elif utenti_coinvolti >= 100:
priorita = "Alta"
tempo_risposta = "1 ora"
elif impatto == "funzionalità ridotta" or utenti_coinvolti >= 10:
priorita = "Media"
tempo_risposta = "4 ore"
else:
priorita = "Bassa"
tempo_risposta = "1 giorno lavorativo"
print(f"Priorità assegnata: {priorita}")
print(f"Tempo massimo di risposta: {tempo_risposta}") Con i valori presenti nell’esempio, il servizio non è completamente bloccato e gli utenti coinvolti sono 35. La condizione relativa all’impatto risulta vera, quindi il ticket riceverà priorità Media.
Spiegazione
La struttura di base
La forma generale del controllo di flusso è:
if condizione:
# istruzioni eseguite se la condizione è vera
elif altra_condizione:
# istruzioni eseguite se la prima è falsa
# e la seconda è vera
else:
# istruzioni eseguite se tutte le condizioni sono false Python valuta le condizioni dall’alto verso il basso. Appena trova una condizione vera, esegue il relativo blocco e ignora tutti i rami successivi. Questa caratteristica è importante: l’ordine delle condizioni può cambiare il risultato.
Perché la condizione critica viene prima?
La prima verifica riguarda servizio_bloccato. Una variabile booleana contiene direttamente il valore True o False, quindi non è necessario scrivere:
if servizio_bloccato == True: È più leggibile usare semplicemente:
if servizio_bloccato: Il blocco critico viene controllato per primo perché rappresenta il caso più urgente. Se il servizio è bloccato, il ticket deve essere classificato immediatamente come critico, anche se il numero di utenti coinvolti fosse basso.
Usare elif per i casi alternativi
elif è l’abbreviazione di “else if”. Serve a controllare una nuova condizione solo quando tutte quelle precedenti sono risultate false.
Nel codice, la seconda verifica usa l’operatore di confronto >=:
elif utenti_coinvolti >= 100: La condizione è vera per valori pari o superiori a 100. Se il ticket coinvolge 100, 150 o 1000 utenti, la priorità sarà alta.
Combinare condizioni con or
La terza condizione contiene l’operatore booleano or:
elif impatto == "funzionalità ridotta" or utenti_coinvolti >= 10: Il ramo viene eseguito quando almeno una delle due condizioni è vera. Anche se l’impatto non è “funzionalità ridotta”, un ticket che coinvolge almeno 10 utenti riceverà comunque priorità media.
Il ruolo di else
Il blocco else non contiene una condizione esplicita. Viene eseguito quando nessun controllo precedente è risultato vero. In questo caso rappresenta la situazione normale: il problema ha un impatto limitato e coinvolge pochi utenti.
Un vantaggio importante di else è che fornisce un comportamento predefinito. In questo modo il programma assegna sempre una priorità, invece di lasciare la variabile non inizializzata.
Best practice
- Ordina le condizioni dalla più urgente alla meno urgente. Le condizioni specifiche e prioritarie dovrebbero comparire prima di quelle generiche.
- Usa nomi descrittivi. Variabili come
servizio_bloccatoeutenti_coinvoltisono più comprensibili di nomi brevi comexon. - Evita confronti booleani inutili. Scrivi
if servizio_bloccato:invece diif servizio_bloccato == True:. - Mantieni il blocco di ogni ramo breve. Se la logica diventa molto lunga, conviene spostarla in una funzione.
- Prevedi sempre un caso predefinito quando serve.
elseè utile per garantire un risultato anche con dati non previsti. - Normalizza i dati testuali. Se un valore arriva da un modulo, puoi usare
.lower()e.strip()per ridurre gli errori di confronto.
Per esempio, prima di controllare il valore dell’impatto, potremmo scrivere:
impatto = input("Descrivi l´impatto: ").strip().lower()
if impatto == "servizio bloccato":
print("Priorità critica")
else:
print("Valutazione standard") In un programma reale sarebbe inoltre opportuno validare che utenti_coinvolti sia un numero intero non negativo, evitando dati incoerenti.
Riepilogo
Con if, elif ed else puoi trasformare regole operative in decisioni eseguibili dal programma. if controlla il primo caso, elif permette di aggiungere alternative e else gestisce tutti i casi rimanenti.
Nell’esempio abbiamo classificato i ticket secondo gravità, numero di utenti e impatto. Il punto fondamentale è ricordare che Python valuta i rami in ordine e ne esegue soltanto uno: per questo le condizioni devono essere progettate e ordinate con attenzione.
