Control de Flujo Condicional (if, else, elif, else)

Ya sabes cómo hacerle preguntas a Python utilizando los operadores de comparación, pero todavía no hemos aprendido a darles un uso práctico dentro del flujo de un programa. Necesitamos un mecanismo que permita al script tomar una bifurcación: ejecutar un bloque de acciones si se cumple una condición, e ignorarlo por completo si no se cumple.

Para trasladar esta lógica al código, Python nos ofrece las instrucciones condicionales (o sentencias condicionales). Existen varias estructuras, pero comenzaremos explorando la más simple de todas.

Sentencia if

La forma más básica de un condicional se estructura de la siguiente manera:

if expresion_booleana:
    instrucción_si_es_verdadero

Para que Python no arroje un error de sintaxis, un bloque if debe contener obligatoriamente los siguientes elementos, respetando estrictamente este orden:

  1. La palabra clave if: Indica al intérprete que inicia una evaluación lógica.
  2. Uno o más espacios en blanco: Para separar el if de la condición.
  3. Una expresión condicional: Una pregunta o variable cuyo resultado se interprete exclusivamente en términos booleanos. Python evalúa esto como True (verdadero) o False (falso).
  4. Dos puntos (:) seguidos de un salto de línea: Esto es obligatorio y marca el cierre de la condición y el inicio del bloque de acciones.
  5. Un bloque indentado (con sangría): Una o más instrucciones que se ejecutarán únicamente si la condición resulta ser verdadera. Se requiere al menos una instrucción dentro del bloque.

Reglas de Indentación

La indentación no es un elemento estético en Python; es parte de su sintaxis core. Define qué líneas pertenecen al condicional y cuáles están fuera de él.

  • La recomendación oficial (PEP 8): Usar cuatro espacios en blanco para la sangría. También puedes usar la tecla Tabulador (Tab).
  • La regla de oro de la consistencia: Si tu bloque tiene cinco líneas de código, todas y cada una de ellas deben tener exactamente el mismo nivel de indentación.
  • Prohibido mezclar en Python 3: Aunque visualmente parezcan iguales en tu editor, Python 3 prohíbe categóricamente mezclar espacios con tabuladores para indentar. Hacerlo provocará un error crítico llamado IndentationError o TabError.

¿Cómo funciona el flujo de ejecución?

  • Si la condición es verdadera (True), Python entra al bloque con sangría, ejecuta todas las instrucciones de esa “escalera” y luego continúa con el resto del programa de forma normal.
  • Si la condición es falsa (False), Python ignora olímpicamente todo el bloque indentado, salta a la primera línea que se encuentre de vuelta en el nivel original (sin sangría) y reanuda la marcha.

Sentencia if-else

La estructura visual que genera la sangría en Python no es casualidad; está diseñada para que cualquier desarrollador pueda identificar, con un solo golpe de vista, los caminos posibles (execution paths) que puede tomar un programa.

Condicionales con Múltiples Instrucciones

Volvamos con nuestro desarrollador que sufre de insomnio. Ahora sabemos que cae profundamente dormido exactamente cuando el contador llega a 120 ovejas. Pero antes de dormir, necesita cumplir una rutina. Observa cómo cambia la estructura cuando metemos varias acciones dentro del mismo condicional:

if sheep_counter >= 120:
    make_a_bed()
    take_a_shower()
    sleep_and_dream()
feed_the_sheepdogs()

¿Cómo se lee este bloque?

  • Las acciones condicionales: Las funciones make_a_bed() (hacer la cama), take_a_shower() (ducharse) y sleep_and_dream() (dormir y soñar) están indentadas al mismo nivel. Por lo tanto, forman un único bloque compacto. Si el contador es 119 o menos, Python ignorará las tres por igual.
  • La acción obligatoria: La función feed_the_sheepdogs() (alimentar a los perros pastores) no tiene sangría. Está de vuelta en el nivel principal del script. Esto significa que no pertenece al if y se va a ejecutar siempre, sin importar si el desarrollador se durmió o sigue contando ovejas.

La Sentencia if-else

Hasta ahora, nuestro condicional simple solo actuaba si el clima era bueno. Pero, ¿qué pasa si el clima es malo? En el código anterior simplemente nos quedábamos de brazos cruzados sin saber qué hacer. En la vida real, solemos trazar un “Plan B”: Si el clima es bueno, saldremos a caminar; de lo contrario, iremos al teatro. En Python, expresamos este camino alternativo mediante la estructura if-else:

if condicion_verdadera_o_falsa:
    ejecutar_si_la_condicion_es_true
else:
    ejecutar_si_la_condicion_es_false

Reglas de Sintaxis del else para el PCEP:

  1. else es una palabra clave reservada: No puedes usarla como nombre de variable.
  2. Alineación estricta: La palabra else debe estar alineada exactamente en la misma columna que la palabra if que le dio origen.
  3. Lleva dos puntos obligatorios (:): Al igual que el if, terminar la línea del else con : es una regla estricta de sintaxis.
  4. Bloque propio: Las instrucciones del “Plan B” (dentro del else) deben llevar su propia indentación de cuatro espacios.

