Python: Tipos básicos

En Python tenemos como tipos de datos simples números: enteros, de coma flotante y complejos, como pueden ser 3, 15.57 o 7 + 5j; cadenas de texto, como “Hola Mundo” y valores booleanos: True (cierto) y False (falso).

Vamos a crear un par de variables a modo de ejemplo. Una de tipo cadena y una de tipo entero:

# esto es una cadena
c = "Hola Mundo"

# y esto es un entero
e = 23

# podemos comprobarlo con la función type
type(c)
type(e)

Como veis en Python, a diferencia de muchos otros lenguajes, no se declara el tipo de la variable al crearla. En Java, por ejemplo, escribiríamos:

String c = "Hola Mundo";
int e = 23;


También nos ha servido nuestro pequeño ejemplo para presentaros los comentarios inline en Python: cadenas de texto que comienzan con el carácter ‘#’ y que Python ignora totalmente. Hay más tipos de comentarios, de los que hablaremos más adelante.

Números

Como decíamos, en Python se pueden representar números enteros, reales y complejos.

Enteros

Los números enteros son aquellos que no tienen decimales, tanto positivos como negativos (además del cero). En Python se pueden representar mediante el tipo int (de integer, entero) o el tipo long (largo). La única diferencia es que el tipo long permite almacenar números más grandes. Es aconsejable no utilizar el tipo long a menos que sea necesario, para no malgastar memoria.

El tipo int de Python se implementa a bajo nivel mediante un tipo long de C. Y dado que Python utiliza C por debajo, como C, y a diferencia de Java, el rango de los valores que puede representar depende de la plataforma. En la mayor parte de las máquinas el long de C se almacena utilizando 32 bits, es decir, mediante el uso de una variable de tipo int de Python podemos almacenar números de -231 a 231 – 1, o lo que es lo mismo, de -2.147.483.648 a 2.147.483.647. En plataformas de 64 bits, el rango es de -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807.

El tipo long de Python permite almacenar números de cualquier precisión, limitado por la memoria disponible en la máquina.

Al asignar un número a una variable esta pasará a tener tipo int, a menos que el número sea tan grande como para requerir el uso del tipo long.

# type(entero) daría int
entero = 23

También podemos indicar a Python que un número se almacene usando long añadiendo una L al final:

# type(entero) daría long
entero = 23L

El literal que se asigna a la variable también se puede expresar como un octal, anteponiendo un cero:

# 027 octal = 23 en base 10
entero = 027

o bien en hexadecimal, anteponiendo un 0x:

# 0x17 hexadecimal = 23 en base 10
entero = 0x17

Reales

Los números reales son los que tienen decimales. En Python se expresan mediante el tipo float. En otros lenguajes de programación, como C, tenemos también el tipo double, similar a float pero de mayor precisión (double = doble precisión). Python, sin embargo, implementa su tipo float a bajo nivel mediante una variable de tipo double de C, es decir, utilizando 64 bits, luego en Python siempre se utiliza doble precisión, y en concreto se sigue el estándar IEEE 754: 1 bit para el signo, 11 para el exponente, y 52 para la mantisa. Esto significa que los valores que podemos representar van desde ±2,2250738585072020 x 10-308 hasta ±1,7976931348623157×10308.

La mayor parte de los lenguajes de programación siguen el mismo esquema para la representación interna. Pero como muchos sabréis esta tiene sus limitaciones, impuestas por el hardware. Por eso desde Python 2.4 contamos también con un nuevo tipo Decimal, para el caso de que se necesite representar fracciones de forma más precisa. Sin embargo este tipo está fuera del alcance de este tutorial, y sólo es necesario para el ámbito de la programación científica y otros relacionados. Para aplicaciones normales podeis utilizar el tipo float sin miedo, como ha venido haciéndose desde hace años, aunque teniendo en cuenta que los números en coma flotante no son precisos (ni en este ni en otros lenguajes de programación).

Para representar un número real en Python se escribe primero la parte entera, seguido de un punto y por último la parte decimal.

real = 0.2703

También se puede utilizar notación científica, y añadir una e (de exponente) para indicar un exponente en base 10. Por ejemplo:

real = 0.1e-3

sería equivalente a 0.1 x 10-3 = 0.1 x 0.001 = 0.0001

Complejos

Los números complejos son aquellos que tienen parte imaginaria. Si no conocías de su existencia, es más que probable que nunca lo vayas a necesitar, por lo que puedes saltarte este apartado tranquilamente. De hecho la mayor parte de lenguajes de programación carecen de este tipo, aunque sea muy utilizado por ingenieros y científicos en general.

En el caso de que necesitéis utilizar números complejos, o simplemente tengáis curiosidad, os diré que este tipo, llamado complex en Python, también se almacena usando coma flotante, debido a que estos números son una extensión de los números reales. En concreto se almacena en una estructura de C, compuesta por dos variables de tipo double, sirviendo una de ellas para almacenar la parte real y la otra para la parte imaginaria.

