Post Top Ad

Your Ad Spot

martes, 25 de junio de 2019

Funciones anidadas de Python

¿Qué es una función anidada?

Las funciones son uno de los "ciudadanos de primera clase" de Python, lo que significa que las funciones se encuentran al mismo nivel que otros objetos de Python como enteros, cadenas, módulos, etc. Se pueden crear y destruir de forma dinámica, pasar a otras funciones, devolver como valores, etc.
Python admite el concepto de "función anidada" o "función interna", que es simplemente una función definida dentro de otra función. En el resto del artículo, usaremos indistintamente la palabra "función interna" y "función anidada".
Hay varias razones por las que a uno le gustaría crear una función dentro de otra función. La función interna es capaz de acceder a las variables dentro del ámbito de cierre. En este artículo, exploraremos varios aspectos de las funciones internas en Python.

Definiendo una función interna

Para definir una función interna en Python, simplemente creamos una función dentro de otra función usando la defpalabra clave de Python Aquí hay un ejemplo:
def function1(): # outer function  
    print ("Hello from outer function")
    def function2(): # inner function
        print ("Hello from inner function")
    function2()

function1()  
Salida
Hello from outer function  
Hello from inner function  
En el ejemplo anterior, function2()se ha definido en el interior function1(), por lo que es una función interna. Para llamar function2(), primero hay que llamar function1()function1()continuación, irá adelante y llamará function2()como se ha definido en su interior.
Es importante mencionar que la función externa debe ser llamada para que la función interna se ejecute. Si no se llama a la función externa, la función interna nunca se ejecutará. Para demostrar esto, modifique el código anterior a lo siguiente y ejecútelo:
def function1(): # outer function  
    print ("Hello from outer function")
    def function2(): # inner function
        print ("Hello from inner function")
    function2()
¡El código no devolverá nada cuando se ejecute!
Aquí hay otro ejemplo:
def num1(x):  
   def num2(y):
      return x * y
   return num2
res = num1(10)

print(res(5))  
Salida
50  
El código devuelve la multiplicación de los dos números, es decir, 10 y 5. El ejemplo muestra que una función interna es capaz de acceder a variables accesibles en la función externa.
Hasta ahora, usted ha visto que es posible que accedamos a las variables de la función externa dentro de la función interna. ¿Qué pasa si intentamos cambiar las variables de la función externa desde dentro de la función interna? Veamos que pasa:
def function1(): # outer function  
    x = 2 # A variable defined within the outer function
    def function2(a): # inner function
       # Let's define a new variable within the inner function
       # rather than changing the value of x of the outer function
        x = 6
        print (a+x)
    print (x) # to display the value of x of the outer function
    function2(3)

function1()  
Salida
2  
9  
La salida muestra que es posible para nosotros mostrar el valor de una variable definida dentro de la función externa desde la función interna, pero no cambiarla. La declaración x = 6nos ayudó a crear una nueva variable xdentro de la función interna en function2()lugar de cambiar el valor de la variable xdefinida en la función externa function1().
En la siguiente sección, analizaremos las razones principales por las que usamos funciones internas en Python.

¿Por qué usar las funciones internas?

Encapsulacion

Se puede crear una función como una función interna para protegerla de todo lo que sucede fuera de la función. En ese caso, la función se ocultará del alcance global. Aquí hay un ejemplo:
def outer_function(x):  
    # Hidden from the outer code
    def inner_increment(x):
        return x + 2
    y = inner_increment(x)
    print(x, y)

inner_increment(5)  
#outer_function(5)
Salida
Traceback (most recent call last):  
  File "C:/Users/admin/inner.py", line 7, in <module>
    inner_increment(5)
NameError: name 'inner_increment' is not defined  
En el código anterior, estamos intentando llamar a la inner_increment()función, pero en su lugar obtuvimos un error.
Ahora, comente la llamada inner_increment()y descomente la llamada outer_function()como se muestra a continuación:
def outer_function(x):  
    # Hidden from the outer code
    def inner_increment(x):
        return x + 2
    y = inner_increment(x)
    print(x, y)

#inner_increment(5)
outer_function(5)  
Salida
5 7  
La secuencia de comandos anterior muestra que la función interna, es decir, inner_increment()está protegida de lo que sucede fuera de ella, ya que la variable xdentro de la inner_incrementfunción no se ve afectada por el valor pasado al parámetro xde la función externa. En otras palabras, las variables dentro de la función interna no son accesibles fuera de ella. Hay una gran ventaja con este patrón de diseño. Después de verificar todos los argumentos en la función externa, podemos omitir con seguridad la verificación de errores dentro de la función interna.

Cierres y funciones de fábrica

Todos los ejemplos que hemos visto hasta ahora solo contienen funciones ordinarias que se han anidado dentro de otras funciones. Es posible que escribamos dichas funciones de otra manera en lugar de anidarlas dentro de otras funciones. No tenemos una razón específica de por qué debemos anidarlos.
Sin embargo, para el caso de cierres , uno debe usar las funciones anidadas.
Podemos vincular / pasar datos a una función sin pasar necesariamente los datos a la función a través de parámetros. Esto se hace utilizando un cierre. Es un objeto de función que es capaz de recordar valores en los ámbitos adjuntos, incluso cuando no están disponibles en la memoria. Esto significa que tenemos un cierre cuando una función anidada hace referencia a un valor que está en su ámbito de cierre.
El propósito de un cierre es hacer que la función interna recuerde el estado de su entorno cuando se le llama, incluso si no está en la memoria. Un cierre es causado por una función interna, pero no es la función interna. El cierre funciona cerrando la variable local en la pila, que se mantiene después de que la creación de la pila haya terminado de ejecutarse.
Las siguientes son las condiciones que deben cumplirse para crear un cierre en Python:
  • Debe haber una función anidada
  • La función interna tiene que hacer referencia a un valor que se define en el ámbito de cierre.
  • La función de encierro tiene que devolver la función anidada.
Considere el siguiente ejemplo:
def function1(name):  
    def function2():
        print('Hello ' + name)
    return function2

func = function1('Nicholas')  
func()  
Salida
Hello Nicholas  
El código anterior demuestra que con cierres, podemos generar e invocar una función desde fuera de su alcance a través del paso de funciones. El ámbito de aplicación function2()sólo está dentro function1()Sin embargo, con el uso de cierres, nos fue posible ampliar este alcance e invocarlo desde fuera de su alcance.
Las funciones internas nos ayudan a definir las funciones de fábrica . Una función de fábrica es una función que crea otro objeto. Por ejemplo:
def power_generator(num):

    # Create the inner function
    def power_n(power):
        return num ** power

    return power_n

power_two = power_generator(2)  
power_three = power_generator(3)  
print(power_two(8))  
print(power_three(4))  
Salida
256  
81  
En el script anterior, a partir de la power_n(power)función, hemos creado otros dos objetos, power_twopower_threeEsto hace que power_n(power)una función de fábrica, ya que genera las funciones power_twopower_threepara nosotros utilizando el parámetro que lo pasamos.

Conclusión

Una función interna es simplemente una función que se define dentro de otra función. La función interna puede acceder a las variables que se han definido dentro del alcance de la función externa, pero no puede cambiarlas. Hay varias razones por las que podemos necesitar crear una función interna. Por ejemplo, una función interna está protegida de lo que sucede fuera de ella. Las funciones internas también son una buena forma de crear cierres en Python.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas