Funciones internas de Python

En Python, las funciones se tratan como objetos de primera clase. Los objetos de primera clase en un idioma se manejan de manera uniforme 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. Python admite el concepto de funciones 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 un parámetro a otra función.
  • Puede devolver la función desde una función.
  • Puedes almacenarlos en estructuras de datos como tablas hash, listas,…

Nota: Para saber más sobre los objetos de primera clase haga clic aquí .

Funciones internas

Una función que está definida dentro de otra función se conoce como inner functiono nested function. Las funciones anidadas pueden acceder a las variables del ámbito adjunto. Las funciones internas se utilizan para que puedan protegerse de todo lo que sucede fuera de la función. Este proceso también se conoce como Encapsulation. Para saber más sobre la encapsulación haga clic aquí .

Ejemplo:

# Python program to illustrate 
# nested functions 
def outerFunction(text): 
    text = text 
    
    def innerFunction(): 
        print(text) 
    
    innerFunction() 
    
if __name__ == '__main__': 
    outerFunction('Hey !') 

Producción:

Hey!

En el ejemplo anterior, la función interior() se ha definido dentro de la función exterior(), lo que la convierte en una función interna. Para llamar a la función interna(), primero debemos llamar a la función externa(). La función externa() seguirá adelante y llamará a la función interna() como se ha definido dentro de ella.

Es importante que se llame a la función externa para que la función interna pueda ejecutarse. Para demostrar esto, considere el siguiente ejemplo:
Ejemplo:

# Python program to illustrate 
# nested functions 
def outerFunction(text): 
    text = text 
    
    def innerFunction(): 
        print(text) 
    
    innerFunction() 

Producción:

This code will return nothing when executed.

Ámbito de variable en función anidada

La ubicación donde podemos encontrar una variable y también acceder a ella si es necesario se denomina alcance de una variable.
Se sabe cómo acceder a una variable global dentro de una función, pero, ¿y si se accede a la variable de una función exterior? Veamos un ejemplo:

# Python program to 
# demonstrate accessing of
# variables of nested functions
  
def f1():
    s = 'I love GeeksforGeeks'
      
    def f2():
        print(s)
          
    f2()
  
# Driver's code
f1()

Producción:

I love GeeksforGeeks

En el ejemplo anterior, se puede ver que es similar a acceder a la variable global desde una función. Ahora supongamos que desea cambiar la variable de la función externa.

# Python program to 
# demonstrate accessing of
# variables of nested functions
  
def f1():
    s = 'I love GeeksforGeeks'
      
    def f2():
        s = 'Me too'
        print(s)
          
    f2()
    print(s)
  
# Driver's code
f1()

Producción:

Me too
I love GeeksforGeeks

Se puede ver que el valor de la variable de la función externa no cambia. Sin embargo, el valor de la variable de la función externa se puede cambiar. Hay diferentes formas de cambiar el valor de la variable de la función externa.

  • Usando un iterable –

    # Python program to 
    # demonstrate accessing of
    # variables of nested functions
      
    def f1():
        s = ['I love GeeksforGeeks']
          
        def f2():
            s[0] = 'Me too'
            print(s)
              
        f2()
        print(s)
      
    # Driver's code
    f1()

    Producción:

    ['Me too']
    ['Me too']
    
  • Uso de palabras clave no locales –

    # Python program to 
    # demonstrate accessing of
    # variables of nested functions
      
    def f1():
        s = 'I love GeeksforGeeks'
          
        def f2():
            nonlocal s
            s = 'Me too'
            print(s)
              
        f2()
        print(s)
      
    # Driver's code
    f1()

    Producción:

    Me too
    Me too
    
  • El valor también se puede cambiar como se muestra en el siguiente ejemplo.

    # Python program to 
    # demonstrate accessing of
    # variables of nested functions
      
    def f1():
        f1.s = 'I love GeeksforGeeks'
          
        def f2():
            f1.s = 'Me too'
            print(f1.s)
              
        f2()
        print(f1.s)
      
    # Driver's code
    f1()

    Producción:

    Me too
    Me too
    

Cierres Python

Un Closure es un objeto de función que recuerda valores en ámbitos adjuntos incluso si no están presentes en la memoria.

  • Es un registro que almacena una función junto con un entorno: un mapeo que asocia cada variable libre de la función (variables que se usan localmente, pero definidas en un ámbito envolvente) con el valor o la referencia a la que estaba vinculado el nombre cuando el cierre fue creado.
  • Una clausura, a diferencia de una función simple, permite que la función acceda a esas variables capturadas a través de las copias de la clausura de sus valores o referencias, incluso cuando la función se invoca fuera de su alcance.
    filtro_ninguno.
# Python program to illustrate 
# closures 
def outerFunction(text): 
    text = text 
    
    def innerFunction(): 
        print(text) 
    
    return innerFunction # Note we are returning function WITHOUT parenthesis 
    
if __name__ == '__main__': 
    myFunction = outerFunction('Hey !') 
    myFunction() 

Producción:

Hey!
  • Como se observa en el código anterior, los cierres ayudan a invocar funciones fuera de su alcance.
  • La función funcióninterna tiene su alcance solo dentro de la funciónexterior. Pero con el uso de clausuras podemos extender fácilmente su alcance para invocar una función fuera de su alcance.
# Python program to illustrate 
# closures 
import logging 
logging.basicConfig(filename ='example.log', level = logging.INFO) 
    
    
def logger(func): 
    def log_func(*args): 
        logging.info( 
            'Running "{}" with arguments {}'.format(func.__name__, args)) 
        print(func(*args)) 
    # Necessary for closure to work (returning WITHOUT parenthesis) 
    return log_func               
    
def add(x, y): 
    return x + y 
    
def sub(x, y): 
    return x-y 
    
add_logger = logger(add) 
sub_logger = logger(sub) 
    
add_logger(3, 3) 
add_logger(4, 5) 
    
sub_logger(10, 5) 
sub_logger(20, 10) 

Producción:

6
9
5
10

Publicación traducida automáticamente

Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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