Funciones en Python

Para entender funciones en Python (Paquetes dentro de módulos de Python), debemos pensar en actos reales para poder hacer una analogía en el ambiente de programación.

Imagínese cuando se levanta.

Lo que ocurre primero, es que uno se siente vivo, se abren los ojos (no siempre), se hace pereza un rato, se levanta de la cama y luego se inicia el día (cada persona tiene sus maneras diferentes de lograrlo).

Esta serie de pasos consecutivos conforman lo que se llama una función.

En el común, una función es en realidad una acción o una serie de acciones que generan un resultado a través de un proceso intermedio.

Para poder distinguir funciones, unas de otras, se le dan dotado de nombres diferentes.

Por ejemplo, la función antes descrita podría nombrarse como Levantarse:

Está función se compone de los siguientes pasos:

  1. Sentirse vivo.

  2. Abrir los ojos.

  3. Hacer pereza.

  4. Levantarse.

En el lenguaje de programación, ésto se podría escribir como

Levantarse(x)

donde x representa el individuo que hace la acción y los paréntesis significan que se habla de una función, y por lo tanto, no se confunde con una variable.

Ejemplo:

Función CortarManzana(x):

Esta función se puede ilustrar de la siguiente manera:

Manzanita

Como podemos ver, una función es realmente es una “Caja Negra”:

La podemos usar, sin importar qué hay dentro de ella.

Ya hemos visto algunas funciones básicas de Python (Built-in):

  • print()

  • len()

  • list()

En este link, se encuentra un manual de todas las funciones básicas de Python.

Veamos algunas de ellas:

Ejercicio

Viendo la entrada y salida del código, infiera qué hace la función correspondiente:

# Your Code Here
x = -5
y = abs(x)
print("\nx =", x)
print("y = ", y,"\n")

# Your Code Here

d = dict({"Saludo": "Hola", "Despido": "Adiós", "Palabra": "Extraño"})
print("Dicionario: ",d,"\n")

# Suma
v = [1,2,3,4,5,6]
s = sum(v)
print("resultado:", s,"\n")

# Your Code Here

a1=max(v)
a2=min(v)

print("a1:",a1,", a2:",a2)
x = -5
y =  5 

Dicionario:  {'Saludo': 'Hola', 'Despido': 'Adiós', 'Palabra': 'Extraño'} 

resultado: 21 

a1: 6 , a2: 1

Parámetros y Variables en Funciones:

Las funciones pueden tener uno o más parámetros asociados.

Por ejemplo la función f(x,y,z)=w, recibe los argumentos x,y,z y produce el resultado w.

Ejemplo:

!pip install numpy matplotlib
Requirement already satisfied: numpy in /opt/anaconda3/lib/python3.8/site-packages (1.20.3)
Requirement already satisfied: matplotlib in /opt/anaconda3/lib/python3.8/site-packages (3.4.2)
Requirement already satisfied: python-dateutil>=2.7 in /opt/anaconda3/lib/python3.8/site-packages (from matplotlib) (2.8.2)
Requirement already satisfied: pillow>=6.2.0 in /opt/anaconda3/lib/python3.8/site-packages (from matplotlib) (8.3.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/anaconda3/lib/python3.8/site-packages (from matplotlib) (1.3.1)
Requirement already satisfied: pyparsing>=2.2.1 in /opt/anaconda3/lib/python3.8/site-packages (from matplotlib) (2.4.7)
Requirement already satisfied: cycler>=0.10 in /opt/anaconda3/lib/python3.8/site-packages (from matplotlib) (0.10.0)
Requirement already satisfied: six in /opt/anaconda3/lib/python3.8/site-packages (from cycler>=0.10->matplotlib) (1.16.0)
# Comente adecuadamente las siguientes líneas de código

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,2*np.pi,30)
y=np.sin(x)

print("x=\n",x,"\n")
print("y=\n",y,"\n")
plt.plot(x,y)
plt.show()
x=
 [0.         0.21666156 0.43332312 0.64998469 0.86664625 1.08330781
 1.29996937 1.51663094 1.7332925  1.94995406 2.16661562 2.38327719
 2.59993875 2.81660031 3.03326187 3.24992343 3.466585   3.68324656
 3.89990812 4.11656968 4.33323125 4.54989281 4.76655437 4.98321593
 5.1998775  5.41653906 5.63320062 5.84986218 6.06652374 6.28318531] 

y=
 [ 0.00000000e+00  2.14970440e-01  4.19889102e-01  6.05174215e-01
  7.62162055e-01  8.83512044e-01  9.63549993e-01  9.98533414e-01
  9.86826523e-01  9.28976720e-01  8.27688998e-01  6.87699459e-01
  5.15553857e-01  3.19301530e-01  1.08119018e-01 -1.08119018e-01
 -3.19301530e-01 -5.15553857e-01 -6.87699459e-01 -8.27688998e-01
 -9.28976720e-01 -9.86826523e-01 -9.98533414e-01 -9.63549993e-01
 -8.83512044e-01 -7.62162055e-01 -6.05174215e-01 -4.19889102e-01
 -2.14970440e-01 -2.44929360e-16] 
_images/py2_7_1.png

Ejercicio:

  1. Investigue las funciones y atributos internos de matplotlib para hacer una matriz 3x1 que contengan:

  • Una función matemática.

  • Una foto.

  • Una esfera con puntos aleatorios en su frontera.

  1. Investigue sobre 5 funciones de Python que acepten al menos 3 parámetros.

  2. Use la libreria pandas para hacer gráficos útiles sobre el Predio_206.csv.

Creación de Funciones

También es posible crear funciones para generar rutinas específicas.

Hay dos maneras de generar funciones en Python:

  1. def

  2. lambda

Ejemplo:

# Explicar las siguientes líneas de código
def mysum_prod(x,y):
    s=x+y
    p=x*y
    return s,p
suma, prod = mysum_prod(3,4)
print("El suma es:", suma)
print("El producto es:", prod)
El suma es: 7
El producto es: 12
#  Use la función correspodiente de forma inteligente
def mysum_prod(x,y):
    s=x+y
    p=x*y
    return [s,p]
# Explique qué diferencias hay entre éste método y el anterior

sumita = lambda arg1,arg2: arg1+arg2

a=6
b=65
s = sumita(a,b)
print("la suma es:", s)
la suma es: 71

¿Cuál es la diferencia y utilidad de la función lambda?

Pista:

# Explicar adecuadamente

def myfunc(n):
    return lambda a : a * n 


mydoubler = myfunc(2)
#print(mydoubler)
print(mydoubler(11))
22

Programación Funcional

Esta sección es una adaptación de geeksforgeeks.

Funciones puras

Las funciones puras tienen dos propiedades.

  • Siempre produce la misma salida para los mismos argumentos. Por ejemplo, 3 + 7 siempre será 10 pase lo que pase.

  • No cambia ni modifica la variable de entrada.

La segunda propiedad también se conoce como inmutabilidad. El único resultado de la función pura es el valor que devuelve. Son deterministas. Los programas realizados mediante programación funcional son fáciles de depurar porque las funciones puras no tienen efectos secundarios ni E / S ocultas. Las funciones puras también facilitan la escritura de aplicaciones paralelas / concurrentes. Cuando el código está escrito en este estilo, un compilador inteligente puede hacer muchas cosas: puede paralelizar las instrucciones, esperar a evaluar los resultados cuando los necesite y memorizar los resultados, ya que los resultados nunca cambian mientras la entrada no cambie.

Revise el siguiente ejemplo. Recibe una lista de número y regresa una nueva lista con los valores elevado al cuadrado.

# Ejemplo de una función pura

# Una función pura que no
# cambia la lista de entrada y
# devuelve la nueva lista

def pure_func(List):
    New_List = []
    for i in List:
        New_List.append(i**2)
    return New_List

# La función en acción
Original_List = [1, 2, 3, 4]
Modified_List = pure_func(Original_List)

