Saltar al contenido
Numerus Scriptum por Edison Achalma

Bucles e iteraciones en Python

For, while, comprehensions y técnicas de iteración eficiente sobre secuencias y contenedores en Python.

50 min de lectura PDF de esta lección(118 KB) DOCX (49 KB)

En esta quinta guía exploraremos las iteraciones, una de las herramientas más poderosas de la programación. Las iteraciones nos permiten procesar grandes cantidades de datos económicos de manera automatizada y eficiente.

1 Actualización de variables

La actualización de variables es fundamental en iteraciones. Consiste en modificar el valor de una variable usando su valor previo.

1.1 Operadores de actualización

python
# Inicializar contador
contador = 0
print(f"Valor inicial: {contador}")

# Incrementar
contador = contador + 1
print(f"Después de +1: {contador}")

# Forma abreviada (más común)
contador += 1
print(f"Después de +=1: {contador}")

# Decrementar
contador -= 1
print(f"Después de -=1: {contador}")

# Multiplicar
contador *= 2
print(f"Después de *=2: {contador}")

# Dividir
contador /= 2
print(f"Después de /=2: {contador}")

# Potencia
contador **= 2
print(f"Después de **=2: {contador}")
Valor inicial: 0
Después de +1: 1
Después de +=1: 2
Después de -=1: 1
Después de *=2: 2
Después de /=2: 1.0
Después de **=2: 1.0

1.2 Aplicaciones económicas

python
# Ejemplo 1: Acumular ventas diarias
ventas_total = 0
ventas_diarias = [1200, 1350, 980, 1500, 1100]

for venta in ventas_diarias:
    ventas_total += venta

print(f"Ventas totales: S/ {ventas_total:,.2f}")

# Ejemplo 2: Calcular interés compuesto
capital = 10000
tasa_anual = 0.08
anos = 5

for ano in range(anos):
    interes = capital * tasa_anual
    capital += interes
    print(f"Año {ano + 1}: S/ {capital:,.2f}")

print(f"\nCapital final: S/ {capital:,.2f}")

# Ejemplo 3: Contador de transacciones por tipo
num_compras = 0
num_ventas = 0
num_transferencias = 0

transacciones = ['compra', 'venta', 'compra', 'transferencia', 'venta', 'compra']

for tipo in transacciones:
    if tipo == 'compra':
        num_compras += 1
    elif tipo == 'venta':
        num_ventas += 1
    elif tipo == 'transferencia':
        num_transferencias += 1

print(f"Compras: {num_compras}")
print(f"Ventas: {num_ventas}")
print(f"Transferencias: {num_transferencias}")
Ventas totales: S/ 6,130.00
Año 1: S/ 10,800.00
Año 2: S/ 11,664.00
Año 3: S/ 12,597.12
Año 4: S/ 13,604.89
Año 5: S/ 14,693.28

Capital final: S/ 14,693.28
Compras: 3
Ventas: 2
Transferencias: 1

2 Bucles definidos con for

Los bucles for permiten iterar sobre una secuencia de elementos un número determinado de veces.

2.1 Función range()

python
# range(stop): de 0 hasta stop-1
print("range(5):")
for i in range(5):
    print(i)

# range(start, stop): de start hasta stop-1
print("\nrange(2, 7):")
for i in range(2, 7):
    print(i)

# range(start, stop, step): de start hasta stop-1 con paso
print("\nrange(0, 10, 2):")
for i in range(0, 10, 2):
    print(i)

# Paso negativo
print("\nrange(10, 0, -1):")
for i in range(10, 0, -1):
    print(i)
range(5):
0
1
2
3
4

range(2, 7):
2
3
4
5
6

range(0, 10, 2):
0
2
4
6
8

range(10, 0, -1):
10
9
8
7
6
5
4
3
2
1

2.2 Aplicaciones económicas básicas

python
# Ejemplo 1: Generar serie de años
print("Proyección económica 2024-2033:")
for ano in range(2024, 2034):
    print(f"Año {ano}")

# Ejemplo 2: Calcular tabla de amortización simplificada
print("\nTabla de amortización (primeros 5 años):")
prestamo = 100000
tasa_mensual = 0.01
cuota = 2000

for mes in range(1, 61):
    interes = prestamo * tasa_mensual
    amortizacion = cuota - interes
    prestamo -= amortizacion
    
    if mes % 12 == 0:
        print(f"Año {mes//12}: Saldo restante S/ {prestamo:,.2f}")

# Ejemplo 3: Simulación de inversión mensual
print("\nSimulación de ahorro mensual:")
ahorro = 0
aporte_mensual = 500

for mes in range(1, 13):
    ahorro += aporte_mensual
    print(f"Mes {mes:2d}: S/ {ahorro:,.2f}")

print(f"\nAhorro anual: S/ {ahorro:,.2f}")
Proyección económica 2024-2033:
Año 2024
Año 2025
Año 2026
Año 2027
Año 2028
Año 2029
Año 2030
Año 2031
Año 2032
Año 2033

Tabla de amortización (primeros 5 años):
Año 1: Saldo restante S/ 87,317.50
Año 2: Saldo restante S/ 73,026.54
Año 3: Saldo restante S/ 56,923.12
Año 4: Saldo restante S/ 38,777.39
Año 5: Saldo restante S/ 18,330.33

Simulación de ahorro mensual:
Mes  1: S/ 500.00
Mes  2: S/ 1,000.00
Mes  3: S/ 1,500.00
Mes  4: S/ 2,000.00
Mes  5: S/ 2,500.00
Mes  6: S/ 3,000.00
Mes  7: S/ 3,500.00
Mes  8: S/ 4,000.00
Mes  9: S/ 4,500.00
Mes 10: S/ 5,000.00
Mes 11: S/ 5,500.00
Mes 12: S/ 6,000.00

Ahorro anual: S/ 6,000.00

3 Iteración sobre colecciones

Los bucles for pueden iterar directamente sobre listas, tuplas, diccionarios y otros objetos iterables.

3.1 Iterar sobre listas

python
# Lista de sectores económicos
sectores = ['Agricultura', 'Minería', 'Manufactura', 'Servicios', 'Construcción']

print("Sectores económicos:")
for sector in sectores:
    print(f"  - {sector}")

# Con índice usando enumerate()
print("\nSectores con índice:")
for i, sector in enumerate(sectores):
    print(f"{i + 1}. {sector}")

# Desde índice específico
print("\nDesde el segundo sector:")
for i, sector in enumerate(sectores, start=1):
    print(f"{i}. {sector}")
Sectores económicos:
  - Agricultura
  - Minería
  - Manufactura
  - Servicios
  - Construcción

