Saltar al contenido
condicionales.py · devschool

if, elif y else en Python

Lección 5 de 19 · 8 min de lectura · Actualizado el

En esta lección
  1. if: ejecutar algo solo si se cumple una condición
  2. else: qué hacer si no se cumple
  3. elif: varias alternativas
  4. Combinar condiciones
  5. Valores truthy y falsy en un if
  6. Condicionales anidados
  7. Expresión condicional (operador ternario)
  8. pass: un bloque que no hace nada
  9. match: elegir entre muchos casos
  10. Ejemplo completo: precio de una entrada
  11. Errores frecuentes
  12. Resumen

Hasta ahora tus programas ejecutaban todas las líneas, una detrás de otra. Con los condicionales el programa puede tomar decisiones: hacer una cosa u otra según los datos. En esta lección verás if, elif y else, cómo escribir buenas condiciones, la versión en una línea y match, la forma moderna de elegir entre muchos casos.

if: ejecutar algo solo si se cumple una condición

temperatura = 30

if temperatura > 25:
    print("Hace calor")
    print("Lleva agua")
print("Buen día")
# Hace calor
# Lleva agua
# Buen día

Tres detalles propios de Python:

  1. La condición no necesita paréntesis.
  2. La línea termina en dos puntos :.
  3. Lo que va dentro del if se marca con sangría (4 espacios). La línea print("Buen día") no tiene sangría, así que se ejecuta siempre.

La condición es cualquier expresión que dé True o False, normalmente una comparación: ==, !=, >, <, >=, <=. Los tienes todos en Operadores.

else: qué hacer si no se cumple

edad = 16

if edad >= 18:
    print("Puedes entrar")
else:
    print("Lo siento, eres menor de edad")
# Lo siento, eres menor de edad

else no lleva condición: recoge todos los casos en los que el if es falso. Siempre se ejecuta uno de los dos bloques, nunca los dos.

elif: varias alternativas

elif es la forma corta de else if. Permite encadenar tantas condiciones como necesites:

nota = 7.5

if nota >= 9:
    print("Sobresaliente")
elif nota >= 7:
    print("Notable")
elif nota >= 5:
    print("Aprobado")
else:
    print("Suspenso")
# Notable

Las condiciones se comprueban en orden y solo se ejecuta el primer bloque que se cumpla. Por eso, en el ejemplo, un 7.5 no dice también “Aprobado”: aunque 7.5 >= 5 es cierto, Python ya había entrado en el bloque del notable.

Cuidado: el orden importa. Si pusieras primero if nota >= 5, todas las notas aprobadas caerían ahí y nunca verías “Sobresaliente”. Ordena de la condición más estricta a la más amplia.

¿Por qué no usar varios if seguidos? Porque serían independientes: se comprobarían todos y podrían ejecutarse varios. elif deja claro que las opciones se excluyen entre sí.

Combinar condiciones

Con and, or y not unes varias comparaciones:

edad = 20
tiene_entrada = True

if edad >= 18 and tiene_entrada:
    print("Puedes pasar")
# Puedes pasar

dia = "domingo"
if dia == "sábado" or dia == "domingo":
    print("Fin de semana")
# Fin de semana

La segunda condición se escribe mejor con in, que comprueba si un valor está en una colección:

if dia in ("sábado", "domingo"):
    print("Fin de semana")

Comparaciones encadenadas

Python permite encadenar comparaciones como en matemáticas, algo que muchos lenguajes no hacen:

edad = 40
if 18 <= edad <= 65:
    print("Edad laboral")
# Edad laboral

Equivale a 18 <= edad and edad <= 65, pero se lee mucho mejor. Funciona con cualquier comparación: 0 < x < 10, a == b == c.

Valores truthy y falsy en un if

La condición de un if no tiene por qué ser un bool. Python convierte el valor a True o False automáticamente:

  • Falsy (cuentan como falso): False, 0, 0.0, "", [], (), {}, set() y None.
  • Truthy: todo lo demás.

Así se escriben comprobaciones muy compactas:

nombre = ""
if not nombre:
    print("No has escrito tu nombre")
# No has escrito tu nombre

carrito = ["libro", "lápiz"]
if carrito:
    print(f"Tienes {len(carrito)} productos")
# Tienes 2 productos

if carrito: significa “si el carrito no está vacío”. Es la forma habitual en Python, más clara que if len(carrito) > 0:.

Cuidado: si una variable puede valer 0 o None y los dos significan cosas distintas, no uses if not x. Por ejemplo, un descuento de 0 es válido, pero None indica que no hay dato. Ahí escribe if descuento is None:.

Condicionales anidados

Puedes meter un if dentro de otro. Cada nivel lleva 4 espacios más:

usuario = "admin"
clave = "1234"

if usuario == "admin":
    if clave == "1234":
        print("Bienvenido, administrador")
    else:
        print("Clave incorrecta")
else:
    print("Usuario desconocido")
# Bienvenido, administrador

Anidar es útil cuando la segunda pregunta solo tiene sentido si la primera se cumple. Pero con tres o cuatro niveles el código se vuelve difícil de seguir. A menudo se puede aplanar con and o con elif:

