En nuestra última lección del curso de introducción a Python aprendimos a introducir y obtener información de nuestro programa por medio de la consola, gracias a las funciones nativas print() e input().
También aprendimos qué son las strings y cómo realizar algunas operaciones básicas con ellas. Entre otras, concatenarlas.
La concatenación nos permite unir varias cadenas de texto en una sola. Se trata de una operación básica y muy útil. Y vamos a aprovecharla para descubrir una de nuestras limitaciones y cómo superarla.
Los tipos de datos en Python
Para enseñar esta lección he preparado un replit, aunque mi recomendación es que abras el tuyo propio y vayas probando con las líneas de código que iré compartiendo. Aquí encontrarás el Replit del que hablo, por si quieres ir consultándolo:
¿Qué son los tipos de datos?
Como verás a lo largo de esta lección, existen diferentes tipos de datos que podemos utilizar en nuestras aplicaciones. De momento solo conoces las strings, que son cadenas de caracteres.
Ya sabes que para concatenarlas utilizas el símbolo de la suma. Así que te propongo que pruebes estas líneas de código en tu replit:
welcome_message_initial_fragment = 'Bienvenid@ a la lección '
lesson = 2
welcome_message_end_fragment = ' del curso de programación en python'
print(welcome_message_initial_fragment + lesson + welcome_message_end_fragment)
¡No te asustes del error!
¿Qué hacen estas líneas?
En las líneas que te propongo, estamos:
- Declarando una variable welcome_message_initial_fragment. Su valor es ‘Bienvenid@ a la lección ‘.
- Declarando una variable lesson. Su valor es 2 (¡Atención a la ausencia de comillas!).
- Declarando la variable welcome_message_end_fragment. Su valor es ‘ del curso de programación en python’.
- Imprimiendo la concatenación de las tres strings anteriores.
Por tanto, el comportamiento esperado es que se imprima en la consola el mensaje “'Bienvenid@ a la lección 2 del curso de programación en python”. Pero si intentas ejecutar el programa verás que el resultado no es el esperado:
¿Qué está pasando?
Tal vez te tiente pensar que el problema con nuestro código es que no utilizamos las comillas a la hora de asignar el valor 2 a la variable lesson. Como sabes, a la hora de declarar una string, necesitamos utilizar comillas. Simples o dobles, eso da igual, pero las mismas al inicio y al final, como hemos hecho con las otras variables. Pero esto no es lo que está pasando.
Como vemos, la consola nos está devolviendo un “TypeError”. Además, nos explica que “solo puede concatenar str (no int) a str”. Y, como vimos en la lección anterior, la única forma de depurar (debug) nuestro código es leyendo los mensajes de error. Así que vamos a desgranar este mensaje.
TypeError en Python
Lo primero que nos dice el mensaje de error es que estamos ante un TypeError. Es decir, un error de tipo.
De momento no sabrás qué significa esto, salvo que tengas nociones de programación, Pero al final de esta lección sabrás exactamente cómo resolver este o cualquier error de tipado. Sigamos, porque tal vez la descripción del error nos dé más información.
A continuación, el mensaje de error nos indica que solo puede concatenar una str a otra str, pero no un int. Aquí te doy un par de pistas:
- str significa string. Es decir, el error nos dice que solo se puede concatenar una cadena de texto con otra cadena de texto.
- int significa integer. Se trata de un nuevo tipo de dato: los números enteros.
En resumen, lo que está pasando es que Python nos permite concatenar strings entre sí, pero no sabe cómo hacerlo cuando uno de los datos que le proporcionamos es un número entero en vez de una cadena de texto.
¿Qué son los tipos de datos?
Explicar los tipos de datos en programación exige más tiempo del que quiero invertir en esta lección, así que le dedicaré algunos recursos adicionales. De momento basta con que te quedes con el concepto, pero puedes investigar más acerca de las implicaciones de cada tipo de dato en la memoria, la conversión entre ellos, etc.
En nuestra anterior lección conocimos nuestro primer tipo de dato: las strings. Y gracias al mensaje de error anterior hemos conocido nuestro segundo tipo de dato: los integers.
Si habláramos de lenguaje natural, lo más probable es que entendiéramos que el operador ‘+’ se utiliza para sumar. Es decir, esperamos que 1 + 1 sea 2. Y esto es razonable, porque podemos sumar números enteros. Pero, ¿podemos sumar cadenas de texto?
Lógicamente, si estamos trabajando con strings podemos concatenarlas, pero no sumarlas. De modo que las operaciones que podemos hacer con 1 no son las mismas que las que podemos hacer con “1”. Y a continuación veremos una prueba con código.
Sin entrar en profundidad en el concepto de tipos de datos, fundamental en programación, puedes quedarte con esto:
- Cada tipo de dato es susceptible de unas u otras operaciones.
- Esto hace que el intérprete pueda realizar o no la operación que le solicitamos dependiendo del tipo de dato que le estamos proporcionando.
- A lo largo de este curso, aunque no expliquemos en detalle cómo funciona cada tipo de dato bajo el capó, conocerás todos los tipos de datos que se utilizan en Python.
Repaso: strings en python
Como ya sabes, las strings son cadenas de texto. Las declaramos utilizando comillas, una en su apertura y otra en su cierre. Y hay una regla: podemos utilizar comillas dobles o simples, pero siempre las mismas al inicio y final.
También sabes que:
- Puedes concatenar strings con un símbolo +.
- Y puedes contar el número de caracteres dentro de una string con la función len()
Otra de las cosas que puedes hacer con las cadenas de texto es acceder al caracter que hay en una posición determinada. Al hacerlo, recuerda algo muy importante: en informática se empieza a contar desde cero.
Dicho de otro modo, la primera letra de una string ocupa la posición 0, la segunda letra la posición 1 y así sucesivamente. Ahora lo veremos con un ejemplo.
Para acceder al caracter que hay en una posición determinada de la string debemos introducir la string y, a continuación, indicarle la posición deseada entre corchetes.
Veamos el ejemplo:
example_string = 'Hello, World!'
print(example_string[0]) # "H"
print(example_string[1]) # "e"
Poco a poco iremos viendo más funciones disponibles en las strings.
Introducción: números enteros. int o integer en Python
Veamos este código:
print("1" + "1")
¿Qué resultado esperamos?
Puedes pensar que 2. Pero recuerda que, aunque 1 + 1 = 2, aquí no estás sumando 1 + 1. Estás sumando “1” + “1”. Y aquí las comillas son clave, porque le estás diciendo al intérprete que 1 es una string y no un número.
Por tanto, el operador + no funciona como un sumatorio, sino como un concatenador. Con lo que el resultado obtenido es “11”. Es decir, estás concatenando “1” y “1”.
Si lo que quieres es sumar 1 + 1 vas a necesitar trabajar con números enteros (int o integer).
¿Cómo declarar números enteros en Python?
Declarar números enteros en Python es muy sencillo. Basta con que no utilices las comillas:
number = 1
string = "1"
Ahora, number es un número entero, y por tanto el resultado de 1 + 1 no será “11” sino 2. Y es que Python, como cualquier otro lenguaje de programación, te permite realizar operaciones matemáticas:
print(1 + 1) # 2
Recuerda que un número entero también puede ser negativo:
negative_integer = -123
Además, Python nos permite separar los números para mejorar su legibilidad. Del mismo modo que hacemos con los puntos en los millares (1.111) o la coma en la notación inglesa (1,111), Python nos permite utilizar una barra baja:
splitted_integer = 123_123
Esta barra baja, como ocurre con los comentarios, será obviada por el intérprete.
Introducción: números decimales en Python. float
Ya sabemos que podemos utilizar números enteros para realizar operaciones, pero, ¿podemos utilizar también números decimales?
Por supuesto. Para ello utilizamos otro tipo de dato, conocido como float (por el “floating point”, que es el punto que separa la parte entera de la decimal). La declaración de floats funciona igual que la declaración de integers:
positive_float = 1.23
negative_float = -12.3
splitted_float = 123_123.123
Introducción: booleanos en Python. Verdadero o falso
Otro tipo de dato muy importante en programación son los booleanos. Un booleano es un dato que puede tener solo uno de dos valores: verdadero o falso.
En la próxima lección aprenderemos en torno a las estructuras de control, lo que te permitirá entender la importancia de este tipo de datos. Pero, de momento, quedémonos solo con su declaración:
print(True)
print(False)
Fíjate en que “True” y “False” deben escribirse en mayúscula y sin comillas (las comillas harían que el intérprete las considerara strings.
¿Cómo saber el tipo de dato con el que estamos trabajando? La función type() en Python
Como has visto,
- Existen diferentes tipos de datos en Python. Hasta ahora conocemos las strings, los integers y los floats.
- Cada tipo de dato tiene una funcionalidad propia. Por tanto, es importante que prestemos atención al tipo de dato con el que estamos trabajando para asegurarnos de que podemos recurrir a la funcionalidad deseada.
Hasta ahora hemos declarado la mayoría de nuestras variables a mano. La única variable que hemos recibido de “fuera” es la que el usuario ha pasado a la función input(). Pero el tipo de input() siempre es string.
De modo que, hasta el momento, siempre hemos sabido el tipo de dato con el que estábamos trabajando.
Sin embargo, cuando escribas una aplicación real, vas a encontrar escenarios en que no conozcas de antemano el tipo de datos que vas a recibir. Por ejemplo, si estos llegan de un payload en el frontend, o de una base de datos.
En estos casos, tu código puede encontrarse en tres escenarios:
- Que, casualmente, el tipo de dato recibido sea el esperado y todo funcione bien. No va a ser lo más frecuente.
- Que el tipo de dato recibido sea diferente al esperado y tu código no funcione como debe. Por ejemplo, que estés desarrollando una calculadora y en lugar de integers te lleguen strings. Lo que implicaría que “1” + “1” equivale a “11”, no a 2. Ahora haremos un ejemplo.
- Que el tipo de dato recibido sea diferente al esperado y, por tanto, tu código arroje un error. En este caso se romperá la aplicación.
Veamos un ejemplo de cada uno de estos escenarios:
Cómo afrontar estas situaciones: type() y cast
Python nos ofrece un conjunto de herramientas para gestionar problemas como los que hemos comentado.
- En primer lugar, tenemos la función type(). Esta función nos permite conocer el tipo de dato que contiene la variable. En combinación con las estructuras de control, que estudiaremos en el siguiente tema, la función type() nos evitará sorpresas a la hora de gestionar datos cuyo tipo no conozcamos de antemano.
- Por otro lado, disponemos de una técnica conocida como cast. El casteo implica cambiar de un tipo de dato a otro. Para ello tenemos diferentes funciones, que analizaremos a continuación.
Conocer el tipo de datos en Python: type()
Python, de forma nativa, incorpora una función type() que devolverá el tipo de dato proporcionado como argumento:
print(type(True))
print(type(1))
print(type("1"))
print(type(splitted_integer))
print(type(welcome_message_initial_fragment + str(lesson) +
welcome_message_end_fragment))
Ten en cuenta que el tipo de type() es type. Esto implica que, si quieres imprimirlo en la consola, tendrás que convertirlo en string. Y a esta operación la conocemos como cast (casteo o castear).
Castear datos en Python: str(), int(), float()
Python nos ofrece una serie de funciones que podemos utilizar para castear datos. Es decir, para cambiar su tipo por otro que nos interese para ejecutar nuestro código. Ya hemos visto ejemplos de uso de estas funciones.
Así, cuando en el ejemplo inicial de esta lección queríamos concatenar welcome_message_initial_fragment + lesson + welcome_message_end_fragment obteníamos un error de tipo. El intérprete nos decía que no podía concatenar strings e integers. Y para resolverlo solo debemos convertir el integer en una string.
Antes de entrar a cada una de las funciones, recuerda que el casteo no siempre es posible. Por ejemplo, convertir un número en una string siempre va a ser posible:
- 1 => “1”
Pero a la inversa solo será posible si la string es numérica:
- “1” => 1
- “uno” no tienen representación numérica.
Cambiar el tipo de datos a string en Python: la función str()
Para convertir un número en una string en Python podemos utilizar la función str():
first_example = str(10) + str(10)
print(first_example)
print("Type of first_example is: " + str(type(first_example)))
Cambiar el tipo de datos a integer en Python: la función int()
Para convertir un número o string en un número entero en Python podemos utilizar la función int():
third_example = int(10.0) + int("10")
print(third_example)
print("Type of third_example is: " + str(type(third_example)))
Ten en cuenta que, si estás intentando convertir un float en un integer, Python “soltará” la parte decimal del número. Es decir, tanto 10.2 como 10.9 se convertirán en 10.
Hago esta puntualización porque, en muchos casos, cuando queremos sacar un número entero de un decimal, lo que realmente buscamos es un redondeo, no quitar la parte decimal. Para ello disponemos de la función round(), que explicaremos más adelante.
Cambiar el tipo de datos a float en Python: la función float()
Para convertir un número o string en un float, Python incorpora la función float():
second_example = float(10) + float("10")
print(second_example)
print("Type of second_example is: " + str(type(second_example)))
Aquí también conviene plantear un matiz. Y es que 2.200 es lo mismo que 2.2.
Aunque matemáticamente esto sea de perogrullo, escribiendo aplicaciones te encontrarás con situaciones en que quieres mostrar en pantalla 2.200 en lugar de 2.2. Pero el casteo te va a devolver siempre el resultado más corto (2.2).
En estos casos tendremos que echar mano de la función format(). En cuanto nos pongamos con las prácticas de esta lección verás un ejemplo. Pero antes, vamos a ver otras dos funcionalidades clave de Python.
Operaciones matemáticas
Como hemos visto, Python da soporte para operaciones matemáticas. De hecho, es un lenguaje de programación muy utilizado para análisis de datos, por lo que este es uno de sus puntos fuertes. Pero, de momento, vamos a ver los operadores más sencillos:
Operador | Función | Ejemplo | Resultado |
+ | Suma | 1 + 1 | 2 |
- | Diferencia | 1 - 2 | -1 |
* | Multiplicación | 2 * 6 | 12 |
/ | División | 6 / 3 | 3.0 |
% | Resto (módulus) | 5 % 2 | 1 |
** | Potencia | 2 ** 3 | 8 |
Operadores de asignación
Un operador de asignación nos permite asignar un valor a una variable. Hasta ahora conocemos uno: =
Sin embargo, a la hora de escribir un programa encontrarás muchas situaciones en que debes realizar una operación matemática y asignar el resultado a la variable inicial. Para estas situaciones Python, como otros lenguajes de programación, ofrece operadores de asignación adicionales que funcionan como atajos:
base = 2
base += 10 # 12 -> equivale a base = base + 10
base -= 2 # 10 -> equivale a base = base - 2
base *= 3 # 30 -> equivale a base = base * 3
base /= 10 # 3.0 -> equivale a base = base / 10
Operador | Función | Ejemplo | Resultado siendo base = 10 |
+= | Asigna a la variable el resultado de sumarle el número indicado | base += 10 | 20 |
-= | Asigna a la variable el resultado de restarle el número indicado | base -= 2 | 18 |
*= | Asigna a la variable el resultado de multiplicarla por el número indicado | base *= 3 | 30 |
/= | Asigna a la variable el resultado de dividirla entre el número indicado | base /= 10 | 1.0 |
Práctica: calculadora de calorías
Ahora que sabes cómo transformar tipos de datos, los tipos de datos más básicos (str, int, float y bool) y cómo hacer operaciones matemáticas, podemos hacer una práctica.
En este caso vamos a hacer una calculadora de calorías. Su objetivo es calcular cuántas calorías tiene una comida. Para ello debemos tener en cuenta que:
- Cada gramo de hidratos de carbono o de proteínas en un alimento aporta 4 kcal.
- Cada gramo de grasa en un alimento aporta 8 kcal.
Por tanto, necesitamos una interfaz que:
- Nos pregunte cuántos gramos de hidratos de carbono hay en nuestra comida.
- Nos pregunte cuántos gramos de proteínas hay en nuestra comida.
- Nos pregunte cuántos gramos de lípidos hay en nuestra comida.
- Calcule el total de kcal en nuestra comida, a partir de las equivalencias que hemos dado antes.
Hazte un Replit e intenta escribir tu aplicación antes de consultar mi propuesta de código. Poco a poco iremos mejorando esta herramienta:
Formatted strings
Hasta ahora, cuando hemos impreso mensajes por pantalla hemos utilizado la concatenación de strings mediante el operador +. Además, en algunos casos hemos tenido que castear los datos, convirtiéndolos en strings antes de poder concatenarlos. Por ejemplo, la última práctica termina con esta línea:
print("Tu ración equivale a " + str(total_kcal) + " kcal")
Este procedimiento puede ser un poco farragoso. Así que Python, como otros lenguajes de programación, incluye la posibilidad de formatear una string de forma más cómoda, mediante las f-strings o formatted strings.
Para utilizar una formatted string basta con escribir una f antes de la string y pasarle los datos entre llaves. De modo que el ejemplo anterior equivale a:
print(f"Tu ración equivale a {total_kcal} kcal")
Práctica: mejoremos nuestra calculadora de calorías
Vamos a mejorar nuestra calculadora de calorías para probar las formatted strings. También introduciremos el método format, que nos permite dar formato a nuestras cadenas de texto (especialmente útil al trabajar con fechas o decimales).
Aunque no entraremos en demasiado detalle, quédate con un nuevo concepto: método. Llamamos método a una función que se ejecuta sobre otro elemento. Por ejemplo, format() solo puede ejecutarse sobre las strings. Pronto aprenderás a crear tus propios métodos, lo que te permitirá entender la diferencia real entre un método y una función. Pero de momento basta con que sepas que el método es una función que ejecutas sobre otro elemento.
Por ejemplo, print() se ejecuta autónomamente. Pero format() debe ejecutarse necesariamente sobre una string, lo que hace que nos refiramo a él como método. Mira el ejemplo para entender a qué me refiero después de intentar mejorar tu calculadora de calorías conforme a las siguientes instrucciones.
Instrucciones: entendiendo el problema
Vamos a mejorar nuestra calculadora para que, además de indicarnos la cantidad de calorías ingeridas, nos indique si la receta es o no equilibrada. En este sentido, se entiende que la ingesta diaria de macronutrientes de debe repartir del siguiente modo:
Nutriente | Porcentaje sobre el aporte total |
Hidratos de carbono | 50 - 55 % |
Proteínas | 10 - 15 % |
Grasas | 30 - 35 % |
Analizando el problema
Lo primero que debemos hacer a la hora de escribir un programa es entender el problema a resolver. Una vez lo entendamos, podemos desarrollar una estrategia para resolverlo.
Respecto a la estrategia a adoptar, no suele existir una estrategia correcta. Generalmente, hay diferentes alternativas, cada una de ellas con sus ventajas o beneficios y desventajas o costes. De modo que cada persona orientará su solución de un modo, y esto no hace necesariamente que una solución sea más válida que otra.
Ello al margen de que se sigan malas prácticas o técnicas ineficientes. Por supuesto, siempre deberíamos seguir buenas prácticas y acogernos a principios como la eficiencia, la legibilidad o la mantenibilidad del código.
Pero, sobre diseño de código y principios de programación, hablaré en otros espacios.
El objetivo de nuestra aplicación
La segunda versión de nuestra aplicación debe ser capaz de indicarnos qué porcentaje representa cada macronutriente sobre el total ingerido.
Factores a tener en cuenta
Partiremos de la tabla incluida más arriba para entender si la distribución de macronutrientes es o no adecuada.
Cómo abordar el problema
- Para saber cuántas calorías aporta nuestra ración reutilizaremos nuestra aplicación de cálculo de calorías.
- A partir de aquí, solo tendremos que calcular qué porcentaje representa cada macronutriente sobre el total. De momento nos limitaremos a informar al usuario del porcentaje recomendado y el ingerido, dejándole que saque sus propias conclusiones. Pero más adelante mejoraremos este feedback.
El código
Hemos partido de una necesidad y hemos analizado qué factores intervienen y cómo podemos resolverlos. Ábrete un Replit e intenta resolver el problema paso a paso. Escribir un programa consiste precisamente en esto: dividir el problema en pequeños pasos e ir resolviéndolos uno a uno. Tras intentarlo, puedes echarle un vistazo a mi propuesta:
Recapitulando: tipos de datos en Python
Hoy hemos tratado muchas cuestiones importantes, centrándonos en los principales tipos de datos en Python. En particular, hemos visto:
- Qué son los tipos de datos en Python. Recuerda:
- Cada tipo de datos permite un conjunto de operaciones diferentes.
- Si necesitas conocer el tipo de datos que alberga una variable, puedes utilizar la función type()
- Los principales tipos de datos en Python. A las strings que ya conocíamos hemos añadido:
- Números enteros (integer o int).
- Números decimales (float).
- Booleanos (bool).
- Cómo convertir un tipo de datos en otro:
- Función str() para convertir datos en strings.
- Función int() para convertir datos en enteros.
- Función float() para convertir datos en decimales.
- Cómo hacer operaciones matemáticas básicas, incluso utilizando operadores de asignación.
- Cómo inyectar información en strings de forma más dinámica, gracias a las formatted strings.
Aplicaciones
Para aprender estos conceptos, hemos desarrollado una primera versión de calculadora de calorías en Python. Posteriormente, hemos iterado sobre este proyecto para añadirle una nueva funcionalidad en nuestra calculadora de calorías 2.0.
¿Y ahora qué?
Asienta los conceptos que hemos visto, practica y consulta documentación, vídeos de YouTube y otros recursos. En cuanto domines todos los conceptos, pasa a tu tercer día de Python. Vamos a estudiar las estructuras de control, que te permitirán darle vida a tus programas.
Reúne fuerzas, porque este es un concepto fundamental dentro de la programación y va a requerir concentración… ¡y nuevas prácticas!
Recuerda que una de mis principales intenciones es que el enfoque de este curso sea eminentemente práctico. Así que ve guardándote en los marcadores de tu smartphone las aplicaciones que vayamos construyendo y tenlas siempre a mano.