Autor: Pablo Cerrillo Ruiz.
Última modificación: 26 de junio de 2019.
Jupyter Notebook es un entorno de trabajo interactivo que permite desarrollar código de manera dinámica. Ahora mismo nos encontramos en el cuaderno UD Estructuras de datos, cuya finalidad es enseñar al alumno las diferentes estructuras de datos en Python y la utilidad que éstas tienen en el mundo de la programación.
Recuerde que para ejecutar el contenido de una celda basta con pulsar el botón Run del panel de control. También puede pulsar al mismo tiempo las teclas Mayúsculas+Enter
La repetición de código es uno de los mayores problemas que se encuentran en el mundo de la programación. Uno de los problemas que surge cuando repetimos el mismo código en diferentes partes de nuestro programa es cuando tenemos que realizar una actualización de dicho código. En primer lugar, dicho código deberá ser cambiado en todo el programa; y segundo, que al aparecer en más de un sitio, es posible que el programador cometa el error de no actualizarlo en alguna parte del código. Por ejemplo, imagine que tenemos el siguiente código que calcula el máximo de tres números y a continuación, calculará el maximo de otros tres números diferentes:
a = 5
b = 2
c = 1
if a >= b:
if a >= c:
print(a)
else:
print(c)
else:
if b >= c:
print(b)
else:
print(c)
a = 4
b = 4
c = 8
if a >= b:
if a >= c:
print(a)
else:
print(c)
else:
if b >= c:
print(b)
else:
print(c)
Como podemos observar, si realizamos un cambio en el cálculo del máximo, deberiamos realizar dos cambios. Realizar eso en una aplicación de varios ficheros sería inviable. Python proporciona mecanismos para poder reutilizar varias veces nuestro código definiendolo una sola vez. Dicho mecanismo se basa en la creación de funciones. Crear funciones permite a programador reutilizar código y eliminar todo el código redundante de nuestra aplicación. Vamos a resolver ahora el problema anterior creando una función.
Vamos a resolver ahora el problema anterior creando una función.
def max(a,b,c):
if a >= b:
if a >= c:
print(a)
else:
print(c)
else:
if b >= c:
print(b)
else:
print(c)
max(5,2,1)
max(4,4,8)
Como podemos observar, mediante la creación de funciones podemos reutilizar nuestro código de forma sencilla. El uso de funciones hace que nuestro programa sea más compacto, debido a al ahorro de líneas que supone su uso; legible, facilita la lectura del código y robusto, minimizamos la probabilidad de fallos.
Una vez introducido el concepto de función, vamos a definir formalmente que es una función y como se define en Python una. Una función es un bloque de código al que le proporcionamos un nombre. Dicha función puede recibir de entrada cero o más parámetros denominados argumentos y opcionalmente puede devolver un valor si lo necesitase. En la imagen siguiente podemos ver la sintaxis en Python para crear funciones:
Donde:
Llegados a este punto, vamos a realizar paso a paso la creación de una función que nos convierta una cantidad de euros en libras para nuestro próximo viaje de estudios.
Para ello, vamos a seguir una serie de pasos:
Paso 1: Pensar en un nombre para la función.
A continuación se proponen diferentes nombres para nuestra función y escogeremos el que mejor refleje la finalidad de nuestra función:
Vamos a escoger la opción número 3: Conversor_de_euros_a_libras
Paso 2: Dar diferentes ejemplos de llamada a la función y lo que nos debería devolver.
Aunque la función no este definida, vamos a dar ejemplos de llamada a la función Conversor_de_euros_a_libras para ver como funcionaría.
>>> Conversor_de_euros_a_libras(1) 0.86 >>> Conversor_de_euros_a_libras(10) 8.6 >>> Conversor_de_euros_a_libras(100) 86
Como podemos observar, nuestra función va a necesitar como parámetro de entrada un valor númerico, el cuál representará la cantidad de euros, y devolverá un valor que representará el número de libras.
Paso 3: Escribir la cabecera de la función utilizando la sentencia def.
Una vez seleccionado el nombre de la función y conocido el número de argumentos de la función, nos disponemos de definirla. Para ello, escribiremos la cabecera mediante la sentencia def. Además, añadiremos un comentario acerca de los tipos de datos de entrada y los tipos de datos de salida. Al igual que hicimos con el nombre de la función, debemos escoger un nombre para los argumentos de manera que su nombre especifique lo que representa.
def Conversor_de_euros_a_libras(euros):
'''
euros(number) -> number Indicamos que euros es un número y la salida de la función es otro número.
>>> Conversor_de_euros_a_libras(1)
0.86
>>> Conversor_de_euros_a_libras(10)
8.6
>>> Conversor_de_euros_a_libras(100)
86
'''
Paso 4: Escribir una definición de lo que realiza nuestra función.
Realizamos un pequeño comentario sobre la funcionalidad de la función.
def Conversor_de_euros_a_libras(euros):
'''
euros(number) -> number Indicamos que euros es un número y la salida de la función es otro número.
Convierte una cantidad de euros en libras.
>>> Conversor_de_euros_a_libras(1)
0.86
>>> Conversor_de_euros_a_libras(10)
8.6
>>> Conversor_de_euros_a_libras(100)
86
'''
Paso 5: Escribir el código que contendrá el cuerpo de la función.
Dado que un euro son 0.86 libras, lo que hacemos es multiplicar nuestra cantidad de euros por 0.86 y lo devolvemos mediante la sentencia return.
def Conversor_de_euros_a_libras(euros):
'''
euros(number) -> number Indicamos que euros es un número y la salida de la función es otro número.
Convierte una cantidad de euros en libras.
>>> Conversor_de_euros_a_libras(1)
0.86
>>> Conversor_de_euros_a_libras(10)
8.6
>>> Conversor_de_euros_a_libras(100)
86
'''
libras = euros * 0.86
return libras
Paso 6: Realizar diferentes pruebas de nuestra función.
Comprobamos si obtenemos los mismos resultados que los obtenidos en el paso número 1.
Conversor_de_euros_a_libras(1)
Conversor_de_euros_a_libras(10)
Conversor_de_euros_a_libras(100)
Vamos a practicar la creación de funciones. Siguiendo los pasos vistos anteriormente, crear una función que permita convertir los grados centígrados en kelvin.
Es posible que tengamos la necesidad de definir valores por defecto de entrada a una función. Python permite definir para cada argumento un valor que tendrá por defecto en caso de no ser proporcionado por el usuario a la hora de llamar a la función.
Como podemos observar, la sintaxis es la misma. La única diferencia es que se indica junto al argumento el operador = junto al valor por defecto deseado. Cabe destacar que no todos los argumentos tienen porque tener valor por defecto.
Ejemplo: Creación de funciones con argumentos que tienen valor por defecto.
''' Función que calcula el área de un paralelogramo (base * altura) '''
def area_paralelogramo( base = 1, altura = 1):
print("El valor de la base es: ", base)
print("El valor de la altura es: ", altura)
print("El área del palalelogramo es: ", base * altura)
area_paralelogramo() # al llamarla sin argumento, se toman los valores por defecto indicados.
print("\n")
area_paralelogramo(5) # al llamarla con un argumento, base tomará el valor 5 y altura el valor por defecto 1.
print("\n")
area_paralelogramo(2,3) # al llamarla con dos argumentos, no se utilizarán los valores por defecto.
¡Cuidado! Los argumentos que tienen un valor por defecto deben colocarse detrás de los que no lo tienen. En caso contrario, Python devolverá un error de sintáxis.
''' Función que calcula el área de un paralelogramo '''
def area_paralelogramo(base = 1, altura):
print("El área del palalelogramo es: ",base*altura)
File "<ipython-input-1-b9b0fdb95f06>", line 3 def area_paralelogramo(base = 1, altura): ^ SyntaxError: non-default argument follows default argument
Vamos a practicar las llamadas a funciones. Para ello, completar el siguiente código.
''' Llamada a funciones con argumentos que tienen valor por defecto '''
# función que resuelve ecuaciones del tipo a*x + b = 0
def ecuacion_primer_grado(a = 1, b = 0):
print("El valor de a es: ",a)
print("El valor de b es: ",b)
print("El valor de x es: ",-b/a)
# llamar a la función ecuacion_primer_grado de tres diferentes formas
Hasta ahora, cada vez que llamábamos a una función con argumentos, el valor de cada uno de los argumentos se iban asignando por la posición de de éstos.. Veamos un ejemplo.
Ejemplo: Asignación de valores a los argumentos de la función por posición.
''' Función que permite saludar a un usuario '''
def saludar(saludo, nombre):
print(saludo + " " + nombre)
saludar("Hola","Pablo") # Hola se asigna a la variable saludo y Pablo a la variable nombre
Si observamos la llamada a la función anterior, vemos que la cadena de texto "Hola" se asigna a la variable saludo y "Pablo" a la variable nombre. Python permite además de realizar la asignación del valor por la posición, por el nombre de la varible. Esto permite que pasar los argumentos en el orden que deseemos.
Ejemplo: Asignación de valores a los argumentos de la función por nombre.
''' Función que permite saludar a un usuario '''
def saludar(saludo, nombre):
print(saludo + " " + nombre)
saludar(nombre = "Pablo", saludo = "Buenas") # Hola se asigna a la variable saludo y Pablo a la variable nombre
Ahora podemos llamar a funciones que tenian diferentes valores por defecto en una posición que es diferente a la primera, indicando el nombre de la variable.
''' Función que calcula el área de un paralelogramo '''
def area_paralelogramo( base = 1, altura = 1):
print("El valor de la base es: ", base)
print("El valor de la altura es: ", altura)
print("El área del palalelogramo es: ", base * altura)
area_paralelogramo(5)
print("\n")
area_paralelogramo(altura = 5)
Vamos a practicar las llamadas a funciones indicando el nombre de los argumentos. Para ello, completar el siguiente código.
''' llamada a funciones indicando el nombre del argumento '''
# Creación de una función llamada holaMundo, sin parámetros y cuyo contenido es la salida por pantalla de la cadena de texto '¡Hola Mundo!'
def realizar_pedido(tipo = 'margarita', bebida = 'fanta de limón', postre = 'helado'):
print('Su pedido es:')
print(' - Su pedido es: ', tipo)
print(' - Su pedido es: ', bebida)
print(' - Postre: ', postre)
# llamar a la función realizar_pedido de 3 formas diferentes, indicando el nombre de los argumentos en la llamada
Una librería es un conjunto de funciones organizadas. En Python dichas librerías se denominan módulos. Los módulos son archivos .py que contienen código escrito en Python y que son importados para su posterior uso en diferentes programas.
Los módulos se encuentran alojados en una carpeta. Dicha carpeta que contiene un conjunto de módulos se denomina paquete.
Podemos importar un módulo mediante la sentencia import. A continuación se muestra la sintaxis:
El módulo math es uno de los paquetes de la librería estándar que contiene constantes y métodos para calcular el valor de diversas funciones matemáticas. Para importar el módulo math utilizamos la siguiente sentencia:
import math
Vamos a comprobar el contenido del paquete math mediante la función dir:
dir(math)
La función dir devuelve las funciones dentro de un módulo o los módulos dentro de un paquete. Podemos obtener información de una función gracias a la funcion help.
help(math.sqrt)
A continuación se especifican las constantes y funciones más utilizados del módulo math.
Variable / Método | Descripción |
---|---|
pi | Devuelve el valor de la constante PI cuyo valor aproximado es 3.14159. |
e | Devuelve el valor de la constante E cuyo valor aproximado es 2.718281. |
sqrt(x) | Devuelve la raíz cuadrada de X. |
pow(x,y) | Devuelve X elevado a Y. El tipo de dato devuelto es float. |
exp(x) | Devuelve la constante E elevado a X. El tipo de dato devuelto es float. |
log10(x) | Devuelve el logaritmo en base 10 de x. |
log(x,b) | Devuelve el logaritmo en base b de x. |
Ejemplo: Uso del módulo math. Fíjese en que antes de utilizar cada elemento de la librería es necesario escribir math.
''' Uso del módulo math '''
print("\n El valor de la constante E es: ", math.e)
print("\n El valor de la constante PI es: ", math.pi)
print("\n La raíz cuadrada de 16 es : ", math.sqrt(16))
print("\n 2 elevado a 3 es: ", math.pow(2,3))
print("\n El logaritmo en base 10 de 100 es: ", math.log10(100))
Una vez terminado el cuaderno, vamos a realizar un pequeño resumen acerca de lo visto hasta ahora:
EJERCICIO 1:Para la siguiente función escrita en Python:
def es_primo(num = 1):
primo = True;
for x in range(2, num // 2):
if num % x == 0:
primo = False
return primo
Identificar los componentes de la función:
'''
1.
2.
3.
4.
5.
'''
EJERCICIO 2: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.
'''
def menor(a,b):
if a <= b:
return a
else:
return b
print(menor(5,4))
print(menor(6,6))
print(menor(menor(5,2),3)))
'''
EJERCICIO 3: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.
'''
def tabla(a = 2):
for x in range(1,11):
print(x, " por ", a , " = ", a*x)
tabla()
'''
EJERCICIO 4: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.
'''
def tabla(a = 2):
for x in range(1,11):
print(x, " por ", a , " = ", a*x)
tabla(5)
'''
EJERCICIO 5: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.
'''
def info_division_entera(dividendo,divisor):
print("Dividendo: ",dividendo)
print("Divisor: ",divisor)
print("Cociente: ",dividendo // dividendo)
print("Resto: ",dividendo % divisor)
info_division_entera(12, 10)
'''
EJERCICIO 6: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.
'''
def info_division_entera(dividendo,divisor):
print("Dividendo: ",dividendo)
print("Divisor: ",divisor)
print("Cociente: ",dividendo // dividendo)
print("Resto: ",dividendo % divisor)
info_division_entera(divisor = 6, dividendo = 12)
'''
EJERCICIO 7: Crear una función llamada es_par que reciba un parámetros de entrada (num) y muestre por pantalla el mensaje "Es par" en caso de ser par o "Es impar" en caso contrario .
EJERCICIO 8: Crear una función para obtener la solución de una ecuación de segundo grado del tipo ax^2 + bx + c = 0. Dicha función tomará como argumento los valores a, b y c.Los valores por defecto de cada argumento sera 1. Utiliza el módulo math para realizar las operaciones que estimes oportunas.