T D

Aprende Python desde cero o el comienzo o del inicio

Descripción del Entorno: Tu Sandbox de Aprendizaje en Python: En este portal web se despliegan diversos módulos funcionales diseñados para dominar la programación desde las bases hasta la persistencia de datos. Aquí podrás explorar la lógica detrás del control de flujo (bucles y condicionales), experimentar con la manipulación en tiempo real de estructuras de datos mediante listas dinámicas (gestión de alumnos, stock de autos y precios de bencina) y comprender la integración de funciones modulares con la lectura física de archivos TXT y CSV. Este entorno actúa como tu laboratorio interactivo para validar código en tiempo real.

Motivo: Actuar como un entorno de pruebas y enseñanza, sandbox operativo y repositorio centralizado para la utilización y repaso sobre la construcción de software en Python.

Puedes usar todos estos recursos con responsabilidad para tus tareas, cuidando el buen uso de estos recursos.
Este documento es una extensión directa para reforzar elementos de programación en Python , If, Elif, Else, Try, Except, While, For, Arreglos, Listas, Conjuntos, Diccionarios, Archivos y Funciones...'. este documento transfiere dichos fundamentos directamente hacia la praxis de la ingeniería de software, aplicando la manipulación de datos en memoria, la persistencia física de archivos y la modularización de algoritmos para resolver modelos de negocio reales y escalables.
Sentencia Python FUNDAMENTOS INICIALES

¿Qué es Python? El Lenguaje de la Alta Industria

Contexto de Negocio

Antes de estructurar código para servidores o automatizaciones, un desarrollador debe entender las herramientas con las que trabaja y por qué las grandes empresas globales las eligen.

Justificación Lógica

Python es un lenguaje de programación de alto nivel, interpretado y multiparadigma. Su sintaxis limpia y legible reduce drásticamente el tiempo de desarrollo y los costos de mantenimiento de software.

sandbox_python py
# Características clave de Python: Legible y potente
print("Hola Mundo, este es el inicio de la ingeniería con Python")
Sentencia Variables / Print FUNDAMENTOS INICIALES

Variables y el Comando Print: Almacenar y Mostrar Información

Contexto de Negocio

Las aplicaciones web y los scripts de backend necesitan guardar datos temporalmente en la memoria RAM y enviarle mensajes o logs de estado al administrador del sistema.

Justificación Lógica

Una variable es un contenedor en memoria con un nombre asignado. El comando 'print()' es la función nativa que nos permite volcar o exteriorizar esos datos directamente en la terminal de comandos.

sandbox_python py
# Asignación de variables de diferente tipo
nombre_servidor = "Servidor_Alpha"
puerto_conexion = 8080

# Desplegando la información usando print
print("Conectando a:", nombre_servidor, "en el puerto:", puerto_conexion)
Sentencia Ideación FUNDAMENTOS INICIALES

La Ideación y su Importancia: Pensar antes de Escribir Código

Contexto de Negocio

Escribir líneas de código de forma desesperada sin una planeación previa suele traducirse en bugs complejos, pérdida de tiempo y software difícil de escalar.

Justificación Lógica

La ideación consiste en traducir un problema del mundo de los negocios a un algoritmo abstracto (pseudocódigo o diagramas de flujo). Su importancia radica en asegurar la lógica del programa antes de la implementación sintáctica.

sandbox_python py
# Ideación Conceptual de un validador:
# 1. Recibir un token de acceso
# 2. Verificar si está vacío
# 3. Notificar el estado

token = "XYZ123"
print("Verificando token de infraestructura...")
Sentencia input / print FUNDAMENTOS INICIALES

Interacción con el Entorno: Entrada y Salida Dinámica de Datos

Contexto de Negocio

Los sistemas interactivos no usan datos fijos (hardcodeados); requieren capturar activamente lo que un usuario digital digita para procesarlo y devolver una salida personalizada.

Justificación Lógica

La función 'input()' detiene la ejecución del script para recolectar información del teclado (Entrada). Posteriormente, el flujo computacional procesa esa variable y la expone mediante un 'print()' (Salida).

sandbox_python py
# Ejemplo práctico de Entrada y Salida de Datos
print("--- SISTEMA DE REGISTRO ACADÉMICO ---")

# Entrada: Capturando datos del alumno
nombre_estudiante = input("Ingrese el nombre del estudiante: ")

