Cuando empiezas a programar, no basta con guardar datos: necesitas decidir qué hacer con ellos y repetir acciones sin escribir lo mismo una y otra vez. Para eso están los condicionales y los bucles. Los condicionales te permiten ejecutar código solo si se cumple una condición; los bucles automatizan repeticiones con una regla clara de fin. Dominar estas estructuras es el paso que convierte "código que funciona" en "código mantenible".
Condicionales: tomar decisiones con if/else
Un condicional evalúa una expresión booleana (verdadero/falso). Si es verdadera, se ejecuta un bloque; si no, otro. Puedes encadenar varias condiciones para cubrir casos más específicos. Mantén tus condiciones simples y con nombres de variables claros para facilitar la lectura.
edad = 18
if edad >= 18:
print("Eres mayor de edad")
elif 13 <= edad < 18:
print("Eres adolescente")
else:
print("Eres menor de edad")
let edad = 18;
if (edad >= 18) {
console.log("Eres mayor de edad");
} else if (edad >= 13) {
console.log("Eres adolescente");
} else {
console.log("Eres menor de edad");
}
switch (TypeScript) y match-case (Python 3.10+)
Usa switch (o match-case en Python moderno) cuando comparas una misma variable contra varios valores. Mejora la legibilidad frente a muchos if/else anidados.
const dia = 3; // 1=Lunes, 7=Domingo
switch (dia) {
case 1:
case 2:
case 3:
case 4:
case 5:
console.log("Día laboral");
break;
case 6:
case 7:
console.log("Fin de semana");
break;
default:
console.log("Valor inválido");
}
estado_http = 404
match estado_http:
case 200:
print("OK")
case 201 | 202:
print("Creado/Aceptado")
case 400 | 404:
print("Error de cliente")
case 500:
print("Error de servidor")
case _:
print("Estado no manejado")
Bucles: repetir sin copiar y pegar
Los bucles ejecutan un bloque múltiples veces. Con for recorres colecciones; con while repites mientras se cumpla una condición. Define siempre una condición de salida clara para evitar ciclos infinitos.
for i in range(5):
print("Iteración", i)
# while: repite hasta que cambie la condición
cuenta_atras = 3
while cuenta_atras > 0:
print(cuenta_atras)
cuenta_atras -= 1
print("¡Despegue!")
// for clásico
for (let i = 0; i < 5; i++) {
console.log("Iteración", i);
}
// while: repite mientras haya elementos en cola
const cola: number[] = [3, 2, 1];
while (cola.length > 0) {
const x = cola.pop();
console.log("Procesando", x);
}
do...while y su equivalente en Python
El bucle do...while (presente en JS/TypeScript) siempre ejecuta el cuerpo al menos una vez antes de verificar la condición. Python no tiene do...while, pero se puede simular con while True y break.
let intentos = 0;
let exito: boolean;
do {
intentos++;
// Simulamos una operación que puede fallar
exito = Math.random() > 0.3; // 70% de éxito (estimación)
console.log(`Intento #${intentos}: ${exito ? "OK" : "Fallo"}`);
} while (!exito && intentos < 3);
console.log(exito ? "Operación completada" : "Se alcanzó el máximo de intentos");
intentos = 0
exito = False
while True: # equivalente a do...while
intentos += 1
# Simulación de éxito 70% (estimación)
import random
exito = random.random() > 0.3
print(f"Intento #{intentos}: {'OK' if exito else 'Fallo'}")
if exito or intentos >= 3:
break
print("Operación completada" if exito else "Se alcanzó el máximo de intentos")
Ejemplo práctico: total del carrito con descuento
Escenario: tienes una lista de productos con precio y cantidad. Recorres el carrito para sumar subtotales y, si el usuario es VIP, aplicas un 10% de descuento (ejemplo). Observa cómo combinamos bucles y condicionales para resolverlo de forma clara.
type Item = { nombre: string; precio: number; cantidad: number };
const carrito: Item[] = [
{ nombre: "Teclado", precio: 30, cantidad: 1 },
{ nombre: "Mouse", precio: 15, cantidad: 2 },
];
const esVIP = true; // condición de negocio
let total = 0;
for (const item of carrito) {
total += item.precio * item.cantidad;
}
if (esVIP) total *= 0.9; // 10% descuento (ejemplo)
console.log("Total a pagar:", total.toFixed(2));
from dataclasses import dataclass
@dataclass
class Item:
nombre: str
precio: float
cantidad: int
carrito = [
Item("Teclado", 30.0, 1),
Item("Mouse", 15.0, 2),
]
es_vip = True
total = 0.0
for it in carrito:
total += it.precio * it.cantidad
if es_vip:
total *= 0.9 # 10% descuento (ejemplo)
print(f"Total a pagar: {total:.2f}")
Buenas prácticas rápidas
- Prefiere nombres de variables que expliquen la intención: esVIP, total, tieneSaldo.
- Evita condiciones complejas en línea; extrae funciones como tieneDescuento(usuario).
- Límites y salidas: usa contadores, topes de intentos y validaciones.
- En switch/match, agrupa casos relacionados y añade un default/_.
- Documenta casos borde: listas vacías, valores nulos, entradas inválidas.
Preguntas frecuentes
¿Cuándo uso if/else y cuándo switch/match?
Si comparas una variable contra varios valores discretos, switch/match ofrece mejor legibilidad y evita cascadas de else if. Si la condición es compuesta (rangos, múltiples variables), if/else es más flexible.
¿En qué casos conviene while frente a for?
Usa for para recorrer colecciones o rangos conocidos. Elige while cuando no sabes cuántas iteraciones necesitas y dependes de una condición dinámica (por ejemplo, leer de una cola hasta vaciarla o reintentar hasta éxito).
¿Cómo evito bucles infinitos y alto consumo de CPU?
Define una condición de salida clara, pon límites máximos (p. ej., intentos < N), cambia el estado dentro del bucle y, si esperas I/O (como red), añade esperas/tiempos de reintento exponencial controlados. Loguea el progreso para depurar.
¿Puedo mezclar condicionales y bucles sin perder legibilidad?
Sí. Divide responsabilidades: el bucle recorre elementos; dentro, usa funciones pequeñas para validar y decidir (esElegible, calcularPrecio). Así reduces anidación y mantienes el flujo claro.
En resumen, condicionales y bucles son piezas esenciales para cualquier programa. Practica con casos reales (validaciones, cálculos por lotes, reintentos) y prioriza siempre la claridad: condiciones simples, salidas controladas y funciones pequeñas que expresen intención. Así tu código será más seguro, fácil de mantener y listo para crecer.