Existen muchos errores asociados a los diferentes tipos de variables y sobretodo a cómo los utilizamos, principalmente cuando queremos hacer operaciones con variables de diferente tipo.
Recordemos que en programación existen diferentes tipos de variables, según lo que queramos almacenar: números, letras, textos, valores booleanos, etc.
En Python las variables no son de un tipo determinado por defecto. Es decir, una variable llamada edad puede contener un número entero, texto, decimal, etc. en cualquier momento. Por tanto, nosotros somos los que tenemos que pensar qué tipos de datos contienen.
Veamos un ejemplo:
edad = input()
if edad > 18:
print("Mayor de edad")
En este caso vamos a tener un error del siguiente tipo:
Traceback (most recent call last):
File "main.py", line 2, in
if edad > 18:
TypeError: '>' not supported between instances of 'str' and 'int'
Vemos que en la línea 2, donde hay la comparación para saber si edad es mayor que 18, tenemos un error porque la operación «>» no tiene sentido entre un texto (str) y un número (int). Es como pretender coparar si «pepe» > 40. No tiene sentido, puesto que esta operación solo se puede hacer entre dos números.
Cualquier cosa que entre a través de un input() entra como texto, aunque escribamos números. Por ello, si nosotros escribimos 20, eso se guarda como «20» (las comillas indican que es un texto o string (str), y no un número. Es decir, los caracteres (o letras) 2 y 0.
La solución pasa consiste pues en transformar este texto en un número. Esto lo podemos hacer del siguiente modo:
Ahora, lo que entremos por input se va a intentar convertir en un número sin decimales (int), y luego guardarse dentro de la variable edad. Digo intentar, porque esto también puede dar problemas. Imaginemos que escribimos algo que no es un número entero, por ejemplo: 18.5. Pues tendremos el siguiente error
Traceback (most recent call last):
File "main.py", line 1, in <module>
edad = int(input())
ValueError: invalid literal for int() with base 10: '18.5'
Este error nos dice que hemos intentado pasarle a la función int() algo que no es un número entero (sin decimales). Como no sabe como convertir este decimal en un entero, se para el programa y da un error. Sucedería lo mismo si en lugar de escribir un número decimal ponemos texto, como por ejemplo «patata». En este caso es más obvio que una palabra no se puede transformar en número, obviamente.
ValueError: invalid literal for int() with base 10: 'patata'
¿Cómo convertimos un texto que contiene un número decimal entonces? La función int no nos sirve, porque no admite decimales un int. Para ello podemos utilizar el tipo float, que sí admite decimales.
edad = float(input())
if edad > 18:
print("Mayor de edad")
Ahora sí, poniendo «18» o «18.5» en el input, funciona. «18» se transforma en el float 18.0, mientras que «18.5» en 18.5, así que todos contentos.
Problemas con operaciones
Las operaciones también dan otro tipo de problemas. Pongamos como ejemplo la operación +. Esta operación puede significar varias cosas:
- Concatenar o unir textos: «bob»+»esponja» dara como resultado «bobesponja»
- Sumar números: 20 + 23 dará 43. Pero ojo: «20» + «23» dará 2023 (porque son letras)
Si esta operación la hacemos con variables del mismo tipo, todo perfecto. Pero, ¿que pasa si mesclamos varios? Veamos el ejemplo:
edad = input()
print(edad + 4)
Recordemos que lo que entra por input siempre será texto, por lo que edad contendrá, por ejemplo, «20». Cuando hacemos en la siguiente línea edad + 4, realmente estamos haciendo «20»+4. Un texto y un número. El ordenador piensa, ¿que hago, sumo como números, o concateno como caracteres? Como no lo sabe, para y muestra un error
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(edad + 4)
TypeError: can only concatenate str (not "int") to str
Como el primer parámetro era un texto, intenta concatenar, pero al ser el segundo un número, pues no puede. Solo se puede con dos textos. ¿Qué sucede si cambiamos el orden de la operación y ponemos primero el número, es decir:
edad = input()
print(4+edad)
Ahora el primer operando es un número, y el ordenador entiende que el + ahora significa sumar números. Al encontrar que el segundo operando es un texto, decide que no se pueden sumar números y letras y da un error al no sabe qué hacer:
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(4+edad)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Nos dice que no se puede usar el operando de sumar + entre un número y un texto, obviamente. Tanto en el caso anterior como en este, la solución pasaría por convertir edad entero, con la función int(), bien sea antes de almacenarla en la variable edad, o directamente dentro del print, antes de la suma.
Como vemos, Python deja en nuestras manos comprobar que las variables que vamos usando son del tipo necesario para poder efectuar las diferentes operaciones, por lo que tenemos que pensar nosotros qué contiene cada variable en cada momento: un número entero, un decimal, un booleano, etc.