QuieroProgramar por Rodri Gonzalez
Python · Lección 03 de 27

Tipos de datos

Todo valor en Python tiene un tipo. El tipo determina qué podés hacer con ese valor, cuánta memoria ocupa y cómo se comporta al combinarse con otros. Entender tipos es la base de todo análisis de datos serio.

80–100 min Prerrequisitos: 01 Qué es Python, 02 Instalación
01

Concepto teórico

¿Qué es un tipo de dato y por qué importa?

Cuando guardás un valor en Python, el intérprete necesita saber qué clase de dato es para tres cosas: (1) cuánta memoria reservar, (2) qué operaciones están permitidas, y (3) cómo comportarse al combinar ese dato con otros. Si tenés el número 5 y el texto "5", se ven iguales en pantalla, pero para Python son completamente distintos: con el primero podés sumar (5 + 3 = 8), con el segundo concatenás ("5" + "3" = "53"). Mismo operador, resultado diferente según el tipo.

Python tiene tipado dinámico: no declarás el tipo explícitamente antes de asignar un valor (como sí pasa en Java con int edad = 35; o en C++ con float precio = 99.5f;). Simplemente escribís edad = 35 y Python infiere automáticamente que es un entero. Si después hacés edad = "treinta y cinco", la variable ahora apunta a un string sin quejarse. Esta flexibilidad acelera el desarrollo pero te exige criterio: si mezclás tipos sin querer, tu código va a fallar o, peor, va a dar resultados incorrectos sin que te des cuenta.

Punto clave: una variable en Python no "contiene" un valor — referencia un objeto en memoria que tiene tipo, valor e identidad. Podés verificar el tipo de cualquier valor con type(valor).

int — Enteros

Los int representan números enteros: positivos, negativos o cero. A diferencia de muchos lenguajes (C, Java, JavaScript) donde los enteros tienen un límite de 32 o 64 bits, en Python los enteros no tienen límite de tamaño. Podés tener un número de 1000 dígitos sin problema — Python le asigna memoria dinámicamente. Esto elimina los bugs de "integer overflow" que son comunes en otros lenguajes.

Formas de escribir enteros:

float — Números decimales

Los float representan números con punto decimal. Internamente usan el estándar IEEE 754 de punto flotante de 64 bits. Esto les da una precisión de aproximadamente 15-17 dígitos significativos, pero NO son exactos. Esta es probablemente la trampa más importante de toda la programación:

0.1 + 0.2 en Python da 0.30000000000000004, no 0.3.

¿Por qué? Porque 0.1 en binario es un número periódico (como 1/3 en decimal es 0.333...). La computadora tiene que truncarlo, y ese error microscópico se acumula. Para la mayoría de cálculos científicos esto es irrelevante, pero para cálculos financieros puede ser catastrófico: si procesás 100,000 transacciones, esos errores de redondeo se acumulan y tu balance no cierra.

Error crítico en finanzas: usar float para cálculos de dinero. Para montos financieros usá Decimal del módulo decimal, que trabaja en base 10 y es exacto. O trabajá en centavos con enteros: $150.50 = 15050 centavos (int). Los bancos usan esta segunda técnica internamente.

Valores especiales de float:

str — Cadenas de texto

Los str (strings) son secuencias de caracteres. Podés usar comillas simples 'hola', dobles "hola" o triples '''hola''' / """hola""". Las triples permiten texto multilínea.

Características importantes:

bool — Booleanos

bool tiene solo dos valores: True y False. Son el resultado de comparaciones y la base de toda decisión en tu código. Dato curioso: en Python, bool es una subclase de int. Esto significa que True == 1 y False == 0, y podés hacer aritmética con ellos: True + True = 2. Esto es útil para contar cuántos elementos cumplen una condición.

Truthy y falsy: en Python, CUALQUIER valor puede evaluarse como booleano. Los siguientes evalúan como False (son "falsy"):

Todo lo demás es truthy (evalúa como True). Esto incluye: "0" (string con un cero), [0] (lista con un elemento), -1 (negativo), etc.

None — La ausencia de valor

None representa explícitamente "no hay dato". No es lo mismo que 0 (cero es un valor), ni que "" (string vacío es un valor), ni que False. None significa literalmente "ausencia".

Analogía financiera: en scoring crediticio, no es lo mismo "ingreso = 0" (la persona declaró que no tiene ingresos) que "ingreso = None" (la persona no contestó la pregunta). Confundir estos dos casos te rompe métricas y modelos. Un 0 se puede promediar; un None hay que decidir si lo excluís, lo imputás o lo marcás como dato faltante.

Para comparar con None, usá is None en vez de == None. is verifica identidad (es el mismo objeto en memoria), mientras que == verifica igualdad de valor. None es un singleton — solo existe UNA instancia — por eso is es más correcto y más rápido.

Conversión entre tipos (casting)

Muchas veces necesitás convertir un tipo a otro. Los datos que llegan de un CSV, una API o un formulario web vienen casi siempre como strings y necesitás convertirlos al tipo correcto para operar.

