AulaML Python · C++
Python principiante · 35 min · Estructuras de control

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+.

Lección 1 de 2 del módulo
Al terminar esta lección podrás
  • 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
  1. ¿Qué es un condicional?
  2. ¿Para qué sirve?
  3. ¿Cómo funciona por dentro?
  4. Sintaxis: `if`, `elif` y `else`
  5. Ejemplo básico: clasificar una nota
  6. Ejemplo intermedio: condiciones anidadas
  7. Condiciones compactas: ternario y `match/case`
  8. Caso práctico: envío y descuento de una compra
  9. Visualización: qué rama se ejecuta
  10. Errores comunes
  11. Buenas prácticas
  12. Ejercicios
  13. Soluciones explicadas
  14. Resumen
  15. 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.5 y 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.

Valorbool(valor)Por qué
0, 0.0FalseEl cero numérico es falso
""FalseCadena vacía, sin caracteres
[], (), {}FalseContenedor sin elementos
NoneFalseAusencia de valor
-1, "0", [0]TrueNo 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.

PYTHON stock.py
stock = 5

if stock > 0:
    print("Disponible")
else:
    print("Agotado")
  • La condición va entre if y los dos puntos: if stock > 0:.
  • El bloque interior usa 4 espacios más que el if. Mezclar tabulaciones y espacios produce TabError.
  • elif se escribe junto, no else if ni elseif.
  • else no lleva condición y va al final; es opcional.
  • Un bloque vacío necesita pass, porque Python no admite un if sin 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:

PYTHON notas.py
nota = 16

if nota >= 18:
    nivel = "excelente"
elif nota >= 14:
    nivel = "bueno"
elif nota >= 11:
    nivel = "regular"
else:
    nivel = "insuficiente"

print(nivel)
  • nota = 16 guarda un int; no hay nada que decidir todavía.
  • nota >= 18 es False, así que el primer bloque no se ejecuta.
  • nota >= 14 es True: se ejecuta nivel = "bueno" y la cadena termina.
  • Los dos elif restantes y el else se saltan aunque sus condiciones también fueran verdaderas.
  • print(nivel) imprime bueno, 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ó.

PYTHON asistencia.py
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.

PYTHON ternario.py
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.

PYTHON comandos.py (requiere Python 3.10+)
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:

PYTHON compra.py
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

Ejecución visual ·Recorrido de una cadena if/elif/else
1 / 5
1 nota = 16
2
3 if nota >= 18:
4 nivel = "excelente"
5 elif nota >= 14:
6 nivel = "bueno"
7 elif nota >= 11:
8 nivel = "regular"
9 else:
10 nivel = "insuficiente"
11
12 print(nivel)
Se guarda 16 en nota.
Variables
nota = 16
Salida
—

Avanza paso a paso: observa la línea resaltada, las variables y la salida.

Errores comunes

Mensaje o síntomaPor qué ocurreCómo se arregla
IndentationError: expected an indented blockNo indentaste después de los dos puntosAñade 4 espacios en el cuerpo del if
IndentationError: unindent does not match any outer indentation levelMezclaste niveles de sangríaAlinea con múltiplos de 4 y no mezcles tabuladores
SyntaxError: expected ':'Falta el signo de dos puntosEscribe if condicion:
SyntaxError: invalid syntax en la condiciónUsaste = en lugar de ==Cambia a == para comparar
Una condición siempre se cumpleUsaste or donde iba andRevisa la lógica: nota >= 13 and nota <= 20
Asignar no es comparar
Incorrecto
PYTHON SyntaxError
nota = 16
if nota = 16:
    print("Igual")
Correcto
PYTHON Correcto
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: a if 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 if larga para separarla del resto.

Ejercicios

Ejercicio 1

Clasificar el índice de masa corporal

Con 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.

Ejercicio 2

Año bisiesto

Pide un año guardado en 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.

Completar código Completa la cadena
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/else se 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 None son falsos.
  • El ternario elige entre dos valores; match/case compara patrones desde 3.10.
  • = asigna y == compara: nunca los confundas dentro de un if.

Evaluación

Evaluación 1

Con valor = 0, ¿qué bloque se ejecuta en if valor: ... else: ...?

Evaluación 2

Con x = 12, ¿qué imprime if x > 10: print("A") elif x > 5: print("B") else: print("C")?

Evaluación 3

¿Cuál es la salida de estado = "apto" if 13 >= 13 else "no apto"?

Tus notas

¿Ya lo entendiste?

Márcala como completada para llevar tu progreso y desbloquear el siguiente paso de la ruta.