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 est谩n al mismo nivel que otros objetos de Python como enteros, cadenas, m贸dulos, etc. Se pueden crear y destruir din谩micamente, 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 la palabra “funci贸n interna” y “funci贸n anidada” indistintamente.

    Hay varias razones por las que a uno le gustar铆a crear una funci贸n dentro de otra funci贸n. La funci贸n interna puede acceder a las variables dentro del 谩mbito adjunto. En este art铆culo, exploraremos varios aspectos de las funciones internas en Python.

    Definici贸n de una funci贸n interna

    Para definir una funci贸n interna en Python, simplemente creamos una funci贸n dentro de otra funci贸n usando Python def palabra clave. 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() ha sido definido por dentro function1(), convirti茅ndolo en una funci贸n interna. Llamar function2(), primero debemos llamar function1(). los function1() luego continuar谩 y llamar谩 function2() como se ha definido en su interior.

    Es importante mencionar que se debe llamar a la funci贸n externa para que se ejecute la funci贸n interna. 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 puede acceder a variables accesibles en la funci贸n externa.

    Hasta ahora, has 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 cambiarlo. La declaraci贸n x = 6 nos ayud贸 a crear una nueva variable x dentro de la funci贸n interna function2() en lugar de cambiar el valor de la variable x definido en la funci贸n externa function1().

    En la siguiente secci贸n, discutiremos las razones principales por las que usamos funciones internas en Python.

    驴Por qu茅 utilizar las funciones internas?

    Encapsulamiento

    Se puede crear una funci贸n como funci贸n interna para protegerla de todo lo que sucede fuera de la funci贸n. En ese caso, la funci贸n se ocultar谩 del 谩mbito 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 al inner_increment() funci贸n, pero en su lugar obtuvimos un error.

    Ahora, comente la llamada a inner_increment() y descomentar la llamada a outer_function() Como se muestra abajo:

    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
    

    El script anterior muestra que la funci贸n interna, es decir, inner_increment() est谩 protegido de lo que sucede fuera de 茅l ya que la variable x dentro de inner_increment la funci贸n no se ve afectada por el valor pasado al par谩metro x de la funci贸n exterior. En otras palabras, las variables dentro de la funci贸n interna no son accesibles fuera de ella. Existe 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 para nosotros escribir tales funciones de otra manera en lugar de anidarlas dentro de otras funciones. No tenemos una raz贸n espec铆fica de por qu茅 deber铆amos 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 mediante un cierre. Es un objeto de funci贸n que puede 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 adjunto.

    El prop贸sito de un cierre es hacer que la funci贸n interna recuerde el estado de su entorno cuando se 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 permanece despu茅s de que la creaci贸n de la pila ha terminado de ejecutarse.

    Las siguientes son las condiciones que se deben cumplir 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 adjunto
    • La funci贸n envolvente 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 los cierres, podemos generar e invocar una funci贸n desde fuera de su alcance a trav茅s del paso de funciones. El alcance de function2() esta solo adentro function1(). Sin embargo, con el uso de cierres, nos fue posible extender este alcance e invocarlo desde fuera de su alcance.

    Las funciones internas nos ayudan a definir 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 gui贸n de arriba, del power_n(power) funci贸n, hemos creado otros dos objetos, power_two y power_three. Esto hace power_n(power) una funci贸n de f谩brica ya que genera la power_two y power_three funciones para nosotros usando el par谩metro que le 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 es posible que necesitemos 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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *