domingo, 29 de junio de 2025

馃И Python Nivel 2 – Parte 11: Pruebas con assert y Manejo Profesional de Errores

 

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

✅ Qu茅 es una prueba con assert y c贸mo usarla
✅ C贸mo detectar errores desde el desarrollo
✅ C贸mo crear pruebas simples sin librer铆as externas
✅ C贸mo capturar errores personalizados y mantener controlado tu c贸digo


馃П ¿Qu茅 es assert?

assert es una instrucci贸n que permite verificar condiciones durante la ejecuci贸n.
Si la condici贸n no se cumple, lanza una excepci贸n (AssertionError) y detiene el programa.


馃攳 Ejemplo b谩sico:


def dividir(a, b): assert b != 0, "El divisor no puede ser cero" return a / b print(dividir(10, 2)) # 5.0 print(dividir(10, 0)) # AssertionError

✅ Ventajas de usar assert

✔️ Detecta errores temprano
✔️ Mejora la confiabilidad del c贸digo
✔️ Facilita pruebas durante el desarrollo
✔️ Se puede desactivar al ejecutar con python -O


馃攼 Personalizar errores con try-except

Adem谩s de assert, Python permite manejar errores sin que el programa se detenga abruptamente:


try: resultado = dividir(10, 0) except AssertionError as e: print("Error capturado:", e)

馃‍馃捇 Ejemplo pr谩ctico: validar emails


def registrar_usuario(nombre, email): assert "@" in email, "El email no es v谩lido" return {"nombre": nombre, "email": email} usuario = registrar_usuario("Ana", "ana@correo.com") print(usuario)

馃И Uso combinado con bucles o inputs


while True: edad = input("Introduce tu edad: ") try: edad = int(edad) assert edad > 0, "La edad debe ser positiva" break except (ValueError, AssertionError) as e: print(f"❌ Error: {e}")

馃 ¿Qu茅 aprendiste hoy?

✔️ C贸mo usar assert para validar condiciones
✔️ C贸mo capturar errores sin romper el programa
✔️ C贸mo detectar errores durante el desarrollo
✔️ C贸mo crear validaciones m谩s limpias y robustas


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

馃帴 Video explicativo en YouTube:
https://www.youtube.com/watch?v=ccWUUSFZKRk

lunes, 23 de junio de 2025

馃И Python Nivel 2 – Parte 9-10: Proyecto CRUD Completo en Consola con POO y JSON

 

馃幆 Objetivo del proyecto:

Crear una aplicaci贸n funcional por consola que permita gestionar una lista de usuarios con las siguientes operaciones:

  • 馃敼 Crear usuarios

  • 馃敼 Leer todos los usuarios

  • 馃敼 Actualizar un usuario existente

  • 馃敼 Eliminar usuarios

  • 馃敼 Guardar los datos en un archivo .json

  • 馃敼 Recuperarlos al iniciar el programa


馃梻️ Estructura del sistema

馃敡 Clases necesarias:

  • Usuario

  • GestorUsuarios (controlador del CRUD)


馃捇 C贸digo simplificado

馃П Clase Usuario


class Usuario: def __init__(self, nombre, email): self.nombre = nombre self.email = email def to_dict(self): return {"nombre": self.nombre, "email": self.email}

馃П Clase GestorUsuarios


import json import os class GestorUsuarios: def __init__(self, archivo): self.archivo = archivo self.usuarios = self.cargar() def cargar(self): if os.path.exists(self.archivo): with open(self.archivo, "r", encoding="utf-8") as f: datos = json.load(f) return [Usuario(**d) for d in datos] return [] def guardar(self): with open(self.archivo, "w", encoding="utf-8") as f: json.dump([u.to_dict() for u in self.usuarios], f, indent=4) def crear_usuario(self, nombre, email): self.usuarios.append(Usuario(nombre, email)) self.guardar() def listar(self): for i, u in enumerate(self.usuarios, 1): print(f"{i}. {u.nombre} - {u.email}") def actualizar(self, indice, nombre, email): if 0 <= indice < len(self.usuarios): self.usuarios[indice].nombre = nombre self.usuarios[indice].email = email self.guardar() def eliminar(self, indice): if 0 <= indice < len(self.usuarios): del self.usuarios[indice] self.guardar()

