top of page
Foto del escritorBraulio Madrid

Particularidades de las variables en Python



Python para mí ha supuesto un dolor de cabeza al no estar acostumbrado a un lenguaje tipo Script como lo es JavaScript, yo vengo de C# y CG, donde las variables tienen que declarar el tipo de valor.


Este post no pretende ser ningún curso de Python, solo son algunas anotaciones curiosas que tiene el lenguaje referente a las variables y como difiere de otros lenguajes, para algunos esto que explicaré podrá ser basura, para otros quizás sea algo que les ahorre uno que otro dolor de cabeza o despierte algún tipo de curiosidad.


¿Como declarar una variable?


Para declarar una variable solo basta el nombre de la variable, un operador de asignación y el valor a asignar.

numeroA = 12

El nombre nunca podrá iniciar con número y a diferencia de C# es recomendable usar notación #snake_case en lugar de #camelCase, esto es por cuestiones de estilo.


Si deseáramos especificar el tipo ¿cómo hacemos?, agregamos "dos puntos seguidos" ":" y luego el tipo.

numero_a : int = 12;

Python no es necesario usar "punto y coma"";" para terminar las líneas, sin embargo nada pasa si las agregamos, de hecho esta práctica no es recomendada porque le resta legibilidad y estilo al código, la única utilidad que tiene es la de separar varias instrucciones dentro de un mismo renglón.


Ahora que hemos anotado el tipo de valor int, que mas tipos existe y que utilidad tiene en la práctica.

entero : int = 12
flotante : float = 12.5
booleano : bool = True
string : str = 'String'
cualquiera : any = None
ninguno : None = None

Hay varias cosas notables en este trozo. Una es que puedo usar comillas dobles ("") o comillas simples ('') para asignar un valor de cadena de caracteres, cuando en otros lenguajes provenientes de C, usan comillas simples para asignar caracteres y dobles para cadenas de caracteres.


Podemos notar el tipo de notación any, para señalar el tipo de valor cualquiera, esto es muy similar como lo hace typescript, que no es mas que un intento para darle tipos a variables de JavaScript.


Por último el valor None, sería similar al valor Null en lenguajes provenientes de C o Java para indicar que no hay un valor asignado, esto es útil para cuando queremos declarar una variable, pero le asignaremos en el futuro un valor.

entero : int = 12
entero = "Entero"

Por ejemplo vemos como asignamos un número entero a la variable entero, pero en la instrucción siguiente le asignamos una cadena de caracteres, anulando por completo nuestra intensión de declarar tipos de valores, entonces ¿qué uso práctico tiene esto?, realmente poco, algunos IDE pueden mejorar sus sugerencias de código.


Es posible usar una librería escrita por el mismísimo creador de Python, llamado mypy o usar una librería de Facebook llamado Pyre, para volver mas estricto el código y evitar esos cambios de tipo, con esto logramos convertir a Python en un lenguaje de tipado fuerte.


Podemos hacer lo mismo con las listas, tuplas, diccionarios y sets.

lista : list() = [10,20,True,"Hola"]
tupla : tuple() = (10,20,True,"Hola")
diccionario : dict() = {"nombre" : "Juan", "edad" : 15}
conjunto_o_set : set() = {"Venus", "Marte", "Tierra"}

Es posible anotar el tipo de colección usando paréntesis como si fuera una colección vacía y fue la manera que me sirvió para hacer una anotación en Windows, ahora por alguna razón en Linux si omito los paréntesis no ocurren errores.

lista = list(10,20,True,"Hola")
tupla = tuple(10,20,True,"Hola")
diccionario = dict(nombre = "Juan", edad = 15)
conjunto_o_set = set("Venus", "Marte", "Tierra")

Esta es una forma de asignar valores y al tiempo indicar el tipo de variable, aunque no es un modo de escritura habitual, yo si la acostumbro, sobre todo para asignar variables vacías.

entero = int() # 0
string = str() # ''
lista = list() # []