Los números complejos en Python se representan de la siguiente forma:

complejo = 2.1 + 7.8j

Operadores

Veamos qué podemos hacer con nuestros números usando los operadores por defecto. Para operaciones más complejas podemos recurrir al módulo math.

Operadores aritméticos

Operador Descripción Ejemplo
+ Suma r = 3 + 2 # r es 5
Resta r = 4 – 7 # r es -3
Negación r = -7 # r es -7
* Multiplicación r = 2 * 6 # r es 12
** Exponente r = 2 ** 6 # r es 64
/ División r = 3.5 / 2 # r es 1.75
// División entera r = 3.5 // 2 # r es 1.0
% Módulo r = 7 % 2 # r es 1

Puede que tengáis dudas sobre cómo funciona el operador de módulo, y cuál es la diferencia entre división y división entera.

El operador de módulo no hace otra cosa que devolvernos el resto de la división entre los dos operandos. En el ejemplo, 7 / 2 sería 3, con 1 de resto, luego el módulo es 1.

La diferencia entre división y división entera no es otra que la que indica su nombre. En la división el resultado que se devuelve es un número real, mientras que en la división entera el resultado que se devuelve es solo la parte entera.

No obstante hay que tener en cuenta que si utilizamos dos operandos enteros, Python determinará que queremos que la variable resultado también sea un entero, por lo que el resultado de, por ejemplo, 3 / 2 y 3 // 2 sería el mismo: 1.

Si quisiéramos obtener los decimales necesitaríamos que al menos uno de los operandos fuera un número real, bien indicando los decimales

r = 3.0 / 2

o bien utilizando la función float (no es necesario que sepais lo que significa el término función, ni que recordeis esta forma, lo veremos un poco más adelante):

r = float(3) / 2

Esto es así porque cuando se mezclan tipos de números, Python convierte todos los operandos al tipo más complejo de entre los tipos de los operandos.

Operadores a nivel de bit

Si no conocéis estos operadores es poco probable que vayáis a necesitarlos, por lo que podéis obviar esta parte. Si aún así tenéis curiosidad os diré que estos son operadores que actúan sobre las representaciones en binario de los operandos.

Por ejemplo, si veis una operación como 3 & 2, lo que estais viendo es un and bit a bit entre los números binarios 11 y 10 (las representaciones en binario de 3 y 2). El operador and (&), del inglés “y”, devuelve 1 si el primer bit operando es 1 y el segundo bit operando es 1, luego el resultado de aplicar and bit a bit a 11 y 10 sería 10, o lo que es lo mismo, 2 en decimal (el primer dígito es 1 para ambas cifras, mientras que el segundo es 1 sólo para una de ellas).

El operador or (|), del inglés “o”, devuelve 1 si el primer operando es 1 o el segundo operando es 1

El operador xor u or exclusivo (^) devuelve 1 si uno de los operandos es 1 y el otro no lo es.

El operador not (~), del inglés “no”, sirve para negar uno a uno cada bit; es decir, si el operando es 0, cambia a 1 y si es 1, cambia a 0.

Por último los operadores de desplazamiento (<< y >>) sirven para desplazar los bits n posiciones hacia la izquierda o la derecha.

Operador Descripción Ejemplo
& and r = 3 & 2 # r es 2
| or r = 3 | 2 # r es 3
^ xor r = 3 ^ 2 # r es 1
~ not r = ~3 # r es -4
<< Desplazamiento a la izquierda r = 3 << 1 # r es 6
>> Desplazamiento a la derecha r = 3 >> 1 # r es 1

Cadenas

Las cadenas no son más que texto encerrado entre comillas simples (‘cadena’) o dobles (“cadena”). Dentro de las comillas se pueden añadir caracteres especiales escapándolos con ‘\’, como ‘\n’, el carácter de nueva línea, o ‘\t’, el de tabulación.

Una cadena puede estar precedida por el carácter ‘u’ o el carácter ‘r’, los cuales indican, respectivamente, que se trata de una cadena que utiliza codificación Unicode y una cadena raw (del inglés, cruda). Las cadenas raw se distinguen de las normales en que los caracteres escapados mediante la barra invertida (\) no se sustituyen por sus contrapartidas. Esto es especialmente útil, por ejemplo, para las expresiones regulares.

unicode = u"äóè"
raw = r"\n"

También es posible encerrar una cadena entre triples comillas (simples o dobles). De esta forma podremos escribir el texto en varias líneas, y al imprimir la cadena, se respetarán los saltos de línea que introdujimos sin tener que recurrir al carácter \n, así como las comillas sin tener que escaparlas.

Las cadenas también admiten operadores como la suma (concatenación de cadenas) y la multiplicación.

