Decisiones Simples (if/elif/else)

Fig. 7.2: if/else: el escáner desvía cada caja según su peso.
En una cinta transportadora, hay cajas que no pueden seguir el camino normal. Una caja de 25 kg no puede ir por la rampa estándar; necesita un Desviador Automático que la intercepte antes de que cause un problema.
- Si la caja pesa más de 20 kg: desvíala a la rampa de “Pesados”.
- Si no → déjala seguir por la rampa normal.
Python tiene exactamente ese mecanismo. Se llama if y else.
Sintaxis del Desviador
if condicion:
# Camino A (Si es verdad)
accion_verdadera()
else:
# Camino B (Si es falso)
accion_falsa()
¡Ojo!: La indentación (sangría) define qué instrucciones pertenecen a cada camino.
Ejemplo de Control de Calidad
Un sensor mide la temperatura de los productos en tiempo real. Cuando supera el umbral crítico, el almacén necesita reaccionar de inmediato:
temperatura = 35 # Grados Celsius
if temperatura > 40:
print("ALERTA: Producto sobrecalentado")
estado = "Dañado"
else:
print("Temperatura normal")
estado = "Aceptable"
Múltiples Desviadores (elif)
Dos caminos a veces no bastan. Una cinta que clasifica por puntaje de calidad puede tener tres destinos distintos: premium, estándar, o desecho. Para eso existe elif, que encadena condiciones sin anidar bloques.
puntaje = 85
if puntaje >= 90:
clasificacion = "Clase A (Premium)"
elif puntaje >= 70:
clasificacion = "Clase B (Estándar)"
else:
clasificacion = "Clase C (Desecho)"
Python evalúa en orden:
- ¿Es >= 90? No.
- (Pasa al siguiente) ¿Es >= 70? Sí. → Ejecuta esto y salta al final.
- Ignora el
else.
La Verdad de las Cajas (Truthiness)
Hasta aquí las condiciones fueron comparaciones (>, >=). Pero un if acepta cualquier valor, no solo comparaciones. La regla es intuitiva: una caja vacía es falsa, una con algo dentro es verdadera.
Cuentan como falsos: 0, "" (texto vacío), [] (lista vacía), {} (diccionario vacío) y None. Casi todo lo demás es verdadero.
carrito: list = []
if carrito:
print("Hay productos por cobrar")
else:
print("El carrito está vacío")
Antes de correrlo: carrito es una lista vacía, ¿qué rama del if crees que se ejecuta?
Se ejecuta el else: una lista vacía cuenta como falsa, así que la condición if carrito: nunca entra.
Por eso casi nunca escribirás if len(carrito) > 0:. El if carrito: dice lo mismo y se lee mejor. Mismo truco para “¿el usuario escribió algo?” (if nombre:). Una excepción que conviene recordar: para distinguir “no hay dato” de un cero válido, compara contra None explícitamente con if dato is not None:, porque 0 es falso pero puede ser un valor legítimo.
Decisiones Dentro de Decisiones
A veces una decisión depende de otra. Puedes anidar un if dentro de otro:
if tiene_sesion:
if es_admin:
print("Panel de administrador")
else:
print("Panel de usuario")
else:
print("Inicia sesión primero")
Anidar funciona, pero más de dos niveles se vuelve una sangría imposible de seguir. El truco profesional es la cláusula de guarda: resuelve primero los casos que no aplican y sal de inmediato, dejando el camino principal limpio y sin anidar. (Aquí usamos una función con return, que el Capítulo 9 desarma pieza por pieza; fíjate solo en la forma: descartar y salir.)
def cobrar(carrito: list, tiene_dinero: bool) -> str:
if not carrito:
return "Carrito vacío" # caso descartado, salimos ya
if not tiene_dinero:
return "Pago rechazado" # otro descartado, salimos ya
return "Venta completada" # el caso normal, sin anidar
Cada guarda atrapa un problema y se va. Lo que sobra al final es el caso normal, a la izquierda y fácil de leer.