Funciones en Python
Contents
Funciones en Python#
Introducción#
En Python, una función es un grupo de declaraciones relacionadas que realizan una tarea específica.
Las funciones ayudan a dividir nuestro programa en partes más pequeñas y modulares. A medida que nuestro programa crece más y más, las funciones lo hacen más organizado y manejable. Además, evita la repetición y hace que el código sea reutilizable.
Analogía con la vida diaria#
Una analogía con la vida diaria puede ser la siguiente.
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 hacerlo).
Esta serie de pasos consecutivos conforman lo que se llama una función
.
En el común, una función es en general una secuencia de pasos o una serie de acciones que generan un resultado específico. De manera abstracta, esos pasos consecutivos se encapsulan en una función, lo cual entrega ventajas cuando se describe una situación compleja y por lo general de carácter repetitivo.
Para poder distinguir funciones, unas de otras, se les asignan nombres diferentes.
Por ejemplo, la función antes descrita podría nombrarse como Levantarse:
Está función se compone de los siguientes pasos:
Sentirse vivo.
Abrir los ojos.
Hacer pereza.
Levantarse.
Así, aunque cada persona puede desarrollar la actividad de levantarse, de manera general tal actividad se puede ver como una un función que alguien ejecuta en algún momento.
En el lenguaje de programación, esto 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.
Una función como caja negra#
En un lenguaje de programación, una función puede entenderse como una caja negra. Como el control remoto de su televisor.
Los ingenieros que desarrollan y producen el control remoto cierran el objeto una vez lo construyen y por lo general elaboran un manual para enseñar a los usuario a usar el control.
Ejemplo Función CortarManzana(x)
:#
Un ejemplo muy simple es el siguiente. Imagine una máquina que corta manzanas como se ilustra en la siguiente imagen.
Función cortar manzana. Créditos: tomada de función cortar manzana.

Como podemos ver, una función es realmente es una Caja Negra
: la podemos usar, sin importar qué hay dentro de ella.
Sin embargo, la máquina puede tener algunos controles (parámetros) que determinan la forma como la máquina funciona. Por ejemplo el número de cortes. Luego de parametrizada la maquina, podemos empezar a pasar manzanas por 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 entra y salida del código, infiera qué hace la función correspondiente:
# Valor absoluto
x = -5
y = abs(x)
print("\nx =", x)
print("y = ", y,"\n")
x = -5
y = 5
# Creación de un diccionario
d = dict({"Saludo": "Hola", "Despido": "Adiós", "Palabra": "Extraño"})
print("Diccionario: ",d,"\n")
Diccionario: {'Saludo': 'Hola', 'Despido': 'Adiós', 'Palabra': 'Extraño'}
# Suma de los elementos de una lista
v = [1,2,3,4,5,6]
s = sum(v)
print("resultado:", s,"\n")
resultado: 21
# Máximo y mínimo
a1 = max(v)
a2 = min(v)
print("a1: {}, a2: {}".format(a1, a2))
a1: 6, a2: 1
Parámetros y argumentos en las funciones#
Las funciones pueden tener uno o más parámetros asociados. Estos son contenedores que recibirán los datos (argumentos) para que la función pueda hacer su trabajo.
Consideremos por ejemplo la función matemática seno (sin
en inglés)
En el ejemplo, el parámetro de la función es ‘x’ que representa a cualquier valor que pueda ser utilizado para calcular la función.
Un argumento por ejemplo es \(\pi/2\). Entonces el resultado obtenido es 1, como aprendimos en la escuela secundaria.
Funciones predefinidas: ejemplo de como producir una gráfica de la función sin(x)
#
Para este ejemplo utilizaremos dos librerías de Python: Numpy y Matplotlib. Puede ir a los capítulos correspondientes para los detalles.
La librería Numpy se llamara con el alias np
y se usa un punto para llamar algún objeto de la librería. Similar con Matplotlib que llamaremos con el alias de plt
.
La función
np.linspace
genera valores entre dos extremos. En el ejemplo genera 30 puntos entre 0 y \(2\pi\).La función
np.sin
calcula la función seno para algún conjunto de argumentos. Observe que la función calcula la función para cada uno de los argumentos dispuestos en el objeto x.La función
np.plt
dibuja el gráfico de la función entre los valores 0 y \(2\pi\).
# Comente adecuadamente las siguientes líneas de código
import numpy as np # importa la librería Numpy
import matplotlib.pyplot as plt # importa la librería matplotlib.pyplot
# calcula la función sin en 30 puntos
x = np.linspace(0,2*np.pi,30)
y = np.sin(x)
# Imprime la tabla de valores.
# Usamos zip para pegar las columnas x, y
print('Estos son los valores para el gráfico de la función')
print("x y")
x_y = zip(np.round(x,2),np.round(y,2))
for values in x_y:
print(values)
print('')
# crea la imagen
print('Imagen')
plt.title('Gráfico de la función $y=\sin(x)$')
plt.xlabel('x')
plt.ylabel('$\sin (x)$')
plt.plot(x,y)
plt.show()
Estos son los valores para el gráfico de la función
x y
(0.0, 0.0)
(0.22, 0.21)
(0.43, 0.42)
(0.65, 0.61)
(0.87, 0.76)
(1.08, 0.88)
(1.3, 0.96)
(1.52, 1.0)
(1.73, 0.99)
(1.95, 0.93)
(2.17, 0.83)
(2.38, 0.69)
(2.6, 0.52)
(2.82, 0.32)
(3.03, 0.11)
(3.25, -0.11)
(3.47, -0.32)
(3.68, -0.52)
(3.9, -0.69)
(4.12, -0.83)
(4.33, -0.93)
(4.55, -0.99)
(4.77, -1.0)
(4.98, -0.96)
(5.2, -0.88)
(5.42, -0.76)
(5.63, -0.61)
(5.85, -0.42)
(6.07, -0.21)
(6.28, -0.0)
Imagen

