Condicionales: if, elif y else
Enseñar a tu programa a elegir un camino según los datos, sin romper la indentación
Los condicionales permiten que un programa ejecute un bloque u otro según los datos. Aquí aprendes la sintaxis de if, elif y else, cómo se decide qué rama corre, cuándo anidar, cómo escribir un ternario legible y cómo usar match/case en Python 3.10+.
- Escribir cadenas if/elif/else con la indentación correcta
- Explicar por qué solo se ejecuta una rama y por qué el orden de las condiciones importa
- Evaluar qué valores son falsos y cuáles verdaderos en una condición
- Decidir entre anidar condiciones o combinarlas con operadores lógicos
- Usar el ternario y match/case cuando aportan claridad
Antes necesitas: Operadores y expresiones
En esta lección
- ¿Qué es un condicional?
- ¿Para qué sirve?
- ¿Cómo funciona por dentro?
- Sintaxis: `if`, `elif` y `else`
- Ejemplo básico: clasificar una nota
- Ejemplo intermedio: condiciones anidadas
- Condiciones compactas: ternario y `match/case`
- Caso práctico: envío y descuento de una compra
- Visualización: qué rama se ejecuta
- Errores comunes
- Buenas prácticas
- Ejercicios
- Soluciones explicadas
- Resumen
- Evaluación
Hasta ahora cada instrucción se ejecuta siempre, en el orden en que está escrita. Un programa así no reacciona a nada: aplicaría el mismo descuento a todos los clientes e intentaría dividir entre cero sin comprobar el divisor. Los condicionales permiten que el camino dependa de los datos.
La idea es sencilla: evalúas una condición, que es cualquier expresión que produzca un valor verdadero o falso, y ejecutas un bloque solo si se cumple. El resto del programa continúa después, como si nada.
¿Qué es un condicional?
Es una bifurcación en el camino del programa. Imagina una receta: «si la masa está seca, añade dos cucharadas de leche; si no, continúa con el siguiente paso». La receta no se ejecuta dos veces, solo toma una de las dos opciones.
En Python se escribe con if (si), elif (si no, si) y else (si no). Una cadena de condiciones puede tener muchos elif, pero solo se ejecuta una rama: la primera cuya condición resulte verdadera. Las demás se ignoran, aunque también fueran verdaderas.
if no es una función ni devuelve un valor: es una estructura de control que cambia el orden de ejecución. Por eso no se escribe resultado = if ..., sino que se usa para decidir qué instrucciones se ejecutan.
¿Para qué sirve?
Cada vez que un programa debe actuar distinto según la situación, hay un condicional detrás. Estos son casos que verás en cualquier proyecto:
- Validar entradas: rechazar una edad negativa o una nota fuera de 0 a 20.
- Aplicar tarifas por tramos: envío gratis desde 200 soles, descuento desde 150.
- Clasificar: aprobado, observado o desaprobado según nota y asistencia.
- Proteger cálculos: dividir solo si el divisor no es cero.
- Machine Learning: decidir una predicción con
probabilidad >= 0.5y activar una alerta si el error supera un umbral.
¿Cómo funciona por dentro?
El intérprete evalúa la condición del if. Si el resultado es verdadero, ejecuta su bloque y salta al final de toda la cadena; si es falso, prueba el siguiente elif. Si ninguno se cumple, ejecuta el else o pasa de largo. Internamente esto son saltos en el bytecode, pero el modelo útil es una escalera: subes peldaños hasta que uno se cumple y dejas de subir.
Una condición no tiene que ser un bool explícito. Python aplica truthiness: convierte el valor a verdadero o falso con una regla fija. Esto permite escribir if nombre: en lugar de if nombre != "":, aunque a veces la segunda forma se lee mejor.
| Valor | bool(valor) | Por qué |
|---|---|---|
0, 0.0 | False | El cero numérico es falso |
"" | False | Cadena vacía, sin caracteres |
[], (), {} | False | Contenedor sin elementos |
None | False | Ausencia de valor |
-1, "0", [0] | True | No están vacíos; el contenido no se evalúa |
El último caso engaña: "0" es verdadero porque es un texto con un carácter, y [0] también porque la lista tiene un elemento. Si necesitas distinguir «cero» de «sin dato», compara explícitamente: if nota is None o if nota == 0.
Sintaxis: `if`, `elif` y `else`
La forma canónica lleva dos puntos al final de cada condición y un bloque indentado debajo. No hay llaves ni end: el bloque termina cuando la indentación vuelve al nivel anterior.
stock = 5
if stock > 0:
print("Disponible")
else:
print("Agotado")- La condición va entre
ify los dos puntos:if stock > 0:. - El bloque interior usa 4 espacios más que el
if. Mezclar tabulaciones y espacios produceTabError. elifse escribe junto, noelse ifnielseif.elseno lleva condición y va al final; es opcional.- Un bloque vacío necesita
pass, porque Python no admite unifsin cuerpo.
Ejemplo básico: clasificar una nota
Una cadena de elif evalúa de arriba abajo y se detiene en la primera condición verdadera. Ese comportamiento permite escribir los casos más exigentes primero:
nota = 16
if nota >= 18:
nivel = "excelente"
elif nota >= 14:
nivel = "bueno"
elif nota >= 11:
nivel = "regular"
else:
nivel = "insuficiente"
print(nivel)nota = 16guarda unint; no hay nada que decidir todavía.nota >= 18esFalse, así que el primer bloque no se ejecuta.nota >= 14esTrue: se ejecutanivel = "bueno"y la cadena termina.- Los dos
elifrestantes y elelsese saltan aunque sus condiciones también fueran verdaderas. print(nivel)imprimebueno, el único valor asignado.
El orden importa. Si hubieras puesto nota >= 11 antes que nota >= 14, un 16 caería en regular, porque esa condición también es verdadera y la cadena se detiene ahí. Escribe siempre de la condición más restrictiva a la más amplia, o usa comparaciones que no se solapen.
Ejemplo intermedio: condiciones anidadas
A veces una decisión depende de otra. Un alumno con nota suficiente puede quedar observado si su asistencia es baja: la segunda condición solo tiene sentido si la primera se cumplió.
nota = 14
asistencia = 0.65
if nota >= 13:
if asistencia >= 0.70:
estado = "aprobado"
else:
estado = "observado"
else:
estado = "desaprobado"
print(estado)La condición externa es verdadera, así que entra al bloque y evalúa la interna: 0.65 >= 0.70 es falsa y el else interno asigna observado. El else externo ni se mira. La indentación muestra la jerarquía: el else de la línea 7 pertenece al if interno, y el de la línea 9 al externo.
Este anidamiento se puede aplanar con and: if nota >= 13 and asistencia >= 0.70:. La versión plana es más corta, pero la anidada permite distinguir los dos motivos de rechazo con mensajes distintos. Elige según lo que necesites comunicar, no por moda.
Condiciones compactas: ternario y `match/case`
Cuando solo necesitas elegir entre dos valores, el operador ternario lo expresa en una línea: valor_si_cierto if condición else valor_si_falso. Es una expresión, así que se puede asignar o pasar como argumento, pero no ejecuta bloques completos.
nota = 12
estado = "aprobado" if nota >= 13 else "desaprobado"
print(f"Estado: {estado}")Con nota = 12 la condición es falsa y estado recibe desaprobado. La ventaja es la brevedad; el riesgo es anidar ternarios dentro de otros ternarios, que se vuelven ilegibles. Si necesitas tres o más casos, usa if/elif/else.
Para comparar un valor contra muchos patrones existe match/case, disponible desde Python 3.10. Comprueba patrones de arriba abajo y ejecuta el primero que coincide; case _ actúa como comodín. No hay fallthrough: al terminar un caso, la estructura acaba.
comando = "guardar"
match comando:
case "guardar":
print("Guardando cambios...")
case "salir":
print("Cerrando el programa")
case _:
print("Comando no reconocido")La salida es Guardando cambios.... match es más legible que una cadena larga de elif cuando comparas un mismo valor con literales o formas de datos. Si solo tienes dos o tres casos numéricos, un if sigue siendo la opción natural.
Caso práctico: envío y descuento de una compra
Una tienda cobra el envío según el monto: gratis desde 200 soles, 7.5 entre 100 y 199.99, y 15 por debajo de 100. Además, los clientes VIP con compra de 150 o más reciben 10 % de descuento. Con una compra de 240 soles:
compra = 240.0
cliente_vip = True
if compra >= 200:
envio = 0.0
elif compra >= 100:
envio = 7.5
else:
envio = 15.0
if cliente_vip and compra >= 150:
descuento = compra * 0.10
else:
descuento = 0.0
total = compra - descuento + envio
print(f"Descuento: {descuento:.2f}")
print(f"Envío: {envio:.2f}")
print(f"Total: {total:.2f}")El primer if es verdadero porque 240 supera 200, así que el envío es 0 y los otros tramos no se evalúan. El segundo combina un bool del cliente con una comparación numérica: ambos son verdaderos, así que el descuento es 24.0. El total es 240 - 24 + 0 = 216.00. Si el cliente no fuera VIP, pagaría 240.00 con envío gratis; esa es exactamente la decisión que expresa el código.
Visualización: qué rama se ejecuta
nota = 16if nota >= 18: nivel = "excelente"elif nota >= 14: nivel = "bueno"elif nota >= 11: nivel = "regular"else: nivel = "insuficiente"print(nivel)nota.—
Avanza paso a paso: observa la línea resaltada, las variables y la salida.
Errores comunes
| Mensaje o síntoma | Por qué ocurre | Cómo se arregla |
|---|---|---|
IndentationError: expected an indented block | No indentaste después de los dos puntos | Añade 4 espacios en el cuerpo del if |
IndentationError: unindent does not match any outer indentation level | Mezclaste niveles de sangría | Alinea con múltiplos de 4 y no mezcles tabuladores |
SyntaxError: expected ':' | Falta el signo de dos puntos | Escribe if condicion: |
SyntaxError: invalid syntax en la condición | Usaste = en lugar de == | Cambia a == para comparar |
| Una condición siempre se cumple | Usaste or donde iba and | Revisa la lógica: nota >= 13 and nota <= 20 |
nota = 16
if nota = 16:
print("Igual")nota = 16
if nota == 16:
print("Igual")`=` guarda un valor y no puede aparecer dentro de una condición en Python. `==` compara y devuelve un booleano. El error apunta a la línea del `if`, y el mensaje habitual es `SyntaxError: invalid syntax`.
Buenas prácticas
- Ordena las condiciones de la más específica a la más general.
- Evita anidar más de dos niveles: extrae funciones o combina con
and. - Prefiere
if nota is None:aif not nota:cuando el cero es válido. - No repitas la misma condición en varios
elif: si se solapan, hay un error de diseño. - Usa el ternario solo para elegir entre dos valores simples.
- Deja una línea en blanco antes y después de una cadena
iflarga para separarla del resto.
Ejercicios
Clasificar el índice de masa corporal
peso = 72 y altura = 1.75, calcula el IMC con peso / altura ** 2 y clasifícalo: menos de 18.5 es bajo, menos de 25 es normal, menos de 30 es sobrepeso y el resto obesidad. Muestra el IMC con un decimal y la categoría.Pista
Calcula primero el IMC y luego usa una cadena if/elif/else con los cortes en orden ascendente.
Año bisiesto
anio y decide si es bisiesto con la regla: divisible entre 4, salvo los múltiplos de 100 que no sean múltiplos de 400. Comprueba con 2024 (sí), 1900 (no) y 2000 (sí).Pista
Combina % con and, or y not. Puedes escribir la regla completa en una sola condición booleana.
nota = 14 if nota >= 18: nivel = "excelente" nota >= 13: nivel = "bueno" else: nivel = "insuficiente" print()
La segunda condición es la continuación de la primera; al final imprime el resultado.
Soluciones explicadas
En el IMC, el cálculo debe hacerse antes de la cadena: si comparas peso / altura ** 2 dentro de cada condición, repites la operación y el código se vuelve frágil. Los cortes funcionan sin límite inferior porque cada elif solo se alcanza cuando el anterior fue falso. Si los pusieras en orden inverso, un IMC de 23 entraría en obesidad.
En el año bisiesto, la trampa está en la precedencia: anio % 4 == 0 and anio % 100 != 0 or anio % 400 == 0 sin paréntesis se evalúa como (A and B) or C, que también es correcto aquí, pero los paréntesis comunican la regla. Comprueba siempre los tres casos límite: un año normal, un múltiplo de 100 y un múltiplo de 400.
Resumen
- Un condicional ejecuta un bloque solo si su condición es verdadera.
if/elif/elsese evalúa de arriba abajo y ejecuta una sola rama.- El orden de las condiciones cambia el resultado cuando se solapan.
- Los dos puntos y la indentación de 4 espacios son obligatorios.
- Cualquier valor se puede usar como condición: vacío, cero y
Noneson falsos. - El ternario elige entre dos valores;
match/casecompara patrones desde 3.10. =asigna y==compara: nunca los confundas dentro de unif.
Evaluación
Con valor = 0, ¿qué bloque se ejecuta en if valor: ... else: ...?
Con x = 12, ¿qué imprime if x > 10: print("A") elif x > 5: print("B") else: print("C")?
¿Cuál es la salida de estado = "apto" if 13 >= 13 else "no apto"?
¿Ya lo entendiste?
Márcala como completada para llevar tu progreso y desbloquear el siguiente paso de la ruta.