Curso de programacion en python3 : 02 - "Tipos" de dato y conversiones de los mismos

Esta entrada es parte de una serie, puedes ver la primera aquí

Lo primero que necesitamos para trabajar es conseguirnos una copia de python3, clic en el cuadro amarillo de la izquierda, viene con un IDE muy pequeño, básicamente un block de notas estilo windows pero con resaltado de código, ayudas utilizando la clave ctrl + espacio, guardado con ctrl + s, y ejecución instantánea al presionar F5.

Cuando diga "tipado dinámico" todos los programadores de C++ y Java gritarán del terror, pero después de unos meses trabajando en python terminé por darme cuenta de que no es tan malo una vez aprendemos a controlar los errores que puede suponer este hecho, no hay que definir el tipo de dato de ninguna variable, compensa mucho por que son errores que solo deberían ser causados por el usuario y aparte son fáciles de corregir, también el tipado nos ayuda a reciclar evitando necesitar un montón de variables locales como me sucede muchas veces en java.

Python tiene un sistema de asignación de memoria dinámica, empezando por que todas las variables son del mismo tipo, una referencia hacia un objeto, entonces python solo utiliza "punteros" como los de C y C++ para controlar los tipos de dato, creo que no hay otra forma de hacer un tipado dinámico, esto significa que una variable solo puede contener un objeto que tiene definido un valor, ese valor determina el tipo de dato, estos tipos para los primerizos son el entero(int, cualquier numero en el conjunto Z es entero) , flotante( float, números en el conjunto de los reales, R), cadena(String, cadenas de texto) y por ultimo el carácter(char, un string es un grupo de char, a estos se les denomina caracteres, por tanto en esta variable solo cabe un símbolo, pesa 8 bits).

Para ejemplificar esto en python, voy a usar una serie de enunciados y cada uno de ellos tendrá un comentario al respecto, estos siete enunciados traen con sigo ciertas conclusiones, todos estos enunciados pueden ser escritos en el interprete de python y resultan una orden para el computador, en este caso crearemos objetos explícitamente, en palabras mas simples, los objetos creados siempre tendrán el mismo contenido y el ejercicio nos ayudará a entender los tipos de dato dinámicos.

1) a = 5 #esto significa que la variable [a] contiene el dato numérico entero [5]
2) a = True #En este caso el tipo de dato es ahora el booleano [True], el [5] por razones obvias ya no existe
3) a = 0.005 #ahora [a] contiene un dato de tipo flotante o float
4) a = "Esto es un string " # ahora tenemos una cadena de texto o String
5) b = a  #el objeto no solo es apuntado por [a], tambien [b] lo esta apuntando.
6) a = a + b # se suman los valores(String) y se guardan en [a]
7) del a #la variable [a] no existe, pero [b] sigue apuntando al objeto
8) print(b) #se imprime el texto, por que [b] sigue existiendo

Ahora bien, basándonos en ese pequeño ejemplo podemos concluir que:

1) no es necesario poner el tipo de dato
2) no es necesario modificar nada para cambiar el dato contenido
3) con flotantes también funciona
4) podemos meter una cadena de texto sin problema
5) se puede guardar copia de los objetos
6)  hay que intentar que 2+2 no sea 22, por que trabajando con String puede pasar
7) se puede borrar una variable con "del"
8) borrar una variable no elimina el objeto asociado, si lo hace, es por que no tenemos otra variable que lo apunte

Sonará que vamos muy rápido, normalmente hay largas conversaciones sobre tipos de datos y sus alcances incluso entre programadores experimentados, pero esto es python, su objetivo es que programemos en el, no tener charlas amenas acompañadas de café (that reference :p).

Los tipos de dato no tienen mucho más, la orientación a objetos es un tema que no le atañe a quien inicia a comprender el lenguaje y por eso python evita hablar de eso, perfectamente sin saber lo que es un objeto ya entendimos que las instancias son creadas por medio de la asignación (esto [=] es el operador de asignación), entendimos que las conversiones no son necesarias si nosotros programadores entendemos cual tipo de objeto estamos creando, entendimos que el string se escribe con comillas y hay que poner mucha atención al utilizarlo ya que el tipado se presta a confusiones, mucho mas graciosas que en otros lenguajes, cabe recalcar que he visto muchos casos de felices accidentes en java, aprendimos que el operador [del] elimina una variable, pero es el recolector de basura quien elimina las instancias y por ultimo aprendimos que [print()] es un método, para imprimir el contenido de una variable en consola, solo es necesario poner la variable entre los parentesis.

