13 · Tuplas: inmutables, hasheables, frecuentemente retornadas
Desempaquetado, la trampa del elemento único, desempaquetado extendido con * y namedtuple para tipos de registro legibles.
Una tupla es una secuencia **inmutable** — una vez creada, no puede cambiar. Esa inmutabilidad hace que las tuplas sean seguras como claves de diccionario, seguras para compartir entre funciones y el contenedor natural para los múltiples valores de retorno de una función.
Sin esto:
Sin tuplas, devolver múltiples valores de una función (por ejemplo `loss, accuracy`) requeriría un dict o una clase — más ceremonia para lo que es conceptualmente un registro.
Los literales de tupla usan paréntesis: (1, 2, 3). Los paréntesis son en realidad opcionales — 1, 2, 3 también es una tupla — pero incluirlos es idiomático por claridad. Las tuplas admiten la misma indexación y slicing que las listas pero no admiten asignación de elementos. También son hasheables, por lo que pueden usarse como claves de diccionario o colocarse dentro de sets.
Python (in browser)
El intercambio `a, b = b, a` funciona porque el lado derecho se evalúa *primero* como la tupla `(b, a)`, luego se desempaqueta. Sin variable temporal.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
El nombre con asterisco `*rest` absorbe todos los elementos restantes en una **lista**. Puedes colocarlo al inicio, en el medio o al final del destino de desempaquetado.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`namedtuple` es una forma de costo cero para agregar nombres de atributos a una tupla. El resultado sigue siendo inmutable e iterable — perfecto para valores de retorno estructurados.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Qué es `type((1))` en Python?
Una 2-tupla `(x, y)` es un punto en R² — exactamente lo que el capítulo 2 de MML define como un vector en el espacio bidimensional. Las tuplas de Python hacen que ese concepto matemático sea directamente expresable en código.
- Las tuplas son secuencias inmutables — la misma indexación que las listas, pero sin asignación de elementos. Hasheables: se pueden usar como claves de diccionario.
- `a, b = b, a` es un intercambio pythónico — sin variable temporal. `first, *rest = t` captura el resto en una lista.
- `(1,)` es una tupla de un elemento; `(1)` es simplemente el entero `1`. La coma al final es obligatoria.
Las funciones en los frameworks de ML rutinariamente devuelven tuplas: `return loss, accuracy` en un paso de entrenamiento; pares `(input, target)` en los DataLoaders de PyTorch; `model.evaluate()` en Keras devuelve `(loss, metrica)`. Los descriptores de forma como `(batch_size, sequence_length, hidden_dim)` son tuplas porque son registros fijos, no colecciones mutables.
Si lo quitas: Sin tuplas, cada retorno de múltiples valores requiere un dict o un dataclass — más ceremonia. Sin inmutabilidad, los descriptores de forma podrían mutarse accidentalmente en medio del pipeline, causando errores crípticos de incompatibilidad de dimensiones.