Te lleva a conocer los cierres de pitón desde cero

¿Qué es un cierre? ¿Para qué sirven los cierres? ¿Por qué utilizar cierres? Hoy tomaremos estas 3 preguntas para entender los cierres paso a paso.

Los cierres y las funciones están estrechamente relacionados, antes de introducir los cierres es necesario introducir algunos conocimientos previos, como el concepto de funciones anidadas y el alcance de las variables.

Alcance

El alcance es el alcance al que se puede acceder a la variable cuando el programa se está ejecutando. La variable definida en la función es una variable local. El alcance de la variable local solo puede estar dentro del alcance de la función y no se puede hacer referencia a ella fuera de la función.

Las variables definidas en la capa más externa del módulo son variables globales, que son visibles en el ámbito global, por supuesto, las variables globales también se pueden leer en la función.

P.ej:

num = 10 # 全局作用域变量
def foo():
    print(num)  # 10

No se puede acceder a las variables locales fuera de la función.
P.ej:

def foo():
    num = 10
print(num)  # NameError: name 'num' is not defined

Función anidada

Una función se puede definir no solo en la capa más externa del módulo, sino también en otra función. Una función definida en una función se llama función anidada. Por ejemplo:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def print_msg():
    # print_msg 是外围函数
    msg = "zen of python"

    def printer():
        # printer是嵌套函数
        print(msg)
    printer()
# 输出 zen of python
print_msg()

Para las funciones anidadas, puede acceder a las variables no locales declaradas en su alcance externo. Por ejemplo, la impresora de funciones anidadas puede acceder normalmente a la variable msg en el ejemplo de código.

Entonces, ¿existe la posibilidad de que se pueda acceder a las variables locales incluso fuera del alcance de la función en sí? La respuesta es el cierre

Que es un cierre

Como primer tipo de objeto, la función se puede devolver como el valor de retorno de la función. Ahora consideremos el siguiente ejemplo:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def print_msg():
    # print_msg 是外围函数
    msg = "zen of python"
    def printer():
        # printer 是嵌套函数
        print(msg)
    return printer

another = print_msg()
# 输出 zen of python
another()

Este código tiene exactamente el mismo efecto que el ejemplo anterior y también genera "zen of python". La diferencia es que la impresora de función interna devuelve directamente como valor de retorno.

Generalmente, las variables locales en una función solo están disponibles durante la ejecución de la función, una vez que se ejecuta print_msg (), pensaremos que la variable msg ya no estará disponible. Sin embargo, aquí encontramos que después de que se ejecuta print_msg, el valor de la variable msg normalmente se emite cuando se llama a otra, esta es la función del cierre, lo que hace posible que se acceda a las variables locales fuera de la función.

Después de leer este ejemplo, definamos nuevamente el cierre. La explicación en Wikipedia es:

En informática, Closure es la abreviatura de Lexical Closure, una función que hace referencia a variables libres. La variable libre referenciada existirá con esta función, incluso si ha abandonado el entorno en el que se creó. Por lo tanto, existe otra opinión de que un cierre es una entidad compuesta por una función y su entorno de referencia relacionado.

Aquí otro es un cierre. Un cierre es esencialmente una función. Consta de dos partes, la función de impresora y la variable msg. Los cierres mantienen los valores de estas variables en la memoria en todo momento.

Un cierre, como su nombre indica, es un paquete cerrado, que se envuelve con variables libres, al igual que los valores de atributo definidos en una clase. El rango visible de variables libres está acompañado por el paquete. Donde puede acceder a este paquete, puede acceder a esta libertad. variable.

Por que usar cierres

Los cierres evitan el uso de variables globales, además los cierres permiten asociar funciones con determinados datos (entorno) sobre los que operan. Esto es muy similar a la programación orientada a objetos En la programación orientada a objetos, los objetos nos permiten asociar ciertos datos (propiedades del objeto) con uno o más métodos.

En términos generales, cuando solo hay un método en el objeto, es mejor usar cierres.
Veamos un ejemplo:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def adder(x):
    def wrapper(y):
        return x + y
    return wrapper

adder5 = adder(5)
# 输出 15
adder5(10)
# 输出 11
adder5(6)

Esto es más elegante que usar clases, además, los decoradores también son un escenario de aplicación basado en cierres.

Todas las funciones tienen un __closure__atributo. Si la función es un cierre, devuelve un objeto tupla compuesto por objetos de celda. Las cell_contentspropiedades del objeto de celda son las variables libres en el cierre.

>>> adder.__closure__
>>> adder5.__closure__
(<cell at 0x103075910: int object at 0x7fd251604518>,)
>>> adder5.__closure__[0].cell_contents
5

Esto explica por qué, después de salir de la función de variables locales, también se puede acceder fuera de la función ya que está almacenada en el cierre cell_contentsen el.

Supongo que te gusta

Origin blog.csdn.net/sinat_38682860/article/details/109311643
Recomendado
Clasificación