¿que pasa si se aplica el operador [+] a texto en python? en principio nada malo
¿que pasa si se aplica el operador [+] entre texto y una variable numérica o booleana? un error enorme, por que python no trabaja con datos, trabaja con objetos

No puedo terminar esta entrada sin explicar en profundidad el sistema de conversiones, imaginemos que hay gente aquí que ha leído con atención, he dicho que los string o cadenas de texto pueden convertir una suma de números, en una unión de textos (2+2 = 22), para ello voy a poner un ejemplo suponiendo que tenía mas de un año de no tocar python y me he puesto a programar para hacer esta entrada, supongamos también que este ejemplo no me ha pasado nunca, supongamos que no me acaba de pasar y pasemos directamente a los motivos, por los cuales, hipotéticamente, esto puede pasar le a cualquiera muy seguido.

Casi todo en python 2 era una variable de entorno o global que se instanciaba en cuanto aparecía en el código, el ejemplo mas simple es que la instrucción print antes solo se le colocaba sin paréntesis seguido de comillas y texto, igual pasó con la variable raw_input, era bastante molesto escribir todo eso, cuando solo existe una forma estándar de recibir datos por una consola, ahora se ha convertido en la función input() que unicamente recibe texto aunque introduzcamos números.

 print("introduzca cualquier cosa")
a = input()
b = input()
a = a+b
print(a)
SALIDA
introduzca cualquier cosa
asd
asd
asdasd

En el caso que necesitemos sumar números, los problemas como ya he dicho son horribles:

introduzca cualquier cosa
1
1
11

¿Como solucionamos esto aunque sea parcialmente? Muy simple, cuando se necesita convertir una entrada de consola en enteros, utilizamos el método int(), al pasar le una variable, retorna un objeto entero en vez de una cadena, hay que guardar ese valor en algún lado ya que el método esta hecho para trabajar sobre la marcha tal que:

print("introduzca cualquier cosa")
a = input()
b = input()
a = int(a)+ int(b)
print(a)

Ahora mismo si estaríamos trabajando con enteros, pero los enteros no permiten punto flotante, en ese caso es necesario utilizar el método float(), en el aire había quedado la pregunta sobre sumar un entero y un string, pues la respuesta es muy simple, como son tipos de datos diferentes, tenemos que realizar una conversión del entero a string para poder concatenar, podríamos pasarlo todo a int, pero aquí aparece el dilema ético de cuando un usuario se equivoca y usa los campos numéricos para hacer la lista de la compra, ese caso especifico se abordará cuando estemos trabajando con excepciones, vamos al código.

a = "este en un numero al azar por que no se me ocurrió otra cosa"
b = 521
print(a,str(b))
SALIDA:
este en un numero al azar por que no se me ocurrió otra cosa 521

Hablemos al respecto, los mas avispados sabrán que las maquinas solo hacen lo que se les pide, por tanto ¿de donde sale el espacio entre a y b, si no esta definido en ninguna de las dos variables?, hasta el momento trabajamos con [+] que es el operador por excelencia para la suma, pero si en python tenemos tipado dinámico, ¿creen que sea buena idea usarlo para unir dos textos? pues no es buena idea, como nuestro BDV Guido van Rossum piensa en los programadores que están acostumbrados al tipado fuerte, ha dejando la concatenación para el [+], pero reafirma su autoridad como dictador colocando el operador coma, no solo como el concatenador por excelencia, si no que además te agrega un flamante espacio automático.

¿Alguien quiere seguir usando el [+] para concatenar, sabiendo que Guido el mismo creador de python y dictador benevolente vitalicio, nos ha regalado la coma con espacio automático? lo dudo mucho, sabiendo la existencia de este hermoso regalo, siempre existirá la ocasión en que una coma con espacio automático no sea lo mejor, pero si existe, es para que lo usemos con sabiduría.

Hasta aquí esta extensa y maravillosa entrada, ya sabemos usar los tipos de datos, ya sabemos que nos pueden conducir al error y como evitarlo, ya sabemos eliminar variables, sabemos los usos de las conversiones, entendimos muy básicamente que python utiliza una gestión de datos muy pulida si la comparamos con java (que genera bastantes dolores de cabeza) y por ultimo con la importancia que se merece, sabemos que Guido van Rossum piensa en nosotros y nos ahorra poner un espacio al concatenar texto <3 muy pronto la tercera entrada.

Comentarios

Entradas populares de este blog

Hablemos de difamación, parafilias y denuncias bien hechas

Criticamos a pablito: "Atrapado en el cuerpo equivocado"

El fruto de una era: Antiintelectualismo moderno