Sectores con índice:
1. Agricultura
2. Minería
3. Manufactura
4. Servicios
5. Construcción

Desde el segundo sector:
1. Agricultura
2. Minería
3. Manufactura
4. Servicios
5. Construcción

3.2 Iterar sobre tuplas

python
# Tupla de indicadores
indicadores = ('PIB', 'Inflación', 'Desempleo', 'Tipo de cambio')

print("Indicadores macroeconómicos:")
for indicador in indicadores:
    print(f"  {indicador}")
Indicadores macroeconómicos:
  PIB
  Inflación
  Desempleo
  Tipo de cambio

3.3 Iterar sobre diccionarios

python
# Diccionario de datos económicos
datos_peru = {
    'pib': 242632,
    'poblacion': 33715471,
    'inflacion': 3.5,
    'desempleo': 7.2
}

# Iterar sobre claves
print("Claves:")
for clave in datos_peru.keys():
    print(f"  {clave}")

# Iterar sobre valores
print("\nValores:")
for valor in datos_peru.values():
    print(f"  {valor}")

# Iterar sobre items (clave-valor)
print("\nIndicadores del Perú:")
for indicador, valor in datos_peru.items():
    print(f"  {indicador}: {valor}")

# Formato mejorado
print("\nReporte económico:")
for indicador, valor in datos_peru.items():
    if indicador == 'pib':
        print(f"  PIB: USD {valor:,} millones")
    elif indicador == 'poblacion':
        print(f"  Población: {valor:,} habitantes")
    elif indicador in ['inflacion', 'desempleo']:
        print(f"  {indicador.capitalize()}: {valor}%")
Claves:
  pib
  poblacion
  inflacion
  desempleo

Valores:
  242632
  33715471
  3.5
  7.2

Indicadores del Perú:
  pib: 242632
  poblacion: 33715471
  inflacion: 3.5
  desempleo: 7.2

Reporte económico:
  PIB: USD 242,632 millones
  Población: 33,715,471 habitantes
  Inflacion: 3.5%
  Desempleo: 7.2%

3.4 Iterar sobre strings

python
# Strings son iterables
codigo = "CIIU-2023"

print("Caracteres del código:")
for caracter in codigo:
    print(caracter)

# Aplicación: validar formato
letras = 0
numeros = 0
otros = 0

for caracter in codigo:
    if caracter.isalpha():
        letras += 1
    elif caracter.isdigit():
        numeros += 1
    else:
        otros += 1

print(f"\nAnálisis del código '{codigo}':")
print(f"  Letras: {letras}")
print(f"  Números: {numeros}")
print(f"  Otros: {otros}")
Caracteres del código:
C
I
I
U
-
2
0
2
3

Análisis del código 'CIIU-2023':
  Letras: 4
  Números: 4
  Otros: 1

4 List comprehension

Las list comprehensions son una forma concisa y elegante de crear listas. Son más eficientes y legibles que los bucles tradicionales.

4.1 Sintaxis básica

python
# Forma tradicional con for
cuadrados_for = []
for i in range(10):
    cuadrados_for.append(i ** 2)

print(f"Con for: {cuadrados_for}")

# Con list comprehension
cuadrados_lc = [i ** 2 for i in range(10)]
print(f"Con LC:  {cuadrados_lc}")

# Más ejemplos
# Generar lista de años
anos = [2020 + i for i in range(10)]
print(f"\nAños: {anos}")

# Convertir a strings
anos_str = [str(ano) for ano in anos]
print(f"Años (str): {anos_str}")

# Operaciones con elementos
precios = [100, 120, 150, 80, 95]
precios_con_igv = [precio * 1.18 for precio in precios]
print(f"\nPrecios sin IGV: {precios}")
print(f"Precios con IGV: {precios_con_igv}")
Con for: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Con LC:  [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Años: [2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029]
Años (str): ['2020', '2021', '2022', '2023', '2024', '2025', '2026', '2027', '2028', '2029']

Precios sin IGV: [100, 120, 150, 80, 95]
Precios con IGV: [118.0, 141.6, 177.0, 94.39999999999999, 112.1]

4.2 List comprehension con condicionales

python
# Sintaxis: [expresion for item in iterable if condicion]

# Filtrar números pares
numeros = list(range(20))
pares = [n for n in numeros if n % 2 == 0]
print(f"Pares: {pares}")

# Filtrar impares
impares = [n for n in numeros if n % 2 != 0]
print(f"Impares: {impares}")

# Múltiplos de 3
multiplos_3 = [n for n in numeros if n % 3 == 0]
print(f"Múltiplos de 3: {multiplos_3}")

# Múltiplos de 2 o 3
multiplos_2_o_3 = [n for n in numeros if n % 2 == 0 or n % 3 == 0]
print(f"Múltiplos de 2 o 3: {multiplos_2_o_3}")
Pares: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Impares: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Múltiplos de 3: [0, 3, 6, 9, 12, 15, 18]
Múltiplos de 2 o 3: [0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18]

4.3 Aplicaciones económicas

python
# Ejemplo 1: Filtrar datos económicos
pib_regional = [100000, 50000, 75000, 30000, 45000, 85000, 60000]

# Regiones con PIB > 50000
grandes_economias = [pib for pib in pib_regional if pib > 50000]
print(f"Grandes economías: {grandes_economias}")

# Ejemplo 2: Calcular variaciones porcentuales
precios_2022 = [100, 105, 110, 108, 112]
precios_2023 = [105, 110, 115, 112, 118]

variaciones = [((p2 - p1) / p1) * 100 
               for p1, p2 in zip(precios_2022, precios_2023)]

print(f"\nVariaciones de precios:")
for i, var in enumerate(variaciones, 1):
    print(f"  Producto {i}: {var:+.2f}%")

# Ejemplo 3: Clasificar empresas por tamaño
ventas = [500000, 2000000, 15000000, 800000, 25000000, 1200000]

clasificacion = ['Pequeña' if v < 1000000 
                 else 'Mediana' if v < 10000000 
                 else 'Grande' 
                 for v in ventas]

print(f"\nClasificación de empresas:")
for i, (venta, cat) in enumerate(zip(ventas, clasificacion), 1):
    print(f"  Empresa {i}: S/ {venta:,} - {cat}")
Grandes economías: [100000, 75000, 85000, 60000]

Variaciones de precios:
  Producto 1: +5.00%
  Producto 2: +4.76%
  Producto 3: +4.55%
  Producto 4: +3.70%
  Producto 5: +5.36%

Clasificación de empresas:
  Empresa 1: S/ 500,000 - Pequeña
  Empresa 2: S/ 2,000,000 - Mediana
  Empresa 3: S/ 15,000,000 - Grande
  Empresa 4: S/ 800,000 - Pequeña
  Empresa 5: S/ 25,000,000 - Grande
  Empresa 6: S/ 1,200,000 - Mediana

4.4 Comprehensions anidadas

python
# Crear matriz
matriz = [[i * j for j in range(5)] for i in range(5)]

print("Matriz de multiplicación:")
for fila in matriz:
    print(fila)

# Aplanar lista de listas
lista_anidada = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
lista_plana = [num for sublista in lista_anidada for num in sublista]
print(f"\nLista anidada: {lista_anidada}")
print(f"Lista plana: {lista_plana}")
Matriz de multiplicación:
[0, 0, 0, 0, 0]
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8]
[0, 3, 6, 9, 12]
[0, 4, 8, 12, 16]

Lista anidada: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Lista plana: [1, 2, 3, 4, 5, 6, 7, 8, 9]

4.5 Dictionary comprehension

python
# Crear diccionarios con comprehension
# Sintaxis: {clave: valor for item in iterable}

# Ejemplo 1: Cuadrados
cuadrados_dict = {x: x**2 for x in range(6)}
print(f"Cuadrados: {cuadrados_dict}")

# Ejemplo 2: Mapeo de códigos
productos = ['A', 'B', 'C', 'D', 'E']
precios = [10, 15, 20, 25, 30]

catalogo = {prod: precio for prod, precio in zip(productos, precios)}
print(f"\nCatálogo: {catalogo}")

# Ejemplo 3: Filtrar diccionario
datos_economicos = {
    'pib': 242632,
    'poblacion': 33715471,
    'inflacion': 3.5,
    'desempleo': 7.2,
    'reservas': 74500
}

# Solo valores mayores a 100
grandes_valores = {k: v for k, v in datos_economicos.items() if v > 100}
print(f"\nGrandes valores: {grandes_valores}")
Cuadrados: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Catálogo: {'A': 10, 'B': 15, 'C': 20, 'D': 25, 'E': 30}

Grandes valores: {'pib': 242632, 'poblacion': 33715471, 'reservas': 74500}

5 Iteración con condicionales

Combinar iteraciones con condicionales permite procesar datos de manera selectiva.

5.1 Filtrado durante iteración

python
# Datos de transacciones
transacciones = [
    {'monto': 1500, 'tipo': 'ingreso'},
    {'monto': 800, 'tipo': 'gasto'},
    {'monto': 2000, 'tipo': 'ingreso'},
    {'monto': 500, 'tipo': 'gasto'},
    {'monto': 1200, 'tipo': 'ingreso'},
]

# Separar por tipo
ingresos = []
gastos = []

for trans in transacciones:
    if trans['tipo'] == 'ingreso':
        ingresos.append(trans['monto'])
    else:
        gastos.append(trans['monto'])

print(f"Ingresos: S/ {sum(ingresos):,.2f}")
print(f"Gastos: S/ {sum(gastos):,.2f}")
print(f"Balance: S/ {sum(ingresos) - sum(gastos):,.2f}")

# Con list comprehension
ingresos_lc = [t['monto'] for t in transacciones if t['tipo'] == 'ingreso']
gastos_lc = [t['monto'] for t in transacciones if t['tipo'] == 'gasto']

print(f"\nCon LC:")
print(f"Ingresos: S/ {sum(ingresos_lc):,.2f}")
print(f"Gastos: S/ {sum(gastos_lc):,.2f}")
Ingresos: S/ 4,700.00
Gastos: S/ 1,300.00
Balance: S/ 3,400.00

Con LC:
Ingresos: S/ 4,700.00
Gastos: S/ 1,300.00

5.2 Transformación condicional

python
# Clasificar trabajadores por género según nombre
nombres = ['María', 'Juan', 'Carmen', 'Pedro', 'Rosa', 'Carlos', 'Ana', 'Miguel']

trabajadores = []
for nombre in nombres:
    if nombre[-1] == 'a':
        trabajadores.append(f"Trabajadora: {nombre}")
    else:
        trabajadores.append(f"Trabajador: {nombre}")

print("Lista de trabajadores:")
for trabajador in trabajadores:
    print(f"  {trabajador}")

# Con list comprehension
trabajadores_lc = [f"Trabajador{'a' if nombre[-1] == 'a' else ''}: {nombre}" 
                   for nombre in nombres]

print("\nCon LC:")
for trabajador in trabajadores_lc:
    print(f"  {trabajador}")
Lista de trabajadores:
  Trabajadora: María
  Trabajador: Juan
  Trabajador: Carmen
  Trabajador: Pedro
  Trabajadora: Rosa
  Trabajador: Carlos
  Trabajadora: Ana
  Trabajador: Miguel

Con LC:
  Trabajadora: María
  Trabajador: Juan
  Trabajador: Carmen
  Trabajador: Pedro
  Trabajadora: Rosa
  Trabajador: Carlos
  Trabajadora: Ana
  Trabajador: Miguel

5.3 Múltiples condiciones

python
# Clasificar números por propiedades
numeros = list(range(1, 21))

pares = []
impares = []
multiplos_3 = []
multiplos_5 = []

for n in numeros:
    if n % 2 == 0:
        pares.append(n)
    else:
        impares.append(n)
    
    if n % 3 == 0:
        multiplos_3.append(n)
    
    if n % 5 == 0:
        multiplos_5.append(n)

print(f"Pares: {pares}")
print(f"Impares: {impares}")
print(f"Múltiplos de 3: {multiplos_3}")
print(f"Múltiplos de 5: {multiplos_5}")
Pares: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Impares: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Múltiplos de 3: [3, 6, 9, 12, 15, 18]
Múltiplos de 5: [5, 10, 15, 20]

6 Iteración múltiple y paralela

La función zip() permite iterar sobre múltiples secuencias en paralelo.

6.1 Función zip()

python
# Listas paralelas
paises = ['Perú', 'Chile', 'Argentina', 'Colombia']
pib = [242632, 301000, 487000, 314000]
poblacion = [33715471, 19493184, 45810000, 51516562]

# Iterar en paralelo
print("Datos económicos de países:")
for pais, pib_val, pob in zip(paises, pib, poblacion):
    pib_pc = (pib_val / pob) * 1000000
    print(f"{pais:12} - PIB: USD {pib_val:,} M - Pob: {pob:,} - PIB/c: USD {pib_pc:,.0f}")
Datos económicos de países:
Perú         - PIB: USD 242,632 M - Pob: 33,715,471 - PIB/c: USD 7,196
Chile        - PIB: USD 301,000 M - Pob: 19,493,184 - PIB/c: USD 15,441
Argentina    - PIB: USD 487,000 M - Pob: 45,810,000 - PIB/c: USD 10,631
Colombia     - PIB: USD 314,000 M - Pob: 51,516,562 - PIB/c: USD 6,095