# Salida: Respuesta procesada devuelta por pantalla
print("¡Registro exitoso! Bienvenido a la plataforma:", nombre_estudiante)
Sentencia Sangría / Estilo FUNDAMENTOS INICIALES

La Indentación en Python: Regla Sintáctica y Legibilidad de Código

Contexto de Negocio

A diferencia de lenguajes como C++, Java o JavaScript que utilizan llaves '{}' para delimitar bloques de instrucciones, Python utiliza el espacio en blanco (sangría). Un error de un solo espacio detiene sistemas completos de integración continua.

Justificación Lógica

La indentación no es opcional ni estética; es una declaración de ámbito (scope). El estándar internacional PEP 8 dicta que cada nivel de indentación debe consistir exactamente en 4 espacios. Esto fuerza al desarrollador a mantener un código limpio, estructurado y legible por defecto.

sandbox_python py
# --- ANÁLISIS COMPARTIDO DE INDENTACIÓN ---
def verificar_sistema_produccion(servidor_online, almacenamiento_disponible):
    # Nivel 1: Inicio de la función
    print("[INFO] Iniciando chequeo de salud del cluster...")
    
    if servidor_online:
        # Nivel 2: Bloque interno del condicional IF
        print("[OK] Comunicación establecida con el host principal.")
        
        if almacenamiento_disponible > 80:
            # Nivel 3: Bloque anidado profundamente
            print("[ALERTA] Almacenamiento crítico. Capacidad superior al 80%.")
            AlertaEspacioInmediata = True
        else:
            # Nivel 3 alternativo
            print("[OK] Niveles de almacenamiento dentro del umbral seguro.")
            AlertaEspacioInmediata = False
            
        # Regreso al Nivel 2
        print("[INFO] Fase 1 del diagnóstico completada con éxito.")
    
    # Regreso al Nivel 1
    print("[INFO] Diagnóstico finalizado. Retornando logs.")
    return "Proceso_Exitoso"

# Un IndentationError rompería el intérprete antes de ejecutarse el software
Sentencia if / elif / else CONTROL DE FLUJO

Evaluación Multicriterio Avanzada: Sentencias de Control if / elif / else

Contexto de Negocio

Una pasarela de pagos internacional necesita procesar transacciones clasificándolas instantáneamente según su volumen financiero, procedencia geográfica y perfil de riesgo crediticio para derivar la operación al procesador bancario adecuado o bloquearla por sospecha de lavado de activos.

Justificación Lógica

Cuando las decisiones de software superan la lógica binaria (verdadero o falso), la estructura encadenada 'if-elif-else' permite evaluar múltiples expresiones lógicas de manera secuencial y mutuamente excluyente. En el momento en que una condición resulta verdadera, su bloque se ejecuta y el intérprete ignora el resto, optimizando los ciclos del procesador.

sandbox_python py
# --- MOTOR DE EVALUACIÓN FINANCIERA EN ALTA ESCALA (FLUJO LINEAL) ---
print("--- INICIANDO ANÁLISIS DE RIESGO DE TRANSACCIÓN ---")

# Variables de Entrada de la Simulación
monto_transaccion = 25000
pais_origen = "CL"
es_usuario_verificado = True

# Regla Crítica 1: Bloqueo inmediato por Cumplimiento Normativo de Fraude Internacional
if monto_transaccion >= 50000 and not es_usuario_verificado:
    print("[CRÍTICO] Transacción sospechosa bloqueada. Alto monto sin verificación.")
    cod_respuesta = "RECHAZADA_RIESGO_PLD"
    tasa_comision = 0.0
    
# Regla 2: Cliente Corporativo VIP - Alta Prioridad y Transacción Segura
elif es_usuario_verificado and monto_transaccion >= 20000:
    print("[PROCESAMIENTO VIP] Canal prioritario activado. Ruta de baja latencia bancaria.")
    cod_respuesta = "APROBADA_CANAL_VIP"
    tasa_comision = monto_transaccion * 0.015  # 1.5% Comisión Corporativa
    
# Regla 3: Transacciones Locales Estándar de Rango Medio
elif pais_origen == "CL" and monto_transaccion > 1000:
    print("[PROCESAMIENTO NACIONAL] Enrutando a través de la Cámara de Compensación Local.")
    cod_respuesta = "APROBADA_NACIONAL"
    tasa_comision = monto_transaccion * 0.029  # 2.9% Comisión Estándar
    
# Regla 4: Transacciones Internacionales Pequeñas o Remesas Globales
elif pais_origen != "CL" and monto_transaccion <= 5000:
    print("[PROCESAMIENTO CROSS-BORDER] Enrutando a Swift Interbancario Internacional.")
    cod_respuesta = "APROBADA_INTERNACIONAL_REMESAS"
    tasa_comision = (monto_transaccion * 0.05) + 0.50  # 5% + Costo Fijo Fx
    
# Regla por Defecto (Fallback Safety): Si no cumple ningún criterio anterior
else:
    print("[PROCESAMIENTO MICRO-PAYMENT] Aplicando tarifa plana y validación básica de fondos.")
    cod_respuesta = "APROBADA_MINIMA"
    tasa_comision = 0.10  # Tarifa única fija de 10 centavos
    
# Impresión de Salida de Resultados de Negocio
print(f"[RESULTADO] Código de operación final obtenido: {cod_respuesta}")
print(f"[RESULTADO] Comisión descontada por pasarela: ${tasa_comision:.2f}")
Sentencia try / except / finally CONTROL DE FLUJO

Gestión de Excepciones y Resiliencia de Software: Bloques try / except / finally

Contexto de Negocio

Un software de telemetría de IoT lee sensores industriales remotos de temperatura mediante peticiones de red TCP/IP. Si la conexión falla, el sensor devuelve datos corruptos, cadenas vacías o un error de división por cero en el hardware, lo que provocaría que el backend del servidor colapse y deje de monitorear toda la fábrica.

Justificación Lógica

Las aplicaciones en producción conviven con fallos inevitables (caídas de red, bases de datos saturadas, archivos inexistentes). La arquitectura 'try-except' captura estos errores en tiempo de ejecución (Runtime Errors) impidiendo la terminación abrupta del script. El bloque 'try' pone a prueba el código inestable, 'except' gestiona el desastre de forma segura, y 'finally' garantiza la liberación de recursos vitales (como cerrar conexiones de bases de datos o archivos abiertos) sin importar si hubo un fallo o no.

sandbox_python py
# --- ENTORNO REFORZADO DE INGESTIÓN DE TELEMETRÍA (FLUJO LINEAL) ---
print("[NÚCLEO] Iniciando procesamiento de paquete de sensores remotos...")
conexion_base_datos_abierta = True
print("[SISTEMA] Conexión activa con el repositorio analítico.")

# Simulación de Entrada de Datos mediante un Diccionario Fijo (Caso con Error de Hardware)
json_crudo = {"sensor_id": "SENSOR_CRÍTICO_02", "voltaje": "15.0", "atenuacion": "0.0"}

try:
    # Intento de extracción de parámetros críticos de la carga útil
    sensor_id = json_crudo["sensor_id"]
    lectura_voltaje = float(json_crudo["voltaje"])
    factor_atenuacion = float(json_crudo["atenuacion"])
    
    print(f"[PROCESANDO] Telemetría del dispositivo: {sensor_id}")
    
    # Operación Matemática Inestable susceptible a un ZeroDivisionError
    indice_eficiencia = lectura_voltaje / factor_atenuacion
    print(f"[ÉXITO] Índice de eficiencia de la celda calculado: {indice_eficiencia:.4f}")
    
except KeyError as error_llave:
    print(f"[ERROR DE DATOS] Atributo obligatorio ausente en la carga útil JSON: {error_llave}")
    print("[MITIGACIÓN] Asignando identificador temporal e indexando a cola de depuración.")
    indice_eficiencia = -1.0
    
except ZeroDivisionError:
    print("[ERROR DE HARDWARE] Factor de atenuación en 0 detectado. División matemática imposible.")
    print("[MITIGACIÓN] Sobreescribiendo cálculo a constante de seguridad de disipación térmica.")
    indice_eficiencia = 999.9
    
except ValueError as error_tipo:
    print(f"[ERROR DE PARSEO] Error crítico en la conversión de tipos primitivos: {error_tipo}")
    print("[MITIGACIÓN] El sensor envió letras en lugar de números. Abortando cálculo.")
    indice_eficiencia = None
    
except Exception as error_general:
    print(f"[ERROR DESCONOCIDO] Evento catastrófico no tipificado: {error_general}")
    indice_eficiencia = 0.0
    
finally:
    # Este bloque se ejecuta SIEMPRE, garantizando la integridad de la infraestructura
    print("[MANTENIMIENTO OBLIGATORIO] Liberando canales de memoria RAM ocupados...")
    conexion_base_datos_abierta = False
    print("[SISTEMA] Conexión cerrada de forma segura. Infraestructura protegida.")
    
print(f"[FINALizado] Índice final registrado en el sistema: {indice_eficiencia}")
Sentencia while_basico CONTROL DE FLUJO

Bucle While: Fundamentos y Contadores

Contexto de Negocio

Aprender cómo un contador controla la vida de un bucle para evitar ciclos infinitos.

Justificación Lógica

El uso de variables de control (contadores) es el mecanismo más básico para dar fin a un bucle condicional.

sandbox_python py
# --- EJEMPLO 1: EL CONTADOR ESTÁNDAR ---
print('--- Inicio del Contador ---')
contador = 1  # Inicialización de la variable de control

while contador <= 10:  # Condición de parada
    print(f'Iteración actual: {contador}')
    
    # Es crítico modificar la variable de control
    # Si olvidamos esta línea, el bucle será infinito
    contador = contador + 1 

print('Bucle finalizado con éxito.\n')

# --- EJEMPLO 2: CUENTA REGRESIVA CON PASO VARIABLE ---
print('--- Lanzamiento de Cohete ---')
cuenta_regresiva = 10

while cuenta_regresiva > 0:
    print(f'T-Minus {cuenta_regresiva} segundos...')
    cuenta_regresiva -= 1  # Forma corta de restar 1

print('¡Despegue! 🚀\n')

# --- EJEMPLO 3: ACUMULADOR DENTRO DE WHILE ---
print('--- Suma de Números Consecutivos ---')
limite = 5
numero_actual = 1
suma_total = 0  # Esta variable acumula los valores

while numero_actual <= limite:
    print(f'Sumando {numero_actual} a la suma total ({suma_total})')
    suma_total += numero_actual
    numero_actual += 1

print(f'La suma total de los números del 1 al {limite} es: {suma_total}')
Sentencia while_flags CONTROL DE FLUJO

Bucle While: Control por Eventos y Banderas (Flags)

Contexto de Negocio

Controlar un bucle mediante el estado de una variable booleana que cambia cuando ocurre un evento.

Justificación Lógica

En desarrollo de software, las banderas (flags) permiten apagar procesos complejos de manera limpia cuando se cumple una condición del sistema.

sandbox_python py
# --- EJEMPLO 1: CONTROL CON BANDERA BOOLEANA ---
sistema_operativo_corriendo = True
ciclos_de_mantenimiento = 0

while sistema_operativo_corriendo:
    ciclos_de_mantenimiento += 1
    print(f'[INFO] Ejecutando análisis de rutina... Ciclo: {ciclos_de_mantenimiento}')
    
    # Simulamos que en el ciclo 4 el sistema decide apagarse
    if ciclos_de_mantenimiento == 4:
        print('[ALERTA] Se detectó solicitud de apagado seguro.')
        sistema_operativo_corriendo = False # Cambiamos el estado de la bandera

print('Sistema apagado limpiamente.\n')

# --- EJEMPLO 2: VALIDACIÓN DE ENTRADAS DE USUARIO ---
# Un caso de uso diario: obligar al usuario a ingresar lo que pedimos
entrada_valida = False

while not entrada_valida:
    edad_texto = input('Por favor, introduce tu edad (debe ser un número): ')
    
    # .isdigit() verifica si el texto contiene solo números
    if edad_texto.isdigit():
        edad = int(edad_texto)
        if edad >= 0 and edad <= 120:
            entrada_valida = True  # Rompemos el ciclo validando la bandera
            print(f'Edad registrada exitosamente: {edad}')
        else:
            print('Error: La edad debe estar entre 0 y 120 años.')
    else:
        print('Error: Eso no parece un número válido.')
Sentencia for_listas CONTROL DE FLUJO

Bucle For: Recorriendo Colecciones e Indexación

Contexto de Negocio

Extraer y operar con elementos almacenados en estructuras secuenciales de datos.

Justificación Lógica

El bucle for extrae automáticamente los elementos uno a uno, eliminando la necesidad de manejar manualmente un índice de posición.

sandbox_python py
# --- EJEMPLO 1: RECORRIDO BÁSICO DE LISTA ---
nombres = ['Ana', 'Carlos', 'Diana', 'Eduardo', 'Fernanda']
print('--- Lista de Invitados ---')
for nombre in nombres:
    # La variable 'nombre' toma el valor de cada elemento en cada vuelta
    print(f'Bienvenido/a a la fiesta, {nombre}!')
print('')

# --- EJEMPLO 2: OPERACIONES MATEMÁTICAS EN LISTAS ---
precios_usd = [10.0, 25.5, 4.99, 99.90, 15.0]
tasa_cambio = 920.0  # Conversión simulada de moneda
precios_locales = []

print('--- Procesando Conversión de Precios ---')
for precio in precios_usd:
    precio_convertido = precio * tasa_cambio
    precios_locales.append(precio_convertido)
    print(f'USD {precio} -> Local ${precio_convertido:,.2f}')
print(f'Lista final procesada: {precios_locales}\n')

# --- EJEMPLO 3: FILTRADO DE DATOS DENTRO DE UN FOR ---
calificaciones = [85, 42, 90, 60, 55, 78, 100, 33]
aprobados = 0
reprobados = 0

print('--- Auditoría de Calificaciones ---')
for nota in calificaciones:
    if nota >= 60:
        print(f'Nota {nota}: APROBADO')
        aprobados += 1
    else:
        print(f'Nota {nota}: REPROBADO')
        reprobados += 1

print(f'\nResumen: {aprobados} estudiantes aprobaron y {reprobados} reprobaron.')
Sentencia for_range CONTROL DE FLUJO

Bucle For con Range: Parámetros Avanzados (Start, Stop, Step)

Contexto de Negocio

Generar secuencias numéricas personalizadas para iteraciones controladas por rangos aritméticos.

Justificación Lógica

La función range(inicio, fin, paso) optimiza el uso de memoria ya que no crea la lista entera en el sistema, sino que genera los números al vuelo.

sandbox_python py
# --- EJEMPLO 1: RANGE CON UN SOLO PARÁMETRO (STOP) ---
# Nota: Comienza por defecto en 0 y es exclusivo (no incluye el número final)
print('--- Rango Simple (0 al 4) ---')
for i in range(5):
    print(f'Valor de i: {i}')
print('')

# --- EJEMPLO 2: RANGE CON START Y STOP ---
print('--- Rango con Inicio y Fin (5 al 10) ---')
for x in range(5, 11):
    print(f'Valor de x: {x}')
print('')

# --- EJEMPLO 3: RANGE CON STEP (PASO / SALTO) ---
print('--- Números Pares del 2 al 20 ---')
# El tercer parámetro indica que irá de 2 en 2
for par in range(2, 21, 2):
    print(f'{par} es un número par.')
print('')

# --- EJEMPLO 4: RANGE INVERTIDO (HACIA ATRÁS) ---
print('--- Conteo Regresivo con Range ---')
# Para ir hacia atrás, el paso (step) debe ser negativo
for reversa in range(10, 0, -1):
    print(f'Contador en reversa: {reversa}')
print('¡Fuego! 💥\n')

# --- EJEMPLO 5: COMBINAR RANGE CON EL LARGO DE UNA LISTA ---
print('--- Modificación por Índice ---')
productos = ['Laptop', 'Mouse', 'Teclado']
stock = [10, 50, 22]

# len(productos) nos da 3, por lo que range(3) genera: 0, 1, 2
for indice in range(len(productos)):
    print(f'Producto en posición {indice}: {productos[indice]} | Stock disponible: {stock[indice]} unidades.')
Sentencia while_true_break CONTROL DE FLUJO

Bucle While True: Menús de Consola y Centinelas

Contexto de Negocio

Estructurar la arquitectura básica de un programa interactivo por consola que responde a comandos continuos del usuario.

Justificación Lógica

While True crea un ciclo infinito teórico. Depende de la evaluación interna de un condicional asociado al comando 'break' para destruir el ciclo.

sandbox_python py
# --- EJEMPLO 1: CALCULADORA BÁSICA INTERACTIVA ---
saldo_cuenta = 1000.0

while True:
    print('\n=== CAJERO AUTOMÁTICO SIMULADO ===')
    print('1. Ver saldo disponible')
    print('2. Depositar dinero')
    print('3. Retirar dinero')
    print('4. Salir del sistema')
    
    opcion = input('Selecciona una opción (1-4): ')
    
    if opcion == '1':
        print(f'Tu saldo actual es de: ${saldo_cuenta:.2f}')
    
    elif opcion == '2':
        monto_deposito = input('Monto a depositar: ')
        if monto_deposito.replace('.', '', 1).isdigit():
            saldo_cuenta += float(monto_deposito)
            print(f'Depósito exitoso. Nuevo saldo: ${saldo_cuenta:.2f}')
        else:
            print('Monto inválido.')
            
    elif opcion == '3':
        monto_retiro = input('Monto a retirar: ')
        if monto_retiro.replace('.', '', 1).isdigit():
            monto_f = float(monto_retiro)
            if monto_f <= saldo_cuenta:
                saldo_cuenta -= monto_f
                print(f'Retiro exitoso. Retiraste: ${monto_f:.2f}')
            else:
                print('Fondos insuficientes.')
        else:
            print('Monto inválido.')
            
    elif opcion == '4':
        print('Gracias por usar nuestro servicio financiero virtual. ¡Hasta luego!')
        break  # Rompe el bucle 'While True' inmediatamente finalizando el menú
        
    else:
        print('Opción inválida. Intenta nuevamente seleccionando del 1 al 4.')

print('El flujo del programa continuó aquí afuera del While True.')
Sentencia break_continue CONTROL DE FLUJO

Modificadores de Ciclo: Control con Break y Continue

Contexto de Negocio

Alterar el comportamiento natural de cualquier bucle (for o while) basándose en condiciones dinámicas.

Justificación Lógica

'break' termina el ciclo por completo. 'continue' aborta únicamente la iteración actual y salta directo a la siguiente vuelta.

sandbox_python py
# --- EJEMPLO 1: USO DE CONTINUE PARA EVITAR ERRORES O FILTRAR ---
print('--- Filtro de Números Impares (Solo imprimiremos pares) ---')
for numero in range(1, 11):
    if numero % 2 != 0:
        # Si es impar, 'continue' ignora el resto del código abajo
        # y pasa inmediatamente al siguiente número de la secuencia
        continue 
    print(f'Número par encontrado: {numero}')
print('')

# --- EJEMPLO 2: USO DE BREAK EN BÚSQUEDA DE DATOS ---
print('--- Escáner de Seguridad de Archivos ---')
archivos_servidor = ['foto.png', 'documento.pdf', 'virus.exe', 'musica.mp3', 'tabla.xlsx']

for archivo in archivos_servidor:
    print(f'Analizando archivo: {archivo}')
    if archivo == 'virus.exe':
        print('[PELIGRO] ¡Amenaza detectada! Deteniendo escaneo del servidor de inmediato...')
        break # Detiene por completo el bucle 'for', los archivos siguientes no se analizan
    print(f'Archivo {archivo} limpio.')

print('Proceso de escaneo finalizado.')
Sentencia anidados CONTROL DE FLUJO

Bucles Anidados: Bucles dentro de Bucles

Contexto de Negocio

Trabajar con estructuras complejas como coordenadas, matrices bidimensionales o combinaciones algebraicas.

Justificación Lógica

Por cada iteración del bucle externo, el bucle interno se ejecuta por completo desde el principio hasta el final.

sandbox_python py
# --- EJEMPLO 1: MATRIZ DE COORDENADAS (X, Y) ---
print('--- Generando Grilla de Coordenadas 3x2 ---')
# Bucle Externo (filas / eje X)
for x in range(1, 4):
    # Bucle Interno (columnas / eje Y)
    for y in range(1, 3):
        print(f'Punto en el espacio -> (X: {x}, Y: {y})')
print('')

# --- EJEMPLO 2: TABLAS DE MULTIPLICAR COMPLETA ---
print('--- Generador de Tablas del 1 al 3 ---')
for tabla in range(1, 4):
    print(f'\n** Tabla del {tabla} **')
    for multiplicador in range(1, 11):
        resultado = tabla * multiplicador
        print(f'{tabla} x {multiplicador} = {resultado}')
print('\nFin del generador de tablas.')
Sentencia Concepto Listas ESTRUCTURAS DE DATOS

Arreglos y Listas: Fundamentos de la Agrupación de Datos

Contexto de Negocio

¿Para qué sirve y por qué existe? Imagina administrar un concesionario de autos o una escuela. Sin listas, tendrías que crear variables individuales infinitas (auto1, auto2, auto3...). Las listas existen para resolver el caos del desbordamiento de variables independientes, permitiendo agrupar colecciones masivas de información bajo un único nombre de referencia común.

