Programación para Newbies VII: Ingredientes – Variables y Tipos de Números

Como les decía anteriormente, ahora vamos a dar una sucinta revisión a los «ingredientes» de un programa en Python. Así como en las recetas de cocina son necesarios distintos ingredientes (te desafío a preparar algo con sólo «un» ingrediente). En Python a estos ingredientes, los llamaremos variables.

>>> 2 + 2
4
>>>

¡Sorpresa! El intérprete de Python puede funcionar como una calculadora. Aprovecho de mostrarte los signos que puedes utilizar:

Operador Descripción
+ Suma
Resta
* Multiplicación
** Exponente
/ División
// División entera
% Módulo (en Chile conocido  como «resto»)
>>> 2**3
18
>>> 10 % 3
1

(3 por 3 nueve, a 10, uno)

La división merece una mención aparte, pero lo veremos en la siguiente sección. Demás está decir la diferencia entre 2 + 3 * 4 y (2 + 3) * 4. Pero esto no es una clase de matemáticas, así que no me detendré en este punto.

Variables

>>> x = 1
>>>

Por mucho que se parezca a una ecuación matemática (no, no huyas, es mucho más simple). La verdad es que el signo «=», no es realmente el «igual a». Lo que realmente está haciendo es asignando, siendo específico, con una asociatividad de derecha a izquierda (el valor a la derecha del signo «=»; 1, se asocia al de la izquierda; x. Y no al revés, es decir que: x = 1 no es igual a 1 = x). Esto puede parecer una exquisitez, pero muy pronto veremos lo relevante que es entender esta diferencia. Otra cosa, si te diste cuenta la asignación no entrega ningún mensaje. Al igual que en los intérpretes en *nix, es una buena señal, o bueno, por lo menos, no hay un error.

>>> x + 1
2
>>>

Nota: Para el nombre de las variables puede utilizarse cualquier caracter alfanumérico y el underscore (guión bajo: «_«), es importante si tomar en cuenta que no puede comenzar con un número y es sensible a las mayúsculas, es decir que, variable, es distinto de VARIABLE, de Variable o VaRiAbLe. Por motivos obvios (y de sanidad mental) recomendaría no utilizar. Algunos programadores usan la primera letra mayúscula, por ejemplo PrimerNombre, otros primer_nombre. No importa cuál ocupes, pero recomiendo que sea cuál sea el que escojas, siempre utilices el mismo y que el nombre de las variables -ojalá- se explique por si mismo.

Las variables podemos dividirlas (básicamente) en tipos, a saber:

  • Números (y sus respectivos conjuntos)
  • Cadenas de textos (strings,[str]) y,
  • Valores booleanos (es decir, de true (verdadero) y false (falso))

Bueno, vamos y creemos algunas:

>>> numero = 1
>>> decimal = 0.1
>>> numero_grande = 2**32
>>> caracter = "c"
>>> cadena = "soy una cadena"

Nota: Como Python proviene de un país de habla inglesa utiliza el punto (.) en vez de la coma (,) para dividir decimales como lo hacemos en Chile y -creo- los países de lengua castellana.

A diferencia de otros lenguajes de programación, en Python no es necesario declarar el tipo de variable al inicializarla. En C C++ por ejemplo para el ejemplo anterior debería haber escrito:

int numero = 1;
double decimal = 0.1;
char caracter = "c";
string cadena ="soy una cadena";
bool booleano = true;

Tipos de Números

Enteros (int) y flotantes (float)

>>> numero = 1
>>> type(numero)
>>> decimal = 0.1
>>> type(decimal)

Por defecto, cualquier número ingresado en Python lo hace como entero (integer; int) lo que significa que al intentar una operación como 3/2 entrega un valor que claramente no es el que buscamos:

>>> 3/2
1
>>> type(3/2)

Para sortear el problema tenemos que hacer que al menos alguno de los dos números sean de coma flotante (float):

>>> float(3)/2
1.5
>>> type (float(3)/2)

Del mismo modo:

>>> 3.0/2
1.5
>>> type (3.0/2)

Si queremos ser un poco más prácticos en caso de utilizar el intérprete podemos comenzarlo con el argumento -Qnew:

~$ python -Qnew

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/2
1.5
>>>

Si acaso lo necesitamos para un programa podemos importar una función de un curioso módulo llamado future (más adelante les contaré algo sobre el mismo):

>>> from __future__ import division
>>> 3/2
1.5
>>> 3//2
1
>>> a = 3//2
>>> type(a)

(He ahí que significa la división entera, del resultado sólo presenta la parte entera. Duh.)

Básicamente y para no complicarse más de lo debido, si necesitas utilizar números del conjunto de los naturales o enteros (Z, es decir, los naturales más los negativos) se utiliza int, mientras que si necesitas números reales, utiliza float.

>>> from math import pi
>>> pi
3.1415926535897931
>>> type(pi)

Largos (long)