6.2 Aplicaciones económicas

python
# Ejemplo 1: Análisis de series de tiempo
meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun']
ventas = [45000, 52000, 48000, 55000, 60000, 58000]
costos = [30000, 35000, 32000, 37000, 40000, 39000]

print("Análisis mensual de rentabilidad:")
print(f"{'Mes':<5} {'Ventas':>10} {'Costos':>10} {'Utilidad':>10} {'Margen':>8}")
print("-" * 50)

for mes, venta, costo in zip(meses, ventas, costos):
    utilidad = venta - costo
    margen = (utilidad / venta) * 100
    print(f"{mes:<5} {venta:>10,} {costo:>10,} {utilidad:>10,} {margen:>7.1f}%")

# Ejemplo 2: Comparar presupuesto vs real
categorias = ['Salarios', 'Alquiler', 'Servicios', 'Marketing', 'Otros']
presupuestado = [80000, 15000, 8000, 12000, 5000]
gastado = [85000, 15000, 7500, 14000, 4800]

print("\n\nAnálisis de ejecución presupuestaria:")
print(f"{'Categoría':<12} {'Presup.':>10} {'Gastado':>10} {'Dif.':>10} {'%':>6}")
print("-" * 55)

for cat, pres, gasto in zip(categorias, presupuestado, gastado):
    diferencia = gasto - pres
    porcentaje = (gasto / pres) * 100
    signo = "+" if diferencia > 0 else ""
    print(f"{cat:<12} {pres:>10,} {gasto:>10,} {signo}{diferencia:>9,} {porcentaje:>5.1f}%")
Análisis mensual de rentabilidad:
Mes       Ventas     Costos   Utilidad   Margen
--------------------------------------------------
Ene       45,000     30,000     15,000    33.3%
Feb       52,000     35,000     17,000    32.7%
Mar       48,000     32,000     16,000    33.3%
Abr       55,000     37,000     18,000    32.7%
May       60,000     40,000     20,000    33.3%
Jun       58,000     39,000     19,000    32.8%


Análisis de ejecución presupuestaria:
Categoría       Presup.    Gastado       Dif.      %
-------------------------------------------------------
Salarios         80,000     85,000 +    5,000 106.2%
Alquiler         15,000     15,000         0 100.0%
Servicios         8,000      7,500      -500  93.8%
Marketing        12,000     14,000 +    2,000 116.7%
Otros             5,000      4,800      -200  96.0%

6.3 Crear diccionarios con zip()

python
# Crear diccionario desde dos listas
productos = ['Laptop', 'Mouse', 'Teclado', 'Monitor']
precios = [2500, 25, 80, 800]

catalogo = dict(zip(productos, precios))
print(f"Catálogo: {catalogo}")

# Acceder
print(f"\nPrecio de Laptop: S/ {catalogo['Laptop']:,.2f}")
Catálogo: {'Laptop': 2500, 'Mouse': 25, 'Teclado': 80, 'Monitor': 800}

Precio de Laptop: S/ 2,500.00

7 Iteraciones anidadas

Las iteraciones anidadas permiten trabajar con estructuras de datos multidimensionales.

7.1 Matrices y tablas

python
# Crear matriz de ceros
filas = 3
columnas = 4

matriz = []
for i in range(filas):
    fila = []
    for j in range(columnas):
        fila.append(0)
    matriz.append(fila)

print("Matriz de ceros:")
for fila in matriz:
    print(fila)

# Con list comprehension
matriz_lc = [[0 for j in range(columnas)] for i in range(filas)]

print("\nCon LC:")
for fila in matriz_lc:
    print(fila)
Matriz de ceros:
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]

Con LC:
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]

7.2 Aplicaciones económicas

python
# Ejemplo 1: Tabla de multiplicación (escalas de producción)
print("Tabla de costos de producción:")
print("     ", end="")
for cantidad in range(1, 6):
    print(f"{cantidad*10:>6}", end="")
print()

for precio in range(1, 6):
    print(f"{precio*100:>5}", end=" ")
    for cantidad in range(1, 6):
        costo = precio * 100 * cantidad * 10
        print(f"{costo:>6}", end="")
    print()

# Ejemplo 2: Análisis regional-sectorial
regiones = ['Lima', 'Arequipa', 'Cusco']
sectores = ['Agricultura', 'Minería', 'Manufactura']

# Datos de PIB por región y sector (millones)
pib_regional_sectorial = [
    [5000, 15000, 30000],  # Lima
    [8000, 12000, 5000],   # Arequipa
    [6000, 8000, 3000]     # Cusco
]

print("\n\nPIB por región y sector (millones USD):")
print(f"{'Región':<12}", end="")
for sector in sectores:
    print(f"{sector:>15}", end="")
print(f"{'Total':>15}")
print("-" * 70)

for i, region in enumerate(regiones):
    print(f"{region:<12}", end="")
    total_region = 0
    for j, sector in enumerate(sectores):
        valor = pib_regional_sectorial[i][j]
        print(f"{valor:>15,}", end="")
        total_region += valor
    print(f"{total_region:>15,}")

# Totales por sector
print(f"{'Total':<12}", end="")
total_general = 0
for j in range(len(sectores)):
    total_sector = sum(pib_regional_sectorial[i][j] for i in range(len(regiones)))
    print(f"{total_sector:>15,}", end="")
    total_general += total_sector
print(f"{total_general:>15,}")
Tabla de costos de producción:
         10    20    30    40    50
  100   1000  2000  3000  4000  5000
  200   2000  4000  6000  8000 10000
  300   3000  6000  9000 12000 15000
  400   4000  8000 12000 16000 20000
  500   5000 10000 15000 20000 25000


PIB por región y sector (millones USD):
Región          Agricultura        Minería    Manufactura          Total
----------------------------------------------------------------------
Lima                  5,000         15,000         30,000         50,000
Arequipa              8,000         12,000          5,000         25,000
Cusco                 6,000          8,000          3,000         17,000
Total                19,000         35,000         38,000         92,000

7.3 Búsqueda en estructuras anidadas

python
# Buscar en matriz
matriz_datos = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90]
]

valor_buscar = 50
encontrado = False

for i, fila in enumerate(matriz_datos):
    for j, valor in enumerate(fila):
        if valor == valor_buscar:
            print(f"Valor {valor_buscar} encontrado en posición [{i}][{j}]")
            encontrado = True
            break
    if encontrado:
        break

if not encontrado:
    print(f"Valor {valor_buscar} no encontrado")
Valor 50 encontrado en posición [1][1]

8 Bucles while

