martes, 29 de julio de 2025

馃彚 Ejercicio Pr谩ctico en Python: Clase Ascensor y Uso desde un Script Principal

 

En este ejercicio pr谩ctico aprender谩s a:

  • Crear una clase en un archivo independiente.

  • Implementar m茅todos para subir, bajar y consultar la planta.

  • Usar modularizaci贸n para separar el c贸digo en dos scripts.


1. Estructura del Proyecto


/ascensor_proyecto ├── ascensor.py └── main.py

2. C贸digo del archivo ascensor.py


class Ascensor: def __init__(self, planta_inicial=0, planta_maxima=10, planta_minima=0): self.planta = planta_inicial self.planta_maxima = planta_maxima self.planta_minima = planta_minima def subir(self): if self.planta < self.planta_maxima: self.planta += 1 print(f"Subiendo... ahora est谩s en la planta {self.planta}") else: print("Ya est谩s en la planta m谩s alta.") def bajar(self): if self.planta > self.planta_minima: self.planta -= 1 print(f"Bajando... ahora est谩s en la planta {self.planta}") else: print("Ya est谩s en la planta m谩s baja.") def ver_planta(self): print(f"Actualmente est谩s en la planta {self.planta}")

3. C贸digo del archivo main.py


from ascensor import Ascensor ascensor1 = Ascensor(planta_inicial=0, planta_maxima=5, planta_minima=-1) ascensor1.ver_planta() ascensor1.subir() ascensor1.subir() ascensor1.ver_planta() ascensor1.bajar() ascensor1.bajar() ascensor1.bajar() ascensor1.ver_planta()

Salida esperada


Actualmente est谩s en la planta 0 Subiendo... ahora est谩s en la planta 1 Subiendo... ahora est谩s en la planta 2 Actualmente est谩s en la planta 2 Bajando... ahora est谩s en la planta 1 Bajando... ahora est谩s en la planta 0 Bajando... ahora est谩s en la planta -1 Actualmente est谩s en la planta -1

¿Qu茅 has aprendido?

  • Modularizaci贸n: separar la clase del programa principal.

  • POO en Python: uso de atributos y m茅todos.

  • Control de estados: mediante m茅todos como subir, bajar, ver_planta.


Pr贸ximos pasos

Prueba a a帽adir mejoras:

  • Limitar el n煤mero m谩ximo de plantas din谩micamente.

  • Crear un men煤 interactivo que pida al usuario las acciones.

  • A帽adir una cola de solicitudes para varias personas.


C贸digo completo en GitHub:

github.com/josecodetech





domingo, 27 de julio de 2025

馃寪 Python Nivel 3 – Parte 4: Manejo de APIs y Automatizaci贸n de Consultas HTTP

 

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 es una API y c贸mo funciona
✅ C贸mo enviar peticiones HTTP desde Python (GET, POST, etc.)
✅ C贸mo consumir datos en formato JSON
✅ C贸mo automatizar consultas a servicios externos
✅ C贸mo manejar errores y respuestas


馃攳 ¿Qu茅 es una API?

Una API (Interfaz de Programaci贸n de Aplicaciones) permite que dos sistemas se comuniquen. En la web, usamos API REST para acceder a datos, enviar formularios, consultar servicios, etc.


馃摝 Usando requests para consumir APIs

Primero, instala el m贸dulo si no lo tienes:


pip install requests

✅ Ejemplo 1: Consultar una API p煤blica (GET)


import requests url = "https://jsonplaceholder.typicode.com/posts/1" respuesta = requests.get(url) if respuesta.status_code == 200: datos = respuesta.json() print(f"T铆tulo: {datos['title']}") else: print("Error al consultar la API")

✅ Ejemplo 2: Enviar datos (POST)


import requests url = "https://jsonplaceholder.typicode.com/posts" nuevo_post = { "title": "Nuevo post", "body": "Contenido del post", "userId": 1 } respuesta = requests.post(url, json=nuevo_post) print(respuesta.json())

馃攣 Automatizar llamadas a una API

Puedes combinar esto con el programador de tareas de Windows o un bucle para automatizar la consulta de datos:


import time while True: r = requests.get("https://api.exchangerate-api.com/v4/latest/USD") if r.ok: euro = r.json()["rates"]["EUR"] print(f"1 USD = {euro} EUR") time.sleep(3600) # espera 1 hora

馃洃 Manejo de errores y excepciones


