Saltar la navegación

4.2. "Hola Python"

Rétor explica:En esta sección vamos a tratar algunos ejemplos para practicar con Python.

De este modo descubriremos algunas funciones, palabras reservadas y formas de iniciar los programas, antes de realizar la aplicación final.

¡A practicar!

1. Programamos nuestro cálculo de medias.

En el programa trabajado en la sección anterior realizaste un pseudocódigo de su proceso.

Recupéralo y vamos a completar su programación usando lo que ya conocemos de Python. Además, le haremos una serie de mejoras. Atrévete con cada paso.

1.1. Escribe el código en Python

Con lo aprendido en las últimas secciones, realiza el código Python del programa indicado. No te olvides pedir por teclado los 3 valores que necesitas y almacenarlos en sus respectivas variables. Después, pruébalo y comprueba que funciona.

¿Necesitas ayuda para pedir al usuario las variables?

Recuerda que para tomar una variable del teclado necesitamos la función input()

Si además queremos, muy recomendado, que muestre por pantalla un mensaje al usuario que le indique lo que tiene que hacer (y no se quede la pantalla esperando en blanco eternamente), debes poner entre los paréntesis un mensaje delimitado por comillas:

input("Esta frase se muestra por pantalla. Explica en ella qué hay que hacer ahora")

Para asignar lo que se introduce por teclado a la variable x (por ejemplo), se usa x=input("Introduce el valor esperado")

1.2. Personalizando nuestro cálculo: trabajamos con nuevas variables

Diagrama de flujo con la mediaQueremos darle a nuestro programa una mayor flexibilidad: que cada usuario pueda configurar el peso (porcentaje) de la calificación de cada trimestre en la nota final. Para ello, vamos a reflexionar:

  • ¿Cómo se te ocurre que podría el usuario configurar los pesos de las calificaciones de cada trimestre?
  • ¿Qué elementos tendrías qeu añadir para lograr esa configuración?
  • Modifica el diagrama de flujo que aparece a la izquierda para añadir esta funcionalidad.

¿Quieres algunas ideas?

Necesitarás para ello nuevas variables. También tendrás que inicializarlas: pídele sus valores al usuario, pero recuerda especificar que sólo introduzcan el número, ya que si introducen el símbolo, por ejemplo 15%, el valor se convertirá en una cadena de caracteres al mezclar números y símbolos.

1.3. Crea el código de la nueva funcionalidad

Realiza el código Python de la funcionalidad añadida y depura los errores que resulten en el IDLE para que funcione correctamente.

2. Usando las librerías en Python

librería Python

Cuando se programa, a veces hace falta recurrir a funciones que ya están implementadas. Esto nos facilita poder crear un programa sin tener que repetir el código o implementarlo todo nuevamente.

Para esto se utilizan las librerías o bibliotecas, que son un conjunto de funciones que realizan ciertas operaciones habituales sobre los datos. Por ejemplo: si necesitamos saber la raíz cuadrada de un número utilizaremos la librería llamada math y, dentro de ella, utilizaremos la función sqrt(x), que devuelve la raíz cuadrada de x.

Tienes todas las librerías de Python en este enlace: librerías de Python. Veamos cómo usarlas:

Añadiendo una librería a nuestro programa

Para añadir la que necesites a tu programa debes usar el comando import. Por ejemplo:

import math

Después ya puedes usar cualquiera de sus funciones poniendo siempre el nombre de la librería delante seguido de un punto y el nombre de la función que quieres utilizar.

Ejemplo de uso 1

Cálculo de la raíz cuadrada de un número:

import math

x=9

print(math.sqrt(x))

Ejemplo de uso 2

Mostrar la fecha actual. Para ello usamos la librería datetime. Esta librería contiene ciertas definiciones, llamadas clases, que hay que importar por separado según la que queramos usar. La función que nos da la fecha actual nos la da la función today() que está en la clase date. Por eso se importa así:

from datetime import date

print(date.today())

¡Pruébalo en tu IDLE a ver qué obtienes! La programación en Python se trata de hacer pruebas, buscar y "cacharrear".

Es un conjunto de implementaciones funcionales, codificadas en un lenguaje de programación, que ofrece una interfaz bien definida para la funcionalidad que se invoca.

3. Probamos librerías: ¡Tira el dado!

Vamos a utilizar las librerías que acabamos de conocer y realizaremos un programa de azar: simular las tiradas de un dado.

Los ejercicios te van  a proponer mejoras escalonadas. Hazlos a tu ritmo, pasoa paso y ¡seguro que te superas cuando consigas realizar el último paso!

3.1. Dado con texto en el IDLE

