Condizionali
Ultimo aggiornamento il 2025-11-06 | Modifica questa pagina
Panoramica
Domande
- Come possono i programmi fare cose diverse per dati diversi?
Obiettivi
- Scrivere correttamente programmi che utilizzano istruzioni if e else e semplici espressioni booleane (senza operatori logici).
- Tracciare l’esecuzione di condizionali non annidati e di condizionali all’interno di loop.
Usare le istruzioni if per controllare se un blocco di
codice viene eseguito o meno.
- Un’istruzione
if(più propriamente chiamata istruzione condizionale) controlla se un blocco di codice viene eseguito o meno. - La struttura è simile a quella di un’istruzione
for:- La prima riga si apre con
ife termina con i due punti - Il corpo contenente una o più istruzioni è indentato (di solito di 4 spazi)
- La prima riga si apre con
PYTHON
mass = 3.54
if mass > 3.0:
print(mass, 'is large')
mass = 2.07
if mass > 3.0:
print (mass, 'is large')
OUTPUT
3.54 is large
I condizionali sono spesso utilizzati all’interno dei cicli.
- Non ha molto senso usare un condizionale quando si conosce il valore (come sopra).
- Ma è utile quando abbiamo una collezione da elaborare.
OUTPUT
3.54 is large
9.22 is large
Usare else per eseguire un blocco di codice quando
l’istruzione condizionale if non è vera.
-
elsesi usa dopo un bloccoif. - Permette di specificare un’alternativa da eseguire quando il blocco
ifnon viene eseguito (cioè quando la condizione è falsa).
PYTHON
masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
if m > 3.0:
print(m, 'is large')
else:
print(m, 'is small')
OUTPUT
3.54 is large
2.07 is small
9.22 is large
1.86 is small
1.71 is small
Usare elif per specificare test aggiuntivi.
- Si possono fornire diverse scelte alternative, ognuna con il proprio test.
- Si usa
elif(abbreviazione di “else if”) seguito da una condizione per specificare queste alternative. - È sempre associato a un
if. - Deve precedere l’eventuale
else(che funge da “caso di default”).
PYTHON
masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
if m > 9.0:
print(m, 'is HUGE')
elif m > 3.0:
print(m, 'is large')
else:
print(m, 'is small')
OUTPUT
3.54 is large
2.07 is small
9.22 is HUGE
1.86 is small
1.71 is small
Le condizioni sono testate una volta, in ordine.
- Python esamina i rami delle condizioni in ordine, testando ciascuno di essi a turno
- L’ordine è importante.
PYTHON
grade = 85
if grade >= 90:
print('grade is A')
elif grade >= 80:
print('grade is B')
elif grade >= 70:
print('grade is C')
OUTPUT
grade is B
- Non torna automaticamente indietro e rivaluta se i valori cambiano.
PYTHON
velocity = 10.0
if velocity > 20.0:
print('moving too fast')
else:
print('adjusting velocity')
velocity = 50.0
OUTPUT
adjusting velocity
- Spesso si usano le condizioni in un ciclo per “evolvere” i valori delle variabili.
PYTHON
velocity = 10.0
for i in range(5): # execute the loop 5 times
print(i, ':', velocity)
if velocity > 20.0:
print('moving too fast')
velocity = velocity - 5.0
else:
print('moving too slow')
velocity = velocity + 10.0
print('final velocity:', velocity)
OUTPUT
0 : 10.0
moving too slow
1 : 20.0
moving too slow
2 : 30.0
moving too fast
3 : 25.0
moving too fast
4 : 20.0
moving too slow
final velocity: 30.0
Creare una tabella che mostri i valori delle variabili per tracciare l’esecuzione di un programma.
| i | 0 | . | 1 | . | 2 | . | 3 | . | 4 | . |
| velocity | 10.0 | 20.0 | . | 30.0 | . | 25.0 | . | 20.0 | . | 30.0 |
- Il programma deve includere un’istruzione
printfuori dal corpo del ciclo per mostrare il valore finale divelocity, poiché il suo valore viene aggiornato nell’ultima iterazione del ciclo.
Relazioni composte con and,
or e parentesi
Spesso si vuole che una combinazione di cose sia vera. È possibile
combinare le relazioni all’interno di una condizione utilizzando
and e or. Continuando l’esempio precedente, si
supponga di avere
PYTHON
mass = [ 3.54, 2.07, 9.22, 1.86, 1.71]
velocity = [10.00, 20.00, 30.00, 25.00, 20.00]
i = 0
for i in range(5):
if mass[i] > 5 and velocity[i] > 20:
print("Fast heavy object. Duck!")
elif mass[i] > 2 and mass[i] <= 5 and velocity[i] <= 20:
print("Normal traffic")
elif mass[i] <= 2 and velocity[i] <= 20:
print("Slow light object. Ignore it")
else:
print("Whoa! Something is up with the data. Check it")
Come per l’aritmetica, si possono e si devono usare le parentesi ogni
volta che c’è una possibile ambiguità. Una buona regola generale è
quella di usare sempre le parentesi quando si mescolano
and e or nella stessa condizione. Cioè, invece
di:
scrivere una di queste:
PYTHON
if (mass[i] <= 2 or mass[i] >= 5) and velocity[i] > 20:
if mass[i] <= 2 or (mass[i] >= 5 and velocity[i] > 20):
in modo che sia perfettamente chiaro a un lettore (e a Python) cosa si intende veramente.
OUTPUT
25.0
Valori di taglio
Riempite gli spazi in modo che il codice sottostante crei un nuovo elenco contenente zeri dove i valori dell’elenco originale erano negativi e uno dove i valori dell’elenco originale erano positivi.
PYTHON
original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = ____
for value in original:
if ____:
result.append(0)
else:
____
print(result)
OUTPUT
[0, 1, 1, 1, 0, 1]
Inizializzazione
Modificate questo codice in modo che trovi i valori più grandi e più piccoli dell’elenco, indipendentemente dall’intervallo di valori originario.
PYTHON
values = [...some test data...]
smallest, largest = None, None
for v in values:
if ____:
smallest, largest = v, v
____:
smallest = min(____, v)
largest = max(____, v)
print(smallest, largest)
Quali sono i vantaggi e gli svantaggi dell’uso di questo metodo per trovare l’intervallo dei dati?
PYTHON
values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
if smallest is None and largest is None:
smallest, largest = v, v
else:
smallest = min(smallest, v)
largest = max(largest, v)
print(smallest, largest)
Se si scrive == None invece di is None,
funziona anche quello, ma i programmatori Python scrivono sempre
is None a causa del modo speciale in cui funziona
None nel linguaggio.
Si può sostenere che un vantaggio dell’uso di questo metodo sarebbe
quello di rendere il codice più leggibile. Tuttavia, uno svantaggio è
che questo codice non è efficiente perché all’interno di ogni iterazione
del ciclo for, ci sono altri due cicli che eseguono due
numeri ciascuno (le funzioni min e max).
Sarebbe più efficiente iterare su ogni numero una sola volta:
PYTHON
values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
if smallest is None or v < smallest:
smallest = v
if largest is None or v > largest:
largest = v
print(smallest, largest)
Ora abbiamo un ciclo, ma quattro test di confronto. Ci sono due modi per migliorarlo ulteriormente: utilizzare un numero minore di confronti in ogni iterazione, oppure utilizzare due cicli che contengono ciascuno un solo test di confronto. La soluzione più semplice è spesso la migliore:
- Utilizzare le istruzioni
ifper controllare se un blocco di codice viene eseguito o meno. - Le condizioni sono spesso utilizzate all’interno dei cicli.
- Usare
elseper eseguire un blocco di codice quando una condizioneifè non vera. - Usare
elifper specificare test aggiuntivi. - Le condizioni vengono verificate una volta, in ordine.
- Creare una tabella che mostri i valori delle variabili per tracciare l’esecuzione di un programma.