Parte II — El Campamento de los Hechizos 🔥

Funciones Lambda, map/filter, zip y Estructuras Lineales (Pilas y Colas)

🔥 Campamento de Hechizos

En esta etapa, el sabio del campamento enseña herramientas funcionales y estructuras lineales. El foco está en escribir transformaciones claras y expresivas.

🪄 Funciones lambda

al_cuadrado = lambda x: x**2
print(al_cuadrado(5))

# Equivalente con def
def al_cuadrado_def(x): return x**2
print(al_cuadrado_def(5))

Nota: lambda crea funciones anónimas simples; útil como argumento de key, map, filter.

🌊 map() — transformar colecciones

numeros = [1, 2, 3, 4]
resultado = list(map(lambda n: n**2, numeros))
print(resultado)

Nota: map aplica una función a cada elemento. En Python moderno, muchas veces preferimos comprensiones.

🧹 filter() — seleccionar elementos

numeros = [1, 2, 3, 4, 5, 6]
pares = list(filter(lambda n: n % 2 == 0, numeros))
print(pares)

Nota: filter retiene solo los elementos que satisfacen el predicado.

✅ Equivalentes con comprensiones

numeros = [1,2,3,4,5,6]
cuadrados = [n**2 for n in numeros]
pares = [n for n in numeros if n % 2 == 0]
print(cuadrados, pares)

Nota: En Python, las comprensiones son idiomáticas por legibilidad.

🧵 zip() — “cremalleras” de secuencias

nombres = ["Ana", "Luis", "Marta"]
edades = [21, 22, 23]
parejas = list(zip(nombres, edades))
print(parejas)

Nota: zip agrupa elemento a elemento. Útil para recorrer listas sincronizadas.

📦 Pilas (Stacks) — LIFO

pila = []
pila.append("A")   # push
pila.append("B")
pila.append("C")
tope = pila.pop()  # pop => "C"
print(pila, tope)

Nota: Las listas sirven como pilas. Operaciones principales: append y pop.

🚦 Colas (Queues) — FIFO

from collections import deque

cola = deque(["cliente1", "cliente2"])
cola.append("cliente3")     # enqueue
atendido = cola.popleft()   # dequeue
print(list(cola), atendido)

Nota: Use collections.deque para colas eficientes en ambos extremos.

🧪 Mini-reto: Undo/Redo

acciones = []
redo = []

def hacer(accion):
    acciones.append(accion); redo.clear()

def deshacer():
    if acciones: redo.append(acciones.pop())

def rehacer():
    if redo: acciones.append(redo.pop())

hacer("escribir A"); hacer("escribir B")
deshacer(); rehacer()
print(acciones, redo)

Idea: Dos pilas gestionan historial (undo) y rehacer (redo).

💭 Checkpoint (Reflexión)

  1. ¿Cuándo prefieres comprensiones sobre map/filter?
  1. Por claridad y brevedad en transformaciones simples.
  1. ¿Qué estructura usar para una cola eficiente?
  1. list • b) deque • c) set
  1. ¿Qué retorna zip si las listas tienen longitudes distintas?
  1. Rellena con None • b) Se detiene en la más corta • c) Lanza error