try: respuesta = requests.get("https://api.fallida.com/data") respuesta.raise_for_status() print(respuesta.json()) except requests.exceptions.HTTPError as e: print("Error HTTP:", e) except requests.exceptions.RequestException as e: print("Error general:", e)

馃 Aplicaciones comunes

  • Consultar precios de criptomonedas o monedas

  • Obtener el clima actual

  • Enviar formularios autom谩ticamente

  • Automatizar tareas de scraping de datos

  • Consultar servicios internos de una empresa


馃搨 C贸digo en GitHub:
github.com/josecodetech

馃帴 Tutorial en YouTube:
https://youtu.be/LgJQW_fbZeY



s谩bado, 26 de julio de 2025

⚙️ Python Nivel 3 – Parte 3: Automatizaci贸n de tareas con Scripts en Windows

馃幆 ¿Qu茅 aprender谩s en esta parte?

✅ Qu茅 es un script en Python
✅ C贸mo automatizar tareas usando el Programador de tareas de Windows
✅ Aplicaciones 煤tiles:

  • Limpieza de archivos

  • Generaci贸n de backup

  • ✅ C贸mo registrar logs y controlar errores


馃Ь ¿Qu茅 es un script en Python?

Un script es un archivo .py que ejecuta autom谩ticamente una serie de acciones. Por ejemplo:

馃Ч Script 1: Limpiar archivos .log autom谩ticamente


# limpiar_logs.py import os carpeta = "C:/Users/TU_USUARIO/Documentos/logs/" for archivo in os.listdir(carpeta): if archivo.endswith(".log"): os.remove(os.path.join(carpeta, archivo)) print("Limpieza de archivos .log completada.")

馃洜️ ¿C贸mo ejecutar este script autom谩ticamente en Windows?

馃獰 Paso 1: Guarda el script .py

Guarda el archivo con el nombre limpiar_logs.py en una carpeta segura. Ejemplo:
C:\scripts\limpiar_logs.py


馃Л Paso 2: Localiza tu ejecutable de Python

Por ejemplo:
C:\Users\TU_USUARIO\AppData\Local\Programs\Python\Python311\python.exe
(Cambia seg煤n tu versi贸n)


馃搮 Paso 3: Abre el Programador de tareas

  1. Pulsa Windows + S y escribe Programador de tareas

  2. Haz clic en "Crear tarea b谩sica"


馃敡 Paso 4: Crea la tarea

  1. Nombre: Limpieza de archivos log

  2. Desencadenador: Diario, y elige una hora (por ejemplo, 3:00 AM)

  3. Acci贸n: “Iniciar un programa”

    • Programa: ruta a python.exe

    • Argumentos: ruta al script → C:\scripts\limpiar_logs.py

    • Iniciar en: carpeta donde est谩 el script (ej. C:\scripts\)


✅ Paso 5: Guarda y prueba la tarea

  • Puedes ejecutarla manualmente desde el programador: clic derecho → Ejecutar

  • Revisa que borre los archivos .log correctamente


馃摝 Ejemplo 2: Script para crear backups de carpetas


# backup_diario.py import shutil import datetime import os origen = "C:/Users/TU_USUARIO/Documentos/Importante/" destino_base = "C:/Users/TU_USUARIO/Respaldo/" fecha = datetime.datetime.now().strftime("%Y-%m-%d") destino = os.path.join(destino_base, f"respaldo_{fecha}") shutil.copytree(origen, destino) print(f"Backup realizado: {destino}")

Este script copiar谩 todo el contenido de una carpeta en otra, a帽adiendo la fecha.


馃摂 ¿C贸mo registrar errores y guardar logs?

Agrega esto a tus scripts:


import logging logging.basicConfig(filename='C:/scripts/logs/backup.log', level=logging.INFO) try: # tu c贸digo aqu铆 logging.info("Backup completado correctamente") except Exception as e: logging.error(f"Error durante el respaldo: {e}")

馃 Aplicaciones pr谩cticas

  • 馃Ч Limpieza de archivos temporales o logs antiguos

  • 馃摝 Backups autom谩ticos de bases de datos, carpetas, etc.

  • 馃搳 Generaci贸n diaria de reportes

  • 馃摤 Env铆o autom谩tico de correos (con smtplib)

  • 馃И Ejecuci贸n de scripts de an谩lisis de datos o scraping


馃敀 Recomendaciones

✅ Crea una carpeta tipo C:\scripts\ para tus scripts
✅ Usa rutas absolutas en Windows (C:/...)
✅ Agrega logs para saber si fall贸
✅ Protege tus scripts con permisos si son sensibles
✅ Puedes combinar con .bat si prefieres ejecutables


https://www.youtube.com/watch?v=aDJXoQnddG0

lunes, 21 de julio de 2025

✅ Python Nivel 3 – Parte 2: Programaci贸n Orientada a Objetos Avanzada

 馃敀 1. Encapsulamiento

Es un principio de la programaci贸n orientada a objetos que protege los datos internos de una clase, restringiendo el acceso directo a ellos.

馃И Ejemplo:


class Usuario: def __init__(self, nombre): self.__nombre = nombre # atributo privado (doble gui贸n bajo) def obtener_nombre(self): return self.__nombre

¿Qu茅 significa __nombre?
El doble gui贸n bajo convierte el atributo en privado, es decir, no se puede acceder directamente desde fuera de la clase (usuario.__nombre dar谩 error).

馃憠 Se accede mediante m茅todos p煤blicos, como obtener_nombre().


馃彿️ 2. Uso de @property y @setter

Permite controlar c贸mo se accede y modifica un atributo, manteniendo la sintaxis simple como si fuera p煤blico.

馃И Ejemplo:


class Producto: def __init__(self, precio): self._precio = precio # protegido @property def precio(self): return self._precio @precio.setter def precio(self, nuevo_precio): if nuevo_precio >= 0: self._precio = nuevo_precio

Ventaja:
Permite hacer validaciones al asignar o leer atributos, manteniendo una interfaz clara:


p = Producto(100) p.precio = 150 # Usa el setter print(p.precio) # Usa el getter

馃攣 3. M茅todos Especiales (Magic Methods)

Son m茅todos que comienzan y terminan con __. Python los usa para sobrecargar operadores y personalizar comportamientos.

✅ Ejemplos 煤tiles:

M茅todo¿Qu茅 hace?
__str__Representaci贸n en print()
__len__Permite usar len(obj)
__eq__Permite usar obj1 == obj2
__add__Permite usar obj1 + obj2

馃И Ejemplo de __str__:


class Punto: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f"Punto({self.x}, {self.y})" p = Punto(1, 2) print(p) # Imprime: Punto(1, 2)

馃П 4. Principios SOLID aplicados a Python

Estos principios ayudan a dise帽ar c贸digo mantenible, limpio y escalable.

馃З Explicaci贸n de cada uno:

  • S – Single Responsibility
    Cada clase debe tener una 煤nica responsabilidad. No mezcles l贸gica de base de datos con l贸gica de interfaz, por ejemplo.

  • O – Open/Closed
    Las clases deben estar abiertas a extensi贸n pero cerradas a modificaci贸n. Usa herencia o composici贸n en lugar de cambiar c贸digo existente.

  • L – Liskov Substitution
    Una subclase debe poder reemplazar a su clase padre sin alterar el comportamiento del programa.

  • I – Interface Segregation
    No fuerces a una clase a implementar m茅todos que no necesita. Divide interfaces en bloques m谩s peque帽os si hace falta.

  • D – Dependency Inversion
    No dependas de clases concretas, sino de abstracciones. Usa interfaces o clases base cuando sea posible.


馃彟 5. Ejemplo completo con todo lo aprendido


class CuentaBancaria: def __init__(self, titular, saldo=0): self.titular = titular self._saldo = saldo def depositar(self, cantidad): self._saldo += cantidad def retirar(self, cantidad): if cantidad <= self._saldo: self._saldo -= cantidad def __str__(self): return f"{self.titular} - Saldo: €{self._saldo}"
  • Usa encapsulamiento (_saldo)

  • Tiene m茅todos claros y separados

  • Usa __str__ para mostrar el objeto de forma legible

  • Cumple con el principio SRP (una clase → una tarea)



s谩bado, 19 de julio de 2025

馃И Python Nivel 3 – Parte 1: Arquitectura MVC y Separaci贸n de Responsabilidades

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 es MVC y para qu茅 se utiliza
✅ C贸mo aplicar MVC en proyectos Python
✅ C贸mo separar l贸gica, datos y presentaci贸n
✅ Beneficios para el trabajo en equipo y mantenimiento


馃П ¿Qu茅 es MVC?