馃‍馃捇 Interfaz por consola


gestor = GestorUsuarios("usuarios.json") while True: print("\n1. Crear usuario\n2. Listar usuarios\n3. Actualizar usuario\n4. Eliminar usuario\n5. Salir") opcion = input("Selecciona una opci贸n: ") if opcion == "1": nombre = input("Nombre: ") email = input("Email: ") gestor.crear_usuario(nombre, email) elif opcion == "2": gestor.listar() elif opcion == "3": gestor.listar() i = int(input("N煤mero de usuario a actualizar: ")) - 1 nombre = input("Nuevo nombre: ") email = input("Nuevo email: ") gestor.actualizar(i, nombre, email) elif opcion == "4": gestor.listar() i = int(input("N煤mero de usuario a eliminar: ")) - 1 gestor.eliminar(i) elif opcion == "5": print("馃憢 Adi贸s.") break

馃 ¿Qu茅 aprendiste hoy?

✔️ Crear una aplicaci贸n CRUD completa con Python
✔️ Usar clases y persistencia con JSON
✔️ Desarrollar men煤s interactivos
✔️ Aplicar POO en un contexto realista


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

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




jueves, 19 de junio de 2025

馃И Python Nivel 2 – Parte 8: Guardar y Cargar Objetos con JSON (Persistencia)

 

馃幆 ¿Qu茅 aprender谩s?

✅ C贸mo guardar estructuras de datos en archivos .json
✅ C贸mo convertir objetos a diccionarios (__dict__)
✅ C贸mo volver a crear objetos desde archivos
✅ Integrar lectura/escritura en tu sistema


馃搧 ¿Por qu茅 usar JSON?

Los objetos en memoria desaparecen al cerrar Python.
Con .json puedes almacenar datos estructurados como diccionarios o listas y volver a cargarlos despu茅s.


✅ Ejemplo pr谩ctico con clases: guardar usuarios

Supongamos que tienes esta clase:


class Usuario: def __init__(self, nombre, email): self.nombre = nombre self.email = email def to_dict(self): return {"nombre": self.nombre, "email": self.email}

馃捑 Guardar lista de usuarios en un archivo


import json usuarios = [Usuario("Ana", "ana@mail.com"), Usuario("Luis", "luis@mail.com")] with open("usuarios.json", "w", encoding="utf-8") as f: json.dump([u.to_dict() for u in usuarios], f, indent=4)

馃搨 Cargar usuarios desde el archivo .json


with open("usuarios.json", "r", encoding="utf-8") as f: datos = json.load(f) usuarios_cargados = [Usuario(**d) for d in datos] for u in usuarios_cargados: print(f"{u.nombre} - {u.email}")

馃 Aprendiste:

  • A serializar objetos (convertir a JSON)

  • A deserializar (crear objetos desde JSON)


馃 Buenas pr谩cticas

✅ Usar to_dict() para conversi贸n
✅ Separar l贸gica de guardado en funciones
✅ Validar archivos vac铆os o inexistentes
✅ Guardar listas completas (no objetos uno a uno)


馃殌 ¿Qu茅 aprendiste hoy?

✔️ A persistir tus objetos entre ejecuciones
✔️ A leer y guardar datos estructurados
✔️ A construir sistemas m谩s completos y reutilizables
✔️ A combinar clases + archivos + l贸gica real


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

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

domingo, 15 de junio de 2025

馃И Python Nivel 2 – Parte 7: Poner en pr谩ctica UML con un mini proyecto

Ahora que conoces c贸mo funciona UML, es momento de aplicarlo a un proyecto pr谩ctico donde dise帽aremos con UML y luego lo programaremos en Python. Esta actividad te ayudar谩 a consolidar los conceptos de clases, herencia, composici贸n y agregaci贸n.


馃幆 Proyecto: Sistema de Biblioteca

