Le istruzioni if possono avere blocchi else che vengono eseguiti nel caso in cui la condizione dell'istruzione if non sia soddisfatta. Allo stesso modo, anche i cicli while possono avere blocchi else, che verranno eseguiti nel caso in cui la condizione dell'istruzione while non sia più valida.
name = input()
if name != 'Alice':
print('I don\'t know you')
else:
print('Hi, Alice!')
print('End!')
name = input()
while name != 'Alice':
print('I don\'t know you')
name = input()
else:
print('Hi, Alice!')
print('End!')
Il programma con il while chiederà all'utente di inserire il proprio nome finché non è "Alice". Quando finalmente il nome è "Alice", la condizione name != 'Alice' non è più vera, e il programma entra nel blocco else dove stampa Hi, Alice!.
Non potremmo semplicemente fare ciò fuori dal while proprio prima di print('End!')?
In questo esempio, sì! Ma while ... else torna davvero utile quando abbiamo a che fare con istruzioni break. Se interrompiamo il ciclo while con un break, l'else non verrà eseguito poiché la condizione era ancora soddisfatta quando il programma è entrato nel ciclo. Alcuni hanno discusso l'idea di chiamare questo costrutto while ... nobreak invece di while ... else.
Immagina di voler verificare se un numero contiene la cifra 5:
n = 123409087542108
while n != 0:
if n % 10 == 5:
print('The number contains a digit 5!')
break
n //= 10
else:
print('The number does not have a digit 5')
Quindi, ogni volta che il ciclo while viene interrotto con un break, l'istruzione else non verrà eseguita; di conseguenza, il programma non stamperà il secondo messaggio se ha già trovato una cifra 5.
Nel caso in cui il ciclo while arrivi alla fine e la condizione non sia più valida, il blocco else verrà eseguito e il programma stamperà The number does not have a digit 5.
Puoi interpretare il concetto di while ... else come while ... nobreak, ma scriverlo con else nei programmi.
Sfida
Dato un numero intero in input, il tuo compito è determinare se contiene una cifra 3 o 7. Se lo fa, dovresti stampare The number contains a digit 3 or 7. Se non lo fa, il programma dovrebbe stampare The number neither has a digit 3 nor a digit 7.