while ... else

Las sentencias if pueden tener bloques else que se ejecutan en caso de que la condición de la sentencia if no se cumpla. De manera similar, los bucles while también pueden tener bloques else, los cuales se ejecutarán si la condición del while no se cumple.
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!')
El programa con un while solicitará al usuario que ingrese su nombre mientras este no sea Alice. Si finalmente el nombre es Alice, la condición name != 'Alice' ya no se cumple, y el programa entra en el bloque else donde imprime Hi, Alice!.
 

¿No podríamos simplemente hacer eso fuera del while justo antes de print('End!')?

En este ejemplo, ¡sí! Pero while ... else es muy útil cuando trabajamos con sentencias break. Si salimos del bucle while usando un break, el else no se ejecutará porque la condición seguía siendo verdadera cuando el programa entró al bucle. Hubo algunas discusiones para llamar a esto while ... nobreak en lugar de while ... else.
Imagina que queremos verificar si el número tiene el 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')
Así que, cada vez que el bucle while se interrumpe con un break, el bloque else no se ejecutará, por lo tanto, el programa no imprimirá el segundo mensaje si ya ha encontrado un dígito 5.
Si el bucle while llega al final y la condición ya no se cumple, el bloque else se ejecutará y el programa imprimirá The number does not have a digit 5.
Puedes interpretar el concepto de while ... else como while ... sin break, pero lo escribes con else en los programas.

Desafío

Dado un número entero en la entrada, tu tarea es determinar si contiene los dígitos 3 o 7. Si es así, debes imprimir The number contains a digit 3 or 7. Si no, el programa debe imprimir The number neither has a digit 3 nor a digit 7.
Input
Output
1208452
The number neither has a digit 3 nor a digit 7
12939078123
The number contains a digit 3 or 7
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue