Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Programación orientada a datos con Python, Unidad 6 — Programación funcional aplicada a datos, 6.3 — Expresividad del código ·

Código declarativo

Código declarativo

Introducción

La programación declarativa se enfoca en describir lo que se debe lograr, en lugar de cómo hacerlo paso a paso. Esto es especialmente valioso cuando se trabaja con datos complejos y largos procesos de análisis. En Python, la programación funcional ofrece herramientas declarativas poderosas para manejar estos escenarios, permitiendo un código más limpio y legible.

Explicación principal

Concepto del Código Declarativo

En el paradigma declarativo, se describe lo que se desea lograr a través de una serie de sentencias o declaraciones. Esto contrasta con la programación imperativa, donde se especifican los detalles de cómo hacerlo paso a paso. La declaratividad permite al compilador o intérprete decidir el mejor camino para alcanzar el resultado.

Ejemplo en Python

Considere un conjunto de datos que contiene información sobre ventas y costos:

ventas = [
    {'producto': 'A', 'precio': 10, 'costo': 5},
    {'producto': 'B', 'precio': 20, 'costo': 10}
]

def calcula_ganancia(producto):
    return producto['precio'] - producto['costo']

# Imperativa
ganancias = []
for venta in ventas:
    ganancia = calcula_ganancia(venta)
    ganancias.append(ganancia)

print(ganancias) # [5, 10]

# Declarativo (usando `map`)
ganancias = list(map(lambda venta: venta['precio'] - venta['costo'], ventas))
print(ganancias) # [5, 10]

En el ejemplo imperativo, se itera manualmente a través de la lista y aplica una función a cada elemento. En cambio, en la versión declarativa con map, se describe el proceso de manera más concisa.

Usos comunes

  • Transformaciones de datos: Aplicar operaciones a elementos iterables.
  • Agrupación e agregación: Calcular estadísticas agregadas sobre conjuntos de datos.
  • Limpieza y transformación de datos: Procesar datos en secuencias de transformaciones declarativas.

Errores típicos / trampas

  1. Captura accidental de variables locales:
   def f():
       x = 5
       return map(lambda y: y + x, [1, 2, 3])

   print(list(f())) # Se imprime [6, 7, 8] pero podría ser confuso si `x` es local

   def g():
       x = 5
       return (y + x for y in [1, 2, 3])

   print(tuple(g())) # (6, 7, 8)

Usar generadores (g) en lugar de funciones map para evitar problemas con la captura de variables.

  1. Operaciones inmutables:
   lista = [1, 2, 3]
   map(lambda x: x + 1, lista) # No modifica lista original

   for i, val in enumerate(lista):
       lista[i] += 1 # Modifica lista original

Recordar que map no modifica la lista original y preferir mutaciones explícitas cuando sean necesarias.

  1. Desempeño:
   import time

   start = time.time()
   map(lambda x: time.sleep(0.1), range(10)) # Puede ser ineficiente
   print(time.time() - start)

   start = time.time()
   for _ in range(10):
       time.sleep(0.1)
   print(time.time() - start) # Mejor desempeño para operaciones lentas

Checklist accionable

  • Defina el problema declarativamente: Trate de describir lo que desea lograr en lugar de cómo hacerlo.
  • Use map y filter con funciones lambda: Para aplicar transformaciones a datos iterables.
  • Evite capturas accidental de variables locales: Use generadores para evitar problemas.
  • Mantenga la legibilidad: Asegúrese de que el código sea fácil de entender, incluso después de un tiempo.
  • Optimice según desempeño: Verifique si las operaciones declarativas están afectando negativamente el rendimiento.

Cierre

La programación declarativa es una poderosa herramienta en la programación orientada a datos. Al declarar lo que se desea lograr, no solo se mejora la legibilidad del código sino también su mantenibilidad y escalabilidad. Aplicándola correctamente, puede mejorar significativamente la eficacia de tus pipelines de análisis de datos.

Siguientes pasos

  • Repase los conceptos: Familiarízate con las funciones declarativas map, filter y reduce.
  • Practique con ejemplos reales: Aplica estos conceptos a datasets más grandes y complejos.
  • Analice el rendimiento: Evalúe si la programación declarativa mejora o empeora el desempeño en tus tareas de análisis de datos.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).