Los bucles while se ejecutan mientras una condición sea verdadera. Son útiles cuando no sabemos de antemano cuántas iteraciones necesitamos.

8.1 Sintaxis básica

python
# Contador simple
contador = 0
while contador < 5:
    print(f"Iteración {contador}")
    contador += 1

print("Fin del bucle")
Iteración 0
Iteración 1
Iteración 2
Iteración 3
Iteración 4
Fin del bucle

8.2 Aplicaciones económicas

python
# Ejemplo 1: Simular inversión hasta alcanzar meta
capital = 10000
meta = 20000
tasa_anual = 0.08
anos = 0

print(f"Capital inicial: S/ {capital:,.2f}")
print(f"Meta: S/ {meta:,.2f}")
print(f"Tasa: {tasa_anual*100}%\n")

while capital < meta:
    anos += 1
    interes = capital * tasa_anual
    capital += interes
    print(f"Año {anos}: S/ {capital:,.2f}")

print(f"\nMeta alcanzada en {anos} años")

# Ejemplo 2: Búsqueda de punto de equilibrio
precio = 100
costo_variable = 40
costos_fijos = 50000
cantidad = 0
ingresos = 0
costos_totales = costos_fijos

print(f"\nBúsqueda de punto de equilibrio:")
print(f"Precio: S/ {precio}")
print(f"Costo variable: S/ {costo_variable}")
print(f"Costos fijos: S/ {costos_fijos:,}\n")

while ingresos < costos_totales:
    cantidad += 100
    ingresos = precio * cantidad
    costos_totales = costos_fijos + (costo_variable * cantidad)

print(f"Punto de equilibrio: {cantidad:,} unidades")
print(f"Ingresos: S/ {ingresos:,}")
print(f"Costos totales: S/ {costos_totales:,}")

# Ejemplo 3: Pago de deuda con cuotas fijas
deuda = 50000
tasa_mensual = 0.015
cuota = 2000
mes = 0
interes_total = 0

print(f"\n\nAmortización de deuda:")
print(f"Deuda inicial: S/ {deuda:,.2f}")
print(f"Cuota mensual: S/ {cuota:,.2f}")
print(f"Tasa mensual: {tasa_mensual*100}%\n")

while deuda > 0:
    mes += 1
    interes = deuda * tasa_mensual
    interes_total += interes
    amortizacion = cuota - interes
    
    if amortizacion > deuda:
        amortizacion = deuda
        cuota = deuda + interes
    
    deuda -= amortizacion
    
    if mes % 12 == 0:
        print(f"Mes {mes:2d}: Saldo S/ {deuda:,.2f}")

print(f"\nDeuda pagada en {mes} meses ({mes/12:.1f} años)")
print(f"Interés total pagado: S/ {interes_total:,.2f}")
Capital inicial: S/ 10,000.00
Meta: S/ 20,000.00
Tasa: 8.0%

Año 1: S/ 10,800.00
Año 2: S/ 11,664.00
Año 3: S/ 12,597.12
Año 4: S/ 13,604.89
Año 5: S/ 14,693.28
Año 6: S/ 15,868.74
Año 7: S/ 17,138.24
Año 8: S/ 18,509.30
Año 9: S/ 19,990.05
Año 10: S/ 21,589.25

Meta alcanzada en 10 años

Búsqueda de punto de equilibrio:
Precio: S/ 100
Costo variable: S/ 40
Costos fijos: S/ 50,000

Punto de equilibrio: 900 unidades
Ingresos: S/ 90,000
Costos totales: S/ 86,000


Amortización de deuda:
Deuda inicial: S/ 50,000.00
Cuota mensual: S/ 2,000.00
Tasa mensual: 1.5%

Mes 12: Saldo S/ 33,698.49
Mes 24: Saldo S/ 14,208.10

Deuda pagada en 32 meses (2.7 años)
Interés total pagado: S/ 13,139.64

8.3 Bucles infinitos y salida

python
# Bucle con condición de salida
print("Simulación de proceso hasta condición:")
iteracion = 0
valor = 100

while True:
    iteracion += 1
    valor *= 0.9  # Decrece 10% cada iteración
    
    print(f"Iteración {iteracion}: {valor:.2f}")
    
    if valor < 10:
        print("Valor crítico alcanzado")
        break
    
    if iteracion > 100:
        print("Límite de iteraciones alcanzado")
        break
Simulación de proceso hasta condición:
Iteración 1: 90.00
Iteración 2: 81.00
Iteración 3: 72.90
Iteración 4: 65.61
Iteración 5: 59.05
Iteración 6: 53.14
Iteración 7: 47.83
Iteración 8: 43.05
Iteración 9: 38.74
Iteración 10: 34.87
Iteración 11: 31.38
Iteración 12: 28.24
Iteración 13: 25.42
Iteración 14: 22.88
Iteración 15: 20.59
Iteración 16: 18.53
Iteración 17: 16.68
Iteración 18: 15.01
Iteración 19: 13.51
Iteración 20: 12.16
Iteración 21: 10.94
Iteración 22: 9.85
Valor crítico alcanzado

9 Control de flujo: break y continue

break y continue permiten controlar el flujo de las iteraciones.

9.1 break: terminar bucle

python
# Buscar primer valor que cumple condición
precios = [100, 105, 110, 95, 120, 130, 90]
umbral = 115

print(f"Buscando primer precio mayor a {umbral}:")
for i, precio in enumerate(precios):
    print(f"Revisando posición {i}: S/ {precio}")
    if precio > umbral:
        print(f"Encontrado en posición {i}: S/ {precio}")
        break
else:
    print("No se encontró ningún precio que supere el umbral")
Buscando primer precio mayor a 115:
Revisando posición 0: S/ 100
Revisando posición 1: S/ 105
Revisando posición 2: S/ 110
Revisando posición 3: S/ 95
Revisando posición 4: S/ 120
Encontrado en posición 4: S/ 120

9.2 continue: saltar iteración

python
# Procesar solo valores válidos
datos = [100, -5, 200, 0, 150, -10, 300, 250]

print("Procesando solo valores positivos:")
suma = 0
for valor in datos:
    if valor <= 0:
        print(f"Saltando valor inválido: {valor}")
        continue
    
    suma += valor
    print(f"Procesando: {valor}, suma acumulada: {suma}")

print(f"\nSuma total: {suma}")
Procesando solo valores positivos:
Procesando: 100, suma acumulada: 100
Saltando valor inválido: -5
Procesando: 200, suma acumulada: 300
Saltando valor inválido: 0
Procesando: 150, suma acumulada: 450
Saltando valor inválido: -10
Procesando: 300, suma acumulada: 750
Procesando: 250, suma acumulada: 1000