print("Lista original:", Original_List)
print("Lista modifciada:", Modified_List)
Lista original: [1, 2, 3, 4]
Lista modifciada: [1, 4, 9, 16]

Recursión

En la programación funcional, no existe el concepto de bucle for o bucle while, sino que se utiliza la recursividad. La recursividad es un proceso en el que una función se llama a sí misma directa o indirectamente. En el programa recursivo, se proporciona la solución al caso base y la solución al problema mayor se expresa en términos de problemas menores. Puede surgir una pregunta ¿cuál es el caso base? El caso base puede considerarse como una condición que le dice al compilador o intérprete que salga de la función.

Ejemplo: consideremos un programa que encontrará la suma de todos los elementos de una lista sin usar ningún bucle for.

# Ejemplo de recursión

# Función recursiva para encontrar
# suma de una lista

def Sum(L, i, n, count):

    # Caso base
    if n <= i:
        return count

    count += L[i]

    # Proceso recursivo
    count = Sum(L, i + 1, n, count)

    return count

# Ejemplo de uso
L = [1, 2, 3, 4, 5]
count = 0
n = len(L)
print(Sum(L, 0, n, count))
15

Las funciones son de primera clase y pueden ser de orden superior

Objetos de primera clase

Los objetos de primera clase se manejan uniformemente en todo momento. Pueden almacenarse en estructuras de datos, pasarse como argumentos o usarse en estructuras de control. Se dice que un lenguaje de programación admite funciones de primera clase si trata las funciones como objetos de primera clase.

Propiedades de las funciones de primera clase:

  • Una función es una instancia del tipo de objeto.

  • Puede almacenar la función en una variable.

  • Puede pasar la función como parámetro a otra función.

  • Puede devolver la función desde una función.

  • Puede almacenarlos en estructuras de datos como tablas hash, listas,…

Ejemplo:

# Programa Python program para ilustrar
# funciones de orden mayor


def shout(text):
    return text.upper()

def whisper(text):
    return text.lower()

def greet(func):
    # almacena la función en una variable
    greeting = func("Hola, soy creada por una función pasada como argumento.")
    print(greeting)

greet(shout)
greet(whisper)
HOLA, SOY CREADA POR UNA FUNCIÓN PASADA COMO ARGUMENTO.
hola, soy creada por una función pasada como argumento.

Funciones integradas de orden superior

Para facilitar mucho el procesamiento de objetos iterables como listas e iteradores, Python ha implementado algunas funciones de orden superior de uso común. Estas funciones devuelven un iterador que ahorra espacio. Algunas de las funciones integradas de orden superior son:

  • map(): la función map() devuelve una lista de los resultados después de aplicar la función dada a cada elemento de un iterable dado (lista, tupla, etc.)

  • filter(): El método filter() filtra la secuencia dada con la ayuda de una función que prueba que cada elemento de la secuencia sea verdadero o no.

Veamos los siguientes dos ejemplos que ilustran map() y filter().

# Ejemplo del uso de map()

# Retorna el doble de n
def addition(n):
    return n + n

# doblamos todos los valores de una lista usando map
numbers = (1, 2, 3, 4)
results = map(addition, numbers)

#  Print no imprime los resultados
# porque se recibe un iterable
print(results)

# Asi recuperamos del iterable los valores e imprimimos
for result in results:
    print(result, end = " ")
<map object at 0x7fe613035eb0>
2 4 6 8 
# Ejemplo de uso de filter()

# función que filtra las vocales en una lista
def fun(variable):

    letters = ['a', 'e', 'i', 'o', 'u']

    if (variable in letters):
        return True
    else:
        return False


# secuencia
sequence = ['g', 'e', 'e', 'j', 'k', 's', 'i', 'r']

# uso de la función filter
filtered = filter(fun, sequence)

print('Las letras filtradas son:')

for s in filtered:
    print(s)
Las letras filtradas son:
e
e
i

Autores

  1. Alvaro Mauricio Montenegro Díaz, ammontenegrod@unal.edu.co

  2. Daniel Mauricio Montenegro Reyes, dextronomo@gmail.com

Comentarios