Tipos de datos
Identifica los tipos centrales de Python, int, float, str, bool, y comprende qué representa cada uno.
- Identificar valores int, float, str y bool
- Usar type() para comprobar el tipo de un valor
- Comprender el tipado dinámico de Python
- Reconocer valores truthy y falsy
El conjunto al que pertenece un número
Responde dos preguntas: tienes manzanas y partes una por la mitad. ¿Sostienes ahora manzanas en el mismo sentido que sostenías ? Media manzana no es un número entero de manzanas, el vive en , y el vive en .
Un matemático responde preguntándose a qué conjunto pertenece un valor. La misma distinción persigue a todo programa: la máquina almacena de forma distinta a , y de forma distinta a "42". La palabra que Python usa para “en qué conjunto vive este valor” es tipo.
Entonces: ¿cuántos conjuntos merece la pena distinguir? Cuatro, al principio.
| Tipo | Qué es, matemáticamente | Ejemplos |
|---|---|---|
int | , los enteros, guardados con exactitud | 42, -7 |
float | , aproximado con un número fijo de dígitos binarios | 3.14, -0.5 |
str | una secuencia finita de caracteres | "hello" |
bool | True, False |
La fila de float tiene una reserva deliberada, aproximado. Un entero se guarda exacto, siempre. Un número real casi nunca: ¿cómo guardarías con un número finito de dígitos? No puedes, así que Python mantiene una aproximación finita y las cuentas divergen en los últimos dígitos. Ese único hecho explica una sorpresa famosa que verás enseguida.
Preguntar a qué conjunto pertenece
Dada una valor, puedes preguntar su tipo directamente:
type(42) # <class 'int'>
type(3.14) # <class 'float'>
type("hi") # <class 'str'>
type(True) # <class 'bool'>Dos notas de notación. Primera, type(...) es una función, le entregas un valor y te devuelve el objeto de tipo al que pertenece ese valor. Segunda, la respuesta imprime <class 'int'>; la palabra class es el término de Python para tipo, y la palabra entre comillas es el nombre del conjunto. Lee <class 'float'> como “pertenece al conjunto float”.
Un nombre no se compromete con un conjunto
Aquí empiezan los beneficios. En un lenguaje de tipado estático declararías por adelantado: x es un entero. Python, en cambio, deja que un nombre apunte donde quiera:
x = 5
print(type(x)) # <class 'int'>
x = "hello"
print(type(x)) # <class 'str'>Redirigir un nombre a otro conjunto es legal, así que el tipo de x no se lee de ninguna declaración, solo preguntando a qué apunta ahora. Esto es el tipado dinámico. Es cómodo, y es también la razón por la que tu programa puede, en silencio, entregar una cadena a una función que espera números: nada lo impide hasta que la propia operación falla.
¿Qué valores actúan como True?
Todo valor es truthy o falsy, o bien se comporta como True en una condición, o bien como False. La regla es compacta y merece la pena verificarla:
- Falsy: el , el , la cadena vacía
""yNone - Truthy: todo lo demás
bool(0) # False
bool(1) # True
bool(-1) # True — cualquier número no nulo es truthy
bool("") # False
bool("hello") # True — cualquier cadena no vacía es truthyFíjate en lo que está en la lista y en lo que queda fuera. -1 es True; 0 no. La cadena "0" es True, es no vacía, y para las cadenas el criterio es la vacuidad, no el valor de su contenido. Esta regla se paga sola en cuanto escribes tu primer if: if score: significa si score no es cero.
Un ejemplo resuelto: auditar una expresión
Los conjuntos pagan en cuanto una expresión los mezcla. Lee el recibo línea a línea y pregunta el conjunto de cada resultado:
unit_price = 4.75
quantity = 4
bill = unit_price * quantity # float: el float absorbe al int
type(bill) # <class 'float'>
bool(bill) # True — todo lo distinto de cero es truthy
type(10 / 2) # <class 'float'> — la división real nunca da intLee bill como el producto de dos conjuntos distintos. Los conjuntos no se “mezclan”, gana el float, porque la proporción no es un número entero de ninguna escala y el conjunto más ancho debe contenerla. La costumbre de auditoría es preguntar al conjunto directamente: type(...) confirma lo que sospechabas en vez de apostar a la suerte.
Errores comunes
4 / 2es2.0, no2. La división real (/) siempre devuelve unfloaten Python 3, incluso cuando la división es exacta. Para un resultado entero pide división entera:4 // 2→2.True + Truees2.booles una subclase deinten Python:Truese comporta como yFalsecomo en aritmética. Los dos conjuntos se solapan, perotype(True)sigue respondiendobool.type()informa el tipo concreto.type(True)esbool, noint, por mucho queTruecolabore en las sumas.type()describe el resultado, no los operandos.type(2 * 3.0)esfloat, unintmultiplicado por unfloatvive en el conjuntofloat. No lo predigas de las piezas; pregúntale a la respuesta.
🧩 Desafíos
🧩 Desafío, piensa primero, luego revela
Predice type(7 / 2) y luego compruébalo.
💡 Respuesta: type(7 / 2) es float, la división real (/) siempre produce un float en Python 3, incluso cuando ambos operandos son enteros y el cociente es un número entero.
🧩 Desafío, piensa primero, luego revela
Predice bool(0), bool(0.0), bool("") y bool("0"). ¿Cuáles son truthy y cuáles falsy?
💡 Respuesta: bool(0) → False, bool(0.0) → False, bool("") → False (cadena vacía), bool("0") → True (cadena no vacía, aunque su contenido sea el carácter "0").
🧩 Desafío, piensa primero, luego revela
En Python, 0.1 + 0.2 no es igual a 0.3. Aquí está el mismo problema en papel: ¿qué ocurre al representar con dos dígitos decimales? Ahora explica por qué un float, que aproxima con finitos dígitos binarios, no puede representar exactamente.
💡 Respuesta: Con dos dígitos, el $1/3$ debe convertirse en $0.33$, una pérdida ya cometida antes de cualquier operación. Igualmente, el $0.1$ no tiene forma binaria exacta; el float guarda un valor cercano, y sumar dos de esos valores arrastra errores diminutos: 0.1 + 0.2 da 0.30000000000000004, no 0.3. Precisión finita, no un error de Python.
🤔 Preguntas socráticas
- Si
bool(-1)esTrue, ¿qué regla única explica que sea truthy pero el sea falsy? ¿Se generaliza la regla de los números a las cadenas? - Python tiene
isinstance(42, int)que devuelveTrue. ¿Seríaisinstancemás fiable quetype(x) == intpara comprobar tipos? ¿Por qué? - ¿Por qué Python escribe
TrueyFalseen mayúsculas en lugar detrueyfalse? ¿Qué otras palabras capitalizadas reserva Python?
✅ Comprobación rápida
1. ¿Cuál es el tipo de 3.14?
2. ¿Cuál es el resultado de True + True?
3. ¿Cuál de estos es falsy?