Parte III — El Templo de los Sabios 🏛️

Conjuntos, Diccionarios, Comprensiones, Generadores y Unpacking Avanzado

🏛️ El Templo de los Sabios

Última etapa: estructuras con semántica conjuntista y clave-valor.

Generadores (evaluación perezosa) y operadores de unpacking.

🪶 Conjuntos (Sets)

a = {1, 2, 3, 3}
b = {3, 4, 5}
print(a)                    # {1, 2, 3}
print(a | b)                # unión
print(a & b)                # intersección
print(a - b)                # diferencia

Nota: Un set no almacena duplicados y no preserva orden.

🧰 Diccionarios (Dict)

precios = {"manzana": 1200, "pera": 900}
precios["uva"] = 1500           # agregar
precios["pera"] = 950           # actualizar
del precios["manzana"]          # eliminar
print(precios.get("mango", 0))  # acceso seguro con valor por defecto
print(list(precios.items()))    # pares (clave, valor)

Nota: Mapeos clave→valor con acceso promedio O(1).

✨ Dict & Set Comprehensions

numeros = [1,2,3,4,5]
dobles = {n: n*2 for n in numeros if n % 2 == 1}  # dict comprehension
pares = {n for n in numeros if n % 2 == 0}        # set comprehension
print(dobles, pares)

Nota: Compacidad y legibilidad para generar colecciones derivadas.

🔄 Generadores (evaluación perezosa)

def cuadrados(n):
    for i in range(n):
        yield i**2

g = cuadrados(5)            # no calcula aún
print(next(g), next(g))     # evalúa bajo demanda

Nota: yield suspende la función y produce valores secuenciales bajo demanda, ahorrando memoria frente a listas grandes.

💡 Expresión generadora

import sys
gen = (i**2 for i in range(10_000))
print(type(gen).__name__, sys.getsizeof(gen))

Nota: Una generator expression es como una comprensión, pero perezosa.

🧰 Operadores de Unpacking

# Unir secuencias
a = [1, 2]; b = [3, 4]
c = [*a, *b, 5]      # [1,2,3,4,5]

# Unir diccionarios (Python 3.9+)
d1 = {"x": 1}; d2 = {"y": 2}
d = {**d1, **d2, "z": 3}
print(c, d)

Nota: * desempaqueta iterables; ** desempaqueta mapeos (diccionarios).

🔁 Swapping de variables (intercambio)

a, b = 10, 20
a, b = b, a
print(a, b)

Nota: En Python no se necesita variable temporal auxiliar.

🧭 Consideraciones de diseño (Resumen)

  • Use sets para pertenencia y operaciones de teoría de conjuntos.
  • Use dicts para acceso por clave y estructuras semánticas (registros).
  • Use generadores para secuencias grandes o potencialmente infinitas.
  • Use unpacking para combinar y distribuir datos de forma clara y segura.

💭 Checkpoint (Reflexión)

  1. ¿Qué imprime {"a":1} | {"b":2} en Python 3.9+?
  1. {"a":1, "b":2} • b) Error • c) {"a":1} | {"b":2} (cadena)
  1. ¿Qué ventaja clave aportan los generadores?
  1. Velocidad siempre mayor • b) Menor uso de memoria por evaluación perezosa • c) Ordenar secuencias
  1. ¿Qué operador desempaqueta diccionarios dentro de otro?
  1. * • b) ** • c) //