Vamos a construir un sistema sencillo para una biblioteca que permita:

  • Registrar libros y usuarios

  • Asignar libros a usuarios

  • Consultar disponibilidad de libros


馃梻️ Dise帽o UML: Clases y Relaciones

Clases involucradas:

  1. Libro

    • titulo: str

    • autor: str

    • disponible: bool

    • prestar(), devolver()

  2. Usuario

    • nombre: str

    • email: str

    • prestamos: list

  3. Biblioteca

    • libros: list

    • usuarios: list

    • agregar_libro(), registrar_usuario(), prestar_libro()


馃П Fragmento UML


-------------------------------- | Libro | -------------------------------- | + titulo: str | | + autor: str | | + disponible: bool | -------------------------------- | + prestar() | | + devolver() | -------------------------------- -------------------------------- | Usuario | -------------------------------- | + nombre: str | | + email: str | | + prestamos: list | -------------------------------- -------------------------------- | Biblioteca | -------------------------------- | + libros: list | | + usuarios: list | -------------------------------- | + agregar_libro() | | + registrar_usuario() | | + prestar_libro() | --------------------------------

馃捇 C贸digo en Python (versi贸n simplificada)


class Libro: def __init__(self, titulo, autor): self.titulo = titulo self.autor = autor self.disponible = True def prestar(self): if self.disponible: self.disponible = False return True return False def devolver(self): self.disponible = True class Usuario: def __init__(self, nombre, email): self.nombre = nombre self.email = email self.prestamos = [] class Biblioteca: def __init__(self): self.libros = [] self.usuarios = [] def agregar_libro(self, libro): self.libros.append(libro) def registrar_usuario(self, usuario): self.usuarios.append(usuario) def prestar_libro(self, titulo, email): libro = next((l for l in self.libros if l.titulo == titulo and l.disponible), None) usuario = next((u for u in self.usuarios if u.email == email), None) if libro and usuario: if libro.prestar(): usuario.prestamos.append(libro) print(f"{usuario.nombre} ha tomado prestado '{libro.titulo}'.") else: print("❌ No se pudo completar el pr茅stamo.")

馃 ¿Qu茅 aprendiste hoy?

✔️ A dise帽ar con UML antes de programar
✔️ A transformar ese dise帽o en c贸digo Python
✔️ A trabajar con clases relacionadas mediante composici贸n y listas
✔️ A crear una app funcional basada en objetos


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

馃帴 Video del mini proyecto en YouTube:
http://youtube.com/watch?v=s4kWoqrTGVM



馃И Python Nivel 2 – Parte 6: UML y Dise帽o de Clases

 

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

✅ Qu茅 es UML y para qu茅 se usa
✅ C贸mo representar clases con UML
✅ C贸mo planificar relaciones (herencia, composici贸n, agregaci贸n)
✅ C贸mo traducir un dise帽o UML en clases Python
✅ Ejemplo completo: diagrama + c贸digo


馃搶 ¿Qu茅 es UML?

UML (Unified Modeling Language) es un lenguaje visual para representar sistemas orientados a objetos.
Se utiliza para planificar clases, atributos, m茅todos y relaciones entre objetos antes de programar.


馃П Estructura de una clase en UML

Un diagrama de clase b谩sico UML incluye:


-------------------------------------- | NombreClase | -------------------------------------- | - atributo1: Tipo | | - atributo2: Tipo | -------------------------------------- | + metodo1(): TipoRetorno | | + metodo2(par谩metro: Tipo): Retorno | --------------------------------------
  • + = p煤blico

  • - = privado

  • # = protegido


馃З Ejemplo simple en UML


------------------------- | Persona | ------------------------- | - nombre: str | | - edad: int | ------------------------- | + saludar(): str | -------------------------

Traducci贸n en c贸digo Python:


class Persona: def __init__(self, nombre, edad): self._nombre = nombre self._edad = edad def saludar(self): return f"Hola, me llamo {self.nombre} y tengo {self.edad} a帽os."

馃敆 Relaciones UML

