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 function
o nested functio
n. 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