a = "uno"
b = "dos"

c = a + b # c es "unodos"
c = a * 3 # c es "unounouno"

Booleanos

Como decíamos el tipo booleano sólo puede tener dos valores: True (cierto) y False (falso). Estos valores son especialmente importantes para las expresiones condicionales y los bucles, como veremos más adelante.

En realidad el tipo bool (el tipo de los booleanos) es una subclase del tipo int. Puede que esto no tenga mucho sentido para tí si no conoces los términos de la orientación a objetos, que veremos más adelantes, aunque tampoco es nada importante.

Estos son los distintos tipos de operadores con los que podemos trabajar con valores booleanos, los llamados operadores lógicos o condicionales:

Operador Descripción Ejemplo
and ¿se cumple a y b? r = True and False # r es False
or ¿se cumple a o b? r = True or False # r es True
not No a r = not True # r es False

Los valores booleanos son además el resultado de expresiones que utilizan operadores relacionales (comparaciones entre valores):

Operador Descripción Ejemplo
== ¿son iguales a y b? r = 5 == 3 # r es False
!= ¿son distintos a y b? r = 5 != 3 # r es True
< ¿es a menor que b? r = 5 < 3 # r es False
> ¿es a mayor que b? r = 5 > 3 # r es True
<= ¿es a menor o igual que b? r = 5 <= 5 # r es True
>= ¿es a mayor o igual que b? r = 5 >= 3 # r es True