Relaci贸nUMLEjemplo
HerenciaFlecha abiertaEmpleado → Persona
Composici贸nRombo negroCoche ▪── Motor
Agregaci贸nRombo blancoCurso ◇── Profesor

馃 ¿Por qu茅 usar UML?

✅ Facilita la planificaci贸n antes de codificar
✅ Mejora la comunicaci贸n entre programadores
✅ Ayuda a evitar errores de dise帽o
✅ Documenta mejor tus sistemas


✅ ¿Qu茅 aprendiste hoy?

✔️ Leer y escribir diagramas UML
✔️ Representar atributos y m茅todos
✔️ Comprender relaciones entre clases
✔️ Traducir UML a Python


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

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



馃И Python Nivel 2 – Parte 5: Relaciones entre Clases – Composici贸n y Agregaci贸n

Despu茅s de aprender herencia, es momento de trabajar otro aspecto clave de la POO: c贸mo se relacionan las clases entre s铆. Esto se logra con t茅cnicas como composici贸n y agregaci贸n.


馃幆 ¿Qu茅 aprender谩s hoy?

✅ Qu茅 es la composici贸n y c贸mo implementarla
✅ Qu茅 es la agregaci贸n y en qu茅 se diferencia
✅ C贸mo crear relaciones entre clases (uno-a-uno, uno-a-muchos)
✅ Ejemplos pr谩cticos con objetos reales


馃敡 1. Composici贸n

La composici贸n representa una relaci贸n fuerte:

“Un objeto contiene otro como parte esencial.”

Si el objeto principal se destruye, los objetos internos tambi茅n.


class Motor: def arrancar(self): print("馃敡 Motor en marcha...") class Coche: def __init__(self): self.motor = Motor() # Composici贸n def arrancar(self): self.motor.arrancar() auto = Coche() auto.arrancar()

馃 Aprendiste:

  • El objeto Coche crea y contiene a Motor

  • No puedes usar Motor si no existe un Coche


馃敡 2. Agregaci贸n

La agregaci贸n representa una relaci贸n d茅bil:

“Un objeto usa a otro, pero no lo controla.”

Se pasa como par谩metro, y puede vivir por separado.


class Profesor: def __init__(self, nombre): self.nombre = nombre class Curso: def __init__(self, profesor): self.profesor = profesor # Agregaci贸n def mostrar(self): print(f"Curso impartido por {self.profesor.nombre}") profe = Profesor("Ana") curso = Curso(profe) curso.mostrar()

馃 Aprendiste:

  • El Curso utiliza un Profesor ya existente

  • Si destruyes el Curso, el Profesor sigue existiendo


馃 Comparaci贸n r谩pida

Relaci贸nCrea internamenteIndependencia
Composici贸n✅ S铆❌ No
Agregaci贸n❌ No✅ S铆

馃殌 ¿Qu茅 aprendiste hoy?

✔️ A crear relaciones reales entre objetos
✔️ A modelar sistemas complejos como colecciones, veh铆culos, usuarios, etc.
✔️ A aplicar buenas pr谩cticas de dise帽o OOP en Python


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

馃挰 ¿Te gustar铆a un proyecto real usando estas relaciones? ¿Un sistema escolar, app o juego?



jueves, 12 de junio de 2025

馃И Python Nivel 2 – Parte 4: Constructores, Destructores y M茅todos Especiales

 

馃幆 ¿Qu茅 aprender谩s hoy?

✅ Qu茅 es y c贸mo se usa el constructor __init__
✅ C贸mo implementar un destructor con __del__
✅ M茅todos especiales como __str__, __len__, __eq__, __repr__
✅ C贸mo hacer que tus objetos se comporten como tipos nativos


馃敡 1. Constructor __init__()

El constructor se ejecuta autom谩ticamente cuando creas un nuevo objeto. Se usa para inicializar atributos.


class Usuario: def __init__(self, nombre, email): self.nombre = nombre self.email = email usuario1 = Usuario("Laura", "laura@email.com") print(usuario1.nombre)

馃敡 2. Destructor __del__()