Suma total: 1000

9.3 Aplicaciones combinadas

python
# Validación de datos con límite de intentos
intentos_maximos = 3
intentos = 0

while intentos < intentos_maximos:
    try:
        monto = float(input("Ingrese monto (positivo): "))
        
        if monto < 0:
            print("Error: el monto debe ser positivo")
            intentos += 1
            continue
        
        if monto > 100000:
            print("Advertencia: monto muy alto")
            confirmar = input("¿Desea continuar? (s/n): ")
            if confirmar.lower() != 's':
                continue
        
        print(f"Monto válido: S/ {monto:,.2f}")
        break
        
    except ValueError:
        print("Error: ingrese un número válido")
        intentos += 1

if intentos >= intentos_maximos:
    print("\nNúmero máximo de intentos alcanzado")

10 Aplicaciones económicas

10.1 Aplicación 1: Simulador de portafolio de inversión

python
def simular_portafolio(inversion_inicial, anos, distribucion, rendimientos):
    """
    Simula el rendimiento de un portafolio diversificado
    
    Parámetros:
    - inversion_inicial: capital inicial
    - anos: número de años a simular
    - distribucion: dict con % por activo
    - rendimientos: dict con rendimientos anuales por activo
    """
    
    print("SIMULACIÓN DE PORTAFOLIO DE INVERSIÓN")
    print("=" * 70)
    
    # Calcular inversión por activo
    inversiones = {}
    print(f"\nInversión inicial: S/ {inversion_inicial:,.2f}")
    print(f"\nDistribución del portafolio:")
    
    for activo, porcentaje in distribucion.items():
        monto = inversion_inicial * porcentaje
        inversiones[activo] = monto
        print(f"  {activo}: {porcentaje*100:.0f}% - S/ {monto:,.2f}")
    
    # Simular cada año
    print(f"\n{'='*70}")
    print("Evolución anual del portafolio:")
    print(f"{'Año':<6} ", end="")
    for activo in inversiones.keys():
        print(f"{activo:>12}", end="")
    print(f"{'Total':>12}")
    print("-" * 70)
    
    for ano in range(1, anos + 1):
        total_ano = 0
        print(f"{ano:<6} ", end="")
        
        for activo in inversiones.keys():
            rendimiento = rendimientos[activo]
            inversiones[activo] *= (1 + rendimiento)
            print(f"{inversiones[activo]:>12,.0f}", end="")
            total_ano += inversiones[activo]
        
        print(f"{total_ano:>12,.0f}")
    
    # Resultados finales
    print(f"\n{'='*70}")
    print("RESULTADOS FINALES:")
    
    total_final = sum(inversiones.values())
    ganancia = total_final - inversion_inicial
    rendimiento_total = (ganancia / inversion_inicial) * 100
    rendimiento_anual = ((total_final / inversion_inicial) ** (1/anos) - 1) * 100
    
    print(f"\nInversión inicial: S/ {inversion_inicial:,.2f}")
    print(f"Valor final: S/ {total_final:,.2f}")
    print(f"Ganancia: S/ {ganancia:,.2f}")
    print(f"Rendimiento total: {rendimiento_total:.2f}%")
    print(f"Rendimiento anual promedio: {rendimiento_anual:.2f}%")
    
    print(f"\nDistribución final:")
    for activo, monto in inversiones.items():
        porcentaje = (monto / total_final) * 100
        print(f"  {activo}: S/ {monto:,.2f} ({porcentaje:.1f}%)")
    
    return inversiones

# Ejemplo de uso
distribucion = {
    'Acciones': 0.40,
    'Bonos': 0.30,
    'Inmuebles': 0.20,
    'Efectivo': 0.10
}

rendimientos = {
    'Acciones': 0.12,
    'Bonos': 0.06,
    'Inmuebles': 0.08,
    'Efectivo': 0.02
}

resultado = simular_portafolio(
    inversion_inicial=100000,
    anos=10,
    distribucion=distribucion,
    rendimientos=rendimientos
)
SIMULACIÓN DE PORTAFOLIO DE INVERSIÓN
======================================================================

Inversión inicial: S/ 100,000.00

Distribución del portafolio:
  Acciones: 40% - S/ 40,000.00
  Bonos: 30% - S/ 30,000.00
  Inmuebles: 20% - S/ 20,000.00
  Efectivo: 10% - S/ 10,000.00

======================================================================
Evolución anual del portafolio:
Año        Acciones       Bonos   Inmuebles    Efectivo       Total
----------------------------------------------------------------------
1            44,800      31,800      21,600      10,200     108,400
2            50,176      33,708      23,328      10,404     117,616
3            56,197      35,730      25,194      10,612     127,734
4            62,941      37,874      27,210      10,824     138,849
5            70,494      40,147      29,387      11,041     151,068
6            78,953      42,556      31,737      11,262     164,508
7            88,427      45,109      34,276      11,487     179,300
8            99,039      47,815      37,019      11,717     195,589
9           110,923      50,684      39,980      11,951     213,539
10          124,234      53,725      43,178      12,190     233,328

======================================================================
RESULTADOS FINALES:

Inversión inicial: S/ 100,000.00
Valor final: S/ 233,327.80
Ganancia: S/ 133,327.80
Rendimiento total: 133.33%
Rendimiento anual promedio: 8.84%

Distribución final:
  Acciones: S/ 124,233.93 (53.2%)
  Bonos: S/ 53,725.43 (23.0%)
  Inmuebles: S/ 43,178.50 (18.5%)
  Efectivo: S/ 12,189.94 (5.2%)

10.2 Aplicación 2: Análisis de sensibilidad de precios

