Mostrando entradas con la etiqueta intermedio. Mostrar todas las entradas
Mostrando entradas con la etiqueta intermedio. Mostrar todas las entradas

miércoles, 22 de julio de 2026

Día 23 — Decoradores: añadiendo superpoderes a tus funciones

Un decorador es una función especial que envuelve a otra función para modificar o ampliar su comportamiento sin necesidad de alterar su código original. Se aplican colocando el símbolo @ seguido del nombre del decorador justo encima de la definición de la función.

Los decoradores son una herramienta muy presente en frameworks profesionales: en Flask y FastAPI se usan para definir rutas (@app.get), y en Django para gestionar permisos o autenticación. Entender cómo funcionan internamente ayuda mucho a comprender el comportamiento de estas herramientas.

Código de ejemplo:

import time

def medir_tiempo(funcion):
    def wrapper(*args, **kwargs):
        inicio = time.time()
        resultado = funcion(*args, **kwargs)
        print(f"Tardó: {time.time() - inicio:.4f}s")
        return resultado
    return wrapper

@medir_tiempo
def calcular():
    return sum(range(1_000_000))

print(calcular())


sábado, 18 de julio de 2026

Día 19 — JSON: el formato universal de intercambio de datos

 JSON (JavaScript Object Notation) es el formato estándar utilizado por la inmensa mayoría de APIs web para intercambiar información entre sistemas. Su estructura es muy similar a la de los diccionarios de Python, lo que hace que trabajar con él resulte muy natural desde este lenguaje.

El módulo json, incluido en la librería estándar de Python, ofrece cuatro funciones principales: dumps() convierte un diccionario en texto JSON, loads() hace el proceso inverso, y dump() / load() realizan las mismas conversiones directamente desde y hacia archivos.

Código de ejemplo:

import json persona = {"nombre": "José", "edad": 35} # Diccionario a texto JSON texto_json = json.dumps(persona, indent=2) print(texto_json) # Texto JSON a diccionario datos = json.loads(texto_json) print(datos["nombre"]) # Guardar directamente en un archivo with open("persona.json", "w") as archivo: json.dump(persona, archivo, indent=2)



 


viernes, 17 de julio de 2026

Día 18 — Archivos: leer y escribir ficheros en Python

Python facilita enormemente la lectura y escritura de archivos gracias a la función open(), combinada con la sentencia with, que garantiza que el archivo se cierre automáticamente al finalizar el bloque, incluso si ocurre un error durante el proceso.

Los modos más comunes de apertura son "r" para lectura, "w" para escritura (que sobreescribe el contenido existente) y "a" para añadir contenido al final del archivo sin borrar lo anterior. Saber manejar archivos es fundamental para tareas como procesar logs, generar informes o leer configuraciones.

Código de ejemplo:

# Escribir en un archivo
with open("datos.txt", "w") as archivo: archivo.write("Hola desde Python\n") archivo.write("Segunda línea\n") # Leer el archivo completo with open("datos.txt", "r") as archivo: contenido = archivo.read() print(contenido) # Leer línea a línea with open("datos.txt") as archivo: for linea in archivo: print(linea.strip())




jueves, 16 de julio de 2026

Día 17 — Manejo de errores con try / except

 Los errores en tiempo de ejecución son inevitables en cualquier programa real: un usuario introduce datos inesperados, un archivo no existe, una conexión falla. Python ofrece el bloque try / except para capturar estos errores y manejarlos de forma controlada en lugar de dejar que el programa se detenga abruptamente.

El bloque try contiene el código que puede fallar, y except especifica qué hacer si ocurre un tipo concreto de error. El bloque opcional finally se ejecuta siempre, haya error o no, y suele usarse para tareas de limpieza como cerrar archivos o conexiones.

