En Python, se puede escribir else no solo después de if, sino también después de los bucles for y while. El cuerpo de else se ejecuta solo cuando el bucle finaliza de manera "normal" — no por break. Esto permite implementar de manera elegante, por ejemplo, la búsqueda de un elemento.
Ejemplo:
for x in range(5): if x == 3: print('¡break!') break else: print('El bucle se completó sin break') # no se ejecutará
for x in range(5): if x == 10: break else: print('El bucle se completó sin break') # se ejecutará
Esta característica se utiliza a menudo para "búsqueda sin éxito": si no ocurrió break, significa que el elemento no fue encontrado.
¿Siempre se ejecuta el bloque else de un bucle si el bucle se completó? ¿Qué pasa si el bucle estaba vacío?
Respuesta: Sí, si no hubo break, else siempre se ejecutará, incluso si el bucle nunca entró en el cuerpo:
for x in []: print('nada') else: print('else!') # esto se imprimirá
Historia
Proyecto: Parser de documentos.
Problema: Buscaban una clave en la lista, y después del bucle ponían una bandera "no encontrado" fuera del else. Como resultado, la detección del elemento funcionaba incorrectamente si no se activaba break.
Historia
Proyecto: Generación de tokens únicos.
Problema: La lógica de generación del token dependía de una salida correcta por break, y else se consideraba erróneamente como "caso excepcional", aunque en realidad se activaba en el 99 % de las ejecuciones, lo que rompía la lógica de autenticación de usuarios.
Historia
Proyecto: Script de prueba para una API de red.
Problema: Debido a la mala interpretación de else después de while, lo utilizaron para manejar el tiempo de espera, aunque el bucle no terminaba por break, y los tiempos de espera no se capturaban, lo que conducía a errores "silenciosos" en las pruebas.