python
def analisis_sensibilidad_demanda(precio_base, elasticidad, cantidad_base, 
                                   variaciones_precio):
    """
    Analiza cómo cambios en el precio afectan la demanda
    """
    
    print("ANÁLISIS DE SENSIBILIDAD DE LA DEMANDA")
    print("=" * 70)
    
    print(f"\nParámetros base:")
    print(f"  Precio base: S/ {precio_base:.2f}")
    print(f"  Cantidad base: {cantidad_base:,} unidades")
    print(f"  Elasticidad precio: {elasticidad:.2f}")
    
    print(f"\n{'='*70}")
    print("Escenarios de precios:")
    print(f"{'Precio':>10} {'Var %':>8} {'Cantidad':>12} {'Var %':>8} {'Ingreso':>12}")
    print("-" * 70)
    
    resultados = []
    
    for var_porcentaje in variaciones_precio:
        # Calcular nuevo precio
        nuevo_precio = precio_base * (1 + var_porcentaje/100)
        
        # Calcular cambio porcentual en cantidad (elasticidad)
        var_cantidad_porcentaje = -elasticidad * var_porcentaje
        nueva_cantidad = cantidad_base * (1 + var_cantidad_porcentaje/100)
        
        # Calcular ingreso
        ingreso = nuevo_precio * nueva_cantidad
        ingreso_base = precio_base * cantidad_base
        var_ingreso = ((ingreso - ingreso_base) / ingreso_base) * 100
        
        print(f"{nuevo_precio:>10.2f} {var_porcentaje:>7.1f}% "
              f"{nueva_cantidad:>12,.0f} {var_cantidad_porcentaje:>7.1f}% "
              f"{ingreso:>12,.0f}")
        
        resultados.append({
            'precio': nuevo_precio,
            'cantidad': nueva_cantidad,
            'ingreso': ingreso
        })
    
    # Encontrar precio óptimo
    precio_optimo_idx = max(range(len(resultados)), 
                            key=lambda i: resultados[i]['ingreso'])
    
    print(f"\n{'='*70}")
    print("PRECIO ÓPTIMO:")
    optimo = resultados[precio_optimo_idx]
    print(f"  Precio: S/ {optimo['precio']:.2f}")
    print(f"  Cantidad: {optimo['cantidad']:,.0f} unidades")
    print(f"  Ingreso máximo: S/ {optimo['ingreso']:,.2f}")
    
    return resultados

# Ejemplo de uso
variaciones = [-20, -15, -10, -5, 0, 5, 10, 15, 20]
resultados = analisis_sensibilidad_demanda(
    precio_base=100,
    elasticidad=1.5,
    cantidad_base=1000,
    variaciones_precio=variaciones
)
ANÁLISIS DE SENSIBILIDAD DE LA DEMANDA
======================================================================

Parámetros base:
  Precio base: S/ 100.00
  Cantidad base: 1,000 unidades
  Elasticidad precio: 1.50

======================================================================
Escenarios de precios:
    Precio    Var %     Cantidad    Var %      Ingreso
----------------------------------------------------------------------
     80.00   -20.0%        1,300    30.0%      104,000
     85.00   -15.0%        1,225    22.5%      104,125
     90.00   -10.0%        1,150    15.0%      103,500
     95.00    -5.0%        1,075     7.5%      102,125
    100.00     0.0%        1,000    -0.0%      100,000
    105.00     5.0%          925    -7.5%       97,125
    110.00    10.0%          850   -15.0%       93,500
    115.00    15.0%          775   -22.5%       89,125
    120.00    20.0%          700   -30.0%       84,000

======================================================================
PRECIO ÓPTIMO:
  Precio: S/ 85.00
  Cantidad: 1,225 unidades
  Ingreso máximo: S/ 104,125.00

11 Ejercicios prácticos

11.1 Ejercicio 1: Calculadora de depreciación

python
def calcular_depreciacion(valor_inicial, vida_util, metodo='lineal'):
    """
    Calcula la depreciación de un activo
    
    Métodos:
    - 'lineal': Depreciación constante
    - 'doble_saldo': Saldo decreciente acelerado
    """
    
    print(f"CÁLCULO DE DEPRECIACIÓN - Método {metodo.upper()}")
    print("=" * 60)
    
    print(f"\nValor inicial: S/ {valor_inicial:,.2f}")
    print(f"Vida útil: {vida_util} años")
    
    if metodo == 'lineal':
        # Depreciación lineal
        depreciacion_anual = valor_inicial / vida_util
        valor_libro = valor_inicial
        
        print(f"Depreciación anual: S/ {depreciacion_anual:,.2f}")
        print(f"\n{'Año':<6} {'Deprec.':<12} {'Deprec. Acum.':<15} {'Valor Libro':<12}")
        print("-" * 60)
        
        depreciacion_acumulada = 0
        
        for ano in range(1, vida_util + 1):
            depreciacion_acumulada += depreciacion_anual
            valor_libro -= depreciacion_anual
            
            print(f"{ano:<6} {depreciacion_anual:>11,.2f} "
                  f"{depreciacion_acumulada:>14,.2f} {valor_libro:>11,.2f}")
    
    elif metodo == 'doble_saldo':
        # Depreciación por doble saldo decreciente
        tasa = 2 / vida_util
        valor_libro = valor_inicial
        depreciacion_acumulada = 0
        
        print(f"Tasa anual: {tasa*100:.2f}%")
        print(f"\n{'Año':<6} {'Valor Inicio':<13} {'Deprec.':<12} "
              f"{'Deprec. Acum.':<15} {'Valor Final':<12}")
        print("-" * 70)
        
        for ano in range(1, vida_util + 1):
            valor_inicio = valor_libro
            depreciacion = valor_libro * tasa
            
            # En el último año, depreciar solo hasta valor residual cero
            if ano == vida_util:
                depreciacion = valor_libro
            
            depreciacion_acumulada += depreciacion
            valor_libro -= depreciacion
            
            print(f"{ano:<6} {valor_inicio:>12,.2f} {depreciacion:>11,.2f} "
                  f"{depreciacion_acumulada:>14,.2f} {valor_libro:>11,.2f}")
    
    print("=" * 60)

# Ejemplos
print("DEPRECIACIÓN LINEAL")
calcular_depreciacion(valor_inicial=50000, vida_util=5, metodo='lineal')

print("\n\n")

print("DEPRECIACIÓN POR DOBLE SALDO DECRECIENTE")
calcular_depreciacion(valor_inicial=50000, vida_util=5, metodo='doble_saldo')
DEPRECIACIÓN LINEAL
CÁLCULO DE DEPRECIACIÓN - Método LINEAL
============================================================

Valor inicial: S/ 50,000.00
Vida útil: 5 años
Depreciación anual: S/ 10,000.00

Año    Deprec.      Deprec. Acum.   Valor Libro 
------------------------------------------------------------
1        10,000.00      10,000.00   40,000.00
2        10,000.00      20,000.00   30,000.00
3        10,000.00      30,000.00   20,000.00
4        10,000.00      40,000.00   10,000.00
5        10,000.00      50,000.00        0.00
============================================================



DEPRECIACIÓN POR DOBLE SALDO DECRECIENTE
CÁLCULO DE DEPRECIACIÓN - Método DOBLE_SALDO
============================================================

Valor inicial: S/ 50,000.00
Vida útil: 5 años
Tasa anual: 40.00%

Año    Valor Inicio  Deprec.      Deprec. Acum.   Valor Final 
----------------------------------------------------------------------
1         50,000.00   20,000.00      20,000.00   30,000.00
2         30,000.00   12,000.00      32,000.00   18,000.00
3         18,000.00    7,200.00      39,200.00   10,800.00
4         10,800.00    4,320.00      43,520.00    6,480.00
5          6,480.00    6,480.00      50,000.00        0.00
============================================================

