Las tuplas parecen listas de segunda clase: sin append, sin remove, sin sort. En realidad son una elección deliberada de diseño. Su inmutabilidad las hace más rápidas, más seguras y capaces de hacer cosas que las listas no pueden, como servir de clave de diccionario.
Crear tuplas y la trampa del elemento único
# Tupla normal punto = (3, 7) rgb = (255, 128, 0) vacia = () # TRAMPA: una coma hace la diferencia no_tupla = (42) # esto es un int, no una tupla si_tupla = (42,) # esta sí es una tupla de un elemento print(type(no_tupla)) #print(type(si_tupla)) #
Por qué las tuplas pueden ser claves de diccionario
Los diccionarios de Python requieren que las claves sean hashables: objetos cuyo valor no cambia durante su vida útil. Las tuplas de elementos inmutables son hashables; las listas no lo son.
# Caché de coordenadas usando tuplas como claves
distancias = {}
distancias[(0, 0)] = 0
distancias[(3, 4)] = 5.0
distancias[(1, 1)] = 1.41
print(distancias[(3, 4)]) # 5.0
# Esto lanza TypeError: unhashable type: 'list'
# distancias[[3, 4]] = 5.0
Desempaquetado (unpacking)
El unpacking asigna cada elemento de una tupla a una variable distinta. Python lo soporta en asignaciones, bucles for y llamadas a funciones.
punto = (10, 20)
x, y = punto
print(x, y) # 10 20
# Intercambio de variables sin temporal
a, b = 1, 2
a, b = b, a
print(a, b) # 2 1
# Ignorar valores con _
datos = ("Ana", 32, "Madrid", "Ingeniería")
nombre, _, ciudad, _ = datos
print(nombre, ciudad) # Ana Madrid
# Desempaquetado extendido con *
primero, *resto = (1, 2, 3, 4, 5)
print(primero) # 1
print(resto) # [2, 3, 4, 5]
*inicio, ultimo = (1, 2, 3, 4, 5)
print(inicio) # [1, 2, 3, 4]
print(ultimo) # 5
namedtuple: tuplas con nombres de campo
collections.namedtuple permite acceder a los elementos por nombre además de por índice, lo que hace el código mucho más legible:
from collections import namedtuple
Punto = namedtuple('Punto', ['x', 'y'])
Color = namedtuple('Color', ['rojo', 'verde', 'azul'])
p = Punto(3, 7)
print(p.x, p.y) # 3 7
print(p[0], p[1]) # 3 7 también funciona por índice
rojo_puro = Color(255, 0, 0)
print(rojo_puro.rojo) # 255
print(rojo_puro) # Color(rojo=255, verde=0, azul=0)
Cuándo usar tupla y cuándo lista
# Tupla: datos heterogéneos con significado fijo (fila de BD, coordenada)
empleado = ("García", "Ana", 42500.0, True)
# Lista: colección homogénea que puede cambiar
nombres_activos = ["Pedro", "María", "Luis"]
# Tupla en return: devolver varios valores
def minmax(nums):
return min(nums), max(nums) # devuelve tupla automáticamente
minimo, maximo = minmax([3, 1, 4, 1, 5, 9])
print(minimo, maximo) # 1 9
La regla práctica: si los datos tienen estructura fija con significado semántico (coordenada, fecha, registro), usa tupla. Si la colección va a crecer, encogerse o reordenarse, usa lista.