Función Convierte a Ejemplo Resultado ¡Cuidado!
int() Entero int("42") 42 int("42.5") da error — primero float()
float() Decimal float("3.14") 3.14 float("$100") da error — limpiá el $
str() Texto str(42) "42" Siempre funciona
bool() Booleano bool(0) False bool("False") es True (string no vacío)
int(float) Entero truncado int(3.99) 3 Trunca, NO redondea. Usá round() si querés redondear
En data analysis: cuando leés un CSV con pandas, todas las columnas empiezan como string u object. Tu primer paso siempre es tipar correctamente: df["monto"] = pd.to_numeric(df["monto"]), df["fecha"] = pd.to_datetime(df["fecha"]). Si no tipás bien, un .sum() concatena strings en vez de sumar números, y tu reporte tiene basura.
Tip profesional: cuando cargás datos, validá tipos explícitamente y registrá las reglas de conversión. Si un campo "ingreso" viene como "$1,250.50", documentá que hay que sacar el $, reemplazar la coma, y convertir a float. Eso vuelve tu pipeline reproducible y auditable.
02

Ejemplos explicados paso a paso

Ejemplo 1: Crear variables de cada tipo y verificar con type()

La función type() te dice exactamente qué tipo tiene un valor. Usala constantemente cuando no estés seguro.

ejemplo_01_tipos.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: El problema de precisión de float y la solución con Decimal

Este es probablemente el bug más famoso de la programación. Si trabajás con plata, tenés que entender esto.

ejemplo_02_precision.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Operaciones entre tipos y qué pasa al mezclar

Python tiene reglas claras sobre qué operaciones están permitidas entre tipos distintos.

ejemplo_03_mezcla.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: Tabla completa de truthy/falsy

Entender qué valores son "falsy" te evita bugs sutiles. En pandas, esto es crítico para filtrar datos.

ejemplo_04_truthy.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: Parsear datos reales — de string crudo a tipos correctos

Así se ven los datos en el mundo real: todo viene como texto y vos tenés que convertirlo. Este patrón lo vas a repetir cientos de veces como analista.

ejemplo_05_parseo.pyPython

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Tipo Ejemplo Verificar Convertir a Notas
int 42, -7, 0xFF type(x) is int int("42") Sin límite de tamaño en Python
float 3.14, 1.5e10 type(x) is float float("3.14") Impreciso — usar Decimal para finanzas
str "hola", 'mundo' type(x) is str str(42) Inmutable. Unicode nativo.
bool True, False type(x) is bool bool(0) Subclase de int (True=1)
None None x is None Singleton. Usar is, no ==
Valor bool() Categoría
0, 0.0, "", [], {}, None, False False Falsy
Todo lo demás (1, "0", [0], -1, "False") True Truthy
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Crear variables y verificar tipos

Creá 5 variables (una de cada tipo: int, float, str, bool, None) e imprimí cada una con su tipo usando type().__name__. El output debe incluir NoneType.

ejercicio_01.pyDebe incluir "NoneType"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Conversión string a número con IVA

Tenés precio_texto = "1000". Convertilo a float, calculá con IVA 21% e imprimí el resultado. Debe incluir 1210.

ejercicio_02.pyDebe incluir "1210"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Truthy y falsy

Creá una lista con estos valores: [0, "", "YPF", 42, None, [], False, "0"]. Recorrela e imprimí cada valor con su resultado de bool(). Debe incluir False.

ejercicio_03.pyDebe incluir "False"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Precisión float vs Decimal

Demostrá el problema de 0.1 + 0.2 con float y resolvelo con Decimal. Imprimí ambos resultados. Debe incluir exactamente 0.3.

ejercicio_04.pyDebe incluir "0.3"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Celsius a Fahrenheit

Convertí celsius = 25 a Fahrenheit con la fórmula (celsius * 9/5) + 32. Verificá que el resultado sea float e imprimilo. Debe incluir 77.

ejercicio_05.pyDebe incluir "77"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Extraer CUIT

Dado cuit = "20-12345678-9", extraé el cuerpo numérico central (el "12345678") y convertilo a int. Imprimilo. Debe incluir 12345678.

ejercicio_06.pyDebe incluir "12345678"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Validador de tipo y truthy/falsy

Creá una función analizar(valor) que imprima el valor, su tipo y si es truthy o falsy. Probala con: False, "Galicia", 0, None, [1,2,3]. Debe incluir FALSY.

ejercicio_07.pyDebe incluir "FALSY"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Limpiar montos con símbolos

Tenés montos_str = ["$1,500.00", "$820.50", "$3,200.00"]. Limpiá los símbolos, convertí a float, sumá e imprimí el total. Debe incluir 5520.5.

ejercicio_08.pyDebe incluir "5520.5"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Simulación bancaria float vs Decimal

Empezá con $100,000. Aplicá 2% de interés mensual durante 12 meses, una vez con float y otra con Decimal. Imprimí ambos resultados para mostrar la diferencia. Debe incluir Decimal.

ejercicio_09.pyDebe incluir "Decimal"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Parsear registro completo a diccionario tipado

Dado "López|42|Córdoba|680|$185,000.00|False", parseá cada campo al tipo correcto y creá un diccionario con claves nombre, edad, ciudad, score, ingreso, activo. Imprimí el diccionario. Debe incluir ingreso.

ejercicio_10_desafio.pyDebe incluir "ingreso"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (04 · Variables y constantes) vas a aprender cómo nombrar, organizar y reutilizar estos valores que acabás de tipar. Las buenas prácticas de naming son lo que separa código amateur de código profesional.

Recursos: Python docs — Built-in Types · Módulo decimal