MVC significa:

  • M – Modelo: gestiona los datos y l贸gica de negocio

  • V – Vista: maneja la interfaz, lo que ve el usuario

  • C – Controlador: conecta el modelo y la vista


馃敡 Ejemplo pr谩ctico en Python (sencillo)

馃З Modelo (model.py)


class Usuario: def __init__(self, nombre): self.nombre = nombre

馃帹 Vista (view.py)


def mostrar_usuario(usuario): print(f"Hola, {usuario.nombre}")

馃幃 Controlador (controller.py)


from model import Usuario from view import mostrar_usuario def main(): user = Usuario("Ana") mostrar_usuario(user) main()

馃摝 ¿Por qu茅 usar MVC?

✔️ Organizaci贸n del c贸digo
✔️ Escalabilidad
✔️ Reutilizaci贸n
✔️ Trabajo colaborativo
✔️ Separaci贸n clara de responsabilidades


馃搨 Estructura de carpetas:


/mi_app ├── model/ │ └── usuario.py ├── view/ │ └── mostrar_usuario.py ├── controller/ │ └── controlador.py └── main.py

馃 ¿Qu茅 aprendiste hoy?

✔️ Qu茅 es MVC
✔️ C贸mo dividir tu c贸digo en modelo, vista y controlador
✔️ C贸mo mejorar la calidad y estructura de tu software
✔️ C贸mo preparar tu app para crecer sin caos


馃搨 Repositorio GitHub:
github.com/josecodetech

馃帴 Video explicativo en YouTube:

https://youtu.be/ms9ufWV_V7w



馃И Python Nivel 2 – Parte 18: Serializaci贸n de Objetos con pickle

 

馃П ¿Qu茅 es serializar?

Serializar significa convertir un objeto en una secuencia de bytes para almacenarlo o transmitirlo, y despu茅s poder reconstruirlo (deserializarlo).

En Python, esto se puede hacer con el m贸dulo pickle.


馃敡 Ejemplo b谩sico

Guardar un objeto en un archivo:


import pickle datos = {'nombre': 'Ana', 'edad': 28} with open('datos.pkl', 'wb') as archivo: pickle.dump(datos, archivo)

Cargar el objeto desde el archivo:


with open('datos.pkl', 'rb') as archivo: datos_recuperados = pickle.load(archivo) print(datos_recuperados)

馃摛 Salida:


{'nombre': 'Ana', 'edad': 28}

馃洝️ ¿Es seguro usar pickle?

⚠️ ¡Cuidado! Nunca uses pickle.load() con archivos de origen desconocido.
Podr铆an contener c贸digo malicioso, ya que pickle ejecuta c贸digo arbitrario.


馃摝 Diferencias entre pickle y json

Caracter铆sticapicklejson
FormatoBinario   Texto plano
Legible por humanos❌ No    ✅ S铆
Compatible con otros lenguajes❌ No       ✅ S铆
Serializa objetos Python complejos✅ S铆   ❌ Solo b谩sicos

馃 ¿Qu茅 aprendiste hoy?

✔️ Qu茅 es la serializaci贸n
✔️ C贸mo guardar y restaurar objetos con pickle
✔️ Cu谩ndo usarlo (y cu谩ndo no)
✔️ Diferencias clave con json


馃搨 Ejemplo pr谩ctico en GitHub:
github.com/josecodetech

馃帴 Tutorial explicativo en YouTube:

https://www.youtube.com/watch?v=2I3E4rvO2E8

 


馃И Python Nivel 2 – Parte 17: Argumentos desde Consola con argparse

馃П ¿Qu茅 es argparse?

argparse es un m贸dulo de Python para crear interfaces de l铆nea de comandos f谩cilmente.

Permite que tu programa reciba instrucciones como:


python programa.py --nombre Ana --edad 25

馃И Ejemplo b谩sico:


import argparse parser = argparse.ArgumentParser(description="Ejemplo de uso de argparse") parser.add_argument("--nombre", type=str, required=True, help="Tu nombre") parser.add_argument("--edad", type=int, required=True, help="Tu edad") args = parser.parse_args() print(f"Hola {args.nombre}, tienes {args.edad} a帽os.")

✅ Ejecutar el script desde consola:


python programa.py --nombre Jose --edad 30

馃摛 Salida:


Hola Jose, tienes 30 a帽os.

馃敡 Argumentos opcionales con valores por defecto:


parser.add_argument("--saludo", type=str, default="Hola", help="Saludo personalizado")

