Funciones y librerías de funciones

Autor: Pablo Cerrillo Ruiz.
Última modificación: 26 de junio de 2019.

Índice

0. ¿Qué es y cómo funciona Jupyter Notebooks?

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

1. Introducción.

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:

In [ ]:
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.

In [ ]:
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.

2. Definición de funciones.

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:

  • def: palabra reservada que indica el comienzo de la declaración de una función.
  • nombre_función: nombre que le proporcionamos a la función que vamos a crear. Generalmente le proporcionamos un nombre que caracterice la finalidad de la función.
  • (arg1, arg2, ..., argN): lista de parámetros que le pasamos como argumento a la función que vamos a crear. Los argumentos son opcionales y en caso de que la función no necesite argumentos, no se indicará entre los paréntesis nada.
  • bloque_código: conjunto de sentencias que se ejecutan dentro de la función.
  • return valor: sentencia opcional que permite devolver un valor o conjunto de valores. Return es una palabra reservada y en cuanto se ejecuté dicha sentencia, terminará la ejecución de la función.

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:

  1. Pensar en un nombre para la función. Se aconseja dar un nombre que refleje la finalidad de la función.
  2. Dar diferentes ejemplos de llamada a la función y lo que nos debería devolver.
  3. Escribir la cabecera de la función utilizando la sentencia def, escribiendo en un comentario los argumentos de entrada junto su tipo de dato y el tipo de dato de la salida de la función.
  4. Escribir una definición de lo que realiza nuestra función.
  5. Escribir el código que contendrá el cuerpo de la función.
  6. Realizar diferentes pruebas de nuestra función.

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:

  1. Conversor.
  2. Conversor_euros_libras.
  3. Conversor_de_euros_a_libras.
  4. Trasformar_euros_a_libras.

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.

In [ ]:
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.

In [ ]:
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.

In [ ]:
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.

In [ ]:
Conversor_de_euros_a_libras(1)
In [ ]:
Conversor_de_euros_a_libras(10)
In [ ]:
Conversor_de_euros_a_libras(100)

¡PRUEBA TÚ!

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.

In [ ]:
 

2.1 Valor por defecto de los argumentos.

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.

In [ ]:
''' 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.

In [1]:
''' 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

¡PRUEBA TÚ!

Vamos a practicar las llamadas a funciones. Para ello, completar el siguiente código.

In [ ]:
''' 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

2.2 Indicando el valor del argumento mediante su nombre.

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.

In [ ]:
''' 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.

In [ ]:
''' 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.

In [ ]:
''' 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) 

¡PRUEBA TÚ!

Vamos a practicar las llamadas a funciones indicando el nombre de los argumentos. Para ello, completar el siguiente código.

In [ ]:
''' 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

3. Librerías de funciones.

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:

3.1 El módulo Math.

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:

In [ ]:
import math

Vamos a comprobar el contenido del paquete math mediante la función dir:

In [ ]:
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.

In [ ]:
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.

In [ ]:
''' 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))

4. ¿Qué hemos aprendido?.

Una vez terminado el cuaderno, vamos a realizar un pequeño resumen acerca de lo visto hasta ahora:

  • La reutilización de código es necesaria si queremos tener como resultado final un código compacto, legible y robusto.
  • Python permite reutilizar código mediante la creación de funciones.
  • Para crear funciones utilizamos la sentencia def. Junto a dicha sentencia se proporciona el nombre de la función, opcionalmente un conjunto de varibles denominadas argumentos de la función, la sentencias que contendrán dicha función y una sentencia return en caso de devolver algún valor.
  • Podemos establecer valores por defecto a los argumentos de la función. Dichos valores serán tenidos en cuenta cuando no se proporcionan valores para dichas argumentos en la llamada a la función.
  • Podemos cambiar el orden de los parámetros en la llamada de la función. Si lo hacemos asi, hay que indicar el nombre del argumento en la llamada para que se asignen correctamente los valores.
  • Python proporciona librerías en su código con el fin de facilitar a los programadores el desarrollo de programas. Para importar algún paquete o módulo proporcionado por Python o creado por nosotros, utilizamos la sentencia import.
  • Math es uno de los módulos que contiene Python para realizar cálculos matemáticos. Para ver el contenido de un módulo o paquete utilizamos la sentencia dir y para obtener información más deteallada la sentencia help

5. Relación de ejercicios.

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. Nombre de la función.
  2. Número de argumentos de la función.
  3. Nombre de cada argumento y tipo de dato.
  4. Valor por defecto de los argumentos de la función.
  5. Valor devuelto y tipo de dato.
  6. ¿Sabrías decir cuál es la funcionalidad de esta función?.
In [ ]:
'''
1.
2.
3.
4.
5.
'''

EJERCICIO 2: ¿Sabrías decir cuál es la salida del siguiente código sin ejecutarlo?.

In [ ]:
'''

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?.

In [ ]:
'''
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?.

In [ ]:
'''
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?.

In [ ]:
'''
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?.

In [ ]:
'''

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 .

In [ ]:
 

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.

In [ ]:
 

This website does not host notebooks, it only renders notebooks available on other websites.

Delivered by Fastly, Rendered by OVHcloud

nbviewer GitHub repository.

nbviewer version: 90c61cc

nbconvert version: 5.6.1

Rendered (Sat, 19 Jun 2021 14:30:14 UTC)