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.
# 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.
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.
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) ➡