03 - Variables
Versión en video (10:19 min):
Fund.Prog con Python 2020
03 - Variables
Nuestros primeros programas han tenido datos prefijados. Es el momento de que empecemos a trabajar con información cambiante, información tipicamente que introduzca al usuario o que sea el resultado de cálculos anteriores. Para eso tenemos que tener nuestro primer contacto con lo que llamaremos las "variables".
Cómo van a ser datos introducidos por el usuario, tendremos que leer lo que introduzca el usuario y eso es algo que no es cómodo en todos los entornos online. Por eso voy a volver a hacer la búsqueda que hicimos la primera sesión. Voy a decir "quiero buscar un compilador de Python online". Y voy a abrir varias de las cosas que me propone en distintas pestañas.
Yo voy a empezar por la de "repl.it", que ya te he comentado que es una de las que a mí me parece más razonable. Y luego probaremos alguna de las otras.
Como primera idea: Una variable será un sitio en el que guardaremos algo que introduzca al usuario o algún cálculo, el resultado de un cálculo.
A ese sitio habrá que darle un nombre. Por ejemplo, yo podría decir "voy a usar una variable para guardar el nombre que introduzca el usuario", y, para que eso sea más o menos legible en el resto del programa, a esa variable la voy a llamar "nombre".
Para hacer eso, pondría "nombre = " ... y le podría dar un valor.
Ese valor, en un ejemplo bastante irreal podría ser "el nombre va a ser igual a dos":
nombre = 2
Pero en este caso, lo que voy que hacer es pedir el nombre al usuario y saludarlo por su nombre. Para eso, para leer datos del usuario, usaremos "input". Si yo pongo input, paréntesis, paréntesis: "input()", se parará el programa para que el usuario introduzca algo y ese algo se va a guardar en esta variable, en la variable "nombre", de modo que yo podría decir pues... hola Vamos a hacerlo primero en dos pasos: "hola" y luego escribir su nombre.
nombre = input()
print("Hola, ")
print(nombre)
Vamos a analizar lo que hace este programa: lee lo que teclea el usuario y lo guarda en un hueco de memoria, en una variable, que hemos llamado "nombre" y luego escribe "hola" Seguido su nombre.
Esto es muy mejorable. Ahora veremos por qué, de momento vamos a empezar por probarlo... lanzo el programa... y parecerá que no pasa nada, porque el programa se va a quedar esperando hasta que yo introduzca algo. Yo pongo... "Nacho" Y entonces me dice "hola Nacho", en dos lineas separadas.
Primera mejora: se ha parado y yo no sabía que esperaba nada de mí, con lo cual es muy habitual que, antes de un "input", al usuario le avise de que estoy esperando algo de él. Hay dos formas de hacerlo; Una primera forma sería que antes de ese "input" ya hubiera aparecido un texto en pantalla, por ejemplo, print... Dime tu nombre.
print("Dime tu nombre:")
nombre = input()
print("Hola, ")
print(nombre)
Vamos a comprobarlo. Si ahora vuelvo a lanzar, ahora sí que aparecerá un mensaje "Dime tu nombre", con lo cual será un poco más intuitivo.
Vuelvo a poner "Nacho" y ahora por lo menos ya sea que venía eso, pero en realidad, si yo no he escrito cosas antes, basta con este texto, que quiero que sea parte del input, ponerlo en orden "input":
nombre = input("Dime tu nombre:")
print("Hola, ", nombre)
Esta va a ser la apariencia más habitual, a "input" y le puede indicar dentro del paréntesis un detalle adicional, y ese tradicional es el texto que queremos que aparezca en esa petición. Vuelvo a lanzar. Y verás que ahora aparecerá el Dime tu nombre y justo a continuación es dende se queda el cursor parado para que yo escriba
Todavía es mejorable: todavía aparecen dos líneas, con lo cual podemos decir... bueno, pues quiero escribir varias cosas y esas varias cosas, en principio, puedo simplemente separarlas por comas.
nombre = input("Dime tu nombre:")
print("Hola, ", nombre)
Ya veremos distintas formas de formatear el texto, de darle una apariencia un poco más a nuestro gusto, pero esta primera forma en principio funcionará.
Pongo como nombre Nacho, y me dice Hola, coma, espacio, seguido de mi nombre.
Ese es un primer contacto con la orden input. ¿Sirve tal cual para nuestros programas? todavía no, porque los primeros programas que hemos hecho habían trabajado con números ,en vez de con textos.
Más adelante veremos cómo manejar textos.
Python es muy versátil manejando textos, pero es algo más complicado que los números, como hemos hecho hasta ahora.
¿Qué hago si el dato que espero que introduzca el usuario va a ser un número? Pues en vez de simplemente usar input. Diremos eso va a ser "input convertido a entero".
Diremos... n1 va a ser, convertido a entero, el input de "Dime un número":
n1 = int(input("Dime un número: "))
Y repetimos esa misma línea para decirle que n2 va a ser el input de otro número, pero insisto, el matiz importante está aquí, ese "input" está dentro de un "int" y de unos parentesis. Con eso le digo: Pides un dato al usuario, pero ese dato lo tomas como un número entero.
n2 = int(input("Dime otro número: "))
Ahora que es un número que yo podría decir, dime que "su suma es", seguido del valor de n1 + n2. Vamos a probarlo...
n1 = int(input("Dime un número: "))
n2 = int(input("Dime otro número: "))
print("Su suma es ", n1+n2)
"Dime un número"... dos... "dime otro número"... tres... y me dice que suma es 5
Dime un número: 2
Dime otro número: 3
Su suma es 5
¿Qué habría ocurrido si yo no hubiera puesto la palabra "int" y el paréntesis exterior? Que eso lo estaría tomando no como números, sino como textos, como secuencias de letras. ¿La operación "más" tiene sentido para textos? Resulta que sí, pero lo que va a hacer es unir los textos.
n1 = input("Dime un número: ")
n2 = input("Dime otro número: ")
print("Su suma es ", n1+n2)
Vamos a ver que no se comporta igual, lanzo el programa... vuelvo a poner dos y luego tres.
Dime un número: 2
Dime otro número: 3
Su suma es 23
Pero esta vez me escribe que su suma es... dos tres, porque como los está tratando como textos, porque no está forzando el "esto tómalo como entero", no he puesto la palabra "int", está poniendo un texto a continuación de otro texto, primero el texto n1 y luego el texto n2.
Insisto, cuando trabajemos con números, por ahora, con números enteros, que son los que conocemos, pondremos "int" y entre paréntesis, "input" con su mensaje de aviso, el que queramos.
Esta va a ser la forma habitual de trabajar con datos introducidos por el usuario, numéricos, sin decimales, en Python.
¿Qué ocurre con los demás entornos online? Que no todos son tan intuitivos, porque no todos nos van a permitir escribir los textos en el panel. Vamos a ver algún caso...
Copio este programa, me lo llevo, por ejemplo, a onlineGDB y pego... Igual que antes, voy a hacerlo más grande y verás que los colores por defecto no son los mismos. Si pulso el botón Run... "Dime tu nombre" "Dime un Número"... el dos... "dime un número"... tres. Habrá que subir esto un poco para los resultados, pero sí ha funcionado.
La otra alternativa es en vez de usar la consola interactiva, que es lo que es Estãndar en "repl.it" y usar texto, y lo que haríamos es que estaríamos obligados a poner aquí cosas como el nombre es Nacho, el primer dato es 2, el segundo , otros tres.,,
Esto es lo que pasa con algún otro entorno online, que el programa realmente no será interactivo, habrá que teclear en una casilla los valores que queremos.
Entonces, al lanzar el programa realmente nos separa para decirnos nada, sino que va escribiendo textos. Y al final mostrando resultados.
Por ejemplo, vamos a "paiza", paiza.io... Pego aquí el programa y digo que lo quiero ejecutar. Y verás que nos dice que hay problemas con ese "input". ¿Por qué? Porque la entrada habría que haberla escrito aquí abajo. Si aquí abajo preparó todas las entradas, así sí que podré probar el programa.
Igual ocurrirá con onlineGDB, Y eso pasará con más de uno...
Este es codingGround, lo hacemos también más grande para que se vea... Aceptamos el aviso de privacidad. Nuevamente, si ejecutamos el programa en codingGround.
Veremos que nos dice, para empezar, que hay cosas raras por aquí que no le gustan: dice "en la línea 4 me has puesto cosas que son carácteres en otros idiomas"... Voy a quitar los acentos por ahora para que no sea eso lo que le vuelva loco, vuelvo a ejecutar y aquí está, dice: "Error al leer de entrada" ¿Por qué? Porque en codingGround ocurre lo mismo. Hay una pestaña "stdin" en la que yo debería escribir ese "Nacho", ese 2 y ese 3. En este caso no, en este caso está fallando, incluso usando su pestaña de "stdin"...
Por eso, insisto, a mí el que más me gusta es "repl.it", porque sí que es interactivo. En la siguiente entrega empezaremos a ver cómo comprobar condiciones usando Python.
Ejercicio 3.1. Pregunta al usuario su nombre y su apellido y escribe "Hola, Sr." seguido de su apellido y luego de su nombre (por ejemplo, "Hola, Sr. Cabanes, Nacho").
Ejercicio 3.2. Pide dos números al usuario y muestra su producto.
Ejercicio 3.3. Pide al usuario tres números y escribe el resultado de (a+b)*c y a*c+b*c.