Justificación Lógica

¿Qué resuelve y por qué es importante? Resuelve la gestión de datos dinámicos en la memoria RAM. En lugar de fragmentar los datos, una lista guarda las referencias de los objetos de manera secuencial. Es vital porque introduce los conceptos de indexación (posiciones numéricas que inician desde el cero) y mutabilidad, permitiendo que tu software crezca, se ordene y sea analizado mediante bucles de forma automatizada.

sandbox_python py
# --- POR QUÉ EXISTE: COMPARATIVA DE ARQUITECTURA ---

# Forma ineficiente (Sin listas): Caos de variables aisladas
auto1 = 'Toyota Yaris'
auto2 = 'Hyundai Accent'
auto3 = 'Suzuki Swift'
# Operar esto requiere escribir código repetitivo para cada variable.

# Forma eficiente (Con listas de Python):
inventario_autos = ['Toyota Yaris', 'Hyundai Accent', 'Suzuki Swift']

# Demostración de por qué es importante: Procesamiento automatizado
print('--- Desplegando Inventario de Autos desde una Estructura Única ---')
for posicion, auto in enumerate(inventario_autos):
    print(f'Índice o Casillero [{posicion}] -> Modelo: {auto}')

print(f'\nTotal de elementos indexados en memoria: {len(inventario_autos)}')
print('Resolución: Todas las variables aisladas ahora viven en una estructura limpia, ordenada y escalable.')
Sentencia Listas CRUD ESTRUCTURAS DE DATOS

Persistencia en Memoria: Operaciones CRUD sobre Listas

Contexto de Negocio

Simulación del ciclo de vida de registros dinámicos del negocio (Agregar, Listar, Actualizar y Eliminar) antes de comprometerlos en una base de datos física.

Justificación Lógica

Las listas de Python permiten mutabilidad directa sobre sus índices en tiempo de ejecución O(1) para la lectura/escritura y O(N) para la búsqueda/eliminación secuencial.

sandbox_python py
# --- ENTIDAD: ALUMNOS (Gestión de Matrículas) ---
alumnos = ['Ana Silva', 'Carlos Pérez', 'María Vial']
print(f'Listar (Inicial): {alumnos}')

# Agregar (Create)
alumnos.append('Diego Soto')
print(f'Agregar (.append): {alumnos}')

# Actualizar (Update)
alumnos[1] = 'Carlos Pérez-Cotapos'  # Modificamos la posición 1
print(f'Actualizar ([índice]): {alumnos}')

# Eliminar (Delete)
alumnos.remove('María Vial')
print(f'Eliminar (.remove): {alumnos}')

print('\n' + '='*40 + '\n')

# --- ENTIDAD: AUTOS (Gestión de Stock / Concesionario) ---
autos = ['Toyota Yaris', 'Hyundai Accent', 'Suzuki Swift']
print(f'Listar Autos: {autos}')

# Agregar nuevo vehículo al inventario
autos.append('Mazda 3')
print(f'Nuevo Stock: {autos}')

# Actualizar vehículo vendido por su modelo nuevo por índice
autos[0] = 'Toyota Yaris Cross'
print(f'Inventario Actualizado: {autos}')

# Eliminar vehículo despachado por completo
autos.pop(2)  # Remueve el elemento en la posición 2 (Suzuki Swift)
print(f'Stock tras Venta (.pop): {autos}')
Sentencia Procesos Listas ESTRUCTURAS DE DATOS

Algoritmia de Colecciones: Métodos Comunes y Procesamiento Numérico

Contexto de Negocio

Procesamiento analítico de registros para la toma de decisiones financieras o estadísticas internas.

Justificación Lógica

Utilizar funciones core e integradas de Python (como sum, len, sort) optimiza drásticamente los ciclos de cómputo del servidor.

sandbox_python py
# --- ENTIDAD: PRECIO DE LA BENCINA (Valores Enteros en CLP) ---
precios_bencina = [1250, 1310, 1190, 1420, 1280]
print(f'Historial de Precios Base: {precios_bencina}')

# 1. Encontrar el precio más alto (Máximo)
precio_maximo = max(precios_bencina)
print(f'Precio Máximo detectado: ${precio_maximo}')

# 2. Encontrar el precio más bajo (Mínimo)
precio_minimo = min(precios_bencina)
print(f'Precio Mínimo detectado: ${precio_minimo}')

