Funciones y Matemáticas en Python
Si llevas tres días copiando y pegando el mismo bloque de código, ya tienes el problema identificado. En infraestructura, copiar lógica es un antipatrón con fecha de caducidad. Las funciones lo cortan de raíz.
Antes de definir una función, conviene tener claro con qué material va a trabajar. En scripts de infraestructura ese material casi siempre son números: capacidad de un clúster, costo por hora, margen de RAM disponible. No son casos pedagógicos inventados. Son los cálculos que aparecen en cualquier script de aprovisionamiento real.
Operaciones Aritméticas Base
# Definamos la capacidad de memoria de dos nodos en GB
node_a_ram = 16
node_b_ram = 32
# Suma: Capacidad total del clúster
print(node_a_ram + node_b_ram)
# Resultado: 48
# Resta: Diferencia de capacidad
print(node_b_ram - node_a_ram)
# Resultado: 16
# Multiplicación: Capacidad total si escalamos node_a a 5 instancias
print(node_a_ram * 5)
# Resultado: 80
# División: Porcentaje de uso si consumimos 12GB en node_b
print(12 / node_b_ram)
# Resultado: 0.375 (37.5%)
Funciones en Python
def es la palabra reservada para declarar una función. Que retorne un valor con return no es opcional si el resultado te importa. Sin return, la función hace su trabajo y tira el resultado a la basura. Literalmente devuelve None.
def nombre_de_la_funcion(parametros):
# Lógica de procesamiento
resultado = "algo calculado"
return resultado
Con esa estructura en mente, dos funciones que uso frecuentemente al enseñar este tema: costo mensual de una instancia y densidad de contenedores por host. Son ejemplos directos, sin artificios.
def calcular_coste_mensual(precio_por_hora, horas_activas):
"""Calcula el coste de ejecución mensual de una instancia."""
return precio_por_hora * horas_activas
def calcular_densidad_contenedores(ram_total_host, ram_por_contenedor):
"""Determina cuántos contenedores caben en un host físico."""
return ram_total_host / ram_por_contenedor
Una vez definidas, las llamas con los valores concretos de cada caso.
# Instancia encendida 730 horas al mes a $0.04 la hora
coste_instancia = calcular_coste_mensual(0.04, 730)
print(f"Coste mensual: ${coste_instancia}")
# Resultado: Coste mensual: $29.2
# Servidor con 64GB de RAM alojando contenedores de 2GB
contenedores_maximos = calcular_densidad_contenedores(64, 2)
print(f"Capacidad máxima de contenedores: {contenedores_maximos}")
# Resultado: Capacidad máxima de contenedores: 32.0
Manejo de Tipos y Errores Básicos
Python no valida tipos en la firma de la función. Eso tiene un costo. Los errores no aparecen cuando defines la función ni cuando la importas, sino cuando el intérprete intenta ejecutar la operación con datos incompatibles. A veces eso ocurre en producción, con datos reales, en el peor momento posible.
El caso más frecuente que veo en clase: alguien pasa texto donde se esperaba un número.
calcular_densidad_contenedores(64, "dos_gigas")
Resultado en tiempo de ejecución:
TypeError: unsupported operand type(s) for /: ‘int’ and ‘str’
El mensaje es preciso. Dice exactamente qué operación falló y con qué tipos. El problema no es la claridad del error, sino cuándo llega. Más adelante en la serie veremos cómo validar parámetros y manejar excepciones para atrapar esto antes de que el script colapse.