CURSO
PYTHON INTERMEDIO
Luis Sigueñas
TelecSA
Creación de clases y objetos
• Clases y Objetos: Una clase es un modelo o plantilla para crear objetos, mientras que un objeto es una
instancia concreta de una clase.
• Herencia: Permite a las clases (clases hijas) heredar atributos y métodos de otras clases (clases
padres), promoviendo la reutilización de código.
• Polimorfismo: Permite que objetos de diferentes clases respondan de manera diferente a un mismo
método, creando flexibilidad en el código.
• Encapsulación: Oculta los datos y métodos internos de una clase, controlando el acceso a ellos para
proteger la integridad de los objetos.
• Abstracción: Oculta la complejidad interna de una clase, exponiendo solo la funcionalidad necesaria
para el usuario.
Ejemplo: Gestión de empleados
import random
#proporciona funciones para generar números pseudoaleatorios
Clases y Objetos:
Clase: Plantilla/blueprint que define atributos y métodos
Objeto: Instancia concreta de una clase
Atributos y Métodos:
Atributos: Variables que pertenecen a la clase/objeto
Métodos: Funciones definidas dentro de la clase
Constructor (__init__):
Método especial que se ejecuta al crear un objeto
Encapsulamiento:
Ocultar detalles internos (convención _ para atributos "privados")
class Empleado: Crear una clase Producto con:
def __init__(self, nombre, puesto, salario):
[Link] = nombre Atributos: nombre, precio,
[Link] = puesto cantidad_en_stock
self._salario = salario # Atributo "protegido"
Métodos: mostrar_info(),
def mostrar_informacion(self): vender(cantidad),
return f"{[Link]} - {[Link]} - Salario: ${self._salario}" reponer(cantidad)
def aumentar_salario(self, porcentaje):
self._salario *= (1 + porcentaje/100)
return f"Nuevo salario: ${self._salario:.2f}"
# Creación de objetos
empleado1 = Empleado("Ana López", "Desarrolladora", 50000)
empleado2 = Empleado("Carlos Ruiz", "Analista", 45000)
# Uso de métodos
print(empleado1.mostrar_informacion())
print(empleado2.aumentar_salario(10))
Threading Básico
El uso de threading básico es fundamental en escenarios donde necesitamos mejorar la eficiencia de
nuestros scripts de automatización.
Ejecución Concurrente de Tareas
• Permite ejecutar múltiples comandos de Shell simultáneamente
• Reduce significativamente el tiempo total de ejecución
• Ideal para operaciones I/O bound (como ejecución de comandos externos)
Mejor Aprovechamiento de Recursos
• Optimiza el uso de CPU durante tiempos de espera
• Permite que el programa siga respondiendo mientras se ejecutan comandos largos
Implementación Sencilla en PyCharm
• PyCharm ofrece excelente soporte para depuración de hilos
• Visualización clara de la ejecución concurrente
Threading Básico
Beneficio Explicación Ejemplo Bancario
Mayor velocidad en tareas Ejecutar múltiples operaciones al Procesar transacciones de
concurrentes mismo tiempo. diferentes clientes en paralelo.
No bloquear el programa principal
Consultar saldos en múltiples
Optimización de recursos mientras se esperan respuestas
cuentas sin bloquear la interfaz.
externas.
Manejar muchas solicitudes sin crear Procesar miles de solicitudes de
Escalabilidad procesos separados (más eficiente tarjetas de crédito
que multiprocessing para I/O). simultáneamente.
Más fácil de implementar
Automatizar reportes diarios con
Simplicidad que asyncio o multiprocessing para
comandos Shell.
casos básicos.
Threading Básico
Se recomienda usar threading en estos escenarios:
• Procesamiento de transacciones en paralelo (ejecutar múltiples transferencias al mismo tiempo).
• Generación de reportes automatizados (backups, logs, balances).
• Consultas simultáneas a bases de datos (saldos, movimientos, clientes).
• Monitoreo en tiempo real (espacio en disco, uso de CPU, logs de errores).
• Ejecución de comandos Shell concurrentes (respaldo de datos, análisis de registros).
¿Cuándo NO usarlo?
• Para tareas intensivas en CPU (mejor usar multiprocessing).
• Si las operaciones requieren orden estricto (los hilos no garantizan secuencialidad).
Threading Básico
Se recomienda usar threading en estos escenarios:
• Procesamiento de transacciones en paralelo (ejecutar múltiples transferencias al mismo tiempo).
• Generación de reportes automatizados (backups, logs, balances).
• Consultas simultáneas a bases de datos (saldos, movimientos, clientes).
• Monitoreo en tiempo real (espacio en disco, uso de CPU, logs de errores).
• Ejecución de comandos Shell concurrentes (respaldo de datos, análisis de registros).
¿Cuándo NO usarlo?
• Para tareas intensivas en CPU (mejor usar multiprocessing).
• Si las operaciones requieren orden estricto (los hilos no garantizan secuencialidad).
Ejemplo
Un banco necesita:
• Respaldar bases de datos de clientes.
• Procesar archivos de transacciones diarias.
• Verificar el espacio en disco del servidor.
¿Qué se entiende por concurrencia?
Asyncio
Es un módulo de Python diseñado para escribir código
concurrente utilizando corrutinas (funciones asíncronas) y el
paradigma de programación asíncrona.
Su principal objetivo es manejar operaciones de E/S
(Input/Output) sin bloqueo, como:
• Solicitudes HTTP (APIs)
• Consultas a bases de datos
• Lectura/escritura de archivos
• Conexiones de red (sockets, WebSockets)
• Procesamiento de múltiples tareas en paralelo sin usar
múltiples hilos (threading).
Asyncio
1. Eficiencia en operaciones de E/S (I/O Bound)
• Cuando un programa realiza operaciones de entrada/salida (como esperar una respuesta de una
API o leer un archivo), el código tradicional se bloquea hasta que la operación termine.
• Con asyncio, Python puede pausar la tarea actual y ejecutar otras tareas mientras espera,
mejorando el rendimiento.
2. Menos sobrecarga que los hilos (threading)
• Los hilos (threading) consumen más memoria y pueden generar problemas de sincronización (race
conditions).
• asyncio usa un solo hilo y alterna entre tareas, evitando problemas de concurrencia.
3. Ideal para servidores y aplicaciones en red
• Servidores web (FastAPI, Quart, aiohttp)
• Scrapers y bots que hacen múltiples peticiones HTTP.
• Procesamiento de datos en tiempo real (WebSockets, MQTT).
Asyncio: Conceptos clave
1. Corrutinas (async def)
Son funciones que pueden pausar su ejecución con await y luego reanudarse.
async def mi_funcion():
print("Inicio")
await [Link](1) # Simula una operación de E/S
print("Fin después de 1 segundo")
2. await (esperar una operación asíncrona)
Indica que el programa puede hacer otras cosas mientras espera a que termine una operación (como una
petición HTTP o una consulta a la BD).
await [Link](2) # Espera 2 segundos sin bloquear el programa
Asyncio: Conceptos clave
3. Event Loop (Bucle de eventos)
Es el núcleo de asyncio. Maneja la ejecución de las corrutinas y decide cuándo cambiar entre tareas.
async def main():
await mi_funcion()
[Link](main()) # Inicia el event loop
4. Tareas (Tasks)
Permiten ejecutar corrutinas en paralelo (concurrentemente).
async def tarea1(): async def main():
await [Link](1) # Ejecutar ambas tareas concurrentemente
print("Tarea 1 terminada") await [Link](tarea1(), tarea2())
async def tarea2(): [Link](main())
await [Link](2)
print("Tarea 2 terminada")
Asyncio
Beneficio Descripción
Maneja miles de conexiones simultáneas sin bloquear el
Mayor rendimiento en E/S
programa.
Menos uso de memoria No requiere múltiples hilos como threading.
Escalabilidad Ideal para microservicios y APIs rápidas (FastAPI usa asyncio).
Concurrencia sencilla Más fácil de depurar que threading (evita race conditions).
Conclusiones
El threading básico en PyCharm es ideal para:
• Automatizar tareas bancarias que involucren esperas (I/O).
• Mejorar la eficiencia de scripts que usan comandos Shell.
• Ejecutar operaciones concurrentes sin bloquear el programa principal.
Usa asyncio cuando:
• Tu aplicación hace muchas operaciones de E/S (APIs, bases de datos,
archivos).
• Necesitas concurrencia sin la complejidad de los hilos (threading).
• Quieres alto rendimiento en servidores o aplicaciones en red.