El destructor se ejecuta cuando el objeto se elimina. Puede usarse para liberar recursos (memoria, archivos abiertos, conexiones).


class Conexion: def __init__(self): print("馃攲 Conexi贸n establecida.") def __del__(self): print("❌ Conexi贸n cerrada.") c = Conexion() del c # Esto fuerza la destrucci贸n

馃敡 3. M茅todo __str__() – Representaci贸n legible

Define c贸mo se muestra el objeto cuando se imprime.


class Producto: def __init__(self, nombre, precio): self.nombre = nombre self.precio = precio def __str__(self): return f"{self.nombre} - ${self.precio}" p = Producto("Auriculares", 45.99) print(p) # Auriculares - $45.99

馃敡 4. Otros m茅todos especiales 煤tiles

M茅todoDescripci贸n
__len__Devuelve la longitud
__eq__Define c贸mo comparar dos objetos (==)
__repr__Representaci贸n t茅cnica (depuraci贸n)
__add__Define c贸mo sumar dos objetos

✅ Ejemplo de comparaci贸n con __eq__


class Libro: def __init__(self, titulo): self.titulo = titulo def __eq__(self, otro): return self.titulo == otro.titulo l1 = Libro("Python B谩sico") l2 = Libro("Python B谩sico") print(l1 == l2) # True

馃殌 ¿Qu茅 aprendiste hoy?

✔️ C贸mo inicializar y destruir objetos
✔️ C贸mo hacer que tus clases se comporten de forma m谩s intuitiva
✔️ C贸mo personalizar funciones internas como print(), ==, len()
✔️ C贸mo mejorar la depuraci贸n con __repr__


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

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

馃挰 ¿Qu茅 m茅todo especial te parece m谩s 煤til? ¿Has usado __init__ sin saberlo?


domingo, 8 de junio de 2025

馃И Python Nivel 2 – Parte 3: Herencia en Programaci贸n Orientada a Objetos

En esta lecci贸n aprender谩s a reutilizar c贸digo mediante herencia, un pilar clave de la Programaci贸n Orientada a Objetos (POO). Te permitir谩 crear estructuras organizadas y extender clases de forma eficiente.


✅ ¿Qu茅 es la herencia?

La herencia permite que una clase hija herede atributos y m茅todos de una clase padre. As铆 se puede reutilizar c贸digo y especializar comportamientos sin partir de cero.


馃敡 Ejemplo 1: Clase base y subclases


class Animal: def __init__(self, nombre): self.nombre = nombre def hablar(self): print(f"{self.nombre} hace un sonido.") class Perro(Animal): def hablar(self): print(f"{self.nombre} dice: ¡Guau!") class Gato(Animal): def hablar(self): print(f"{self.nombre} dice: Miau.")

perro = Perro("Rex") gato = Gato("Michi") perro.hablar() gato.hablar()

馃 Aprendiste:

  • C贸mo una clase hija sobrescribe m茅todos

  • Que las clases hijas heredan atributos y m茅todos autom谩ticamente


馃敡 Ejemplo 2: Constructor extendido con super()


class Vehiculo: def __init__(self, marca, modelo): self.marca = marca self.modelo = modelo class Coche(Vehiculo): def __init__(self, marca, modelo, puertas): super().__init__(marca, modelo) self.puertas = puertas def mostrar_info(self): print(f"{self.marca} {self.modelo}, {self.puertas} puertas")

coche = Coche("Toyota", "Yaris", 5) coche.mostrar_info()

馃 Aprendiste:

  • A reutilizar el constructor de la clase padre con super()

  • A a帽adir nuevos atributos en la subclase


馃殌 ¿Qu茅 aprendiste hoy?

✔️ Crear jerarqu铆as de clases
✔️ Reutilizar y extender c贸digo
✔️ Especializar comportamientos en subclases
✔️ Aplicar el principio DRY (Don’t Repeat Yourself)


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

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

馃挰 ¿Te gustar铆a ver un ejemplo real usando herencia para usuarios, productos o personajes de un juego? ¡Com茅ntalo!



