Corso Python / Scegliere il percorso con if, elif ed else

Una catena if–elif–else sceglie un percorso controllando le condizioni dall’alto verso il basso. Viene eseguito soltanto il primo ramo vero: progetta quindi ordine e limiti delle condizioni prima di scriverle.

Definire i rami con condizioni e rientri

Dopo la condizione di if o elif serve il due punti. Le istruzioni del ramo sono rientrate in modo coerente, normalmente con quattro spazi. Evita di mescolare tabulazioni e spazi: l’allineamento visivo può non corrispondere alla struttura interpretata da Python. else non ha una condizione.

Puoi avere più rami elif oppure nessuno; anche else è facoltativo. Senza else, se nessuna condizione è vera, l’esecuzione prosegue dopo la catena senza eseguirne alcun ramo. La guida ufficiale alle istruzioni if mostra la struttura.

Due if separati possono essere entrambi eseguiti. Una catena if–elif sceglie invece un solo ramo. Per due avvisi indipendenti, come «importo elevato» e «categoria da controllare», due if possono essere appropriati; per attribuire una sola classe a un importo, una catena esprime meglio la scelta. Le condizioni si costruiscono con le regole di confronto e operatori logici.

Eseguire una classificazione completa

Salva il codice seguente in UTF-8 nel file classify.py, dentro una cartella di esercitazione. Esegui python classify.py con l’interprete del progetto selezionato. Fuori dall’ambiente virtuale su macOS o Ubuntu usa python3 se è il comando dell’interprete scelto. Non servono pacchetti esterni.

amount = 8000
if amount < 0:
    label = "invalid"
elif amount == 0:
    label = "free"
elif amount <= 10000:
    label = "small"
else:
    label = "large"
print(label)

Il risultato atteso è:

small

Con amount uguale a 8000, la condizione sui negativi è falsa e quella su zero è falsa. La condizione amount <= 10000 è vera, quindi assegna small a label. Il ramo else non viene eseguito. La stampa, allineata con if e non rientrata dentro un ramo, mostra la classificazione scelta.

Progettare intervalli e valori di confine

Il programma assume importi interi: distingue negativi, zero, interi da 1 a 10000 e valori superiori a 10000. Le condizioni precedenti escludono i casi già trattati. Perciò nel terzo ramo non serve ripetere che amount è positivo: negativi e zero hanno già selezionato un ramo.

Importo Etichetta prevista
-1 invalid
0 free
1 e 10000 small
10001 large

Se mettessi amount <= 10000 come prima condizione, includeresti anche zero e negativi e i rami successivi dedicati a questi casi non sarebbero raggiunti. Le condizioni possono sovrapporsi: è l’ordine della catena a stabilire quale viene scelta per prima.

Questa logica non converte automaticamente una stringa in numero. La lettura con input(), la conversione con int() e la gestione di un formato non valido sono compiti distinti dalla classificazione; la guida a input e output mostra quel passaggio.

Assegnare i valori su tutti i percorsi

Se usi label dopo la catena, deve ricevere un valore in ogni percorso che raggiunge quella riga. Nell’esempio tutti i rami assegnano label e l’else copre il caso residuo. Assegnarla solo in un if senza else può lasciare il nome indefinito quando la condizione è falsa.

Puoi assegnare un valore iniziale prima della condizione oppure assegnare nei rami if ed else. Scegli un valore iniziale solo se ha un significato valido: non usare un’etichetta generica per nascondere un caso dimenticato. A livello di script un nome non definito genera NameError; dentro una funzione un nome locale usato prima dell’assegnazione può generare UnboundLocalError. La documentazione sulla risoluzione dei nomi spiega la differenza.

  1. Sostituisci amount con ciascun valore della tabella e verifica l’etichetta.
  2. Per amount uguale a 10000 cambia soltanto <= in <: la classificazione passa da small a large. Ripristina poi <=.
  3. Ripristina amount uguale a 8000 e controlla di nuovo small. Se un ramo non viene eseguito, esamina prima la sua condizione e i rami precedenti, anziché aggiungere altro annidamento.

Provare i confini e almeno un caso per ogni ramo permette di scoprire errori che un solo valore centrale non mostra. Mantieni esplicito dove viene deciso il valore utilizzato dopo la classificazione.