Lección 4 de 29Módulo 1: Fundamentos de Python

04. Estructuras de Control: if, for, while

Aprende a controlar el flujo de tus programas con condicionales y bucles

30 minutos

Aprende a controlar el flujo de tus programas con condicionales y bucles. Estas estructuras son esenciales para cualquier análisis de datos.

Condicionales: if, elif, else

Los condicionales permiten ejecutar código basándose en condiciones:

Estructura básica

# if simple
edad = 25

if edad >= 18:
    print("Eres mayor de edad")
    print("Puedes votar")

if-else

# Decisión binaria
stock = 5

if stock > 0:
    print("Producto disponible")
else:
    print("Producto agotado")

if-elif-else

# Múltiples condiciones
puntuacion = 85

if puntuacion >= 90:
    calificacion = "A - Excelente"
elif puntuacion >= 80:
    calificacion = "B - Muy bien"
elif puntuacion >= 70:
    calificacion = "C - Bien"
elif puntuacion >= 60:
    calificacion = "D - Suficiente"
else:
    calificacion = "F - Insuficiente"

print(f"Calificación: {calificacion}")

Ejemplo práctico: Análisis de campaña

# Datos de campaña
ctr = 3.5
conversion_rate = 4.2
roi = 250

# Análisis multinivel
if roi > 200 and ctr > 3 and conversion_rate > 4:
    estado = "🌟 EXCEPCIONAL"
    accion = "Escalar presupuesto inmediatamente"
elif roi > 100 and ctr > 2:
    estado = "✅ BUENA"
    accion = "Mantener y optimizar"
elif roi > 0:
    estado = "⚠️ REGULAR"
    accion = "Revisar segmentación y creativos"
else:
    estado = "❌ MALA"
    accion = "Pausar y reformular estrategia"

print(f"Estado de campaña: {estado}")
print(f"ROI: {roi}% | CTR: {ctr}% | Conv: {conversion_rate}%")
print(f"Acción recomendada: {accion}")

Resultado:

Estado de campaña: 🌟 EXCEPCIONAL
ROI: 250% | CTR: 3.5% | Conv: 4.2%
Acción recomendada: Escalar presupuesto inmediatamente

Operador ternario (if de una línea)

# Forma larga
edad = 20
if edad >= 18:
    status = "adulto"
else:
    status = "menor"

# Forma corta (ternario)
status = "adulto" if edad >= 18 else "menor"

# Ejemplo práctico
precio = 150
descuento = 0.20 if precio > 100 else 0.10
precio_final = precio * (1 - descuento)
print(f"Precio final: ${precio_final}")  # $120.0

Bucle for

El bucle for itera sobre secuencias (listas, tuplas, strings, rangos):

Iterar sobre listas

# Lista de ventas diarias
ventas = [1200, 1450, 1100, 1800, 1950, 2100, 1750]

# Imprimir cada venta
for venta in ventas:
    print(f"Venta del día: ${venta:,}")

# Con índice usando enumerate()
for dia, venta in enumerate(ventas, start=1):
    print(f"Día {dia}: ${venta:,}")

Usar range()

# range(n) genera números de 0 a n-1
for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# range(inicio, fin)
for i in range(1, 6):
    print(i)  # 1, 2, 3, 4, 5

# range(inicio, fin, paso)
for i in range(0, 11, 2):
    print(i)  # 0, 2, 4, 6, 8, 10

Ejemplo práctico: Análisis de ventas

# Datos de ventas mensuales
ventas_mensuales = {
    "Enero": 45000,
    "Febrero": 52000,
    "Marzo": 48000,
    "Abril": 61000,
    "Mayo": 55000,
    "Junio": 70000
}

# Calcular total y análisis
total_ventas = 0
mejor_mes = ""
mejor_venta = 0

for mes, venta in ventas_mensuales.items():
    total_ventas += venta

    # Determinar mejor mes
    if venta > mejor_venta:
        mejor_venta = venta
        mejor_mes = mes

    # Análisis por mes
    if venta > 60000:
        rendimiento = "⭐ Excelente"
    elif venta > 50000:
        rendimiento = "✅ Bueno"
    else:
        rendimiento = "⚠️ Regular"

    print(f"{mes}: ${venta:,} - {rendimiento}")

promedio = total_ventas / len(ventas_mensuales)

print("\n" + "="*50)
print(f"Total H1 2024: ${total_ventas:,}")
print(f"Promedio mensual: ${promedio:,.2f}")
print(f"Mejor mes: {mejor_mes} (${mejor_venta:,})")

Resultado:

Enero: $45,000 - ⚠️ Regular
Febrero: $52,000 - ✅ Bueno
Marzo: $48,000 - ⚠️ Regular
Abril: $61,000 - ⭐ Excelente
Mayo: $55,000 - ✅ Bueno
Junio: $70,000 - ⭐ Excelente

==================================================
Total H1 2024: $331,000
Promedio mensual: $55,166.67
Mejor mes: Junio ($70,000)