Tirar un dado supone el uso de la aleatoriedad. Pero ¿cómo se lleva esta aleatoriedad al cálculo? Python dispone para ello de una librería llamada random.

  1. Consulta dicha librería en el enlace proporcionado arriba y busca qué función definida en ella nos permite elegir un valor al azar de entre los de una secuencia.
  2. ¿Cómo se crea la variable que almacena el conjunto de valores del dado? ¿Necesitas una variable o varias?
  3. Crea el código Python que saca un valor al azar entre 1 y 6 (dado).

¿Te ayudamos con la librería y la variable?

  1. Busca en la página de la librería qué realiza la función choice().
  2. Para definir tu variable dado:

Python tiene varios tipos de datos para crear secuenciasde valores. Dentro de las secuencias están los tipos de cadenas de caracteres, que ya conoces. Otros tipos muy importante de secuencias son las listas y las tuplas:

Listas Se inicializa escribiendo los valores entre corchetes, separando sus elementos con comas cada uno. Los elementos se acceden por el lugar que ocupan empezando a numerar por el 0. Son heterogéneas y mutables (elementos diferentes y que pueden cambiar).

Ejemplo:

factura=['leche','azúcar',1.2,1.5]

Tuplas Se inicializa escribiendo los valores entre paréntesis, separando sus elementos con comas cada uno. Los elementos se acceden por el lugar que ocupan empezando a numerar por el 0. Es una lista inmutable. No se pueden modificar sus elementos tras crearla.

Ejemplo:

edades=('Mario',3,'Pepa',5)

Puedes encontrar más información aquí: tipos secuencia.

3.2. Nuestro dado tiene su ventana

Vamos a mejorar nuestra aplicación del dado: le daremos su propia ventana a la aplicación. En dicha ventana vamos a mostrar el número que sale tras ejecutar el programa y hacer la tirada. Vamos a ir realizando cada paso:dado en ventana

  1. La librería para crear y usar ventanas en nuestros programas es tkinter. Puedes consultar sus funciones en el enlace anterior, que te lleva a ella concretamente: tkinter. Impórtala en tu programa.
  2. Crear una ventana: debes crear la variable que contendrá el área de la ventana. Para ello utiliza la función de la librería que crea este tipo de variable: tkinter.Tk() y asígnala a la variable que le dará nombre a nuestra ventana.
  3. Con las funciones geometry y title dale unas dimensiones y un título a la ventana. (A title solo hay que pasarle una cadena de caracteres, entre comillas, claro).
  4. Inicializa el dado y ejecuta la instrucción necesaria para elegir un valor al azar, como en el programa anterior.
  5. Ahora vamos a escribir el resultado en la ventana: crearemos un elemento de tipo "etiqueta" que mostrará el resultado. Para crear esta etiqueta dentro de nuestra ventana ya creada, consulta la librería tkinter y busca la información deseada: librería tkinter.
  6. Para mostrar cualquier elemento creado en una ventana, hay que llamar a la función pack(). Por ejemplo, si la variable que contiene nuestra etiqueta se llama resultado, la instrucción debe ser: resultado.pack()
  7. Finalmente, hay que ejecutar la instrucción .mainloop() (precedida de la variable que le da nombre a nuestra ventana) al final del programa para mostrar la ventana inicial. Por ejemplo, si nuestra ventana se creó con ventana=tkinter.Tk(), ahora deberemos llamar a ventana.mainloop()
  8. ¡Ejecuta tu programa! y depura los posibles errores que te puedan resultar en el código.

¿Cómo vas?

¿Te has equivocado en algo al hacer la actividad?

Cuando queremos aprender algo, lo normal es equivocarse al principio. Fallar forma parte de aprender. No te agobies por todos los nuevos conceptos, librerías, nombres de las funciones que ofrece cada librería...son muchos comandos los posibles y la práctica da el conocimiento para su uso.

Además de los enlaces oficiales de Python para trabajar con las librerías y sus funciones, en Internet hay miles de páginas que resuelven dudas sobre las distintas posibilidades. Es cuestión de ir probando y familiarizándose con el nuevo lenguaje. Hay que interpretar los errores como parte del proceso de aprendizaje de la programación.

Para aprender de tus errores sigue estos consejos:

  1. Me doy cuenta de en qué parte he fallado.
  2. Busco la forma de mejorar ese error.
  3. Lo intento de nuevo.
  4. Entiendo que el error es importante para aprender.

No lo olvides: cuando te equivocas una vez, aprendes para el siguiente intento.

¡Y por supuesto siempre estarán tus profesores para ayudarte! Utiliza tu comunicación con ellos para aprender.

3.3. ¡Ahora tenemos un dado real!

Dado moviéndoseVamos a dar el último paso de nuestro dado: le vamos a añadir las imágenes para obtener un resultado visual.