def dividir(a, b): try: resultado = a / b return resultado except ZeroDivisionError: return "Error: no se puede dividir por cero" except TypeError: return "Error: introduce solo números" finally: print("Operación completada") print(dividir(10, 2)) # 5.0 print(dividir(10, 0)) # Error: no se puede dividir por cero




miércoles, 15 de julio de 2026

Día 16 — Herencia: reutilizando y extendiendo clases

La herencia permite crear una nueva clase a partir de otra ya existente, heredando automáticamente todos sus atributos y métodos. La clase que hereda se llama "clase hija", y la original "clase padre". Esto evita duplicar código cuando varias clases comparten comportamiento común.

Además, la clase hija puede sobreescribir cualquier método heredado para darle un comportamiento distinto, una técnica conocida como polimorfismo. Este concepto es la base de frameworks tan populares como Django, donde casi todo se construye a partir de clases que heredan funcionalidad predefinida.

Código de ejemplo:

class Animal: def __init__(self, nombre): self.nombre = nombre def hablar(self): return "..." class Perro(Animal): def hablar(self): return f"{self.nombre} dice: ¡Guau!" class Gato(Animal): def hablar(self): return f"{self.nombre} dice: ¡Miau!" rex = Perro("Rex") print(rex.hablar()) # Rex dice: ¡Guau!




martes, 14 de julio de 2026

Día 15 — Clases: introducción a la programación orientada a objetos

La programación orientada a objetos (POO) es un paradigma que modela el código a partir de "objetos" que combinan datos y comportamiento, de forma similar a como funcionan los elementos del mundo real. Una clase actúa como el molde o plantilla, y un objeto es cada instancia concreta creada a partir de ese molde.

El método __init__ es el constructor: se ejecuta automáticamente cada vez que se crea un nuevo objeto, y normalmente se usa para inicializar sus atributos. El parámetro self hace referencia al propio objeto dentro de cualquier método de la clase, y siempre debe aparecer como primer parámetro.

Código de ejemplo:

class Persona: def __init__(self, nombre, edad): self.nombre = nombre self.edad = edad def presentarse(self): return f"Soy {self.nombre} y tengo {self.edad} años" jose = Persona("José", 35) print(jose.presentarse()) print(jose.nombre) # Acceso directo al atributo




domingo, 12 de julio de 2026

Día 13 — *args y **kwargs: funciones con argumentos flexibles

A veces no sabemos de antemano cuántos argumentos recibirá una función. Para esos casos, Python ofrece *args, que agrupa cualquier cantidad de argumentos posicionales en una tupla, y **kwargs, que agrupa argumentos con nombre en un diccionario.

Estas herramientas son ampliamente utilizadas en librerías y frameworks profesionales como Flask, FastAPI o Django, donde las funciones necesitan aceptar configuraciones muy variables sin tener que predefinir cada parámetro posible.

Código de ejemplo:

def suma(*numeros): return sum(numeros) print(suma(1, 2, 3, 4)) # 10 print(suma(5, 10)) # 15 def crear_perfil(**datos): for clave, valor in datos.items(): print(f"{clave}: {valor}") crear_perfil(nombre="José", ciudad="Sevilla", edad=35)




jueves, 9 de julio de 2026

Día 11 — List comprehension: listas potentes en una línea

Las list comprehensions son una característica distintiva de Python que permite crear listas de forma compacta y legible, sustituyendo bucles for tradicionales de varias líneas por una sola expresión. Además de ser más cortas, suelen ejecutarse más rápido que el equivalente con bucle explícito.

La sintaxis básica es [expresión for elemento in iterable], y se puede añadir una condición opcional al final con if para filtrar qué elementos se incluyen en el resultado final.

Código de ejemplo:

# Forma tradicional cuadrados = [] for n in range(1, 6): cuadrados.append(n ** 2) # Con list comprehension cuadrados = [n ** 2 for n in range(1, 6)] print(cuadrados) # [1, 4, 9, 16, 25] # Con condición pares = [n for n in range(20) if n % 2 == 0] print(pares) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]