1.3.-Tipos de datos
1.3. Tipos de datos¶
Idea principal
El tipo de un dato indica qué valor representa y qué operaciones son coherentes con él. Elegir y comprobar los tipos evita errores y permite transformar los datos de entrada en información útil.
En 1.2 usamos variables, operadores y conversiones en pequeños programas. Ahora profundizaremos en los tipos simples y en los principales contenedores de Python. Esta base será necesaria para recorrer, filtrar y procesar colecciones en los siguientes temas.
1. Por qué existen los tipos¶
Un tipo de dato describe qué clase de valor representa un dato y qué
operaciones se pueden realizar con él. Los tipos permiten que el programa
interprete correctamente los valores y distinga, por ejemplo, entre el número
17 y el texto "17". Aunque ambos se escriben con los mismos dígitos, el
primero puede participar en operaciones aritméticas y el segundo está formado por
dos caracteres.
>>> 17 + 3
20
>>> "17" + "3"
'173'
>>> 17 + "3"
Traceback (most recent call last):
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Los lenguajes gestionan los tipos de distintas maneras:
- En un lenguaje de tipado estático, como Kotlin, el tipo se conoce y se comprueba normalmente antes de ejecutar el programa. El compilador puede detectar muchos errores con antelación.
- En un lenguaje de tipado dinámico, como Python, el tipo se asocia al valor durante la ejecución y no es obligatorio escribirlo al crear cada variable.
- En un lenguaje de tipado fuerte, como Python o Kotlin, no se mezclan sin más valores incompatibles.
- En un lenguaje de tipado débil pueden existir más conversiones implícitas. Esto puede reducir la cantidad de código escrito, pero también ocultar errores.
Estas características no hacen que un lenguaje sea mejor que otro. Representan distintos equilibrios entre flexibilidad, rapidez para escribir y cantidad de errores que se detectan antes de ejecutar el programa.
Aunque Python es dinámico, conocer el tipo de cada dato sigue siendo importante. Elegir y comprobar el tipo adecuado permite:
- aplicar operaciones válidas y obtener resultados previsibles;
- detectar conversiones incorrectas;
- documentar la intención del programa;
- facilitar la lectura, las pruebas y el mantenimiento del código.
En Python se puede consultar el tipo actual con type(). También se pueden usar
anotaciones de tipo para comunicar qué tipo se espera, aunque Python no las
utiliza por sí solo para impedir la ejecución:
Las anotaciones ayudan a las herramientas de desarrollo y a quienes leen el
código. En cualquier caso, un valor obtenido con input() sigue siendo texto
hasta que se convierte explícitamente.
Este contenido trabaja el RA 1 del módulo de Programación.
| Código | Descripción |
|---|---|
| RA 1 | Reconoce la estructura de un programa informático, identificando y relacionando los elementos propios del lenguaje de programación utilizado. |
| CE d | Se han identificado los distintos tipos de variables y la utilidad específica de cada uno. |
| CE e | Se ha modificado el código de un programa para crear y utilizar variables. |
| CE g | Se han clasificado, reconocido y utilizado en expresiones los operadores del lenguaje. |
| CE h | Se ha comprobado el funcionamiento de las conversiones de tipo explícitas e implícitas. |
Qué deberías saber al terminar
Al acabar este apartado deberías poder:
- distinguir
int,float,str,boolyNone; - consultar el tipo de un valor con
type(); - acceder a caracteres y subcadenas mediante índices y rebanadas;
- elegir entre listas, tuplas y diccionarios;
- combinar datos con operadores adecuados;
- realizar conversiones explícitas y explicar las implícitas.
2. Clasificación de los datos¶
Los tipos simples representan valores individuales, como un número, un texto o un valor lógico. Los tipos compuestos o contenedores agrupan varios valores. En Python todo es un objeto y cada objeto tiene un tipo que determina sus operaciones.
| Categoría | Tipos principales | Ejemplos |
|---|---|---|
| Simples | int, float, str, bool, NoneType |
18, 2.5, "FP", True, None |
| Contenedores | list, tuple, dict |
[1, 2], (1, 2), {"id": 1} |
No confundas “simple” con “poco importante”: una cadena puede contener muchos
caracteres, pero se trata como un único objeto de tipo str.
3. Consultar el tipo de un dato¶
La función type() devuelve la clase del objeto:
>>> type(1)
<class 'int'>
>>> type(2.5)
<class 'float'>
>>> type("Hola")
<class 'str'>
>>> type([1, "dos", True])
<class 'list'>
>>> type((1, 2))
<class 'tuple'>
>>> type({"pi": 3.1416})
<class 'dict'>
También puedes comprobar si un objeto es de un tipo con isinstance(valor,
tipo), una opción habitual cuando validas datos:
4. Números: int y float¶
int representa números enteros y float números con parte decimal. Los
decimales se escriben con punto, no con coma.
>>> type(-2)
<class 'int'>
>>> type(2.3)
<class 'float'>
>>> 5 / 2
2.5
>>> 5 // 2
2
>>> 5 % 2
1
>>> 2 ** 3
8
Los operadores aritméticos son +, -, *, /, //, % y **. La
precedencia sigue, de forma general, este orden: paréntesis, potencias,
productos y cocientes, y sumas y restas. Los paréntesis permiten expresar la
intención sin ambigüedad.
Las comparaciones numéricas (==, !=, >, <, >=, <=) producen un
booleano:
Precisión de los números reales
Los float se representan normalmente en coma flotante y algunos valores
decimales no pueden almacenarse con precisión exacta. Para cálculos
económicos conviene estudiar tipos o técnicas específicas, como Decimal.
5. Cadenas de texto: str¶
Una cadena es una secuencia de caracteres delimitada por comillas simples o dobles. Puede estar vacía, contener espacios o incluir caracteres especiales:
4.1. Índices y caracteres¶
Los índices empiezan en cero. Los índices negativos cuentan desde el final:
| Cadena | P |
y |
t |
h |
o |
n |
|---|---|---|---|---|---|---|
| Índice positivo | 0 | 1 | 2 | 3 | 4 | 5 |
| Índice negativo | -6 | -5 | -4 | -3 | -2 | -1 |
>>> "Python"[0]
'P'
>>> "Python"[-1]
'n'
>>> "Python"[6]
Traceback (most recent call last):
IndexError: string index out of range
Un índice fuera de rango produce IndexError.
4.2. Subcadenas o rebanadas¶
La forma cadena[inicio:fin:paso] devuelve una parte. El límite final no se
incluye:
>>> "Python"[1:4]
'yth'
>>> "Python"[2:]
'thon'
>>> "Python"[:-2]
'Pyth'
>>> "Python"[0:6:2]
'Pto'
>>> "Python"[:]
'Python'
Las cadenas son inmutables: puedes crear una nueva cadena, pero no cambiar un carácter directamente.
4.3. Operaciones y funciones de cadenas¶
| Operación | Resultado |
|---|---|
c1 + c2 |
Concatena cadenas. |
c * n |
Repite una cadena. |
c1 in c2 / not in |
Comprueba si aparece una subcadena. |
len(c) |
Devuelve la longitud. |
c.upper() / c.lower() |
Cambia a mayúsculas o minúsculas. |
c.title() |
Escribe en formato de título. |
c.split(separador) |
Divide y devuelve una lista. |
min(c) / max(c) |
Devuelve el carácter mínimo o máximo según el orden Unicode. |
>>> "Me gusta " + "Python"
'Me gusta Python'
>>> "Python" * 2
'PythonPython'
>>> "thon" in "Python"
True
>>> "A,B,C".split(",")
['A', 'B', 'C']
>>> "python".upper()
'PYTHON'
Las comparaciones de cadenas distinguen mayúsculas y minúsculas y siguen el orden Unicode, no necesariamente el orden alfabético humano:
Para presentar valores es preferible usar f-strings:
>>> moneda = "€"
>>> cambio = 1.12
>>> f"Un euro equivale a {cambio:.2f} {moneda}"
'Un euro equivale a 1.12 €'
El método format() también es válido y permite posiciones, nombres y
formatos:
>>> "Un {} vale {} {}".format("€", 1.12, "$")
'Un € vale 1.12 $'
>>> "Un {moneda} vale {cambio:.2f} {otra}".format(
... moneda="€", cambio=1.12, otra="$"
... )
'Un € vale 1.12 $'
En los marcadores, {:n}, {:>n} y {:^n} alinean a izquierda, derecha o centro;
:nd reserva n posiciones para un entero y :n.mf reserva n posiciones
con m cifras decimales. Por ejemplo, "Pi vale {:8.4f}".format(3.141592)
produce Pi vale 3.1416.
6. Booleanos: bool¶
El tipo bool solo tiene True y False. Aparece en comparaciones y controla
las condiciones del programa.
Tabla de verdad básica:
x |
y |
not x |
x and y |
x or y |
|---|---|---|---|---|
False |
False |
True |
False |
False |
False |
True |
True |
False |
True |
True |
False |
False |
False |
True |
True |
True |
False |
True |
True |
En un contexto lógico, Python considera falsos False, None, 0, 0.0, las
cadenas y contenedores vacíos. La mayoría de los demás valores se consideran
verdaderos. Por eso bool("0") es True: la cadena no está vacía.
7. Contenedores¶
Los contenedores permiten agrupar datos. Pueden contener valores de tipos distintos, aunque en un proyecto es recomendable que la estructura sea clara.
6.1. Listas: list¶
Una lista es ordenada y mutable. Se escribe entre corchetes:
>>> tareas = ["analizar", "programar", "probar"]
>>> tareas[0]
'analizar'
>>> tareas.append("documentar")
>>> tareas
['analizar', 'programar', 'probar', 'documentar']
Se utiliza cuando el contenido puede cambiar. Admite índices, rebanadas y
operaciones como append, remove, sort y len.
6.2. Tuplas: tuple¶
Una tupla es una secuencia ordenada e inmutable. Se escribe normalmente entre paréntesis:
Es adecuada para datos que deben permanecer constantes, como una coordenada o los valores de configuración de una conexión.
6.3. Diccionarios: dict¶
Un diccionario relaciona claves con valores y se escribe entre llaves. Las claves deben ser únicas:
>>> alumno = {"nombre": "Ada", "edad": 18}
>>> alumno["nombre"]
'Ada'
>>> alumno["curso"] = "DAW"
>>> alumno
{'nombre': 'Ada', 'edad': 18, 'curso': 'DAW'}
Es útil para representar entidades cuyos datos tienen nombre. Para evitar un
KeyError puedes usar get("clave") cuando la clave sea opcional.
8. Conversiones de tipo¶
Una conversión explícita se solicita mediante una función:
int("12") # 12
float("3.14") # 3.14
str(3.14) # "3.14"
bool("") # False
int(True) # 1
float(True) # 1.0
La conversión debe ser válida: int("c") y float("III") producen
ValueError. Además, int(3.9) devuelve 3, porque descarta la parte decimal;
no redondea.
Una conversión implícita la realiza Python cuando una operación lo permite,
por ejemplo al combinar int y float:
No hay conversión implícita de str a número ni de número a str:
Comprueba la entrada antes de convertirla
Los datos del teclado y de formularios llegan normalmente como texto. Una
aplicación fiable valida el formato y contempla errores antes de usar
int() o float().
9. Buenas prácticas y errores frecuentes¶
| Situación | Problema | Solución |
|---|---|---|
5 / 2 frente a 5 // 2 |
Se necesita saber si se quiere división real o cociente entero. | Elegir el operador y documentar la intención. |
"17" frente a 17 |
Parecen iguales, pero sus tipos y operaciones son distintos. | Comprobar con type() y convertir cuando proceda. |
Índice 6 en "Python" |
El último índice es 5. |
Usar len(cadena) - 1 o una rebanada segura. |
is para comparar textos |
Comprueba identidad, no igualdad de contenido. | Usar ==. |
bool("0") |
Toda cadena no vacía es verdadera. | Convertir a número si representa una cantidad. |
| Modificar una tupla o cadena | Son inmutables. | Crear un nuevo valor o usar una lista. |
Comprueba tu comprensión
¿Qué tipos tienen "3", 3 y 3.0? ¿Qué estructura elegirías para una
lista de tareas que puede cambiar y cuál para una coordenada fija? Justifica
cada decisión.
10. Resumen¶
- El tipo determina las operaciones válidas y la forma de interpretar un dato.
int,float,str,boolyNonerepresentan los valores básicos.- Las cadenas son secuencias indexadas e inmutables; las listas son secuencias mutables; las tuplas son secuencias inmutables y los diccionarios relacionan claves con valores.
type()permite inspeccionar un dato eisinstance()ayuda a validarlo.- Las conversiones explícitas se solicitan con funciones y las implícitas solo ocurren en situaciones concretas.
Idea clave
Elegir el tipo adecuado no es un detalle de sintaxis: es una decisión de diseño. Cuando el programa representa correctamente sus datos, las operaciones, las comprobaciones y la depuración resultan mucho más claras.