# 3. Calcular el promedio de la bencina (Suma / Cantidad)
suma_total = sum(precios_bencina)
cantidad_registros = len(precios_bencina)
promedio = int(suma_total / cantidad_registros)  # Forzado a entero según requerimiento
print(f'Promedio del mercado de combustibles: ${promedio}')

# 4. Ordenar el histórico de menor a mayor
precios_bencina.sort()
print(f'Historial Ordenado Ascendente (.sort): {precios_bencina}')

# 5. Invertir el orden (Mayor a menor)
precios_bencina.reverse()
print(f'Historial Ordenado Descendente (.reverse): {precios_bencina}')
Sentencia Archivos I/O PERSISTENCIA Y MODULARIDAD

Persistencia Física: Lectura de Archivos Plano (TXT) y Estructurados (CSV)

Contexto de Negocio

El software del servidor necesita extraer información guardada en el disco duro de la máquina para cargarla a memoria e iterarla con bucles for.

Justificación Lógica

El manejo de flujos de archivos con la sentencia 'with open' garantiza el cierre automático del puntero del sistema operativo, evitando fugas de memoria (memory leaks).

sandbox_python py
# Simulando creación física interna de archivos para el entorno sandbox
with open('alumnos.txt', 'w') as txt_file:
    txt_file.write('Ana Silva\nCarlos Perez\nDiego Soto\n')

with open('bencina.csv', 'w') as csv_file:
    csv_file.write('dia,precio\nLunes,1250\nMartes,1310\nMiercoles,1190\n')

# --- 1. LECTURA DE TXT LINEA POR LINEA CON FOR Y LISTAS ---
print('--- Procesando alumnos.txt ---')
lista_alumnos = []
with open('alumnos.txt', 'r') as archivo_txt:
    for linea in archivo_txt:
        # strip() elimina los saltos de línea '\n'
        alumno_limpio = linea.strip()
        lista_alumnos.append(alumno_limpio)

print(f'Lista RAM finalizada desde TXT: {lista_alumnos}\n')

# --- 2. LECTURA DE CSV CON FILTROS E HISTOGRAMA ---
print('--- Procesando bencina.csv ---')
import csv
historial_precios = []
with open('bencina.csv', mode='r') as archivo_csv:
    lector = csv.reader(archivo_csv)
    header = next(lector) # Saltamos los títulos de las columnas
    
    for fila in lector:
        dia = fila[0]
        precio_entero = int(fila[1]) # Conversión explícita a entero
        historial_precios.append(precio_entero)
        print(f'Cargado -> Dia: {dia} | Valor extraído: ${precio_entero}')

print(f'Mapeo final de bencina guardado en lista: {historial_precios}')
Sentencia Funciones def PERSISTENCIA Y MODULARIDAD

Modularidad de Algoritmos: Definición y Retorno de Funciones Reutilizables

Contexto de Negocio

Escribir código repetitivo degrada la mantenibilidad del software. Las funciones permiten empaquetar bloques lógicos aislados.

Justificación Lógica

El uso de la instrucción 'def' y 'return' promueve el principio DRY (Don't Repeat Yourself) y encapsula el comportamiento del sistema bajo un alcance (scope) local seguro.

sandbox_python py
# Definición de subprocesos reutilizables
def calcular_promedio_combustible(lista_precios):
    """Calcula el precio promedio asegurando retorno entero"""
    if len(lista_precios) == 0:
        return 0
    return int(sum(lista_precios) / len(lista_precios))

def buscar_vehiculo_inventario(lista_autos, auto_buscado):
    """Evalúa la existencia de un elemento devolviendo un booleano"""
    if auto_buscado in lista_autos:
        return f'✅ {auto_buscado} está disponible en sala de ventas.'
    else:
        return f'❌ Lo sentimos, {auto_buscado} no registra stock.'

# --- EJECUCIÓN UNITARIA DE NUESTRAS FUNCIONES ---
stock_autos = ['Toyota Yaris', 'Hyundai Accent', 'Mazda 3']
precios_semana = [1200, 1340, 1290, 1150]

# Invocar funciones pasando parámetros posicionales
resultado_busqueda = buscar_vehiculo_inventario(stock_autos, 'Mazda 3')
promedio_bencina = calcular_promedio_combustible(precios_semana)

print('--- Ejecución Modular del Sistema ---')
print(resultado_busqueda)
print(f'Promedio procesado por la función: ${promedio_bencina}')