List comprehension (for avanzado)

# Forma tradicional
cuadrados = []
for x in range(1, 6):
    cuadrados.append(x ** 2)
print(cuadrados)  # [1, 4, 9, 16, 25]

# List comprehension (más Pythonic)
cuadrados = [x ** 2 for x in range(1, 6)]
print(cuadrados)  # [1, 4, 9, 16, 25]

# Con condición
pares = [x for x in range(10) if x % 2 == 0]
print(pares)  # [0, 2, 4, 6, 8]

# Ejemplo práctico: filtrar productos
productos = [
    {"nombre": "Laptop", "precio": 800, "stock": 5},
    {"nombre": "Mouse", "precio": 25, "stock": 0},
    {"nombre": "Teclado", "precio": 60, "stock": 8},
    {"nombre": "Monitor", "precio": 300, "stock": 0}
]

# Productos disponibles
disponibles = [p["nombre"] for p in productos if p["stock"] > 0]
print(f"Productos disponibles: {disponibles}")
# ['Laptop', 'Teclado']

# Precios con descuento
precios_descuento = [p["precio"] * 0.9 for p in productos]
print(f"Precios con 10% descuento: {precios_descuento}")

Bucle while

El bucle while se ejecuta mientras una condición sea verdadera:

Estructura básica

# Contador simple
contador = 1

while contador <= 5:
    print(f"Iteración {contador}")
    contador += 1

print("Bucle terminado")

Ejemplo práctico: Validación de entrada

# Simular validación de edad
intentos = 0
max_intentos = 3

while intentos < max_intentos:
    edad_input = "25"  # En producción sería: input("Ingresa tu edad: ")

    try:
        edad = int(edad_input)

        if 18 <= edad <= 120:
            print(f"✅ Edad válida: {edad}")
            break  # Salir del bucle
        else:
            print("⚠️ Edad fuera de rango (18-120)")
    except ValueError:
        print("❌ Error: Ingresa solo números")

    intentos += 1
    print(f"Intentos restantes: {max_intentos - intentos}\n")
else:
    print("❌ Máximo de intentos alcanzado")

Ejemplo: Cálculo de interés compuesto

# Capital inicial
capital_inicial = 10000
tasa_interes = 0.07  # 7% anual
objetivo = 20000
años = 0

capital_actual = capital_inicial

print(f"Capital inicial: ${capital_inicial:,.2f}")
print(f"Tasa de interés: {tasa_interes*100}%")
print(f"Objetivo: ${objetivo:,.2f}\n")

while capital_actual < objetivo:
    años += 1
    interes = capital_actual * tasa_interes
    capital_actual += interes
    print(f"Año {años}: ${capital_actual:,.2f} (interés: ${interes:,.2f})")

print(f"\n✅ Objetivo alcanzado en {años} años")
print(f"Capital final: ${capital_actual:,.2f}")

Resultado:

Capital inicial: $10,000.00
Tasa de interés: 7.0%
Objetivo: $20,000.00

Año 1: $10,700.00 (interés: $700.00)
Año 2: $11,449.00 (interés: $749.00)
Año 3: $12,250.43 (interés: $801.43)
...
Año 10: $19,671.51 (interés: $1,286.92)
Año 11: $21,048.52 (interés: $1,377.01)

✅ Objetivo alcanzado en 11 años
Capital final: $21,048.52

Control de flujo: break, continue, pass

break: Salir del bucle

# Buscar un producto en inventario
productos = ["Laptop", "Mouse", "Teclado", "Monitor", "Tablet"]
buscar = "Teclado"

for producto in productos:
    if producto == buscar:
        print(f"✅ Producto encontrado: {producto}")
        break  # Salir del bucle
    print(f"Buscando... revisando {producto}")
else:
    # Este else se ejecuta si el bucle NO fue interrumpido por break
    print(f"❌ Producto '{buscar}' no encontrado")

continue: Saltar a la siguiente iteración

# Procesar solo ventas válidas
ventas = [1200, -50, 1450, 0, 1800, -100, 1950]

ventas_validas = 0
total = 0

for venta in ventas:
    if venta <= 0:
        print(f"⚠️ Venta inválida ignorada: {venta}")
        continue  # Saltar esta iteración

    ventas_validas += 1
    total += venta
    print(f"✅ Venta procesada: ${venta:,}")

print(f"\nTotal de {ventas_validas} ventas válidas: ${total:,}")

pass: Placeholder (no hace nada)

# Útil durante desarrollo para definir estructura sin implementar
for producto in productos:
    if producto == "Laptop":
        pass  # TODO: implementar lógica especial para laptops
    elif producto == "Mouse":
        print("Procesando mouse...")
    else:
        pass

Bucles anidados

# Análisis de ventas por categoría y región
ventas_por_region = {
    "Norte": {"Electrónica": 50000, "Ropa": 30000, "Alimentos": 20000},
    "Sur": {"Electrónica": 45000, "Ropa": 35000, "Alimentos": 25000},
    "Este": {"Electrónica": 60000, "Ropa": 28000, "Alimentos": 22000}
}