馃摝 Tambi茅n puedes mostrar ayuda autom谩ticamente:


python programa.py --help

馃 Esto genera un mensaje con los argumentos requeridos y sus descripciones.


馃洜 Casos de uso reales

✔️ Automatizar tareas (copias, procesamiento de archivos)
✔️ Crear herramientas de l铆nea de comandos
✔️ Pasar rutas de archivos, filtros, claves, par谩metros
✔️ Crear scripts para cron jobs o tareas por lotes


馃 ¿Qu茅 aprendiste hoy?

✔️ A leer par谩metros desde consola
✔️ A usar argparse para mejorar tus scripts
✔️ A crear herramientas m谩s profesionales y reutilizables
✔️ A integrar entradas externas en tus programas


馃搨 C贸digo de ejemplo en GitHub:
github.com/josecodetech

馃帴 Video explicativo en YouTube:

https://youtu.be/atngTsBwA5I


mi茅rcoles, 16 de julio de 2025

馃И Python Nivel 2 – Parte 16: Gesti贸n de Dependencias con pip y Archivos requirements.txt

 

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 es pip y c贸mo instalar librer铆as externas
✅ C贸mo crear y usar un requirements.txt
✅ C贸mo compartir tu entorno de desarrollo
✅ Buenas pr谩cticas para proyectos colaborativos


馃П ¿Qu茅 es pip?

pip es el gestor de paquetes de Python.
Con 茅l puedes instalar librer铆as externas con un solo comando:


pip install requests

Esto te permite reutilizar librer铆as que otros desarrolladores han publicado.


馃梻 ¿Qu茅 es un archivo requirements.txt?

Es un archivo de texto donde defines todas las dependencias necesarias de tu proyecto, l铆nea por l铆nea.


requests==2.31.0 flask==2.3.2

馃敡 C贸mo generarlo autom谩ticamente:


pip freeze > requirements.txt

Esto guarda todas las librer铆as y versiones que tienes en tu entorno actual.


馃攧 C贸mo instalar dependencias desde el archivo:


pip install -r requirements.txt

✅ As铆 puedes compartir tu proyecto con otros, y podr谩n instalar todo de forma autom谩tica.


馃И Ejemplo paso a paso:

  1. Crea un entorno virtual:


    python -m venv venv
  2. Act铆valo:

    • En Windows: venv\Scripts\activate

    • En macOS/Linux: source venv/bin/activate

  3. Instala una librer铆a:


    pip install rich
  4. Guarda dependencias:


    pip freeze > requirements.txt
  5. Usa requirements.txt en cualquier m谩quina:


    pip install -r requirements.txt

馃摝 Buenas pr谩cticas

✔️ Siempre usa entornos virtuales
✔️ No subas carpetas venv al repositorio
✔️ Usa requirements.txt para compartir dependencias
✔️ Usa pip freeze solo dentro del entorno virtual


馃 ¿Qu茅 aprendiste hoy?

✔️ C贸mo instalar paquetes externos con pip
✔️ C贸mo crear y usar un archivo requirements.txt
✔️ C贸mo colaborar y compartir tu proyecto f谩cilmente
✔️ Buenas pr谩cticas para un entorno Python profesional


馃搨 C贸digo de ejemplo en GitHub:
github.com/josecodetech

馃帴 Video explicativo en YouTube:
https://youtu.be/kKdl9ZoajV0



jueves, 10 de julio de 2025

馃И Python Nivel 2 – Parte 15: Introducci贸n a Testing con unittest

 

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 es el testing y por qu茅 es esencial
✅ C贸mo crear tests automatizados con unittest
✅ Qu茅 es un test case y c贸mo definirlo
✅ C贸mo comprobar que el c贸digo funciona correctamente
✅ Qu茅 hacer cuando un test falla


馃П ¿Qu茅 es unittest?

unittest es el m贸dulo est谩ndar de Python para pruebas automatizadas.
Permite crear clases de test que validan que tus funciones y m茅todos se comporten correctamente.


馃摝 Estructura b谩sica de un test:


import unittest def suma(a, b): return a + b class TestSuma(unittest.TestCase): def test_suma_positivos(self): self.assertEqual(suma(2, 3), 5) def test_suma_negativos(self): self.assertEqual(suma(-2, -3), -5) if __name__ == '__main__': unittest.main()