11.2 Ejercicio 2: Simulador de política de inventarios

python
def simular_politica_inventario(demanda_diaria, dias_simulacion, 
                                punto_reorden, cantidad_pedido,
                                tiempo_entrega, inventario_inicial):
    """
    Simula una política de inventarios (Q, R)
    """
    
    import random
    
    print("SIMULACIÓN DE POLÍTICA DE INVENTARIOS")
    print("=" * 70)
    
    print(f"\nParámetros:")
    print(f"  Demanda diaria promedio: {demanda_diaria} unidades")
    print(f"  Inventario inicial: {inventario_inicial} unidades")
    print(f"  Punto de reorden: {punto_reorden} unidades")
    print(f"  Cantidad de pedido: {cantidad_pedido} unidades")
    print(f"  Tiempo de entrega: {tiempo_entrega} días")
    
    # Variables de simulación
    inventario = inventario_inicial
    pedido_pendiente = False
    dias_hasta_entrega = 0
    total_vendido = 0
    dias_sin_stock = 0
    num_pedidos = 0
    ventas_perdidas = 0
    
    print(f"\n{'Día':<5} {'Demanda':<8} {'Ventas':<8} {'Inventario':<10} {'Pedido':<8}")
    print("-" * 50)
    
    for dia in range(1, dias_simulacion + 1):
        # Generar demanda (distribución normal)
        demanda = max(0, int(random.normalvariate(demanda_diaria, demanda_diaria * 0.2)))
        
        # Verificar si llega pedido
        if pedido_pendiente:
            dias_hasta_entrega -= 1
            if dias_hasta_entrega == 0:
                inventario += cantidad_pedido
                pedido_pendiente = False
        
        # Procesar venta
        if inventario >= demanda:
            ventas = demanda
            inventario -= demanda
            total_vendido += ventas
        else:
            ventas = inventario
            ventas_perdidas += (demanda - inventario)
            total_vendido += ventas
            inventario = 0
            dias_sin_stock += 1
        
        # Verificar punto de reorden
        estado_pedido = ""
        if inventario <= punto_reorden and not pedido_pendiente:
            pedido_pendiente = True
            dias_hasta_entrega = tiempo_entrega
            num_pedidos += 1
            estado_pedido = "PEDIDO"
        
        # Mostrar cada 5 días
        if dia % 5 == 0 or dia == 1:
            print(f"{dia:<5} {demanda:<8} {ventas:<8} {inventario:<10} {estado_pedido:<8}")
    
    # Estadísticas finales
    print(f"\n{'='*70}")
    print("ESTADÍSTICAS DE LA SIMULACIÓN:")
    print(f"  Total vendido: {total_vendido:,} unidades")
    print(f"  Ventas perdidas: {ventas_perdidas:,} unidades")
    print(f"  Nivel de servicio: {(total_vendido/(total_vendido+ventas_perdidas)*100):.1f}%")
    print(f"  Días sin stock: {dias_sin_stock} de {dias_simulacion}")
    print(f"  Número de pedidos: {num_pedidos}")
    print(f"  Inventario final: {inventario} unidades")
    print(f"  Inventario promedio: {inventario_inicial/2:.0f} unidades (aprox.)")

# Ejemplo de uso
simular_politica_inventario(
    demanda_diaria=50,
    dias_simulacion=90,
    punto_reorden=200,
    cantidad_pedido=500,
    tiempo_entrega=5,
    inventario_inicial=600
)
SIMULACIÓN DE POLÍTICA DE INVENTARIOS
======================================================================

Parámetros:
  Demanda diaria promedio: 50 unidades
  Inventario inicial: 600 unidades
  Punto de reorden: 200 unidades
  Cantidad de pedido: 500 unidades
  Tiempo de entrega: 5 días

Día   Demanda  Ventas   Inventario Pedido  
--------------------------------------------------
1     46       46       554                
5     57       57       328                
10    52       52       63                 
15    50       50       358                
20    74       74       61                 
25    48       48       357                
30    41       41       85                 
35    39       39       373                
40    47       47       98                 
45    68       68       339                
50    44       44       84                 
55    62       62       360                
60    36       36       170        PEDIDO  
65    50       50       450                
70    63       63       156        PEDIDO  
75    55       55       445                
80    58       58       166        PEDIDO  
85    55       55       445                
90    64       64       207                

======================================================================
ESTADÍSTICAS DE LA SIMULACIÓN:
  Total vendido: 4,393 unidades
  Ventas perdidas: 242 unidades
  Nivel de servicio: 94.8%
  Días sin stock: 8 de 90
  Número de pedidos: 8
  Inventario final: 207 unidades
  Inventario promedio: 300 unidades (aprox.)

12 Conlusión

En esta guía hemos explorado las iteraciones en Python:

Actualización de variables

Uso de operadores compuestos para modificar variables: +=, -=, *=, /=.

Bucles for

Iteraciones definidas sobre secuencias. La función range() genera secuencias numéricas. enumerate() proporciona índices. zip() permite iteración paralela.

List comprehension

Forma concisa y eficiente de crear listas. Puede incluir condicionales y expresiones complejas.

Iteraciones anidadas

Permiten trabajar con estructuras multidimensionales como matrices y tablas.

Bucles while

Iteraciones indefinidas basadas en condiciones. Útiles cuando no sabemos cuántas iteraciones necesitamos.

Control de flujo

break termina el bucle completamente. continue salta a la siguiente iteración.

13 Próximos pasos

En la siguiente guía (Guía 6: Funciones) exploraremos:

  • Flujo de ejecución, argumentos y parámetros
  • Definición y uso de funciones
  • Funciones anónimas (lambda)
  • Funciones map y filter
  • Módulos NumPy y Pandas

Las funciones nos permitirán organizar nuestro código de manera modular y reutilizable, fundamental para proyectos económicos complejos.

14 Recursos adicionales

Para profundizar en iteraciones:

  • Python Loops: docs.python.org/tutorial/controlflow.html
  • List Comprehensions: docs.python.org/tutorial/datastructures.html
  • Práctica con datasets económicos reales

La práctica constante con datos reales consolidará estos conceptos. Se recomienda aplicar iteraciones en el procesamiento de datos del BCRP, INEI y otras fuentes económicas, automatizando análisis que normalmente requerirían horas de trabajo manual.

Cómo citar

Achalma, E. (2021, 21 de junio). Bucles e iteraciones en Python. Numerus Scriptum. https://numerus-scriptum.netlify.app/cursos/python/iteraciones-con-python/

Esc
elegir abrir Esc cerrar