sábado, 26 de octubre de 2024

Lenguajes. Python.

Funciones de conversión de variables

Dado que la función input() se asocia necesariamente a una variable de tipo string, necesitamos contar con una función que nos permita cambiar de tipo a esa variable. No es esta la única circunstancia en que necesitaremos utiliza este tipo de funciones, pero sí una de las más evidentes. Trataremos en esta entrada sobre las funciones de conversión y su uso.


De momento, en esta fase introductoria de nuestro aprendizaje de Python, vamos a conocer cuatro funciones de conversión básicas. Siendo v la variable a convertir...
  • str(v) -> Transforma v en una variable de tipo cadena (string)
  • int(v) -> Convierte en una variable numérica de tipo entero (integer)
  • float(v) - > Convierte v en una variable numérica de tipo decimal (float)
  • eval(v) -> Permite que contenga cualquier expresión válida en Python.   
Veremos a continuación algunas aplicaciones prácticas (1) para entender mejor la importancia de realizar estas conversiones, el modo de usar estas funciones y los resultados que obtendremos con ellas.

#Primer script Python.
#Incluye el uso de variables, operadores y funciones input y output

print ("Bienvenido a este mi primer programa Python")
print("Voy a hacerte alguns preguntas y al final te daré una respuesta",'\n')
nombre = input("Dime tu nombre: ")
pueblo = input("Dime el lugar donde naciste: ")
ano_nac = input("Tu año de nacimiento: ")
ano_act = 2024
ano_nac = int(ano_nac)
annos = ano_act - ano_nac
annos = str(annos)
print(nombre,"naciste en",pueblo,"en el año",str(ano_nac),"y ahora tienes",annos,"años")

En este primer caso realizo la conversión de una variable, cuyo valor se solicita al usuario mediante input(), esta conversión es de string a integer (ano_nac = int(ano_nac)) para poder realizar la operación (annos = ano_act - ano_nac). A continuación con el resultado de esa operación realizo la conversión inversa para poder utilizarla en la salida (print(nombre,"naciste en",pueblo,"en el año",str(ano_nac),"y ahora tienes",annos,"años")). Podría haberlo hecho directamente en el mismo print(), como en el caso de la variable ano_nac (str(ano_nac)). 

En este caso, el único cambio de tipo necesario es el primero (ano_nac = int(ano_nac)), ya que provoca error usar variables string con operadores algebraicos, pero no los otros dos, ya que el intérprete asume esas variables numéricas como parte de la cadena que se devuelve el programa.

Veamos un segundo ejemplo, en este caso de operaciones matemáticas.

opera1 = 35
opera2 = input("Segundo operador numérico: ")
resulta1 = opera1 + opera2

Este script produce error por tratar de sumar una variable string (opera2 = input("Segundo operador numérico: ")) con una integer (opera1 = 35); para evitarlo es necesario convertir opera2 en integer.  Esta es una de las formas posibles (resulta1 = opera1 + int(opera2)), pero si queremos volver a utilizarla en una segunda operación resulta que sigue siendo una variable string, por lo que seguirá dando el error inicial (2), así que la mejor opción es convertirla en integer antes de operar (opera2=int(opera2)) (3)

Si en vez de sumar queremos realizar una división (resulta2 = opera1 / opera2) nos devolverá un valor float, ya que resulta2 asume como tipo el resultante de la operación, no limitando este tipo al de los valores de los operandos, por lo que no se produce ni error ni encubrimiento (4).

Tras las modificaciones, este sería el script resultante:

# Segundo script Python
# Operaciones aritméticas y funciones de cambio de tipo de variable 
opera1 = 35
opera2 = input("Segundo operador numérico: ")
resulta1 = opera1 + int(opera2)
print(resulta1)
opera3 = int(opera2)
resulta2 = opera1 / opera3
print(resulta2)


NOTAS

(1) Desarrolladas desde el generador de script del IDLE y obtenemos los resultados en el Shell.
(2) Esto es así porque lo que hacemos mediante esa primera fórmula no es convertir opera2 en integer, si no usar una versión integer de una variable string en una operación cuyo resultado se asigna a una tercera variable (resulta1). Realmente opera2 sigue siendo la variable string que deriva del uso de la función input(). Esta forma de operar también tiene su ventaja: conservar el dato original de la variable.
(3) Ahora opera2 queda convertida en una variable integer, dada la reutilización que hacemos de ella y el uso de la función int().
(4) Por encubrimiento (de tipo) me refiero a que devolviera un valor entero por asimilación al tipo integer. Esto generaría problemas en cálculos en los que los valores decimales son importantes. Pero aquí no es el caso. Tampoco se produciría en el caso de que resulta2 hubiera sido "declarada" previamente como integer, ya que al usarla en la operación se produce una reasignación de contenido y un cambio de tipo de variable (en este caso, de integer a float) por el tipado dinámico, que es una de las características de este lenguaje.