REVIT ARCHITECTURE (982) – PYTHON – Bucles (66) – For…else en Python

En Python, un for puede tener una cláusula else.
La parte else se ejecuta siempre que el bucle termine de forma normal, es decir, sin que lo interrumpas con un break.
Además, la variable de control (i por ejemplo) mantiene su último valor después de que el bucle acabe, y eso incluye cuando no se ejecuta el bucle ni una sola vez.

Si la variable ya existía antes de entrar al for y el bucle no se ejecuta, conservará su valor anterior.
Si no existía antes y el bucle no se ejecuta, entonces no existirá cuando llegues al else.

Ejemplo

Salida:

En este caso:

El rango range(3, 3) no tiene elementos, así que el for nunca se ejecuta.

Como x ya existía antes, su valor se conserva (99) y eso es lo que imprime en el else.

Creamos la variable x y le damos el valor 99.
Esto significa que, si más adelante el for no se ejecuta, este valor seguirá existiendo.

Iniciamos un bucle for, usando como variable de control a x.

range(3, 3) significa «números desde 3 hasta (pero sin incluir) 3».
Como el número de inicio y el de fin son iguales, el rango está vacío → no hay valores para iterar.

Debido a que el rango está vacío, el cuerpo del for no se ejecuta ni una sola vez.

Esta línea está dentro del for, pero no se ejecuta en este caso, porque no hay iteraciones.

Como el bucle for terminó sin usar break (y aquí ni siquiera comenzó), el else se ejecuta.

Imprime «En else:» seguido del valor de x.

Como x ya existía antes del bucle y el for no lo cambió (porque nunca se ejecutó), x sigue valiendo 99.

Salida final del programa:

Ahora se realizará un ejemplo que consiste en escribir el mismo código, pero con un caso en el que x no exista antes del for.

Explicación línea por línea de código:

El for intenta iterar con x tomando valores de range(3, 3).

range(3, 3) está vacío → no hay ninguna iteración.

Nunca se ejecuta porque el bucle no entra ni una vez.

Como el bucle no se interrumpió con break (y en este caso ni empezó), el else se ejecuta.

Problema: x no existía antes del bucle y el bucle no llegó a crearla, así que Python no sabe qué es x → error.

Resultado al ejecutar:

Conclusión importante:
Si el bucle no se ejecuta ni una sola vez y la variable de control no existía antes, obtendrás un NameError en el else (o en cualquier parte después del bucle).

Bonus

Comportamiento del for + else

Caso ¿Bucle se ejecuta? ¿Variable definida antes? Resultado
1. Bucle con iteraciones  Sí No importa La variable de control toma el último valor iterado y el else se ejecuta si no hubo break.
2. Bucle sin iteraciones No La variable conserva el valor que tenía antes del bucle.
3. Bucle sin iteraciones No No NameError porque la variable nunca llegó a crearse.

Ejemplos rápidos
Con iteraciones

Salida:

Coje el último valor que es 2.

Sin iteraciones, pero variable definida antes

Salida:

Como no se ejecuta el bucle for toma la x que hay antes del bucle for, que es 42.

Sin iteraciones y sin variable definida antes

salida:

FAQ Avanzada sobre for + else en Python

1. ¿Para qué sirve realmente el else en un bucle for?
El else no es un «sino» condicional como en otros lenguajes, sino un bloque que se ejecuta si el bucle termina de forma normal (es decir, sin usar break).
Esto lo hace útil, por ejemplo, para búsquedas: si encuentras el elemento, haces break; si no lo encuentras, el else se ejecuta.

2. ¿Qué pasa si el for no se ejecuta ni una vez?
Si la variable de control ya existía antes, conserva su valor previo.

Si no existía, obtendrás un NameError al intentar usarla después del bucle.

3. ¿Es buena práctica usar else con for?
En código de producción suele ser poco común y puede confundir a otros desarrolladores.
Si lo usas, conviene añadir un comentario explicativo para que quede claro que no es un error de indentación.

4. ¿Se ejecuta el else si uso continue dentro del for?
Sí, continue no afecta al else, ya que el bucle sigue ejecutándose hasta agotarse.
Solo break evita que se ejecute el else.

5. ¿Qué pasa con la variable de control después del for?
Con iteraciones: la variable de control queda con el último valor iterado.

Sin iteraciones: queda con el valor previo si existía, o no existe si no estaba definida.

6. ¿El else funciona igual con while?
Sí, la lógica es la misma: el else de un while se ejecuta si el bucle termina sin break.

7. ¿Cómo diferenciar un else de bucle de un else de if?
Es solo cuestión de indentación:

No está «pegado» al if más cercano, sino al for.

8. ¿Puedo hacer return dentro del else?
Sí, pero eso corta la ejecución del resto de la función como cualquier return. Esto es útil para salir de una búsqueda sin break.

9. ¿Es posible combinar try…except con for…else?
Sí, y a veces es práctico:

try:
Inicia un bloque try.
Aquí va el código que queremos ejecutar pero que podría lanzar una excepción.
Si ocurre un error dentro de este bloque, Python saltará al except.

for val in values:
Comienza un bucle for que recorre la colección values.
En cada iteración, la variable val toma un elemento de values.

process(val)
Llama a la función process pasando el valor actual (val).

Aquí podría ocurrir un error si process lanza una excepción.

Si no hay error, el bucle continúa.

if bad_condition(val):
Comprueba si el valor actual cumple con una condición «mala» usando bad_condition(val).
Esta función debe devolver True o False.

break
Si la condición es mala (True), usamos break para salir inmediatamente del bucle for.
Esto también hace que el else asociado al for no se ejecute.

else:
Este else está ligado al for, no al if.
Se ejecuta solo si el bucle termina de forma normal (es decir, sin break y sin errores).
Si break fue llamado o si hubo una excepción, no entra aquí.

print(«Todo procesado sin problemas»)
Mensaje que se muestra si todos los valores fueron procesados correctamente y no se encontró ninguna «mala condición».

except Exception as e:
Inicia un bloque except que captura cualquier excepción que ocurra en el try.
La excepción capturada se guarda en la variable e.

print(«Error:», e)
Si hubo un error en cualquier punto del try (ya sea en process(val), en bad_condition(val) o en el propio bucle), este print muestra el mensaje «Error:» seguido de la descripción de la excepción (e).

Resumen del flujo:

Procesa cada elemento de values.

Si encuentra una condición mala → sale del bucle con break (sin ejecutar el else).

Si procesa todo sin problemas y sin break → muestra «Todo procesado sin problemas».

Si ocurre un error en cualquier parte → salta al except y muestra el mensaje de error.

10. ¿El else del for es igual que poner código después del bucle?
No del todo. La diferencia está en que el else no se ejecuta si hubo break, mientras que el código después del bucle sí se ejecuta siempre.

Licencia Creative Commons Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

Deja un comentario