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_verdaderoPara que Python no arroje un error de sintaxis, un bloque if debe contener obligatoriamente los siguientes elementos, respetando estrictamente este orden:
- La palabra clave
if: Indica al intérprete que inicia una evaluación lógica. - Uno o más espacios en blanco: Para separar el
ifde la condición. - Una expresión condicional: Una pregunta o variable cuyo resultado se interprete exclusivamente en términos booleanos. Python evalúa esto como
True(verdadero) oFalse(falso). - 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. - 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
IndentationErroroTabError.
¿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) ysleep_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 alify 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_falseReglas de Sintaxis del else para el PCEP:
elsees una palabra clave reservada: No puedes usarla como nombre de variable.- Alineación estricta: La palabra
elsedebe estar alineada exactamente en la misma columna que la palabraifque le dio origen. - Lleva dos puntos obligatorios (
:): Al igual que elif, terminar la línea delelsecon:es una regla estricta de sintaxis. - 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 delif. En cuanto termina, ignora por completo el bloque delelsey salta directamente a las líneas de abajo. - Si la condición evalúa a
False, Python pasa de largo el bloque delif, se mete directo al bloque delelse, 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 delelse.
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
elsese empareja única y exclusivamente con elifque 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:
- Dependencia obligatoria: No puedes escribir un
elifni unelsede la nada. Ambos requieren obligatoriamente unifinicial que abra la estructura. - El
elseva al final: Si decides incluir un bloqueelse, este debe ser siempre la última rama de toda la cascada. No puedes poner unelifdebajo de unelse. - El
elsees opcional: Puedes construir una cascada que tenga únicamente unify varioselif. El bloqueelsefinal se puede omitir por completo si no lo necesitas. - Garantía de ejecución única (Con
else): Si la cascada termina en un bloqueelse, una (y solo una) de todas las ramas se va a ejecutar de forma garantizada. - Riesgo de ejecución cero (Sin
else): Si la cascada no incluye unelseal final, existe la posibilidad de que ninguna rama se ejecute, en caso de que todas las condiciones (ifyelif) resulten ser falsas (False).