Las imágenes que vamos a utilizar en el programa las debes descargar de este enlace: imágenes del dado.

No te preocupes si no consigues realizar todos los apartados de este último paso, ¡incidiremos sobre todo lo utilizado aqúí en nuestro próximos programas y proyectos!

¡Vamos al programa!:

  1. Además de las librerías ya usadas: random y tkinter, en este nuevo reto vamos a necesitar la librería PIL, que habrá que instalar. Esta librería se usa para utilizar y manipular archivos de imagen en Python. En este enlace tienes su documentación oficial, que necesitarás consultar: librería de trabajo con imágenes PIL o Pillow. Sigue estos pasos para instalarla, según tu SO:

    Linux

    Mira este vídeo que te explica cómo instalar la librería PIL en Linux:



    Windows

    Y aquí tienes la explicación de cómo instalar PIL si tu SO es Windows:


     

  2. Importa los dos módulos que utilizaremos de PIL: Image e ImageTk (utiliza el mismo método de declaración que vimos anteriormente en el ejemplo de uso 2 del apartado sobre las librerías.

  3. Crea la ventana para mostrar la tirada, como hiciste en El ejercicio anterior.

  4. Crea la variable que será el dado. Realizarás la misma operación en en los pasos anteriores, pero en vez de iniciarla con números, debe ser una secuencia de imágenes que crearás pasándole los nombres de los archivos - con su extensión - como cadena de caracteres. De nuevo puedes elegir crearla como lista o como tupla.

  5. Ahora vas a crear la variable que contendrá a la imagen resultante de la tirada. La crearás como una imagen de fotografía usando la función ImageTk.PhotoImage(), perteneciente a ImageTk. Puedes ver en la documentación que esta función debe recibir entre los paréntesis una imagen. Para eso usarás el módulo Image. ¿Qué función, desde de Image, se usa para abrir una imagen?¿Qué debe recibir esa función entre los paréntesis? Piensa cómo seleccionarás al azar lo que se envía a esta función.

  6. Para mostrar en nuestra ventana el resultado, debemos crear de nuevo una etiqueta con Label, igual que hicimos en el ejercicio anterior. La diferencia es que esa etiqueta ahora no recibe un segundo parámetro de tipo text, sino uno de tipo image: nuestra variable anterior con la imagen resultante de la selección al azar.

  7. Ya sólo tienes que mostrar en la ventana la etiqueta, igual que hiciste en el ejercicio 2.2.

  8. No te olvides de ejecutar la instrucción para mostrar la ventana, que se utiliza siempre al final del programa. (Ver ejercicio anterior).

¿Una ayuda con la variable para la imagen resultado?

Observa y analiza la siguiente instrucción del código. Asegúrate de que comprendes cada parámetro en ella:

ImagenDado = ImageTk.PhotoImage(Image.open(random.choice(dado))

3.4. Cuestión de formato

En el paso anterior hemos creado ya nuestro dado digital con visualización incluida. Ha ahora una prueba: en la instrucción en la que muestras la etiqueta en la ventana de la aplicación, añade como parámetro entre los paréntesis expand=True, de manera que quedará:

nombre_variable_etiqueta.pack(expand=True)

Prueba a ejecutar y responde: ¿Qué cambio has observado?¿Para qué crees que sirve este parámetro?

4. Tratamiento de errores en Python

Vamos a ver ahora tres de los errores más comunes en Python, en cada uno de los ejercicios a continuación. Los nombres de estos errores son ZeroDivisionError, NameError, TypeError.

Prueba lo siguiente: en tu IDLE ejecuta las instrucciones print(3/0), print(s), print (3+"Hola") :

  1. ¿Qué errores te salen?
  2. ¿Sabes a qué se debe cada uno? Identifícalos con los tipos que te hemos nombrado antes.

Fíjate en que Python te indica el tipo de error. En una buena programación, la posibilidad de error del programador o del usuario (introduciendo valores que no se corresponden con lo esperado) debe tenerse en cuenta. Para ello utilizamos el bloque try/except y se usa así:

print ("Introduce los valores a dividir.")

a= input("Ingresa el primer numero: \n")

b= input("Ingresa el segundo numero: \n")

try:

   print ("El resultado es: ",a/b) #Debe haber una indentación en el uso de try y de except

except:

   print("Error al introducir los datos")# Indentamos también

Ejecútalo e intenta ahora:

  1. Entrar como segunda variable un 0.
  2. Entrar como segunda variable la cadena "Hola".

Verás que aparece el mensaje que has configurado para que aparezca. Aunque esto no nos ayuda mucho a la hora de identificar cuál ha sido exactamente el error si no sabemos qué datos introdujo el usuario...

Vamos a perfeccionar este código con los ejemplos a continuación.

¿Sabías que...?

Para introducir en el código un comentario de programador, que explique por ejemplo qué es lo que se va a calcular a contuación, podemos preceder la línea del símbolo #

Esto hará que la ejecución del programa ignore completamente el texto a continuación de ese símbolo. Si queires ignorar un texto de varias líneas, deberás usar una triple comilla doble (""") al comienzo y al final del texto que deseas que sea ignorado en la ejecución.

Esto se llama comentarios en el código. ¡Úsalo en tus programas y te resultará de mucha ayuda para saber por qué pusiste cada grupo de instrucciones!

5. Solucionando la división por cero

  1. Ejecuta el programa anterior introduciendo un 0 como segunda variable. ¿Qué mensaje te aparece?
  2. ¿Ese mensaje es representativo del error?¿Podemos saber qué dato ha introducido el usuario gracias al mensaje de error?
  3. ¿Qué otros valores podrían introducirse y obtendríamos el mismo mensaje?
  4. Efectivamente, necesitamos acotar cuál ha sido el error cuando el usuario ha introducido sus valores para a y para b. Para solucionarlo necesitas saber que un programa puede tener varios except, y podremos crear uno exclusivamente para el error de la división por cero, sin más que saber el nombre del error en Python: ZeroDivisionError. Las líneas a incluir serán:

    except ZeroDivisionError:
       print ("Error al intentar dividir por cero, intenta otro calculo!")

  5. Intenta incluir estas dos líneas permitiendo que a continuación siga existiendo el antiguo except que teníamos antes con el mensaje de error genérico.
  6. Prueba a ejecutar introduciendo varios valores para las variabls, entre los que se encuentre el 0 en la segunda variable. ¿Podemos ahora distinguir cuándo el usuario ha intentado dividir por 0?

6. Detectando errores del programador

Vamos a tratar ahora la segunda excepción habitual: NameError. Ejecuta el siguiente programa:

print ("Introduce los valores a dividir.")

a= input("Ingresa el primer numero: \n")

b= input("Ingresa el segundo numero: \n")

try:

   print ("El resultado es: ",a/c) #Debe haber una indentación en el uso de try y de except

except ZeroDivisionError:

   print ("Error al intentar dividir por cero")

  1. ¿Qué error obtienes ahora?
  2. ¿De qué tipo es?¿Por qué aparece?
  3. ¿Cómo se te ocurre que podemos dar información por pantalla para saber qué ha ocurrido, diferenciando el tipo de error concreto?

7. ¡Detectamos que no es un número!

Finalmente, vamos a tratar el tipo de error: TypeError. Toma como entrada el programa que creaste en el apartado anterior:

print ("Introduce los valores a dividir.")

a= input("Ingresa el primer numero: \n")

b= input("Ingresa el segundo numero: \n")

try:

  print ("El resultado es: ",a/b) #Debe haber una indentación en el uso de try y de except

  print ("El resultado es la división de los números: ", a, " y ", c)

except ZeroDivisionError:

   print ("Error al intentar dividir por cero")

except NameError:

   print ("Se intenta usar una variable que no existe")

  1. Ejecútalo introduciendo una palabra en lugar de un número. ¿Qué nuevo error obtienes ahora?
  2. Crea una excepción para ese tipo de error concreto.
  3. Escribe al final una excepcón genérica para cualquier otro tipo de error que se pueda producir y que no es ninguno de los tres anteriores.

8. Reviso lo que aprendo

Reflexiona un momento sobre todo lo que has aprendido hasta llegar aquí y completa el PASO 3 (Reviso lo aprendido) de tu Diario de aprendizaje.
Recuerda:
1.   Pregunta a tu profesora o profesor si lo vas a rellenar en papel o en el ordenador.
2.   Si lo rellenas en el ordenador, no te olvides de guardarlo en una carpeta que más tarde puedas localizar. 
¡Ánimo, que lo harás genial!

9. Resumiendo lo aplicado

Crea en tu blog una entrada en la que expongas el resultado de lo que has aprendido sobre Python en estos últimos trabajos de programación:

  • De lo trabajado sobre este lenguaje de programación, ¿qué conocías ya y sabías resolver?
  • ¿Has programado la nueva funcionalidad del cálculo de medias completa?
  • ¿Conocías las librerías en programación? Explica si completaste los pasos en la programación del dado y qué concepto de los trabajados en los distintos pasos con las librerías te ha resultado más difícil de comprender o si hay alguno que no hayas comprendido del todo.
  • ¿Te ha parecido útil el manejo de excepciones en Python? Piensa en qué otras aplicaciones puede tener un buen uso.