Las estructuras if, elif y else permiten que un programa tome decisiones. En lugar de ejecutar siempre las mismas instrucciones, Python puede comparar valores, validar datos, elegir una acción y responder de manera diferente según cada situación. Comprender estas estructuras es esencial para menús, formularios, juegos, APIs, automatizaciones y reglas de negocio.
Antes de empezar, conviene repasar booleanos, operadores, input(), funciones y manejo de excepciones. También puedes consultar el tutorial oficial sobre if y la referencia oficial de sentencias condicionales.
La estructura básica
edad = 20
if edad >= 18:
print("Eres mayor de edad")
La expresión edad >= 18 produce True o False. El bloque indentado solo se ejecuta cuando el resultado es verdadero.
Añadir else
edad = 16
if edad >= 18:
print("Acceso permitido")
else:
print("Acceso denegado")
else no necesita condición. Representa todos los casos que no cumplieron el if.
Usar elif
nota = 7.5
if nota >= 9:
resultado = "Excelente"
elif nota >= 7:
resultado = "Aprobado"
elif nota >= 5:
resultado = "Suficiente"
else:
resultado = "Suspenso"
print(resultado)
Python evalúa de arriba hacia abajo y ejecuta el primer bloque verdadero. Después omite los demás. El orden es importante: primero deben aparecer las condiciones más específicas o exigentes.
Un error de orden
# Incorrecto
if nota >= 5:
print("Aprobado")
elif nota >= 9:
print("Excelente")
Una nota de diez cumple la primera condición y nunca alcanza el elif. Debes comprobar primero nota >= 9.
Comparaciones
temperatura = 25
if temperatura == 25:
print("Exactamente 25")
if temperatura != 0:
print("No es cero")
if temperatura < 30:
print("Menor que 30")
Los operadores principales son ==, !=, <, <=, > y >=. No confundas =, que asigna, con ==, que compara.
Operadores lógicos
edad = 25
tiene_documento = True
if edad >= 18 and tiene_documento:
print("Puede registrarse")
and exige que ambas condiciones sean verdaderas. or necesita al menos una. not invierte el valor.
es_admin = False
es_editor = True
if es_admin or es_editor:
print("Puede editar")
if not es_admin:
print("No tiene permisos de administrador")
Cortocircuito
Python deja de evaluar cuando ya conoce el resultado:
usuario = None
if usuario is not None and usuario["activo"]:
print("Usuario activo")
Si usuario es None, la segunda parte no se ejecuta. El orden protege el acceso.
Valores truthy y falsy
Python interpreta algunos valores como falsos: False, None, cero y colecciones vacías.
nombre = input("Nombre: ").strip()
if nombre:
print(f"Hola, {nombre}")
else:
print("No escribiste un nombre")
Esta forma es clara cuando solo interesa saber si hay contenido. Si necesitas distinguir entre None, cero y cadena vacía, compara explícitamente.
Comprobar pertenencia
rol = "editor"
roles_permitidos = {"admin", "editor"}
if rol in roles_permitidos:
print("Acceso permitido")
in funciona con strings, listas, tuplas, sets, diccionarios y otros iterables. En diccionarios comprueba claves.
Rangos
edad = 30
if 18 <= edad <= 65:
print("Dentro del rango")
Python permite encadenar comparaciones. Es más legible que repetir la variable con and.
Condiciones anidadas
usuario_activo = True
rol = "editor"
if usuario_activo:
if rol == "admin":
print("Panel completo")
else:
print("Panel limitado")
else:
print("Cuenta desactivada")
La anidación puede ser útil, pero demasiados niveles dificultan la lectura. Puedes combinar condiciones o usar retornos tempranos dentro de funciones.
Retornos tempranos
def puede_comprar(usuario, total):
if usuario is None:
return False
if not usuario.get("activo"):
return False
if total <= 0:
return False
return True
Este patrón evita un bloque muy profundo y deja claras las causas de rechazo.
Validar entrada
texto = input("Edad: ").strip()
try:
edad = int(texto)
except ValueError:
print("Debes escribir un entero")
else:
if edad < 0:
print("La edad no puede ser negativa")
elif edad < 18:
print("Menor de edad")
else:
print("Mayor de edad")
if no sustituye a las excepciones cuando una conversión puede fallar.
Menús
print("1. Crear")
print("2. Buscar")
print("0. Salir")
opcion = input("Opción: ").strip()
if opcion == "1":
print("Creando")
elif opcion == "2":
print("Buscando")
elif opcion == "0":
print("Saliendo")
else:
print("Opción desconocida")
En un menú pequeño, if/elif es apropiado. En un sistema grande, un diccionario de funciones o match-case puede resultar más mantenible.
Comparar strings
respuesta = input("¿Continuar? ").strip().lower()
if respuesta in {"s", "si", "sí"}:
print("Continuando")
elif respuesta == "n":
print("Cancelado")
else:
print("Respuesta inválida")
Normalizar con strip y lower reduce diferencias accidentales.
Comparar floats
Evita depender de igualdad exacta después de cálculos:
import math
resultado = 0.1 + 0.2
if math.isclose(resultado, 0.3):
print("Son suficientemente cercanos")
Los floats usan representación binaria y pueden contener pequeñas diferencias.
Identidad frente a igualdad
resultado = None
if resultado is None:
print("No hay resultado")
Usa is None y is not None. Para comparar valores normales utiliza ==.
Operador condicional
estado = "adulto" if edad >= 18 else "menor"
Es útil para una asignación sencilla. Evita anidarlo o incluir lógica compleja porque reduce la legibilidad.
Condiciones dentro de listas
numeros = [1, 2, 3, 4, 5]
pares = [numero for numero in numeros if numero % 2 == 0]
Aquí el if filtra elementos. Una comprensión no debe contener una lógica difícil de explicar.
Reglas de negocio
def calcular_envio(total, es_premium, zona):
if total < 0:
raise ValueError("Total inválido")
if es_premium or total >= 100:
return 0
if zona == "internacional":
return 20
return 5
El orden expresa prioridades: primero validación, después envío gratuito y finalmente tarifas.
Pruebas
def test_envio_gratuito_por_total():
assert calcular_envio(120, False, "local") == 0
def test_envio_premium():
assert calcular_envio(20, True, "local") == 0
def test_envio_internacional():
assert calcular_envio(20, False, "internacional") == 20
Prueba cada rama, incluidos límites exactos como 99.99 y 100.
Errores frecuentes
Los problemas habituales son usar = en vez de ==, ordenar mal los elif, olvidar la indentación, comparar floats exactamente, escribir condiciones siempre verdaderas y mezclar and y or sin paréntesis claros.
# Incorrecto
if rol == "admin" or "editor":
print("Siempre se ejecuta")
# Correcto
if rol == "admin" or rol == "editor":
print("Rol permitido")
La cadena "editor" por sí sola es verdadera.
Evitar condiciones demasiado largas
Extrae reglas con nombres descriptivos:
es_mayor = edad >= 18
tiene_acceso = rol in roles_permitidos
cuenta_valida = activo and not bloqueado
if es_mayor and tiene_acceso and cuenta_valida:
print("Acceso concedido")
Los nombres convierten una expresión técnica en una explicación.
Cuándo usar match-case
match-case puede ser conveniente para analizar estructuras o muchos valores discretos. Para rangos, comparaciones y condiciones booleanas, if/elif/else suele ser más natural.
Conclusión
if, elif y else controlan las decisiones de un programa. Ordena las condiciones desde las más específicas, combina operadores lógicos con claridad y valida entradas antes de aplicar reglas. Reduce la anidación mediante funciones y retornos tempranos, prueba todas las ramas y evita expresiones ambiguas. Una condición bien escrita debe explicar con claridad cuándo ocurre cada acción.






