Declarações if podem ter blocos else que são executados caso a condição da declaração if não seja satisfeita. De forma semelhante às declarações if, os loops while também podem ter blocos else, que serão executados caso a condição do while não seja satisfeita.
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!')
O programa com um while irá solicitar ao usuário que insira seu nome enquanto não for Alice. Caso o nome seja finalmente Alice, a condição name != 'Alice' não se mantém, e o programa entra no bloco else, onde imprime Hi, Alice!.
Não poderíamos simplesmente fazer isso fora do while logo antes de print('End!')?
Neste exemplo, sim! Mas o while ... else é muito útil quando estamos lidando com declarações break. No caso de interrompermos o loop while com um break, o else não será executado, pois a condição ainda estava sendo satisfeita quando o programa entrou no loop. Houve algumas discussões para nomear isso como while ... nobreak em vez de while ... else.
Imagine que queremos verificar se o número tem o dígito 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')
Assim, sempre que o loop while é interrompido com break, o bloco else não será executado; portanto, o programa não imprimirá a segunda mensagem se já tiver encontrado um dígito 5.
Caso o loop while chegue ao fim e a condição não seja mais satisfeita, o bloco else será executado e o programa imprimirá The number does not have a digit 5.
Você pode interpretar o conceito de while ... else como while ... nobreak, mas escrevê-lo com else nos programas.
Desafio
Dado um número inteiro na entrada, sua tarefa é descobrir se ele contém o dígito 3 ou 7. Se contiver, você deve imprimir The number contains a digit 3 or 7. Se não, o programa deve imprimir The number neither has a digit 3 nor a digit 7.