Cierre de pitón

Cierre de pitón
En este artículo, vamos a discutir el cierre de Python.Antes de comprender el cierre de Python, necesitamos comprender las funciones anidadas y las variables no locales.

Función anidada:

Una función anidada se define dentro de otra función. Estas funciones pueden acceder a una variable de la función exterior. La variable no local a la que podemos acceder dentro de su alcance.

Ex:

defouter_fun (s):
msg = s #non variable local
definner_fun ()::
Imprimir (MSG)
inner_fun ()
OUTER_FUN ('Buenos días')

Producción:

En el ejemplo anterior, el inner_fun es una función anidada, y MSG es una variable no local. Podemos acceder a estos dentro del cuerpo externo_fun.

Definición de cierre:

El cierre de Python es una función anidada. Podemos acceder a la variable fuera del alcance. Este concepto es esencial para comprender los decoradores de Python.

Todas las funciones anidadas no son cierres. Los siguientes tres criterios deben reunirse para definir un cierre:

  1. Deberíamos tener una función anidada (función dentro de otra función)
  2. La función anidada debe referirse a una variable no local
  3. La función de alcance externo debe devolver la función interna.

Ex:

#Definir funciones anidadas
Defgreet_msg (s):
msg = s# msg está teniendo alcance en la función exterior
defprint_msg ()::
Imprimir (MSG)#Uso de la variable no local
returnPrint_MSG#Objeto de retorno en lugar de llamar a una función interna
call_fun = salud_msg ('buenos días')
call_fun ()
call_fun ()

Producción:

En el ejemplo anterior, el Greet_msg es la función exterior. Esto crea una función interna (greed_msg es el cierre aquí), y se devuelve.

La función exterior gree_msg devuelve una función print_msg y se asigna a la variable call_fun. Aquí vemos que la función exterior terminó su ejecución, pero aún podemos acceder a la variable MSG.

Cómo modificar la variable dentro del cierre:

Usando una palabra clave no local, podemos modificar la variable dentro de la función interna.

Ex: Sin usar una palabra clave no local. Aquí estamos tratando de modificar la variable NUM dentro del cierre y obtuvimos UnboundLocalError porque Python cree que NUM es una variable local y NUM no está definida dentro de la diversión ().

defgenerate_num ()::
num = 0
Deffun ():
num += 1
Imprimir (NUM)
devolver diversión
g = Generate_num ()
gramo()
gramo()
gramo()

Producción:

Ex: Con usar no local palabra clave. En el siguiente ejemplo que usa la palabra clave no local, podremos modificar la variable NUM.

defgenerate_num ()::
num = 0
Deffun ():
numordo no local
num += 1
Imprimir (NUM)
devolver diversión
g = Generate_num ()
gramo()
gramo()
gramo()

Producción:

Escribiremos más ejemplo usando un cierre:

Ex: Esto imprimirá argumentos aprobados y el nombre de la función

defouter (func):
defclosure (*args):
print ('Running "" con argumentos '.Formato (FUNC.__name__, args))
imprimir (func (*args))
Cierre de regreso
Defadd (a, b):
ReturnA+B
defsub (a, b):
regresar A-B
defmul (a, b):
devolver a*b
Defdiv (a, b):
regresar A/B
add_closure = OUTER (ADD)
sub_closure = exterior (sub)
mul_closure = exterior (mul)
div_closure = exterior (div)
add_closure (3, 3)
add_closure (4, 5)
Sub_closure (10, 5)
Sub_closure (20, 10)
mul_closure (10, 5)
mul_closure (20, 10)
Div_Closure (10, 5)
Div_Closure (20, 10)

Producción:

Ex: En el siguiente ejemplo, cada vez que se llama al cierre, los valores se agregarán a una lista y agregarán todos los valores de la lista y luego devolverán un valor.

Defaddition ():
res = []
deffunc_sum (val):
resonancia.adjuntar (val)
sum_res = sum (res)
RETHERSUM_RES
returnfunc_sum
s = adición ()
t = s (2)
Imprimir (t)
t = s (5)
Imprimir (t)
t = s (10)
Imprimir (t)
t = s (100)
Imprimir (t)

Producción:

Ex: En este ejemplo, multiplique el número de parámetro de función interna por parámetro de función exterior
Def multiply_by_number (m):

# función interna
Desfoperación (n):
# m se multiplica por n
regresar n * m
# Función interna de retorno
Operación de retorno
multiply_by_10 = multiply_by_number (10)
# debería imprimir 20
Imprimir (multiply_by_10 (2))
# debería imprimir 100
Imprimir (multiply_by_10 (10))
# debería imprimir 120
Imprimir (multiply_by_10 (12))

Producción:

Conclusión:

El cierre de Python es una función anidada. Con esto, podemos evitar usar variables globales utilizando variables no locales. Esto proporciona algunos datos ocultando y comprensión de este concepto útil para construir un decorador de Python.