Por último las funciones int() que sirve para convertir números flotantes en enteros, también sirve para asignar valores, si dejas los paréntesis vacíos esto es igual a cero, lo mismo con str() que por defecto asigna una cadena vacía, lo mismo con list(), asigna una lista vacía. etc.

cualquiera = any() # Esto produce un error
cualquiera = any(10) # Error. No permite valores únicos, sino iterables.
cualquiera = any("Hola") # No produce error, pero devuelve tipo bool
print(cualquiera) # True
print(type(cualquiera)) # bool

El tipo de valor any, realmente no es un tipo de valor, la asignación resulta extraña, aunque realmente no es un tipo de valor útil, resulta curioso, en lugar de asignar any, es mejor asignar None.


¿Qué diferencia los distintos tipos de colecciones?


Como los dos últimos trozos de código habrá notado que puedes asignar distintos tipos de valor dentro de estas, muy distinto que en C#, donde los array o arreglos debían tener todos los elementos el mismo tipo de dato, en Python puede variar y esto puede presentar ventajas y desventajas.


La ventaja principal y evidente es que este puede parecer como un tipo de objeto o estructura, sin necesidad de declarar previamente una clase para tal fin.


La desventaja es que esto puede dificultar el tratamiento de los datos dentro de un bucle, pues los datos pueden ser cualquier cosa.


Si vemos los tipos de colecciones set, tuple, list o string, puede parecer lo mismo, pero tienen pequeñas diferencias, pero sustanciales, una cadena de caracteres no es mas que una tupla con caracteres y al igual que las tuplas son inmutables y su tratamiento es muy parecido, las tuplas pueden contener cualquier tipo dentro, en cambio el tipo string, solo puede contener caracteres, no es posible cambiar una sola letra manualmente dentro de la cadena a menos que cambies todo el valor, a esto se le llama #inmutabilidad y es la capacidad de la variable de permanecer inalterable durante la ejecución del programa:

saludo = "Hola mundo"
saludo[0] = "C" # Esto arroja un error.

tupla = ("hola", 10, True)
tupla[2] = False # Esto arroja un error.

El tipo de colección set, permite asignar distintos tipos de valores, pero también es inmutable, no permite la adición de valores repetidos y el orden de los items no está garantizado, esto quiere decir que no es posible acceder al valor mediante un índice, pues la posición pudo haber cambiado.

conjunto = {"hola", 10, True}
conjunto[1] = 20 # Esto arroja un error. pues no existe asignación sin indice.
conjunto.add(10) # No agrega ningún valor, pues 10 ya existe.
conjunto.add(20) # {10, True, 20, "hola"} cambió el orden.

El tipo de colección lista es el mas flexible de todos, pues tiene un orden garantizado, es mutable y permite repetición de datos.

lista = ["hola", 10, True]
lista[1] = 20 # Es mutable
lista.append("hola") # Permite repetición de valores.
print(lista) # ["hola", 20, True, "hola"]

Los diccionarios están compuestos de llave y valor. Las llaves no permiten repetición, pero los valores si pueden ser repetibles, los diccionarios no usan un índice, pero se puede acceder al valor de estas mediante la llave. Los diccionarios son mutables y por tanto cambiar el valor usando la llave correspondiente en cualquier momento.

diccionario = {"nombre" = "Juan", edad = 15}
diccionario["nombre"] = "Felipe"
diccionario["apellido"] = "González"
print(diccionario) # {"nombre" : "Felipe", "edad" : 10, "apellido" : "González"}

Esto ha sido algunas curiosidades acerca de las variables de Python y como puede comportarse a diferencia de los lenguajes fuertemente tipados, si crees que se me pudo haber escapado algún detalle puedes dejar el comentario, yo tampoco soy un adalid de Python y tu aporte puede ser de utilidad para los demás.


No siendo mas nos vemos en un proximo post.

20 visualizaciones0 comentarios

Comments


bottom of page