total_general = 0

for region, categorias in ventas_por_region.items():
    print(f"\n{'='*40}")
    print(f"REGIÓN: {region}")
    print(f"{'='*40}")

    total_region = 0

    for categoria, venta in categorias.items():
        total_region += venta
        total_general += venta
        print(f"  {categoria}: ${venta:,}")

    print(f"  ---")
    print(f"  Total {region}: ${total_region:,}")

print(f"\n{'='*40}")
print(f"TOTAL GENERAL: ${total_general:,}")

Proyecto práctico: Analizador de KPIs

# Dashboard de KPIs mensual
kpis = {
    "Enero": {"usuarios": 1000, "conversiones": 45, "ingresos": 4500},
    "Febrero": {"usuarios": 1200, "conversiones": 60, "ingresos": 6000},
    "Marzo": {"usuarios": 1500, "conversiones": 90, "ingresos": 9000},
    "Abril": {"usuarios": 1800, "conversiones": 108, "ingresos": 10800},
}

# Objetivos
OBJETIVO_CONVERSION_RATE = 6.0  # 6%
OBJETIVO_REVENUE_PER_USER = 5.5  # $5.5 por usuario

print("="*60)
print("ANÁLISIS DE KPIs - Q1 2024")
print("="*60)

# Análisis mes por mes
meses_cumpliendo = 0

for mes, metricas in kpis.items():
    usuarios = metricas["usuarios"]
    conversiones = metricas["conversiones"]
    ingresos = metricas["ingresos"]

    # Calcular métricas derivadas
    conversion_rate = (conversiones / usuarios) * 100
    revenue_per_user = ingresos / usuarios

    # Evaluar cumplimiento
    cumple_conversion = conversion_rate >= OBJETIVO_CONVERSION_RATE
    cumple_revenue = revenue_per_user >= OBJETIVO_REVENUE_PER_USER
    cumple_objetivos = cumple_conversion and cumple_revenue

    if cumple_objetivos:
        meses_cumpliendo += 1
        estado = "🎯 CUMPLE"
    else:
        estado = "⚠️ NO CUMPLE"

    print(f"\n{mes}:")
    print(f"  Usuarios: {usuarios:,}")
    print(f"  Conversiones: {conversiones}")
    print(f"  Ingresos: ${ingresos:,}")
    print(f"  Conversion Rate: {conversion_rate:.2f}% (Objetivo: {OBJETIVO_CONVERSION_RATE}%)")
    print(f"  Revenue/User: ${revenue_per_user:.2f} (Objetivo: ${OBJETIVO_REVENUE_PER_USER})")
    print(f"  Estado: {estado}")

    # Recomendaciones específicas
    if not cumple_conversion:
        print(f"  📌 Acción: Mejorar embudo de conversión")
    if not cumple_revenue:
        print(f"  📌 Acción: Aumentar ticket promedio")

# Resumen ejecutivo
print("\n" + "="*60)
print("RESUMEN EJECUTIVO")
print("="*60)
print(f"Meses cumpliendo objetivos: {meses_cumpliendo}/{len(kpis)}")
cumplimiento_porcentaje = (meses_cumpliendo / len(kpis)) * 100
print(f"Tasa de cumplimiento: {cumplimiento_porcentaje:.1f}%")

if cumplimiento_porcentaje >= 75:
    print("✅ Rendimiento trimestral EXCELENTE")
elif cumplimiento_porcentaje >= 50:
    print("⚠️ Rendimiento trimestral REGULAR - Requiere mejoras")
else:
    print("❌ Rendimiento trimestral BAJO - Acción inmediata requerida")

Buenas prácticas

1. Usar nombres descriptivos en bucles

Mal:

for i in lista:
    print(i)

Bien:

for producto in productos:
    print(producto)

for usuario in usuarios_activos:
    enviar_email(usuario)

2. Evitar bucles innecesarios

Mal:

total = 0
for venta in ventas:
    total += venta

Bien:

total = sum(ventas)

3. Usar else en bucles cuando sea apropiado

# Buscar elemento
for item in lista:
    if item == objetivo:
        print("Encontrado!")
        break
else:
    print("No encontrado")  # Solo se ejecuta si NO hubo break

Resumen de la lección

✅ Los condicionales (if/elif/else) controlan qué código se ejecuta ✅ El bucle for itera sobre secuencias y es ideal para analizar listas de datos ✅ El bucle while se ejecuta mientras una condición sea verdadera ✅ break sale del bucle, continue salta a la siguiente iteración ✅ List comprehension es una forma elegante de crear listas con for ✅ Los bucles anidados permiten análisis multidimensionales


🎯 Próxima lección: 05. Funciones y Módulos

En la siguiente lección aprenderás a crear funciones reutilizables y organizar tu código profesionalmente. 🚀

¿Completaste esta lección?

Marca esta lección como completada. Tu progreso se guardará en tu navegador.