Los tipos de datos en Python
Introducción
Después de algunas nociones básicas y la estructura sintáctica de las instrucciones de Python, es una buena idea estudiar la materia prima que manejan, es decir, los datos y, más particularmente, los tipos de datos.
Con Python, tiene que saber que todo son objetos, en el sentido informático del término, incluidos los tipos de datos.
Todo esto se explica en profundidad en el capítulo El lado objeto de Python, pero debe aceptar el hecho de que los números, las cadenas, las funciones, etc. todo, es un objeto.
Estas explicaciones se dan para que no se sorprenda con ciertas notaciones típicas de objetos, como <variable.función()> o quizás <objeto.método()>.
Ejemplo
"Python".upper()
pajar.find(aguja)
mucho.count('u')
En estos objectos que se pueden manejar mediante el lenguaje Python, hay tipos de datos predefinidos integrados en el intérprete y utilizables inmediatamente.
Hasta que pueda crear sus propios objectos y tipos de datos, aquí hay una descripción de los tipos de datos más comunes:
-
booleanos
-
numéricos
-
alfanuméricos
-
contenedores o secuenciales
Los booleanos
En las primeras versiones de Python, el tipo booleano no existía y solo usábamos 0 para False (Falso) y 1 para True (Verdadero).
Y funcionaba bien. Pero, ciertamente, para que el lenguaje sea más profesional, se ha añadido el tipo booleano.
Este tipo booleano contiene dos constantes: True (Verdadero) y False (Falso).
De hecho, se trata de un entero disfrazado porque es posible hacer:
>>> True + 1
2
Cualquier objeto se puede comparar con un valor booleano y casi todo se considera Verdadero, excepto:
-
las constantes False y None
-
el valor 0
-
la cadena de caracteres vacía (’’)
-
listas de tuplas y otros contenedores vacíos ([] {} () ...)
Usado comúnmente en la búsqueda de la verdad, el tipo booleano está asociado con tres operadores y ocho formas de comparación.
1. Los operadores booleanos
Los operadores booleanos clásicos son or, and, y not.
Empezamos por el operador más sencillo: not. Devuelve un booleano.
not X devuelve False si x es Verdadero. De lo contrario devuelve True.
Por otro lado, tenga cuidado con los operadores and y or: estos no devuelven sistemáticamente un booleano.
Operaciones |
Resultados |
X or Y |
Si X es falso, devuelve Y, de lo contrario, devuelve X |
X and Y |
Si X es falso, devuelve X, de lo contrario, devuelve Y |
Aquí está la tabla cruzada de resultados para X or Y.
5 y 8 son números enteros tomados al azar. El objetivo es ilustrar con cualquier valor numérico.
X OR Y |
Y = True |
Y = False |
Y = 8 |
Y = 0 |
Y = () |
Y = [] |
Y = {} |
X = True |
True |
True |
True |
True |
True |
True |
True |
X = False |
True |
False |
8 |
0 |
() |
[] |
{} |
X = 5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
X = 0 |
True |
False |
8 |
0 |
() |
[] |
{} |
X = () |
True |
False |
8 |
0 |
() |
[] |
{} |
X = [] |
True |
False |
8 |
0 |
() |
[] |
{} |
X = {} |
True |
False |
8 |
0 |
() |
[] |
{} |
Y aquí está la tabla para el operador and:
X AND Y |
Y = True |
Y = False |
Y = 8 |
Y = 0 |
Y = () |
Y = [] |
Y = {} |
X = True |
True |
False |
8 |
0 |
() |
[] |
{} |
X = False |
False |
False |
False |
False |
False |
False |
False |
X = 5 |
True |
False |
8 |
0 |
() |
[] |
{} |
X = 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
X = () |
() |
() |
() |
() |
() |
() |
() |
X = [] |
[] |
[] |
[] |
[] |
[] |
[] |
[] |
X = {} |
{} |
{} |
{} |
{} |
{} |
{} |
{} |
En el uso actual, con las declaraciones if o while, esto no cambia mucho.
Pero es mejor saber que la verdad no siempre es lo que espera...
Los numéricos
Hay tres familias principales de datos numéricos: enteros, flotantes y complejos.
Vamos a decirlo claramente, el uso de números complejos va mucho más allá del alcance de este libro.
Tenga confianza en este punto, porque incluso el artículo de Wikipedia sobre el tema, es de difícil acceso desde los primeros párrafos.
Si lo necesita y sabe cómo usarlo, buenas noticias: están implementado de serie en el lenguaje Python.
Para los demás, seamos razonables y pasemos a conjuntos más accesibles, como los números enteros y flotantes.
1. Los números enteros
¿Qué decir sobre los números enteros en Python? Tienen una precisión ilimitada, desde la versión 3, ya no hay enteros cortos y largos, solo enteros.
Sin embargo, cuando miramos un poco más, encontramos en el módulo ’sys’ (un módulo cercano al sistema) un límite pero que en realidad no lo es.
El módulo ’sys’ permite acceder a las variables del sistema mantenidas por el intérprete.
En este módulo hay un valor llamado maxsize; para obtenerlo, necesitamos importar el módulo ’sys’ y mostrar el valor:
>>> import sys
>>> print(sys.maxsize)
9223372036854775807
Pero esto no es un límite, porque es posible hacer lo siguiente:
>>> maximum = sys.maxsize
>>> print( maximum + 1)
9223372036854775808
Incluso con Python, cuando se superan los límites, no hay límite. Sin embargo, todavía hay una explicación técnica.
Este número maxsize se corresponde con el número entero máximo para el formato de almacenamiento predeterminado del lenguaje Python, pero si la necesidad es mayor, no hay problema. Por otro lado, las operaciones con números enteros serán un poco más largas.
A saber: realizar...
Los alfanuméricos
Después de los cálculos, el texto. Este es el momento de estudiar las cadenas de caracteres en Python.
Se trata del tipo "string", pero preferimos el nombre "cadena de caracteres", por la sencilla razón de que la imagen de los eslabones de una cadena se asemeja a este tipo de datos.
A diferencia de los datos numéricos, que son tipos de datos compuestos por un solo elemento, el tipo "string" es un tipo de datos secuenciales (de ahí la imagen de los eslabones de una cadena).
El lenguaje le permite usar una cadena como un solo objeto, la cadena como un todo, pero también acceder a cada elemento (los caracteres) de este objeto.
Nota: el tamaño de una cadena de caracteres solo tiene un límite respecto a la memoria física que se puede asignar (para probar en una máquina sin memoria swap de intercambio, si no desea bloquear su servidor).
La creación de una cadena de caracteres es simple. Este tipo de datos solo deben estar delimitados por una comilla simple ’ o una comilla doble " e incluso es posible utilizar una comilla doble triple """.
Ejemplo
a = "hola mundo"
El uso de comillas dobles o simples no importa, excepto cuando se trata de mezclar los dos.
a = "aquí hay un caso típico de uso de comillas dobles"
# ^
# -------------------------|
a = ' Le dije "Cuidado con las comillas dobles" '
# ^ ^
# ------------------|----------------------------|
Las comillas triples le permiten introducir texto en varias líneas, lo que puede ser muy práctico.
a= """
¡Hola al mundo!
============
"""
1. Las operaciones aplicables a las cadenas de caracteres
Algunas operaciones son aplicables a las cadenas de caracteres.
|
|
Concatenación |
|
|
Repetición |
|
Los contenedores o secuenciales
Puede que empiece a apreciar este lenguaje, pero tenga cuidado; una vez que pruebe lo que está por venir, lo adoptará.
El tipo de datos alfanuméricos da una pequeña muestra de lo que puede hacer con las listas, que son un tipo de datos fundamental en Python.
1. Las listas
Este tipo tiene un nombre adecuado, porque es un objeto que puede contener otros, con el único límite del tamaño de la memoria.
Como es costumbre, la sintaxis es muy sencilla, excepto por que en el caso de las listas, puede usar un atajo o la creación de un objeto "list".
Ambas sintaxis son importantes.
El corchete doble se usa para crear una lista vacía o para inicializarla durante la asignación.
Ejemplo
>>> a = [] # Lista vacía
>>> b = [1,2,3] # pequeña lista de 3 enteros
>>> a
[]
>>> b
[1, 2, 3]
Pero en una lista, es posible almacenar todos los tipos de datos y objectos que Python conoce.
Ejemplo (con las variables inicializadas en el ejemplo anterior)
>>> c = [ "a", 1.0, b , 42 ]
>>> c
['a', 1.0, [1, 2, 3], 42]
En el ejemplo anterior, almacenamos en la lista ’c’ una cadena de caracteres, un número en coma flotante, otra lista y un número entero.
El interés es poder recorrer todo esto.
>>> for element in c:
... print(" => ", element)
...
=> a
=> 1.0
=> [1, 2, 3]
=> 42
La otra sintaxis es igualmente importante, aunque se adelanta a un capítulo que veremos más adelante sobre programación orientada a objetos (POO).
También es posible utilizar la siguiente sintaxis:
>>> a = list() # creación de una instancia de lista
>>> a
[]
Con una lista como argumento, esto permite copiar la lista.
>>> d = list(c)
>>> d
['a', 1.0, [1, 2, 3], 1912]
Pero cuidado, d y c son dos listas diferentes, mientras que si escribimos:
>>> e = d
>>> e
['a', 1.0, [1, 2, 3], 1912]
>>> d
['a', 1.0...
Otros tipos de datos
En el lenguaje Python existen otros tipos de datos, como vistas de diccionarios, por ejemplo.
También están los slices, objetos diseñados para dividir listas y otras secuencias, bytes y bytearray, que son clases diseñadas para manejar bytes.
El tipo de bytes es importante porque, como se verá más adelante, permite manejar archivos en modo binario.
Es un poco como un número entero, pero con métodos adicionales.
El problema es que, hoy en día, solo manejamos muy raramente bytes. El tipo Texto administra archivos automáticamente y gestiona correctamente la codificación en utf-8, que incluye ascii.
Un dato más: aquí está la jerarquía de los tipos de datos en Python.
None |
Sí, es un tipo de datos |
Not Implemented |
Este también |
Ellipse |
Para el manejo de ’…’ o puntos suspensivos (Ellipsis). Es un objeto para representar los bucles recursivos. |
numbers |
Enteros/Flotantes, etc. |
Secuencias |
|
mutables |
Listas |
inmutables |
Tuplas |
Conjuntos |
|
Conjuntos |
Set |
Conjuntos fijos |
Frozenset |
Tabla de correspondencia |
|
Diccionario |
|
Tipos que se pueden llamar |
Callable en inglés, las funciones por ejemplo |
Módulos |
Pueden ser llamados mediante la instrucción ’import’ |
Objetos declarados por el desarrollador |
Sus futuros objetos están... |
Resumen
En este capítulo se han estudiado los tipos de datos que Python conoce, así como los operadores y los métodos aplicables a ellos.
A partir de estos tipos básicos, es posible construir estructuras de datos complejas sin otro límite que su imaginación.