Maestría en Python

Bienvenido al nivel superior. Aquí dejaremos de escribir código que "funciona" para escribir código que es eficiente, escalable y profesional.

1. Entornos Virtuales: El Taller del Profesional

En el curso básico instalamos Python globalmente. Pero, ¿qué pasa si el Proyecto A necesita la versión 1.0 de una librería y el Proyecto B necesita la versión 2.0? Ahí entra el Entorno Virtual.

🛠 Concepto: Aislamiento Imagina que cada proyecto tiene su propia caja de herramientas. Si rompes una herramienta en la caja A, la caja B sigue perfecta.
# 1. Crear el entorno (en la terminal)
python -m venv mi_entorno

# 2. Activar el entorno (Windows)
mi_entorno\Scripts\activate

# 2. Activar el entorno (Mac/Linux)
source mi_entorno/bin/activate

# 3. Ahora, lo que instales solo existe aquí
pip install requests

2. Profundizando en Comprehensions

Ya vimos lo básico. Ahora haremos magia con diccionarios y condiciones anidadas.

Dictionary Comprehension

Intercambiar claves y valores de un diccionario en una línea.

monedas = {"USD": 1.0, "EUR": 0.9, "GBP": 0.8}

# Invertir el diccionario: {1.0: "USD", ...}
invertido = {valor: clave for clave, valor in monedas.items()}

print(invertido)

3. Iteradores y Generadores: Ahorrando Memoria

Si tienes que procesar 1 millón de datos, una lista normal colapsaría tu memoria RAM. Un Generador procesa los datos de uno en uno.

⚡ Palabra Clave: yield A diferencia de return que acaba la función, yield "pausa" la función y entrega un valor, guardando su estado para la próxima vez.
def generador_infinito():
    num = 0
    while True:
        yield num
        num += 1

# Uso del generador
gen = generador_infinito()

print(next(gen)) # Imprime 0
print(next(gen)) # Imprime 1
# No ocupa memoria aunque sea infinito

4. Decoradores: Modificando Funciones

Los decoradores son funciones que "envuelven" a otras funciones para cambiar su comportamiento sin tocar su código interno.

⏱ Ejemplo Práctico: Medir tiempo Vamos a crear un decorador que nos diga cuánto tarda en ejecutarse cualquier función.
import time

# Definimos el decorador
def cronometro(funcion):
    def envoltura():
        inicio = time.time()
        funcion() # Ejecutamos la función original
        fin = time.time()
        print(f"Tiempo total: {fin - inicio} segundos")
    return envoltura

# Usamos el decorador con @
@cronometro
def tarea_pesada():
    time.sleep(2)
    print("¡Tarea terminada!")

tarea_pesada() 
# Salida: 
# ¡Tarea terminada!
# Tiempo total: 2.00xxxx segundos

5. POO Avanzada: Métodos Mágicos (Dunder Methods)

¿Alguna vez te has preguntado por qué puedes sumar dos números con `+` o imprimir un objeto? Son los Double Underscore Methods.

class Caja:
    def __init__(self, items):
        self.items = items

    # __str__: Define cómo se ve el objeto al hacer print()
    def __str__(self):
        return f"Caja con {self.items} cosas"

    # __len__: Define qué pasa si usamos len() en el objeto
    def __len__(self):
        return self.items

mi_caja = Caja(50)
print(mi_caja)      # Imprime: Caja con 50 cosas
print(len(mi_caja)) # Imprime: 50

6. Concurrencia: Asyncio (Async / Await)

Python tradicional lee el código línea por línea y espera. Asyncio permite que, mientras espera una descarga de internet, el procesador haga otras cosas.

Imagina un camarero: No espera en la cocina a que se cocine el plato, va a atender otra mesa mientras tanto.

import asyncio

async def descargar_datos():
    print("Iniciando descarga...")
    await asyncio.sleep(2) # Simula espera de red
    print("¡Datos descargados!")

async def main():
    # Ejecutar la tarea asíncrona
    await descargar_datos()

# En Python 3.7+
asyncio.run(main())

7. Testing: Código a prueba de balas

No eres un experto hasta que no testeas tu código. Usaremos unittest, que viene instalado en Python.

import unittest

def multiplicar(a, b):
    return a * b

class TestCalculadora(unittest.TestCase):
    
    def test_multiplicacion(self):
        resultado = multiplicar(10, 5)
        # Afirmamos que el resultado DEBE ser 50
        self.assertEqual(resultado, 50)

if __name__ == '__main__':
    unittest.main()

🚀 Tu viaje no termina aquí

Ya eres un experto en el lenguaje. Ahora toca especializarse y construir cosas reales.

Ver Especializaciones (Web, Data y Apps) ➡