¿Cómo funciona el flujo de ejecución dual?

El camino se vuelve de vía única exclusiva:

  • Si la condición evalúa a True, Python ejecuta el bloque del if. En cuanto termina, ignora por completo el bloque del else y salta directamente a las líneas de abajo.
  • Si la condición evalúa a False, Python pasa de largo el bloque del if, se mete directo al bloque del else, ejecuta sus instrucciones y da por terminada la estructura condicional.
  • En resumen: Jamás se ejecutarán ambos bloques en una misma corrida. Es una bifurcación pura: o se ejecuta el camino del if, o se ejecuta el camino del else.

Estructuras Condicionales Avanzadas: Anidación y Cascadas (elif)

Ya dominas el “Plan A” (if) y el “Plan B” (if-else). Sin embargo, los problemas de la vida real y los algoritmos de certificación suelen requerir evaluar múltiples condiciones sucesivas o dependientes entre sí. Para ello, Python nos ofrece dos caminos: la anidación (poner condicionales dentro de otros condicionales) y las cascadas (usando la palabra clave elif).

Flujo de Bloques Múltiples en if-else

Antes de complicar el escenario, observa cómo se comporta la indentación cuando añadimos más de una acción en la rama alternativa:

if the_weather_is_good:
    go_for_a_walk()
    have_fun()
else:
    go_to_a_theater()
    enjoy_the_movie()
have_lunch()

Al igual que vimos antes, las funciones go_to_a_theater() y enjoy_the_movie() se ejecutarán en bloque si y solo si la condición del if es falsa. Al finalizar cualquiera de los dos caminos, el programa recupera su flujo normal y ejecuta la función have_lunch(), la cual no depende en absoluto del clima.

Condicionales Anidados (Nested if-else)

La anidación ocurre cuando la instrucción que colocas dentro de un if o un else es, a su vez, otra estructura condicional completa. Imagina este plan dominical complejo:

  • Si el clima es bueno: Vamos a caminar. Si además encontramos un buen restaurante, almorzamos allí; si no lo encontramos, nos comemos un sándwich.
  • Si el clima es malo (de lo contrario): Vamos al teatro. Si no quedan entradas disponibles, nos vamos de compras al centro comercial.

Al trasladar esto a Python, el código se estructura así:

if the_weather_is_good:    
    if nice_restaurant_is_found:
        have_lunch()
    else:
        eat_a_sandwich()
else:    
    if tickets_are_available:
        go_to_the_theater()
    else:
        go_shopping()

La Regla de Emparejamiento:

En el examen te pondrán códigos con muchas ramas y debes saber qué else le pertenece a qué if. La regla en Python es matemática y visual:

  • Cada else se empareja única y exclusivamente con el if que se encuentre exactamente en su mismo nivel de indentación (columna).

Fíjate cómo la sangría te permite rastrear el camino mentalmente: el primer else está alineado con nice_restaurant_is_found, mientras que el segundo else está alineado con tickets_are_available.

El Operador elif

Anidar demasiados if hace que el código se desplace mucho hacia la derecha, volviéndose difícil de leer. Para solucionar esto, Python introduce una palabra clave reservada: elif (que es una abreviatura de else if). El elif sirve para enlazar una cadena de preguntas consecutivas. El programa irá evaluándolas de arriba hacia abajo y se detendrá por completo en el momento exacto en que encuentre la primera condición que sea verdadera (True).

Cambiemos nuestro plan: Si el clima es bueno, caminamos; de lo contrario, si conseguimos entradas, vamos al teatro; de lo contrario, si hay mesas libres, vamos al restaurante; y si todo lo demás falla, nos quedamos en casa a jugar al ajedrez.

En Python, este escenario se escribe de forma limpia como una cascada:

if the_weather_is_good:
    go_for_a_walk()
elif tickets_are_available:
    go_to_the_theater()
elif table_is_available:
    go_for_lunch()
else:
    play_chess_at_home()

Reglas de Oro de la Cascada

El Python Institute suele diseñar preguntas de opción múltiple basadas estrictamente en estas cinco restricciones lógicas de la cascada:

  1. Dependencia obligatoria: No puedes escribir un elif ni un else de la nada. Ambos requieren obligatoriamente un if inicial que abra la estructura.
  2. El else va al final: Si decides incluir un bloque else, este debe ser siempre la última rama de toda la cascada. No puedes poner un elif debajo de un else.
  3. El else es opcional: Puedes construir una cascada que tenga únicamente un if y varios elif. El bloque else final se puede omitir por completo si no lo necesitas.
  4. Garantía de ejecución única (Con else): Si la cascada termina en un bloque else, una (y solo una) de todas las ramas se va a ejecutar de forma garantizada.
  5. Riesgo de ejecución cero (Sin else): Si la cascada no incluye un else al final, existe la posibilidad de que ninguna rama se ejecute, en caso de que todas las condiciones (if y elif) resulten ser falsas (False).