Funciones que regresan valores y cerraduras.
Todas las funciones regresan un valor al finalizar su ejecución al cual se le puede asignar un nombre si se desea conservarlo. Por defecto, el valor que regresan es None, el cual a diferencia de otros valores no es desplegado por el intérprete.
Ejemplo:
In [46]:
def funcion():
pass
In [47]:
resultado = funcion()
print(resultado)
In [48]:
resultado
La expresión return.
La expresión return se utiliza para regresar un objeto específico a su ámbito superior y acto seguido dar por terminada la ejecución de la función de forma similar a break. Pueden incluirse varias expresiones return en una función, pero sólo se ejecutará la primera que se encuentre. La sintaxis es la siguiente:
return <objeto>
Ejemplo:
In [49]:
def promedio(*muestras):
return (len(muestras), sum(muestras) / len(muestras))
In [50]:
media = promedio(1, 3, 5, 8, 11, 24, 90, 29)
In [51]:
print('El promedio de la muestra de %d elementos es %.3f.' %(media))
Cerraduras.
El valor que regresa una función se conoce como "cerradura" o "closure" y tiene características muy particulares ya que se encuentra justo entre el ámbito local de una función y su ámbito superior.
Funciones anidadas.
Python permite definir funciones dentro de otras funciones.
Ejemplo:
In [52]:
def lista_primos(limite=100):
'''Genera una lista de los números primos comprendidos entre el 2 y el valor de limite.'''
#La lista inicia con el número 2
lista = [2]
def esprimo(numero):
'''Valida si numero es divisible entre algún elemento de lista. De ocurrir,
regresa False. De lo contrario, regresa True.'''
for primo in lista:
if numero % primo == 0:
return False
return True
#Se realizará una iteración de cada número entero desde 3 hasta el valor de limite.
for numero in range(3, limite + 1):
#Si esprimo(numero) regresa True, añade el valor de numero a lista
if esprimo(numero):
lista.append(numero)
return lista
In [53]:
lista_primos(103)
Out[53]:
En el ejemplo anterior se definió a la función esprimo() dentro de la función listaprimos(). Como se puede observar, el nombre lista está en el espacio de nombres de listaprimos(), pero al estar en un entorno superior al ámbito de esprimo(), éste puede acceder a lista.
Recursividad.
Python permite hacer llamadas recursivas a una función. Es decir, que la función se invoque a si misma.
Cada vez que una función se invoca a si misma, Python crea un nuevo objeto de tipo function con las mismas características que la función original, pero con un ámbito totalmente nuevo y de nivel inferior a la función original.
Ejemplo:
In [54]:
def factorial(numero):
if numero == 1:
return 1
else:
fact = numero * factorial(numero - 1)
return fact
In [55]:
factorial(5)
Out[55]:
En este caso, la función factorial() se invoca recursivamente, pero cada vez que lo hace, el valor del argumento decrece en 1 de forma sucesiva hasta que el parámetro numero alcanza el valor de 1 y regresa dicho valor. Es entonces que la cerradura de la función de nivel inferior se multiplica por el parámetro numero de la función superior hasta llegar a la función de más alto nivel.
Ahora se incluirán algunas modificaciones al ejemplo anterior para ilustrar el proceso.
In [56]:
def factorial(numero):
print('En este ámbito, numero =', numero)
if numero == 1:
print('Llegó al final.\nRegresa 1!')
return 1
else:
fact = numero * factorial(numero - 1)
print('Regresa %d!' %numero)
return fact
In [57]:
factorial(5)
Out[57]:
Funciones de orden superior.
Las funciones de orden superior son funciones que aceptan funciones como argumentos y a su vez regresan funciones.
Ejemplo:
La función html() puede recibir una función y regresará una función que de por resultado el cuerpo básico de un documento en HTML5 que envuelva al resultado de la función usada como argumento. Por otro lado, la función parrafo() transforma un texto en un párrafo rodeado por las etiquetas HTML correspondientes.
In [58]:
def html(funcion):
'''Añade las etiquetas básicas de un documento HTML5 al elemento
resultante del argumento funcion.'''
etiquetas = "<html>\n <head>\n <title>Página</title>\n </head>\n <body>\n {}\n </body>\n</html>"
def empaqueta(texto):
'''Permite encerrar entre etiquetas de HTML5 al resultado de funcion(texto).'''
return etiquetas.format(funcion(texto))
return empaqueta
In [59]:
help(html)
In [60]:
def parrafo(texto):
'''Encierra entre las etiquetas de párrafo al elemento texto.'''
return '<p>' + str(texto) + '</p>'
In [61]:
print(parrafo('Hola, Mundo.'))
In [62]:
help(parrafo)
In [63]:
print(html(parrafo)('Hola, Mundo.'))
In [64]:
help(html(parrafo))
Decoradores.
Los decoradores son un recurso de Python que permite aplicar una función de orden superior a otra función con la siguiente sintaxis.
@<nombre de función de orden superior>
def <nombre>(<argumentos>):
...
...
Ejemplo:
Se utilizará el decorador de la función html() aplicado a la función parrafo().
In [65]:
def html(funcion):
'''Añade las etiquetas básicas de un documento HTML5 al elemento
resultante del argumento funcion.'''
etiquetas = "<html>\n <head>\n <title>Página</title>\n </head>\n <body>\n {}\n </body>\n</html>"
def empaqueta(texto):
'''Permite encerrar entre etiquetas de HTML5 al resultado de funcion(texto).'''
return etiquetas.format(funcion(texto))
return empaqueta
In [66]:
@html
def parrafo(texto):
'''Encierra entre las etiquetas de párrafo al elemento texto.'''
return '<p>' + str(texto) + '</p>'
In [67]:
print(parrafo("Hola, Mundo."))
In [68]:
help(parrafo)
Definición de funciones con la declaración lambda.
Python permite definir funciones en una sola línea mediante el uso del la expresión lambda con la siguiente sintaxis:
lambda <argumentos>: <código>
A este tipo de funciones se les conoce como funciones lambda o funciones anónimas debido a que no requieren de un nombre para ser definidas.
Para nombrar a estas funciones se utiliza el operador de asignación ( = ).
Ejemplo:
In [69]:
saluda = lambda texto='extraño', ancho=50: print('Hola, {}.'.format(texto).center(ancho))
In [70]:
type(saluda)
Out[70]:
In [71]:
saluda()
In [72]:
saluda('Mundo', 20)
Funciones lambda con estructuras if... else.
Las funciones lambda permiten incluir condicionales dentro de su sintaxis de la siguiente forma:
lambda <argumentos>: <expresion_1> if <condición> else <expresión_2>
Ejemplo:
es_par es una función que valida si un número entero ingresado como parámetro es par.
In [73]:
es_par = lambda numero: True if numero % 2 == 0 else False
In [74]:
es_par(2)
Out[74]:
In [75]:
es_par(3)
Out[75]:
Ejemplo:
La función factorial calcula el factorial de un número mediante recursividad.
In [76]:
factorial = lambda numero: numero * factorial(numero - 1) if numero > 1 else 1
In [77]:
factorial(5)
Out[77]:
* https://www.charliejsanchez.com/2017/09/04/creacion-y-uso-de-funciones-en-python-3/
Comentarios
Publicar un comentario