Cada lenguaje de programación se basa en componentes fundamentales que proporcionan los bloques de construcción para construir las herramientas más sofisticadas basadas. Aprender cómo y cuándo usar cada uno es lo primero que se debe hacer al encontrar un nuevo lenguaje de programación. En cualquier lenguaje, a menudo hay múltiples formas de lograr el mismo objetivo, pero eso no siempre significa que cada solución sea igualmente eficiente.
Comprender cada tipo de datos le permite aprovechar al máximo el diseño y el programa del lenguaje de la manera más eficiente y efectiva posible. Los principales tipos de datos integrados utilizados en Python incluyen:
- Numéricos
- Booleanos
- Secuencias
- Mapas
- Módulos
- Clases
- Métodos
- Funciones
- Excepciones
Hay algunos otros, pero estos son los más importantes y más utilizados.
Este articilo revisa los conceptos básicos de cómo y cuándo usar cada uno, y (para aquellos que migran de Python 2 a 3) también señalará algunas de las diferencias entre el uso de Python 2 frente al uso de Python 3.
Numéricos
Los tipos numéricos consisten en números enteros, números de tipo flotante (o flotantes) y números complejos. Cada uno es equivalente a su contraparte matemática:
- Los enteros son números enteros que pueden ser negativos, cero o positivos.
- Los números flotantes son números reales representados en forma decimal con una precisión predefinida
- Los números complejos consisten en un componente real y otro imaginario, ambos representados como números flotantes.
Los constructores int(), float() y complex() se usan para producir números de cada tipo en Python:
x = int(2)
y = float(2)
z = complex(2,2)
print(x + x)
print(x + y)
print(x + z)
Produce la siguiente salida:
4
4.0
(4+2j)
Alternativamente, Python definirá automáticamente un número como entero si no incluye un decimal; como un número flotante si lo haces; y como un número complejo si usa la forma a + bj donde j indica la parte imaginaria. La salida es la misma:
x = 2
y = 2.0
z = 2 + 2j
print(x + x)
print(x + y)
print(x + z)
Produce la misma salida
4
4.0
(4+2j)
Elegir si usar un número entero, un número flotante o un número complejo es bastante sencillo. Si su aplicación requiere más de un dígito significativo, el uso de enteros no será suficiente. Si sus datos son complejos, tiene sentido usar números complejos. La suma no es la única operación que pueden sufrir los tipos numéricos. La siguiente tabla enumera las operaciones que se pueden realizar con / en tipos numéricos:
Operacion | Resultado | |
---|---|---|
x + y | la suma de x con y | |
x – y | la resta de x con y | |
x * y | la multiplicacion de x con y | |
x / y | la division de x con y | |
x // y | el cociente aproximado al decimal inferior | |
x % y | el residuo entre x dividio y | |
-x | x negada | |
+x | x sin cambios | |
abs(x) | valor absoluto de x | |
int(x) | x convertido a entero | |
float(x) | x convertido a float | |
complex(re | im) | un número complejo con parte real re yparte imaginaria im. im predeterminado a cero |
c.conjugate() | conjugado del número complejo c | |
divmod(x | y) | el par (x // y, x % y) |
pow(x | y) | x elevado a la y |
x ** y | x elevado a la y |
Cada tipo de datos puede sufrir ciertas operaciones. Muchas operaciones se superponen entre tipos, pero algunas son únicas. Puede encontrar una lista completa de operaciones para cada tipo de datos en la documentación.
Booleanos
Siguiendo los tipos numéricos, quizás el tipo de datos más común encontrado son los tipos booleanos. Los valores booleanos son un caso especial de tipos numéricos utilizados para expresar Verdadero y Falso. En operaciones matemáticas, se comportan exactamente como 1 y 0, pero también se pueden usar en el contexto de operaciones booleanas y comparaciones (es decir, mayor que, menor que, igual, no igual, etc.).
Secuencias
Una secuencia describe una serie de valores. Los valores pueden ser palabras individuales, frases, números o incluso una serie dentro de una serie. Los cuatro tipos básicos de secuencia son:
- Listas
- Tuplas
- Rangos
- Strings
Los primeros tres tipos de secuencia pueden contener cualquier tipo de valores de datos, mientras que las cadenas se limitan exclusivamente al texto. Las secuencias pueden ser inmutables o mutables. Una secuencia mutable se puede cambiar después de que se ha creado, mientras que una secuencia inmutable no.
Echemos un vistazo más de cerca a cada tipo de secuencia:
Listas: las listas son secuencias mutables que generalmente contienen datos homogéneos. Son ideales para casos de uso donde los valores son todos de la misma categoría (por ejemplo, edad de los estudiantes en una clase, número de saques de esquina en un partido, o artículos para comprar en la tienda, etc.), o cuando los valores deben agregarse o eliminarse de forma recursiva. Se pueden crear de varias maneras, pero siempre se denotan con corchetes: []. Por ejemplo, podemos crear una lista de compras:
compras = ['arroz', 'huevos', 'tocino', 'trampolin', 'manzanas']
print(compras)
compras.sort()
print(compras)
Produce la siguiente salida:
['arroz', 'huevos', 'tocino', 'trampolin', 'manzanas']
['arroz', 'huevos', 'manzanas', 'tocino', 'trampolin']
Las operaciones de lista permiten la ordenación rápida, el acceso a valores individuales (conocidos como segmentación) o la reasignación y eliminación:
print(compras[3])
compras[3] = 'piñata'
print(compras)
compras.remove('apples')
print(compras)
Produce la siguiente salida:
tocino
['arroz', 'huevos', 'manzanas', 'piñata', 'trampolin']
['arroz', 'huevos', 'piñata', 'trampolin']
Técnicamente, la lista de compras es una lista de secuencias, ya que las cadenas son secuencias en sí mismas (más sobre esto más adelante).
Tuplas: Son casi idénticas en concepto a las listas, excepto que son inmutables. Debido a esto, son ideales para casos de uso que necesitan preservar la secuencia durante las operaciones. Este suele ser el caso cuando una secuencia consiste en valores heterogéneos. En lugar de corchetes, se denotan entre paréntesis: (). Un ejemplo con valores heterogéneos:
personas = ('Juan', 'Marilyn', 32, 'Jennifer', 'Andrea', 26)
print(personas[0:3])
Produce como salida:
('Juan', 'Marilyn', 32)
Podemos dividir la tupla para ver valores individuales, pero no podemos eliminar o reasignar:
personas[3] = 25
Produce el siguiente error
TypeError: 'tuple' object does not support item assignment
Sin embargo, se puede definir una nueva tupla utilizando la tupla original:
nueva_tupla = personas[0:3]
print(nueva_tupla)
Produce el siguiente resutlado
('Juan', 'Marilyn', 32)
Rangos: el tipo de rango se utiliza para representar una secuencia inmutable de números. Se utilizan casi exclusivamente en operaciones recursivas como bucles para definir el número de ciclos o bucles. El siguiente ejemplo crea un rango que comienza en 1, se detiene en 11 y se incrementa en pasos de 1:
r = range(1, 11, 1)
print(list(r))
Resulta en:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Podemos usar el objeto de rango dentro de un bucle for simple:
for i in r:
print('indice: ' + str(i))
Produce la siguiente salida
indice: 1
indice: 2
indice: 3
indice: 4
indice: 5
indice: 6
indice: 7
indice: 8
indice: 9
indice: 10
Strings: como mencioné anteriormente, las cadenas son secuencias inmutables de puntos Unicode. Sus casos de uso están restringidos a aquellos que requieren información de texto, que, independientemente de para qué use Python, seguramente aparecerán. Ya sea para analizar encabezados al importar datos o para trazar información de texto en un gráfico, comprender cómo usar cadenas es esencial para programar en Python. Volviendo al ejemplo de la lista, podemos dividir la lista de compras para obtener el cuarto valor, luego dividir nuevamente (porque la cadena en sí es una secuencia) para obtener la primera letra:
print(compras[3]) print(compras[3][0])
Resulta en:
trampolin
t
Las cadenas admiten todas las operaciones de secuencia comunes (como el corte), así como algunos “métodos” adicionales. Los métodos son otro tipo de datos de Python incorporado que define funciones en objetos específicos, como cadenas (más sobre esto más adelante). Por ejemplo, el uso de un método llamado capitalize capitalizará la primera letra de la cadena:
print(compras[3])
compras[3] = compras[3].capitalize()
print(compras)
Obtenemos como resultado:
trampolin
['arroz', 'huevos', 'piñata', 'Trampolin']
Vale la pena señalar que hay un tipo de secuencia adicional diseñado para procesar datos binarios, pero se usa con menos frecuencia. Para obtener más información sobre estos tipos, consulte la documentación.
Mapas
Solo hay un tipo de mapas en Python, conocido como diccionario. Los diccionarios son conjuntos mutables de pares clave-valor, donde cada clave se asigna a cada valor. Se pueden usar números o cadenas para las claves, y los valores pueden ser listas, diccionarios u otros tipos mutables. Los diccionarios son ideales para almacenar conjuntos de información para múltiples objetos, donde cada objeto tiene su propio conjunto de datos. Considere una libreta de direcciones:
libreta = {'Pablo': ['925 First Street', 'San Jose', 'California'] ,
'Jose': ['501 Market Street', 'San Francisco', 'California'],
'Erick': ['1911 Lincoln Avenue', 'Los Angeles', 'California']}
print(libreta['Jose'])
Obtenemos como salida:
['501 Market Street', 'San Francisco', 'California']
Esto permite un acceso rápido al valor (la dirección en este caso) simplemente conociendo la clave (nombre). Tenga en cuenta que uso una lista para cada valor y, por supuesto, se admiten las mismas operaciones:
libreta['Jose'][1]
Obtenemos:
San Francisco
Los valores no tienen que ser del mismo tipo. Podría haber puesto fácilmente una sola cadena, un entero o cualquier otra cosa para Erick en lugar de usar una lista.
Los diccionarios también admiten métodos. Uno de los más útiles es el método de keys(), que imprime todas las claves dentro del diccionario.
libreta.keys()
Obtenemos la siguiente salida
dict_keys(['Pablo', 'Jose', 'Erick'])
Como puede ver, los diccionarios son un poco diferentes de los tipos de secuencia. Su objetivo es reflejar las muchas bases de datos de la vida real que tienen información vinculada a una sola clave (es decir, número de licencia de conducir, número de pasaporte, identificación del estudiante, etc.) y deben usarse en tales casos.
Otros tipos incorporados
Además de los tipos de datos ya discutidos, hay varios que son un poco más avanzados, pero esenciales para saber cuando se programa en Python. Ahora que está familiarizado con los tipos numéricos, booleanos, de secuencia y de mapeo, es hora de explorar algunos más:
- Sets: son una colección desordenada de objetos. Un conjunto en Python es equivalente a la definición matemática de un conjunto. Se comporta de manera similar a una lista o tupla, excepto que no está ordenada y no puede contener duplicados. Hay dos tipos de conjuntos:
- set() que es mutable y
- frozenset() que es inmutable
- Módulos: son carpetas que contienen código Python. Son una manera fácil de organizar, compartir y descargar código. El código dentro de un módulo puede definir funciones, clases y variables, pero también puede incluir scripts ejecutables. Se puede acceder al código a través de una simple declaración del módulo de importación.
- Clases: son prototipos definidos por el usuario para objetos de datos, completos con sus propios atributos y variables. Ofrecen una forma de crear objetos más sofisticados más allá de los tipos de datos que ya he mencionado. A medida que su caso de uso para Python crece en complejidad, los tipos de datos integrados son cada vez más incapaces de mantenerse al día con las clases definidas por el usuario en términos de eficiencia. El uso de clases proporciona una estructura inherente a su código que es lógica y legible para usted y para otros. Puedes leer más sobre ellos aquí.
- Funciones: son bloques de código independientes que realizan una función específica, de ahí el nombre. Cada función tiene una entrada. Esa entrada se transforma de alguna manera, y luego se devuelve. Las funciones pueden ser definidas por el usuario, pero Python tiene varias integradas. De hecho, ya hemos estado utilizando la función print() para mostrar algunos de los tipos de datos ya discutidos. Realmente no hay límite a lo que puede hacer una función.
- Métodos: como se mencionó anteriormente, un método es una función definida para una clase específica. En el ejemplo de cadena, se accede al método de capitalización con string.capitalize. Los métodos proporcionan un acceso directo para operaciones comunes realizadas en objetos de la misma clase.
Diferencias entre Python 2 y 3
Este articulo hasta ahora describe los tipos de datos en Python 3 (3.7.4 para ser específico). Para aquellos de ustedes que recién están haciendo la transición de Python 2 a 3, deberán tener en cuenta que el uso de algunos tipos de datos integrados ha cambiado. Por ejemplo:
- La función de print: Python 3 requiere el uso de paréntesis. Por ejemplo, la sintaxis de Python 2 de print list se convierte en print(list) en Python 3.
- Operador de división: en Python 2, el uso del operador de división en dos valores enteros produce una salida entera (es decir, el resultado se redondea si la división produce un residuo). En Python 3, la misma operación produce una salida flotante. Antes de migrar, es posible que desee examinar los operadores de división en su código de Python 2 y convertirlos para usar flotantes en lugar de enteros.
- String: los strings de Python 2 son caracteres ASCII de forma predeterminada, pero el comportamiento predeterminado en Python 3 es tratar todas las cadenas como Unicode.
- xrange() y range(): en Python 3, la función xrange() ha quedado en desuso. Sin embargo, puede usar la función range() en Python 3 para lograr los mismos objetivos que xrange().