>>> numero_grande = 2**32
>>> type(numero_grande)
<type 'long'>

Por razones técnicas, el computador no es capaz de almacenar números mayores ni menores que los comprendidos entre – 2.147.483.647 y 2.147.483.647. Por supuesto es posible de todas formas: para representar números fuera de dicho rango se utiliza una nueva notación donde los números son almacenados como largos (long):

>>> numero_grande
4294967296L

Estos números funcionan como cualquier otro con el único detalles es la «L» mayúscula al final. Puedes utilizar la minúscula también (l), pero se parece mucho al número uno (1), por lo que se desaconseja.

Nota: ¿Por qué ese límite? En realidad no es trascendental, pero me parece que es interesante: Toda la culpa es que usamos procesadores de 32 bits. Si en cada bit se pueden almacenar dos valores («0» y «1»), entonces sólo bastaría elevar el número de opciones (2) al número de bits (32), es decir: 4.294.967.296. Dado que habitualmente requerimos números negativos (y no sólo naturales), podemos dividir el valor por 2 (positivos y negativos), es decir, 231. El único problema que nos queda sería que estamos omitiendo el cero, por ende, el valor máximo en un ordenador de 32 bits sería 231 – 1. En el caso de procesadores de 64 bits los límites son de 263 – 1.

Python también puede manejar números complejos, pero creo eso ya escapa a los objetivos de estos artículos :). Si te interesa saber más sobre el tema, te recomiendo que visites la documentación oficial.

¿Por qué el detalle de los tipos?

Buena pregunta: Dudo si aún tenga validez (creo que sí), resulta que en los comienzos de la programación los computadores eran mucho más lentos y contaban con mucha menos memoria por lo que cada vez que era posible había que ahorrar. Puesto que por ejemplo, long (al igual que float) utiliza más memoria que int, lo ideal era sólo recurrir a este tipo de variable cuando fuera estrictamente necesario. Un caso interesante al respecto es con el lenguaje C que cuenta con un tipo conocido como unsigned int que funciona como los límites de int, pero sin valores negativos, por lo que su valor máximo es: 232 – 1. Utilizando éste uno se podía ahorrar utilizar long en los valores positivos (hasta el límite de 4.294.967.295 por supuesto).

Un poco larga esta parte, pero bueno, me pareció que no era muy buena idea cortarla. En la siguiente parte veremos qué son las cadenas y como podemos juguetear un poco ellas.

13 comentarios en “Programación para Newbies VII: Ingredientes – Variables y Tipos de Números

  1. Muy buen post, creo que a los «newbies» en esto de la programación les ha quedado muy claro todo. Dos cositas rápidas:

    En C, string cadena ="soy una cadena"; y bool booleano = true; son expresiones ilegales, puesto que tanto los tipos string como bool no existen (aunque usted no lo crea). Los booleanos se suelen emular con los enteros (0 es falso y cualquier otro número es verdadero) mientras que las cadenas de caracteres si existen, pero como una extensión de los char (que da paso a comportamientos muy interesantes a la vez que útiles). Prefiero aclararlo antes de que salga un purista a reclamar xD.

    Lo que hablas al final sobre los tipos, aún tiene validez. Más allá de la cantidad de memoria que se necesite para almacenar un tipo, donde más se siente es en las operaciones de asignación, representación y especialmente en las comparaciones. De hecho, muchos algoritmos miden su eficiencia en términos del número de comparaciones.

    Me gusta

    • Ugh, que extraño, tomé un libro de C para poner ese ejemplo y sale que la cadena es distinto y se debe declarar de esa forma… ahora lo de bool puede ser que me haya pifiado. ¿Cómo sería entonces en C?. ¿Cómo crearía una variable de una cadena?

      Me gusta

    • Tal vez lo viste en algún libro de C++ (que tiene diferencias notables sobre C) u otro que usa librerías fuera del estándar ANSI. El ejemplo correcto sería:

      char cadena[] = "soy una cadena"

      Se define la cadena como un simple array (arreglo) de caracteres, pero con la particularidad de que internamente termina con el carácter especial '' que indica el final de cadena. Es esto último lo que diferencia entre un arreglo de caracteres y una cadena de caracteres.

      Me gusta

  2. Información Bitacoras.com…

    Valora en Bitacoras.com: Como les decía anteriormente, ahora vamos a dar una sucinta revisión a los “ingredientes” de un programa en Python. Así como en las recetas de cocina son necesarios distintos ingredientes (te desafío a preparar algo con sólo …..

    Me gusta

  3. […] Como les decía anteriormente, ahora vamos a dar una sucinta revisión a los “ ingredientes ” de un programa en Python. Así como en las recetas de cocina son necesarios distintos ingredientes (te desafío a preparar algo con sólo “un” … Excerpt from:  Programación para Newbies VII: Ingredientes – Variables y Tipos de … […]

    Me gusta

Deja un comentario

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