馃И Python Nivel 2 – Parte 2: M茅todos especiales, encapsulamiento y representaci贸n

 馃幆 ¿Qu茅 aprender谩s hoy?

✅ Usar m茅todos especiales como __str__ y __repr__
✅ Aplicar encapsulamiento con atributos privados
✅ Definir getters y setters
✅ Hacer que tus objetos sean m谩s intuitivos y seguros


馃敡 1. M茅todo especial __str__

Sirve para representar el objeto cuando lo imprimes.


class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def __str__(self): return f"{self.nombre} ({self.edad} a帽os)" persona = Persona("Carlos", 30) print(persona) # Carlos (30 a帽os)

馃敡 2. Encapsulamiento: atributos privados

Se indica con doble gui贸n bajo __ al comienzo del atributo.
Esto protege datos que no deber铆an modificarse directamente.


class CuentaBancaria: def __init__(self, titular, saldo): self.__titular = titular self.__saldo = saldo def mostrar_info(self): print(f"Titular: {self.__titular}, Saldo: {self.__saldo}")

⚠️ Si intentas acceder directamente a cuenta.__saldo, obtendr谩s error.


馃敡 3. Getters y Setters

M茅todos que permiten acceder o modificar atributos privados de forma controlada.


class CuentaBancaria: def __init__(self, titular, saldo): self.__titular = titular self.__saldo = saldo def get_saldo(self): return self.__saldo def depositar(self, monto): if monto > 0: self.__saldo += monto

cuenta = CuentaBancaria("Ana", 1000) print(cuenta.get_saldo()) # 1000 cuenta.depositar(500) print(cuenta.get_saldo()) # 1500

馃挕 BONUS: M茅todo __repr__

Se usa m谩s para depuraci贸n o representar el objeto en consola/interactivo.


def __repr__(self): return f"Persona(nombre={self.nombre}, edad={self.edad})"

馃 ¿Qu茅 ganaste hoy?

✔️ M谩s control sobre la visibilidad de tus atributos
✔️ Seguridad al modificar datos sensibles
✔️ Representaciones legibles de tus objetos
✔️ Mejores pr谩cticas POO


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

馃帴 Video paso a paso en YouTube:
https://youtu.be/8lwoAQCer3Q

馃挰 ¿Ya usaste getters y setters? ¿Conoc铆as __str__? ¡Cu茅ntamelo!

馃И Python Nivel 2 – Parte 1: Introducci贸n a la Programaci贸n Orientada a Objetos

 Despu茅s de dominar los fundamentos de Python, es hora de dar el siguiente paso:

Organizar tu c贸digo como un profesional con clases y objetos.


馃 ¿Qu茅 es la Programaci贸n Orientada a Objetos?

Es un paradigma que permite estructurar el c贸digo imitando el mundo real:
馃摝 Clases → plantillas
馃 Objetos → instancias 煤nicas
馃彿️ Atributos → caracter铆sticas
⚙️ M茅todos → acciones


馃敡 Conceptos que aprender谩s hoy:

  • Qu茅 es una clase y c贸mo se define

  • C贸mo crear objetos a partir de clases

  • C贸mo funcionan los atributos y m茅todos

  • Qu茅 es el constructor __init__

  • Qu茅 significa self en Python


Ejemplo 1: Crear una clase b谩sica


class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def saludar(self): print(f"Hola, me llamo {self.nombre} y tengo {self.edad} a帽os.") # Crear y usar un objeto persona1 = Persona("Luc铆a", 29) persona1.saludar()

Ejemplo 2: Modificar atributos


persona1.nombre = "Laura" persona1.saludar()

馃 El objeto puede cambiar din谩micamente su informaci贸n.


Ejemplo 3: Crear m煤ltiples objetos


persona2 = Persona("Carlos", 35) persona3 = Persona("Ana", 42) persona2.saludar() persona3.saludar()

馃殌 ¿Por qu茅 usar POO?

✔️ Mantiene el c贸digo limpio y escalable
✔️ Agrupa informaci贸n y funciones en una sola entidad
✔️ Es la base de librer铆as, frameworks, APIs y juegos
✔️ Reutilizas estructuras sin reescribir todo


