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 |
Te olvidastes comentar (o talvaz va para otra parte) que Python permite hacer comparaciones del tipo:
1 <= a <= 7
MUY buen curso.
Me encantan tus entradas sobre python.
Es un gran momento para aprender, de hecho lo haré.
Muy bueno el artículo, ¡sigue así campeón!
Saludos !
Muchas gracias por todos los tips! estoy aprendiendo python y me vienen al pelo.
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!!!!
Gracias por el tutorial 😀 Buen post! 😀
Al final aprendere Phyton avanzado gracias a ti xD
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.
Coño pana excelente tutorial. Si sigues así voy a aprender Python gracias a ti :D.
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.
Muchas gracias por tus mini-guias! Realmente útil!
Cada entrada que te curres, un agradecimiento que te pongo.
Mil gracias de nuevo!
1saludo
Muy buena entrada, bastante bien explicada
Cierto. Gracias por el apunte tzulbert.
Y evidentemente los demás operandos también se pueden combinar (de forma lógica)
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.
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 🙂
Gracias por la respuesta Zootropo, yo por mi parte me he puesto a buscar y he encontrado este artículo que compara ambos lenguajes:
http://blog.ianbicking.org/ruby-python-power.html
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 🙂
Cierto javi, gracias por la corrección.
Fallo muy tonto, sobre todo porque en los resultados de hacer la exponenciación si que le resté uno 😛
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.
ya, ya, por eso me he dado cuenta que era un descuido xD
intento ayudar con lo poco que sé 😛
«# 027 es 23 en base 10
entero = 027»
es en base 8 😛
Te lo estas currando un monton ^^.
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.
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
Leyendo la entrada del blog de danyx me doy por contestado.
http://elcodigok.blogspot.com/2007/11/documentacin-y-gua-de-aprendizaje-de.html
Gracias
Pingback: Python: Tipos básicos II (Colecciones)
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.
Cierto, gracias wolverenstein
Pingback: Python: Control de flujo
Pingback: Python: Revisitando objetos
Pingback: Python: Entrada / Salida. Ficheros
esta muy bien te felicito de verdad
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
esta es una informacion bastante buena y me interesa bastante yo personalmente en lo que cabe se los aconsejo
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
Hola, apenas empiezo la carrera de Contaduria y me tropiezo con los numeros booleanos. para mi es nuevo!!! pero con tus explicaciones, aprendere.
chevre y enteresante esto me servira para mejor en la carrera de ing. sistemas
Como hago para que el resultado que me imprima tenga 20 decimales..? es decir que me imprima por ejemplo 0.11111111111111111111
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»
@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.
Muy buen sitio.
Si quieren aprender a programar en python con videotutoriales, puede acceder a mi canal en YouTube
Saludos!
Siempre se te olvida comentar que todos los tutoriales que dejas son sacados del libro «PYTHON PARA TODOS».
Normal. Yo soy el autor. El libro está basado en estos tutoriales que escribí primero en el blog 😉
Muchas gracias amigo. Me servira para mi materia de programación se sistemas, saludos.
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
Hola
Me gusto el post, pero quisiera saber como convertir un dato a double ofloat o decimal
algo asi como
str(num)
o
int(num)
cosas asi!
Gracias!
hola se puede hacer un range con numeros flotantes.
necesito hacer entre 0 y 1 crear una condicion para que este entre esos valores .
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