As instruções if podem ter blocos else que são executados caso a condição da instrução if não seja satisfeita. De forma semelhante às instruções if, os ciclos while também podem ter blocos else, que serão executados caso a condição do ciclo 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 while irá pedir ao utilizador que introduza o seu nome enquanto não for Alice. Quando finalmente o nome for Alice, a condição name != 'Alice' deixa de ser verdadeira, e o programa entra no bloco else, onde imprime Hi, Alice!.
Não poderíamos simplesmente fazer isso fora do while mesmo antes de print('End!')?
Neste exemplo, sim! Mas o while ... else torna-se muito útil quando lidamos com instruções break. No caso de interrompermos o ciclo while com um break, o bloco else não será executado, pois a condição ainda era verdadeira quando o programa entrou no ciclo. Houve algumas discussões para chamar isto de while ... nobreak em vez de while ... else.
Imagine que queremos verificar se um 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 ciclo while é interrompido com um break, o bloco else não é executado; portanto, o programa não imprimirá a segunda mensagem se já tiver encontrado o dígito 5.
Caso o ciclo while chegue ao fim e a condição deixe de ser verdadeira, o bloco else será executado e o programa imprimirá The number does not have a digit 5.
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, a sua tarefa é determinar se ele contém o dígito 3 ou 7. Se o número contiver um desses dígitos, 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.