Ejercicio#
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.
Investigue sobre 5 funciones de Python que acepten al menos 3 parámetros.
Creación de Funciones en Python#
Hay dos maneras básicas para definir funciones en Python:
def
lambda
De manera muy general, una función se define iniciando con la cláusula def(). Dentro de los paréntesis se colocan los parámetros que usará la función.
Nuestro primer ejemplo es una función que suma dos número y regresa el resultado.
# función suma
def suma(x, y):
s = x + y
return s
La cláusula return
se usa para retornar el resultado de la función.
Calcular la función es bastante simple. Por ejemplo la suma entre 3 y 5 se puede calcular como
s = suma(3, 5)
print(s)
8
Una función que regresa dos valores#
De manera formal, una función retorna un único valor. Desde el punto de vista práctico, un objeto como (3,4) es una tupla
en Python que estudiamos en otro módulo. Una función puede regresar un tupla y cualquier otro objeto complicado. Observe el siguiente ejemplo.
# Explicar las siguientes líneas de código
def mysum_prod(x,y):
s = x + y
p = x * y
return s,p
result = mysum_prod(3,4)
print(result)
(7, 12)
También podemos separar la salida, si es lo que se requiere, de la siguiente manera:
suma, prod = mysum_prod(3,4)
print("El suma es:", suma)
print("El producto es:", prod)
El suma es: 7
El producto es: 12
Anotando (typing) los parámetros de una función#
Recuerde que la asignación de variables en Python es dinámica. Esto facilita la programación, pero introduce algunos problemas.
En el caso de las funciones, es importante que el usuario (que siempre incluye al programador) sepa que tipos de parámetros espera una función. Para hacerlo, las versiones de Python desde 2.0 introdujeron el concepto anotación o tipificación de los parámetros de una función.
Se pretende indicar al usuario de la función qué tipo de datos se espera que entren a la función y los que salen. Esto es muy útil para mejorar la lectura del código.
Por supuesto, aún es posible usar tipos de datos diferentes a los que sugerimos. Esto es debido al principio pythonico de tener asignación dinámica.
Para ilustrar la anotación revise el siguiente ejemplo.
def mysum_prod(x: int, y: int) -> [int, int]:
s = x + y
p = y * x
return [s,p]
mysum_prod(2.2, 3)
[5.2, 6.6000000000000005]
Valor de los parámetros por defecto#
En ocasiones se espera definir valores por defecto para los parámetros de una función. Esta se hace simplemente escribiendo parametro=valor
. Veamos el ejemplo
# función suma con parámetros por defecto
def suma(x, y=1):
s = x + y
return s
print(suma(3))
4
El cuidado que hay que tener es que los parámetros por defecto siempre van después de los parámetros obligatorios. En el ejemplo la variable x es obligatoria y debe ser entregado a la función. Por otro lado la variable y esta definida por defecto.
Pasando un número arbitrario de argumentos con *arg
#
Para situaciones en las cuales se desconoce de antemano el número de argumentos que se esperan para ejecutar una función, puede nombrar los parámetros de manera genérica en la forma *arg
. Revise el siguiente ejemplo. El objetivo es sumar un número indeterminado de números. Por supuesto este es un ejemplo de juguete, pero sirve para ilustrar el concepto. Veamos.
# sumador
def adder(*num):
sum = 0
for n in num:
sum = sum + n
print("Sum:",sum)
adder(3,5)
adder(4,5,6,7)
adder(1,2,3,5,6)
Sum: 8
Sum: 22
Sum: 17
Pasando un número arbitrario de argumentos nombrados con **arg
#
En ejemplo anterior no se diferenciaron los parámetros con un nombre. Se dice que los argumentos son no nombrados non keyword arguments
. Si requiere pasar parámetros arbitrario pero con nombre cada uno, puede usar la notacion **arg
. Estos argumentos se llaman nombrados keyword arguments
. Veamos el ejemplo.
def intro(**data):
print("\nTipo de dato del argumento:",type(data))
for key, value in data.items():
print("{} is {}".format(key,value))
intro(Firstname="Sita", Lastname="Sharma", Age=22, Phone=1234567890)
intro(Firstname="John", Lastname="Wood", Email="johnwood@nomail.com", Country="Wakanda", Age=25, Phone=9876543210)
Tipo de dato del argumento: <class 'dict'>
Firstname is Sita
Lastname is Sharma
Age is 22
Phone is 1234567890
Tipo de dato del argumento: <class 'dict'>
Firstname is John
Lastname is Wood
Email is johnwood@nomail.com
Country is Wakanda
Age is 25
Phone is 9876543210
Funciones anónimas. Funciones lambda#
Hay situaciones, principalmente relacionadas con la programación funcional, en la cuales no se requiere dar un nombre a una función, sino más bien definir la forma como trabaja la función.
Observe el siguiente ejemplo.
# 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
En este ejemplo, la función anónima lambda recibe dos argumentos y regresa su suma. Le hemos dado un nombre: sumita. Pero realmente esto no es necesario. Sin embargo muestra como es posible asignar una función a un objeto, para ser utilizada como una función normal.
La lógica es la siguiente:
lambda arg1,arg2: arg1+arg2
define la función anónima.la función anónima es asignada al objeto sumita, con lo cual sumita será una función que hace lo mismo que la función anónima, pero ahora llamada como una función definida con
def
.
Un ejemplo de programación funcional#
Observe detenidamente el siguiente fragmento de código.
# Explicar adecuadamente
def myfunc(n):
return lambda a : a * n
mydoubler = myfunc(2)
#print(mydoubler)
print(mydoubler(11))
22
La lógica es la siguiente:
La función myfunc regresa otra función que tendrá un valor predefinido, llamado aquí n. Esa función se usa para definir otra función que recibirá una parámetro a para multiplicarlo por n.
Cuando hacemos la asignación
mydoubler = myfunc(2)
se ha definido una nueva función que se llamará mydobler. la cual recibirá un argumento y lo multiplicará por 2 (el valor de n)
Ejercicio#
Estudie detenidamente el ejemplo anterior y construya un ejemplo suyo.
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 modificada:", Modified_List)
Lista original: [1, 2, 3, 4]
Lista modificada: [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 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 0x7ff35f2baa90>
2 4 6 8
# Ejemplo de uso de filter()
# función que filtra las vocales en una lista
def vocal(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(vocal, sequence)
print('Las letras filtradas son:')
for s in filtered:
print(s)
Las letras filtradas son:
e
e
i