48 pensamientos en “Python: Tipos básicos”

  1. Te olvidastes comentar (o talvaz va para otra parte) que Python permite hacer comparaciones del tipo:
    1 <= a <= 7

    MUY buen curso.

  2. Que tal a todos, esta muy buena las review de Python, tengo algo de experiencia en ello y aprovechando este tema les invito a que vean algo de lo que publique en mi blog de programación:
    http://elcodigok.blogspot.com/search/label/Python

    además les comento que he liberado un programita realizado en Python y QT llamado Pykonvert para la conversión de nuestros archivos de videos.

    Esta muy bueno el sitio, me enganche desde los primeros dias de Enero por una recomendación, saludos y segan asi!!!!

  3. Muy buena iniciativa esta de enseñar python. A mi me viene bien porque de hecho estaba pensando en aprender algún lenguaje de scripting, lo que no tengo claro es si aprender python o ruby, ¿vosotros que opináis? ¿cuál creéis que es mejor para pequeños desarrollos? Especialmente de tratamiento de datos y conexiones a BBDD que es para lo que lo pienso usar. ¿Y de cara a usar interfaces gráficas? No sé sigo sin tenerlo claro.

  4. Yo le veo mucho más futuro a Python luis.

    Python se utiliza mucho más y es mucho más conocido (más oportunidades laborales, más ayuda si tienes algún problema, más librerías que te facilitan la vida…)

    Sin olvidar que casi todas (¿o todas?) las distros Linux tienen Python instalado por defecto, y no conozco ninguna que tenga Ruby.

    En occidente Ruby es conocido básicamente por el framework de desarrollo web Ruby on Rails, pero Django, uno de los más conocidos para Python, no tiene nada que envidiarle.

  5. Te olvidastes comentar (o talvaz va para otra parte) que Python permite hacer comparaciones del tipo:
    1 <= a <= 7

    MUY buen curso.

    Cierto. Gracias por el apunte tzulbert.

    Y evidentemente los demás operandos también se pueden combinar (de forma lógica)

  6. Un pequeño apunte: en la tabla de operadores bit a bit has puesto que “^” es “and”, en lugar de “xor”.

    Ya que estoy ocioso y viendo que el tutorial va dirigido a novatísimos aprovecho para explicar la codificación binaria que se usa y que justifica que ~3=-4.

    La idea es que hemos de conseguir que un número exprese su propio signo sin tener que recurrir a usar caracteres especiales (“-” y “+”). Hay muchas formas de codificar números binarios con signo, pero como no podría ser de otra manera hay una que es mejor que las demás. La calidad de una codificación se mide por el rango que podemos representar con un número de bits. En este caso la ganadora es Complemento a 2 (para los interesados también existen “símbolo y magnitud” (sym) y “complemento a 1” (c1), una comparación en http://es.wikipedia.org/wiki/Representaci%C3%B3n_de_n%C3%BAmeros_con_signo). No me voy a enrollar con las diferencias, que para eso está el artículo de Wikipedia, simplemente explicar cómo transformar un número decimal a complemento a dos:

    Lo primero es transformar el número a su correspondiente binario positivo y anteponerle un 0, es decir, si queremos codificar el -7 tendríamos que transformarlo en 0111. Ahora lo pasamos a complemento a 1, es decir, cambiamos los 0s por 1s y los 1s por 0s. Nos queda 1000. Lo último que hay que hacer es sumarle 1: 1001.

    Si queremos recorrer el camino inverso, es decir, saber qué número es el 1001, seguimos los mismos pasos: 1001 -> 0110 + 1 = 0111 = 7, por lo que nuestro número era el -7. Probad vosotros a negar el 3 (cambiar 1s por 0s y 0s por unos) y luego mirad qué número es el que habéis obtenido.

  7. Cierto, fallo técnico. Gracias por la correción unf.

    Y gracias por la explicación 🙂 Yo no quería entrar en demasiados tecnicismos pero seguro que más de uno tiene la curiosidad y le es útil.

    Es un gustazo cuando la gente aporta cosas 🙂

  8. 2 cosas:
    La primera que muchas gracias por currartelo, muchos estamos aprendiendo gracias a tí 😉
    Y la segunda es que has puesto que se puede representar de -2^31 hasta 2^31, y sería hasta (2^31)-1, por el tema de la representación Ca2 xD
    Merci de nuevo 🙂

  9. Muy bueno Zoo, no lo he leido, es muy largo, pero tiene buena pinta. Te animo a que sigas ya lo sabes, mucha gente te lo agradecerá.

    Luis, no conozco mucho ruby, pero python es muuuuy bueno para lo que quieres, interfaces gráficas con gtk, qt, wxwindows… y usar BBDD pues sqlite, mysql, postresql… Tiene librerías para todo.

  10. tuxiradical, con eso quería decir que si pasas 027, que es un número en octal, a base diez, obtienes 23. Vamos, que 027 equivale a “23 en base 10”.

    Lo cambio a ver si se entiende mejor.

  11. Genial el articulo, me estava planteando aprender Python, pero no sabia, si hacerlo por mi cuenta o apuntarme a algun cursillo este mes de vacaciones, si sabeis de alguna pagina en concreto o manual, que no sea muy aburrido me pondre por mi cuenta.
    Aunque visto lo visto, con leer este blog ya es algo xD
    Sigue así.
    Mis felicitaciones

  12. Pingback: Python: Tipos básicos II (Colecciones)

  13. Excelente iniciativa esto de explicar Python.

    Bueno, quería sólo hacer notar que en la tablita “and/or/not”, el ejemplo en “or” debiese aparecer

    r = True or False # r es True

    Puedes borrar este comentario si lo deseas.

  14. Pingback: Python: Control de flujo

  15. Pingback: Python: Revisitando objetos

  16. Pingback: Python: Entrada / Salida. Ficheros

  17. como puedo recuperar una linea de un archivo e ir guardando los datos en distintas variables ejemplo:
    133 25 145 56
    que en la variable x1=133, y1=25, x2=145 y y2=56
    …esperamos su respuesta

  18. necesito ayuda para realizar un programa que solicite cinco numeros racionales y que si el usuario coloca uno irracional que le indique el error, asi mismo debo indicar luego el valor mayor y el menor…gracias

  19. Hola, apenas empiezo la carrera de Contaduria y me tropiezo con los numeros booleanos. para mi es nuevo!!! pero con tus explicaciones, aprendere.

  20. Como hago para que el resultado que me imprima tenga 20 decimales..? es decir que me imprima por ejemplo 0.11111111111111111111

  21. Hola que tal, realice un código donde es necesario dividir dos números muy grande algo así como factorial de 250 entre un numero aun mas grande pero me da un error overflow… ya he usado todo los tipos de datos a ver si resolvía pero no he tenido éxito. si hay alguna manera de hacer una conversión a base 10 (notación científica)tal vez se ”facilitaría” el calculo si alguien me puede ayudar con algo de info al respecto se los agradecería XD
    “programar en equipo es la única manera de programar”

  22. @waya (Comentario para waya)
    Muchas veces es mejor hacer las cosas solo, antes que estar en un equipo de programadores que creen que son arquitectos de software….

    Hay varias cosas que decidí hacerlos solo por que muchas manos en un plato hacen mucho garabato… y muchas veces si querés que algo realmente funcione, tenés que hacerlo personalmente, no en equipo, por que muchas cosas en equipo no llegan a ningun lado.

    En un equipo donde cada uno tiene su trabajo BIEN DEFINIDO ahi es otra cosa y depende, pero sabé que muchas veces es muuuucho mejor hacer las cosas solo.

  23. Hola, necesito hacer un programa en python, en el cual ingresando desde el teclado un caracter, el programa de devuelva un 1, si es numero, un 2, si es un caracter, un tres si es caracter especial y 0 si es 0, desde ya gracias si alguien me puede dar una mano

  24. hola se puede hacer un range con numeros flotantes.
    necesito hacer entre 0 y 1 crear una condicion para que este entre esos valores .

  25. en los operadores aritméticos pusiste en la división entera 1.0 si se supone que es entera sin punto decimal o eso creo yo

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.