if usuario != "admin":
    print("Usuario desconocido")
elif clave != "1234":
    print("Clave incorrecta")
else:
    print("Bienvenido, administrador")
# Bienvenido, administrador

Expresión condicional (operador ternario)

Cuando solo necesitas elegir entre dos valores, hay una versión en una línea:

nota = 4
estado = "Aprobado" if nota >= 5 else "Suspenso"
print(estado)
# Suspenso

Se lee casi como una frase: “Aprobado si la nota es mayor o igual que 5; si no, Suspenso”. También se puede usar dentro de una f-string:

unidades = 1
print(f"Tienes {unidades} {'mensaje' if unidades == 1 else 'mensajes'}")
# Tienes 1 mensaje

Úsala solo para casos sencillos. Si necesitas ejecutar varias instrucciones o hay más de dos opciones, un if normal es más legible.

pass: un bloque que no hace nada

Python no permite bloques vacíos. Si todavía no sabes qué poner, o quieres dejar claro que en un caso no se hace nada, usa pass:

stock = 10
if stock > 0:
    pass   # TODO: gestionar la venta
else:
    print("Sin stock")

Sin el pass, obtendrías un IndentationError.

match: elegir entre muchos casos

Desde Python 3.10 existe match, parecido al switch de otros lenguajes pero más potente. Compara un valor con varios patrones y ejecuta el primero que encaje:

opcion = "2"

match opcion:
    case "1":
        print("Ver saldo")
    case "2":
        print("Sacar dinero")
    case "3":
        print("Salir")
    case _:
        print("Opción no válida")
# Sacar dinero
  • case _ es el caso por defecto: encaja con cualquier cosa. Va siempre el último.
  • A diferencia del switch de Java o JavaScript, no hace falta break: solo se ejecuta un caso.

Varios valores en un mismo caso

Con | agrupas valores:

dia = "sábado"

match dia:
    case "sábado" | "domingo":
        print("Fin de semana")
    case "viernes":
        print("Casi fin de semana")
    case _:
        print("Día laborable")
# Fin de semana

Condiciones extra con if (guardas)

Un case puede capturar el valor en una variable y añadir una condición:

temperatura = 32

match temperatura:
    case t if t < 0:
        print("Hiela")
    case t if t < 25:
        print("Agradable")
    case t:
        print(f"Calor: {t} grados")
# Calor: 32 grados

Patrones con secuencias

match puede mirar dentro de una lista y separar sus partes. Muy útil para interpretar órdenes escritas por el usuario:

orden = "mover norte".split()

match orden:
    case ["salir"]:
        print("Hasta luego")
    case ["mover", direccion]:
        print(f"Te mueves hacia el {direccion}")
    case _:
        print("No entiendo la orden")
# Te mueves hacia el norte

El patrón ["mover", direccion] encaja con cualquier lista de dos elementos cuyo primer elemento sea "mover", y guarda el segundo en direccion.

Consejo: para comparar un valor con tres o cuatro opciones, if/elif sigue siendo perfectamente válido. match brilla cuando hay muchos casos o cuando necesitas desmontar estructuras.

Ejemplo completo: precio de una entrada

edad = 70
es_estudiante = False

if edad < 4:
    precio = 0
elif edad < 18 or es_estudiante:
    precio = 5
elif edad >= 65:
    precio = 4
else:
    precio = 9

print(f"Precio: {precio} €")
# Precio: 4 €

Errores frecuentes

  • Olvidar los dos puntos: if edad > 18 da SyntaxError: expected ':'.
  • Usar = en lugar de ==: if edad = 18: da SyntaxError. = asigna; == compara.
  • Sangría incorrecta: si el cuerpo no está sangrado, IndentationError. Si un print queda mal alineado, puede ejecutarse fuera del if sin que te des cuenta.
  • Comparar con or de forma incompleta: if dia == "sábado" or "domingo": es siempre verdadero, porque "domingo" es un texto no vacío (truthy). Escribe if dia in ("sábado", "domingo"):.
  • Comparar números con texto: input devuelve str, así que if edad >= 18 con edad = input(...) da TypeError. Convierte con int().
  • else if: en Python es elif. else if provoca un error de sintaxis o de sangría.

Resumen

EstructuraUso
if cond:Ejecuta el bloque solo si se cumple
else:Alternativa cuando no se cumple
elif cond:Más alternativas; solo se ejecuta la primera verdadera
a <= x <= bComparación encadenada
if lista:Truthy: “si no está vacía”
x if cond else yElegir entre dos valores en una línea
passBloque vacío
match / caseMuchos casos; | agrupa, _ por defecto, if como guarda

En la siguiente lección aprenderás a repetir código con bucles.

Pon a prueba lo que has aprendido

[Python] ¿Qué muestra este código?
dia = "lunes"
if dia == "sábado" or "domingo":
    print("Fin de semana")
else:
    print("Laborable")

[Python] ¿Qué muestra este código?
nota = 9.5
if nota >= 5:
    print("Aprobado")
elif nota >= 9:
    print("Sobresaliente")
else:
    print("Suspenso")

¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.