¿Qué es la conversión de tipos?
La conversión de tipos de datos, llamada
casting en inglés, es
el proceso de cambio de un tipo de dato a otro compatible.
Esta acción la necesitaremos en múltiples ocasiones. Por
ejemplo, si queremos transformar la entrada de un
input()
, la cual se guarda como
str
, pero necesitamos un int
o
un float
, para operar con él.
Espacio publicitario
Funciones predefinidas para conversiones
Muchas de las funciones predefinidas de Python sirven para realizar conversiones. A continuación tienes un listado de ellas:
-
int()
: Convierte un valor a un número entero. -
float()
: Convierte un valor a un número de coma flotante. -
str()
: Convierte un valor a una cadena de caracteres. -
bool()
: Convierte un valor a un booleano. -
complex()
: Convierte un valor a un número complejo. -
ord()
: Convierte un carácter a su código Unicode. -
chr()
: Convierte un código Unicode a un carácter. -
hex()
: Convierte un número a su representación hexadecimal. -
oct()
: Convierte un número a su representación octal. -
bin()
: Convierte un número a su representación binaria.
Conversión implícita
La conversión implícita es la que ocurre cuando el
intérprete de Python transforma el tipo de dato
automáticamente. Por ejemplo, si sumamos un número entero
(int
) con un número con decimales
(float
), Python realizará la conversión
implícita del entero, al tipo float
, antes de
realizar la suma.
De esta forma es posible operar con ambos tipos de datos sin tener errores.
numero_1 = 10
numero_2 = 20.5
print(numero_1 + numero_2)
30.5
Tanto los compiladores de otros lenguajes de programación, como el intérprete de Python, requieren hacer este tipo de conversiones para asegurarse de que la operación se realice correctamente y no se pierda ninguna parte decimal.
Por ejemplo, al sumar 10
(int
) y
20.5
(float
), el
int
se convierte primero a
float
, resultando en 10.0
, y
luego se realiza la suma:
10.0 + 20.5 = 30.5.
¿Cómo saber el tipo de dato en Python?
En Python podemos comprobar cualquier tipo de dato con la
función predefinida type()
.
Observa el siguiente ejemplo:
numero_1 = 10
numero_2 = 20.5
print(type(numero_1 + numero_2))
<class 'float'>
En este ejemplo estoy pasándole a la función una expresión (una suma). Gracia a utilizar esta función de Python, el intérprete nos puede indicar el tipo de dato resultante de la expresión, en lugar del resultado de esta.
Aquí tienes otro ejemplo de uso:
numero_1 = 10
numero_2 = 20.5
print(type(numero_1))
print(type(numero_2))
<class 'int'>
<class 'float'>
En este otro ejemplo estoy pasando a cada
type()
un valor de variable. En el primero
evalúa el valor 10
y nos indica que es de
tipo int
. En el segundo evalúa el valor
20.5
y nos indica que es un valor
float
.
Muy pronto le verás la utilidad a este tipo de
comprobaciones. Por el momento, utiliza la función
type()
cada vez que tengas dudas del valor
que queda en alguna variable, en determinada línea de
código. Así podrás ir aprendiendo bien como manipula
Python los datos y los tipos que maneja en todo momento.
Espacio publicitario
Conversión explícita
La conversión explícita es aquella que hacemos
manualmente, escribiéndola en el código. Veamos un ejemplo
de esto con la función predefinida int()
:
numero = 100.43
numero_entero = int(numero) # Se convierte en int
print(numero)
print(numero_entero)
100.43
100
La variable numero
tiene un tipo de dato
float
. En la variable
numero_entero
hago la conversión de la
variable numero
, utilizando para ello la
función predefinida int()
.
Ten cuidado con este tipo de conversiones, ya que como ves, en ciertas acciones de conversión pierdes parte de la información. En el ejemplo anterior, acabo de perder un valor de
0.43
.
Analizar los tipos de datos
Vamos a escribir un pequeño código con una entrada de datos. Este va a servir para introducir dos números en la consola, y que Python los sume.
numero_1 = input("Introduzca el primer número: ")
numero_2 = input("Introduzca el segundo número: ")
suma = numero_1 + numero_2
print(f"El resultado de la suma es: {suma}.")
Introduzca el primer número: 10
Introduzca el segundo número: 24
El resultado de la suma es: 1024.
¡Vaya! Qué locura. Python acaba de decirme que
10 + 24 da como resultado
1024
.
¿Se trata de un fallo de Python?
En absoluto. Lo que ha ocurrido lo podemos averiguar
investigando un poco con la función predefinida
type()
. Con ella podrás indagar en los tipos
de datos que tiene cada cosa, como bien he explicado
anteriormente.
Espacio publicitario
Lo normal sería pensar que si introduzco un número entero,
se guarde como entero, pero la función predefinida
input()
, guarda siempre un tipo de dato
str
. Independientemente del valor que le
pongamos. En el siguiente ejemplo, podrás apreciarlo:
numero_1 = input("Introduzca el primer número: ")
numero_2 = input("Introduzca el segundo número: ")
suma = numero_1 + numero_2
print(f"Tipo de numero_1: {type(numero_1)}")
print(f"Tipo de numero_2: {type(numero_2)}")
print(f"Tipo de suma: {type(suma)}")
Introduzca el primer número: 10
Introduzca el segundo número: 24
Tipo de numero_1: <class 'str'>
Tipo de numero_2: <class 'str'>
Tipo de suma: <class 'str'>
En este ejemplo estoy realizando la operación de suma de
los dos valores entrados desde la consola (10
y 24)
.
Después imprimo tanto los tipos de datos de los valores
introducidos, como el tipo de dato que produce el
resultado final, gracias a la función predefinida
type()
.
De este modo, en todo momento podemos apreciar en la consola los tipos de datos que se están manejando.
Perfecto, ya sabemos cuál es el fallo. Al poner datos
sobre el input()
, se guardan como
str
.
En conclusión a todo esto, en la variable
suma
se está utilizando el operador
+
con dos cadenas de caracteres. ¿Recuerdas
que ocurría cuando hacíamos dicha acción? La respuesta es
concatenación. Los dos str
se concatenan
formando un nuevo str
en la variable suma.
Así: "10" + "24" = "1024"
.
Ahora que ya tienes algo de contexto para hacer conversiones de tipos de datos, es el momento de empezar a aplicarlas para solucionar problemas.
Conversión int()
Para realizar una conversión a tipo int
, lo
haremos con la función predefinida int()
.
En el siguiente código, estoy transformando
numero_1
y numero_2
, que
llevarán originalmente valores str
, a tipo
int
:
numero_1 = input("Introduzca el primer número: ")
numero_2 = input("Introduzca el segundo número: ")
numero_1 = int(numero_1)
numero_2 = int(numero_2)
suma = numero_1 + numero_2
print(f"Tipo de numero_1: {type(numero_1)}")
print(f"Tipo de numero_2: {type(numero_2)}")
print(f"Tipo de suma: {type(suma)}")
print("\n")
print(f"El resultado de la suma es: {suma}.")
Introduzca el primer número: 10
Introduzca el segundo número: 24
Tipo de numero_1: <class 'int'>
Tipo de numero_2: <class 'int'>
Tipo de suma: <class 'int'>
El resultado de la suma es: 34.
La conversión funciona. Después de ella podemos comprobar
que los números ya no son str
. Ahora son
int
, y podemos realizar la operación
aritmética correctamente.
Veamos un código que hace las mismas conversiones, pero expresado de forma más concisa:
numero_1 = int(input("Introduzca el primer número: "))
numero_2 = int(input("Introduzca el segundo número: "))
suma = numero_1 + numero_2
print(f"El resultado de la suma es: {suma}.")
Introduzca el primer número: 100
Introduzca el segundo número: 600
El resultado de la suma es: 700.
Espacio publicitario
Orden de resolución
Cuando utilizamos funciones dentro de otras funciones,
como en las dos conversiones de este último ejemplo, el
intérprete de Python resolverá primero la función interna,
en este caso el input()
:
numero_1 = int(input("Introduzca el primer número: "))
Con el input()
se pide el valor en la
consola. Se introduce (por ejemplo 100
), y se
almacena como un str
, quedando en ese momento
de esta forma:
numero_1 = int("100")
Después de esto, el intérprete resuelve la última llamada
a función, la de int()
. El valor queda de
esta forma en la variable:
numero_1 = 100
Observa el siguiente ejemplo:
funcion_1(funcion_2(funcion_3(funcion_4())))
¿Sabrías decirme en qué orden se ejecutarían las llamadas
a estas funciones? La respuesta la tienes si has prestado
atención al orden de resolución del ejemplo anterior. El
intérprete de Python resolverá primero la función más
interna, la funcion_4()
. Una vez realizada la
tarea de esta hipotética función, resolverá la
funcion_3()
, luego la
funcion_2()
y finalmente la
funcion_1()
.
Conversión float()
Volvamos a este ejemplo:
numero_1 = int(input("Introduzca el primer número: "))
numero_2 = int(input("Introduzca el segundo número: "))
suma = numero_1 + numero_2
print(f"El resultado de la suma es: {suma}.")
En principio funciona perfecto, pero ¿qué ocurre si intento sumar un valor con decimales?
Introduzca el primer número: 14.678
ValueError: invalid literal for int() with base 10: '14.678'
Error de valor: literal inválido para int() con base 10: '14.678'
Tenemos un código un tanto frágil, el cual no es capaz de sumar con decimales. Para solucionarlo solo tenemos que hacer la conversión de
str
afloat
, en lugar de utilizarint()
.
numero_1 = float(input("Introduzca el primer número: "))
numero_2 = float(input("Introduzca el segundo número: "))
suma = numero_1 + numero_2
print(f"Número 1: {numero_1}")
print(f"Número 2: {numero_2}")
print(f"El resultado de la suma es: {suma}.")
Introduzca el primer número: 14.678
Introduzca el segundo número: 10
Número 1: 14.678
Número 2: 10.0
El resultado de la suma es: 24.678.
Si el valor pasado a la función float()
es un
decimal, se convierte el valor str
del
input()
a float
. Por ejemplo
"14.678"
a 14.678
.
Si el valor pasado a la función float()
es un
entero, se convierte el valor str
del
input()
a float
. Por ejemplo
"10"
a 10.0
.
Con esto tan simple hemos conseguido mejorar esta mini calculadora de sumas.
El utilizar una función de conversión u otra dependerá del
resultado final que se desee obtener. Si no quieres
decimales, haz las conversiones con int()
. Y
si quieres decimales, con float()
.
Espacio publicitario
Conversión bool()
Las conversiones explícitas a tipo de dato
bool
las haremos con la función predefinida
bool()
.
La lógica booleana establece que numéricamente hablando,
el valor 0
corresponde al valor booleano
False
, y 1
al valor
True
.
interruptor = 1
# Convierte el valor entero a bool
booleano = bool(interruptor)
print(booleano)
True
interruptor = 0
# Convierte el valor entero a bool
booleano = bool(interruptor)
print(booleano)
False
Debes tener en cuenta las siguientes reglas de
funcionamiento de bool()
:
Convierte en True con:
- Números distintos de cero
- Cadenas de caracteres no vacías (con algún caracter)
- Listas, tuplas, diccionarios y conjuntos no vacíos (con algún elemento)
-
Objetos de tipo
bool
que tienen el valorTrue
Convierte en False con:
- Valor
0
- Cadenas de caracteres vacías
- Listas, tuplas, diccionarios y conjuntos vacíos
-
Objetos de tipo
bool
que tienen el valorFalse
- Valor especial
None
Hay algún que otro caso, pero creo que es suficiente para poder hacer una comparación entre ambos valores booleanos.
Veamos un ejemplo. Si convertimos un str
con
un valor "Hola"
, nos da un resultado
True
:
saludo = "Hola"
# Convierte el valor a bool
booleano = bool(saludo)
print(booleano)
True
En cambio, si la cadena está vacía se convierte en
False
:
saludo = ""
# Convierte el valor a bool
booleano = bool(saludo)
print(booleano)
False
Puedes ir haciendo pruebas con cualquier otro valor, a ver que ocurre. En los próximos capítulos empezarás a aprender sobre la lógica booleana y le verás sentido a este sistema.
Espacio publicitario
Conversión str()
Las conversiones explícitas a tipo de dato
str
, las haremos con la función
str()
.
Aquí tienes un ejemplo:
numero = 1000
# Convierte el valor int a str
cadena = str(numero)
print(type(cadena))
<class 'str'>
Aquí se obtiene el valor entero 1000
y se
almacena con la conversión como
str
("1000"
).
El resto de funciones predefinidas son para usos más específicos, por lo que es necesario entender su propósito, y cómo funcionan antes de poder utilizarlas. De todas formas, si te manejas bien con diferentes tipos de números que no sean los decimales, no tendrás mucho problema en utilizarlas.
Mira este ejemplo de conversión de número hexadecimal a decimal:
decimal = 1000
# Se convierte el decimal en hexadecimal
hexadecimal = hex(decimal)
print(hexadecimal)
0x3e8
Espacio publicitario
Espacio publicitario
Espacio publicitario