馃搶 Pr贸ximo paso:

En la Parte 2 aprender谩s:

  • C贸mo usar m茅todos especiales (__str__, __repr__)

  • C贸mo encapsular informaci贸n

  • C贸mo crear clases con l贸gica m谩s compleja


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

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

馃挰 ¿Te gustar铆a ver c贸mo aplicar clases para videojuegos, apps o bots? ¡D茅jamelo en los comentarios!

s谩bado, 7 de junio de 2025

馃И Python Nivel 1 – Parte 10: Ejercicio Integrador – Gestor de Tareas

 馃幆 Objetivo:

Crear un programa realista que permita al usuario:

  • A帽adir tareas

  • Marcar tareas como completadas

  • Ver tareas pendientes y completadas

  • Guardar y recuperar tareas desde un archivo .json


馃摑 Enunciado del proyecto: Gestor de tareas

Escribe un programa que permita al usuario gestionar sus tareas del d铆a. Las tareas se deben guardar en un archivo llamado tareas.json para que no se pierdan al cerrar el programa.


✅ Caracter铆sticas:

  1. Men煤 principal con opciones:

    • A帽adir nueva tarea

    • Ver tareas pendientes

    • Marcar tarea como completada

    • Ver tareas completadas

    • Salir

  2. Uso de funciones para cada acci贸n

  3. Datos estructurados con listas y diccionarios

  4. Lectura y escritura en archivo .json para guardar todo


馃捇 C贸digo completo del proyecto


import json import os archivo = "tareas.json" # Cargar tareas si existe el archivo def cargar_tareas(): if os.path.exists(archivo): with open(archivo, "r", encoding="utf-8") as f: return json.load(f) else: return {"pendientes": [], "completadas": []} # Guardar tareas en archivo def guardar_tareas(tareas): with open(archivo, "w", encoding="utf-8") as f: json.dump(tareas, f, indent=4) # Mostrar tareas def mostrar_tareas(lista, titulo): print(f"\n馃搵 {titulo}:") if lista: for i, tarea in enumerate(lista, start=1): print(f"{i}. {tarea}") else: print("No hay tareas.") # Men煤 principal def menu(): tareas = cargar_tareas() while True: print("\n--- MEN脷 ---") print("1. A帽adir tarea") print("2. Ver pendientes") print("3. Marcar como completada") print("4. Ver completadas") print("5. Salir") opcion = input("Elige una opci贸n: ") if opcion == "1": nueva = input("Escribe la nueva tarea: ") tareas["pendientes"].append(nueva) guardar_tareas(tareas) elif opcion == "2": mostrar_tareas(tareas["pendientes"], "Tareas pendientes") elif opcion == "3": mostrar_tareas(tareas["pendientes"], "Tareas pendientes") if tareas["pendientes"]: try: num = int(input("N煤mero de tarea completada: ")) - 1 completada = tareas["pendientes"].pop(num) tareas["completadas"].append(completada) guardar_tareas(tareas) except (ValueError, IndexError): print("❌ Entrada inv谩lida.") elif opcion == "4": mostrar_tareas(tareas["completadas"], "Tareas completadas") elif opcion == "5": print("✅ Programa cerrado. ¡Hasta pronto!") break else: print("❌ Opci贸n no v谩lida.") # Ejecutar men煤 menu()

馃 ¿Qu茅 se repasa aqu铆?

✔️ Estructuras condicionales y bucles
✔️ Listas, diccionarios y funciones
✔️ Lectura/escritura de archivos .json
✔️ Validaci贸n de entrada del usuario
✔️ Organizaci贸n y reutilizaci贸n de c贸digo


馃殌 Pr贸ximo paso:

Con este proyecto cierras el Nivel 1 de Python y est谩s listo para pasar a conceptos intermedios como:

  • clases y objetos

  • librer铆as externas

  • proyectos web o visuales


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

Video tutorial : https://youtu.be/CSeYb1WS7QE