✅ ¿Qu茅 hace cada parte?

  • import unittest: importa el framework

  • class TestX(unittest.TestCase): define un grupo de tests

  • self.assertEqual(...): compara resultado esperado con resultado real

  • unittest.main(): ejecuta todos los tests definidos


馃И Otros m茅todos de validaci贸n


self.assertNotEqual(a, b) self.assertTrue(condici贸n) self.assertFalse(condici贸n) self.assertIn(valor, lista) self.assertRaises(ErrorEsperado, funcion, args)

馃挕 ¿Cu谩ndo hacer testing?

✔️ Al desarrollar funciones cr铆ticas
✔️ Cuando mantienes proyectos grandes
✔️ Al trabajar en equipo
✔️ Para prevenir errores en producci贸n


馃‍馃捇 Ejemplo real con clase Usuario


class Usuario: def __init__(self, nombre): self.nombre = nombre def saludo(self): return f"Hola, {self.nombre}" class TestUsuario(unittest.TestCase): def test_saludo(self): u = Usuario("Ana") self.assertEqual(u.saludo(), "Hola, Ana")

馃 ¿Qu茅 aprendiste hoy?

✔️ A automatizar pruebas con unittest
✔️ A validar comportamientos de funciones y clases
✔️ A escribir c贸digo m谩s confiable y profesional
✔️ A detectar errores antes de que lleguen al usuario


馃搨 C贸digo de ejemplo en GitHub:
github.com/josecodetech

馃帴 Video paso a paso en YouTube:
https://youtu.be/-2Dj28lOn8E


mi茅rcoles, 9 de julio de 2025

馃И Python Nivel 2 – Parte 14: Uso de Decoradores (Decorators) en Python

 

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 son los decoradores y para qu茅 sirven
✅ C贸mo crear y aplicar decoradores
✅ C贸mo usarlos para validar, medir tiempos o modificar comportamiento
✅ Decoradores anidados y con par谩metros


馃П ¿Qu茅 es un decorador?

Un decorador en Python es una funci贸n que recibe otra funci贸n como argumento y devuelve una nueva funci贸n con funcionalidades a帽adidas, sin modificar su estructura interna.


馃敡 Sintaxis b谩sica


def mi_decorador(funcion_original): def nueva_funcion(): print("Antes de ejecutar") funcion_original() print("Despu茅s de ejecutar") return nueva_funcion @mi_decorador def saludar(): print("Hola!") saludar()

馃 Salida:


Antes de ejecutar Hola! Despu茅s de ejecutar

✅ ¿Para qu茅 sirven los decoradores?

✔️ Validar par谩metros
✔️ Medir tiempos de ejecuci贸n
✔️ Agregar logs o registros
✔️ Controlar permisos o acceso
✔️ Reutilizar c贸digo sin repetir l贸gica


馃晲 Ejemplo: medir tiempo de ejecuci贸n


import time def medir_tiempo(func): def wrapper(*args, **kwargs): inicio = time.time() resultado = func(*args, **kwargs) fin = time.time() print(f"Tiempo: {fin - inicio:.2f}s") return resultado return wrapper @medir_tiempo def procesar(): time.sleep(2) print("Proceso terminado") procesar()

馃З Decorador con argumentos


def repetir(n): def decorador(func): def wrapper(*args, **kwargs): for _ in range(n): func(*args, **kwargs) return wrapper return decorador @repetir(3) def hola(): print("Hola!") hola()

馃 ¿Qu茅 aprendiste hoy?

✔️ Qu茅 son y c贸mo funcionan los decoradores
✔️ C贸mo aplicarlos en funciones reales
✔️ C贸mo pasar par谩metros a los decoradores
✔️ A reutilizar l贸gica de forma limpia y elegante


馃搨 C贸digo de ejemplos en GitHub:
github.com/josecodetech

馃帴 Video explicativo en YouTube:
https://youtu.be/oloxPaRSGpg



馃И Python Nivel 2 – Parte 13: Documentar tu C贸digo con Docstrings y Buenas Pr谩cticas

 

馃幆 ¿Qu茅 aprender谩s?

✅ Qu茅 es un docstring y c贸mo escribirlo correctamente
✅ C贸mo documentar funciones, clases y m贸dulos
✅ C贸mo generar documentaci贸n autom谩tica
✅ Buenas pr谩cticas para que tu c贸digo sea m谩s legible y mantenible


馃П ¿Qu茅 es un Docstring?

