Los tipos de datos determinan qué representa un valor y qué operaciones pueden realizarse con él. Python identifica el tipo automáticamente, pero el programador sigue siendo responsable de elegir una estructura adecuada. Un número, un texto, una lista de productos y un registro de usuario tienen necesidades distintas. Comprender estas diferencias evita conversiones innecesarias, errores de lógica y estructuras difíciles de mantener.
Esta guía se relaciona con los artículos sobre strings, listas, diccionarios, sets y tuplas.
La documentación oficial de tipos integrados describe el comportamiento de números, secuencias, conjuntos y mappings. El tutorial oficial de estructuras de datos ofrece ejemplos prácticos de listas, diccionarios y sets.
Consultar el tipo de un valor
edad = 30
nombre = "Lucía"
activo = True
print(type(edad))
print(type(nombre))
print(type(activo))
type() muestra la clase exacta. Para comprobar compatibilidad, especialmente con herencia, suele ser mejor isinstance:
if isinstance(edad, int):
print("Es un entero")
Enteros: int
int representa números enteros positivos, negativos o cero. Python admite enteros muy grandes sin un límite fijo pequeño:
usuarios = 1250
saldo = -40
potencia = 2 ** 100
Las operaciones más comunes son suma, resta, multiplicación, división entera, resto y potencia:
a = 17
b = 5
print(a + b) # 22
print(a // b) # 3
print(a % b) # 2
print(a ** b) # 1419857
Decimales: float
float representa números de punto flotante:
temperatura = 22.5
porcentaje = 0.18
No todos los decimales pueden representarse exactamente en formato binario:
print(0.1 + 0.2)
# 0.30000000000000004
Para comparar resultados calculados utiliza math.isclose. Para dinero o reglas decimales exactas, considera Decimal.
Booleanos: bool
bool tiene dos valores: True y False. Se utiliza para decisiones:
tiene_permiso = True
if tiene_permiso:
print("Acceso permitido")
Muchos valores tienen una interpretación booleana. Cero, cadenas vacías, listas vacías y None son falsos. No confundas una cadena "False" con el booleano False: toda cadena no vacía se considera verdadera.
Texto: str
str representa texto Unicode:
mensaje = "Python es legible"
print(mensaje.upper())
print(mensaje.split())
print(mensaje.replace("legible", "práctico"))
Las strings son inmutables. Los métodos devuelven nuevos valores:
nombre = " ana "
limpio = nombre.strip().title()
Listas: list
Una lista es ordenada, mutable y permite valores repetidos:
tareas = ["estudiar", "probar", "documentar"]
tareas.append("publicar")
tareas[0] = "repasar"
Es apropiada cuando el orden importa y la colección puede cambiar. Aunque Python permite mezclar tipos, una lista homogénea suele ser más fácil de procesar.
Tuplas: tuple
Una tupla es ordenada e inmutable:
coordenada = (10, 25)
x, y = coordenada
Resulta útil para registros pequeños que no deben cambiar, coordenadas, claves compuestas y retornos múltiples. La inmutabilidad no significa que todos los objetos contenidos sean inmutables; una tupla puede contener una lista modificable.
Conjuntos: set
Un set almacena valores únicos y permite búsquedas rápidas:
etiquetas = {"python", "web", "python"}
print(etiquetas)
# {'python', 'web'}
También facilita operaciones matemáticas:
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # unión
print(a & b) # intersección
print(a - b) # diferencia
No dependas del orden visual de un set. Para un conjunto inmutable utiliza frozenset.
Diccionarios: dict
Un diccionario relaciona claves únicas con valores:
usuario = {
"nombre": "Ana",
"edad": 28,
"activo": True,
}
print(usuario["nombre"])
print(usuario.get("telefono", "No disponible"))
Es ideal para registros, configuraciones, índices y respuestas JSON. Las claves deben ser hashables, como strings, números o tuplas inmutables.
El valor None
None representa ausencia de valor:
resultado = None
if resultado is None:
print("Todavía no hay resultado")
Compáralo con is None, no con == None. Distingue entre ausencia, cero, cadena vacía y lista vacía, porque pueden tener significados diferentes.
Rangos: range
range representa una secuencia de enteros sin crear una lista completa:
for numero in range(1, 6):
print(numero)
Es eficiente para bucles y admite inicio, límite y paso. El límite final no se incluye.
Bytes y bytearray
bytes representa datos binarios inmutables. bytearray es mutable:
texto = "café"
datos = texto.encode("utf-8")
recuperado = datos.decode("utf-8")
Se usan en archivos binarios, redes, imágenes y criptografía. No intentes mezclar bytes y strings sin codificar o decodificar explícitamente.
Tipos mutables e inmutables
Los enteros, floats, booleanos, strings, bytes, tuplas y frozensets son inmutables. Las listas, diccionarios, sets y bytearrays son mutables. Esta diferencia afecta asignaciones y funciones:
lista_a = [1, 2]
lista_b = lista_a
lista_b.append(3)
print(lista_a) # [1, 2, 3]
Ambas variables apuntan al mismo objeto. Para una copia superficial usa lista_a.copy(). Para estructuras anidadas puede ser necesario copy.deepcopy.
Convertir tipos
edad = int("30")
precio = float("19.90")
texto = str(123)
valores = list((1, 2, 3))
unicos = set([1, 1, 2])
Las conversiones pueden fallar:
try:
cantidad = int(input("Cantidad: "))
except ValueError:
print("Debes introducir un entero")
Elegir la estructura correcta
Usa una lista para una secuencia modificable, una tupla para un grupo fijo, un set para unicidad y pertenencia, y un diccionario para asociaciones clave-valor. No elijas solo por costumbre. Pregunta si el orden importa, si debe haber duplicados, cómo se busca la información y si los valores cambiarán.
Anotaciones de tipo
def promedio(valores: list[float]) -> float:
if not valores:
raise ValueError("La lista está vacía")
return sum(valores) / len(valores)
Las anotaciones no impiden automáticamente pasar otro tipo durante la ejecución, pero mejoran el editor, la documentación y el análisis estático.
Errores frecuentes
Los fallos habituales incluyen sumar strings con números, modificar una colección mientras se recorre, usar una lista como clave de diccionario, esperar orden en un set, comparar floats con igualdad exacta y crear copias superficiales de estructuras anidadas. También es común convertir un valor demasiado pronto y perder información.
Ejemplo práctico
productos = [
{"id": 1, "nombre": "Teclado", "precio": 50.0},
{"id": 2, "nombre": "Ratón", "precio": 20.0},
]
ids = {producto["id"] for producto in productos}
precios = [producto["precio"] for producto in productos]
resumen = (len(productos), sum(precios))
print(ids)
print(resumen)
Cada estructura cumple una función: lista para los registros ordenados, diccionarios para cada producto, set para identificadores únicos y tupla para un resumen fijo.
Conclusión
Los tipos de datos son la base de cualquier programa Python. Comprender números, booleanos, strings, listas, tuplas, sets, diccionarios, None y bytes permite representar cada problema de forma clara. Presta atención a mutabilidad, conversiones y precisión. Elegir bien la estructura simplifica los algoritmos y reduce errores antes de escribir código más avanzado.