Un docstring es un texto descriptivo que se coloca justo despu茅s de la definici贸n de una funci贸n, clase o m贸dulo.
Se escribe entre triples comillas (""" """") y sirve para explicar qu茅 hace, qu茅 par谩metros recibe y qu茅 devuelve.


馃‍馃捇 Ejemplo de funci贸n con docstring


def saludar(nombre): """ Devuelve un saludo personalizado. Par谩metros: nombre (str): El nombre de la persona a saludar. Retorna: str: Un saludo con el nombre. """ return f"Hola, {nombre}!"

馃摝 Docstring en una clase


class Usuario: """ Representa un usuario con nombre y email. """ def __init__(self, nombre, email): """ Inicializa un nuevo usuario. Par谩metros: nombre (str): Nombre del usuario. email (str): Correo electr贸nico del usuario. """ self.nombre = nombre self.email = email

馃О Buenas pr谩cticas al documentar

✔️ Usa lenguaje claro y conciso
✔️ Explica entradas y salidas
✔️ Usa estilo PEP 257 (recomendado en Python)
✔️ Incluye ejemplos cuando sea 煤til


馃И Acceder al docstring en tiempo de ejecuci贸n


print(saludar.__doc__) help(saludar)

馃搫 Docstring de m贸dulo

Coloca un docstring al principio del archivo .py:


""" M贸dulo para gestionar usuarios y sus datos. Contiene: - Clase Usuario - Funciones de validaci贸n """

馃殌 ¿Qu茅 aprendiste hoy?

✔️ A escribir documentaci贸n integrada con docstrings
✔️ A aplicar buenas pr谩cticas de c贸digo limpio
✔️ A facilitar el mantenimiento de tus programas
✔️ A comunicarte mejor con tu futuro yo (o tu equipo)


馃搨 Ejemplos documentados en GitHub:
github.com/josecodetech

馃帴 Video paso a paso en YouTube:
https://www.youtube.com/watch?v=DKz0CfiSbFs



domingo, 6 de julio de 2025

馃И Python Nivel 2 – Parte 12: Gesti贸n de Errores Personalizados y Excepciones Propias

 

馃幆 ¿Qu茅 aprender谩s en esta parte?

✅ C贸mo definir tus propias excepciones en Python
✅ Cu谩ndo y por qu茅 usar errores personalizados
✅ C贸mo lanzar errores con raise
✅ C贸mo capturarlos y diferenciarlos de otros errores
✅ Aplicaci贸n en sistemas reales: validaciones y reglas de negocio


馃П ¿Qu茅 son las excepciones personalizadas?

Son clases propias que heredan de Exception y te permiten controlar errores con m谩s precisi贸n y dar mensajes espec铆ficos a cada situaci贸n.


馃敡 Ejemplo b谩sico:


class EdadInvalidaError(Exception): pass def verificar_edad(edad): if edad < 18: raise EdadInvalidaError("Debes ser mayor de edad.")

馃摝 ¿Por qu茅 usar excepciones propias?

✔️ Identificas claramente el tipo de error
✔️ Mejoras la organizaci贸n del c贸digo
✔️ Ayudas a otros desarrolladores a entender tu l贸gica
✔️ Puedes aplicar reglas de negocio complejas f谩cilmente


馃‍馃捇 Ejemplo real: Sistema de usuarios


class UsuarioExistenteError(Exception): pass usuarios_registrados = ["ana@mail.com", "luis@mail.com"] def registrar_usuario(email): if email in usuarios_registrados: raise UsuarioExistenteError("El usuario ya est谩 registrado.") usuarios_registrados.append(email)

馃И Capturando errores personalizados


try: registrar_usuario("ana@mail.com") except UsuarioExistenteError as e: print("⚠️ Error:", e)

馃攣 Jerarqu铆a de excepciones propias

Puedes crear subtipos para organizar mejor errores:


class ErrorUsuario(Exception): pass class UsuarioExistenteError(ErrorUsuario): pass class EmailInvalidoError(ErrorUsuario): pass

馃 ¿Qu茅 aprendiste hoy?

✔️ A crear tus propias excepciones con clases
✔️ A lanzar errores espec铆ficos con raise
✔️ A capturar errores personalizados con try-except
✔️ A mejorar la claridad y control de tus validaciones


馃搨 C贸digo de ejemplo en GitHub:
github.com/josecodetech

馃帴 Video paso a paso en YouTube:
https://youtu.be/6gpdqmTc8aE