Fechamento do Python

Fechamento do Python
Neste artigo, vamos discutir o fechamento do Python.Antes de entender o fechamento do Python, precisamos entender funções aninhadas e variáveis ​​não locais.

Função aninhada:

Uma função aninhada é definida dentro de outra função. Essas funções podem acessar uma variável da função externa. A variável não local que podemos acessar em seu escopo.

Ex:

Defouter_fun (s):
msg = s #non variável local
definitivamente_fun ():
Imprimir (msg)
INNER_FUN ()
Outer_fun ('bom dia')

Saída:

No exemplo acima, o interno_fun é uma função aninhada e msg é uma variável não local. Podemos acessá -los dentro do corpo externo.

Definição de fechamento:

O fechamento do Python é uma função aninhada. Podemos acessar a variável fora do escopo. Este conceito é essencial para entender os decoradores de Python.

Todas as funções aninhadas não são fechamentos. Os três critérios a seguir devem atender para definir um fechamento:

  1. Devemos ter uma função aninhada (função dentro de outra função)
  2. A função aninhada deve se referir a uma variável não -local
  3. A função de escopo externo deve retornar a função interna.

Ex:

#Defining Funções aninhadas
DEFGREET_MSG (S):
msg = s# msg está tendo escopo na função externa
Defrint_msg ():
Imprimir (msg) #Using Non Local Variable
ReturnPrint_MSG#Objeto de retorno em vez de chamar uma função interna
call_fun = greet_msg ('bom dia')
call_fun ()
call_fun ()

Saída:

No exemplo acima, o greet_msg é a função externa. Isso cria uma função interna (greet_msg está fechando aqui) e é devolvido.

A função externa Greet_msg retorna uma função print_msg e é atribuído à variável Call_fun. Aqui vemos a função externa terminando sua execução, mas ainda podemos acessar a variável msg.

Como modificar a variável dentro do fechamento:

Usando palavras -chave não -locais, podemos modificar a variável dentro da função interna.

Ex: Sem usar palavra -chave não -local. Aqui estamos tentando modificar a variável num dentro do fechamento e obtivemos o não -contrato que o python pensa em num como uma variável local e num não é definido dentro de diversão ().

DEFGENERATE_NUM ():
num = 0
Deffun ():
num += 1
impressão (num)
retornar divertido
g = generate_num ()
g ()
g ()
g ()

Saída:

Ex: Com o uso não -local palavra -chave. No exemplo abaixo, usando palavras -chave não -locais, poderemos modificar a variável num.

DEFGENERATE_NUM ():
num = 0
Deffun ():
Num não -local
num += 1
impressão (num)
retornar divertido
g = generate_num ()
g ()
g ()
g ()

Saída:

Vamos escrever mais exemplo usando um fechamento:

Ex: Isso imprimirá argumentos passados ​​e nome da função

defouter (func):
Defclosure (*args):
print ('em execução "" com argumentos '.formato (func.__nome__, args))
Imprimir (func (*args))
Retorno de fechamento
defadd (a, b):
returna+b
Defsub (a, b):
retornar a-b
Defmul (a, b):
Retornar A*B
defdiv (a, b):
Retornar A/B
add_closure = externo (add)
sub_closure = externo (sub)
Mul_closure = externo (MUL)
div_closure = externo (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)

Saída:

Ex: No exemplo abaixo, cada vez que o fechamento é chamado, os valores serão anexados a uma lista e adicionará todos os valores na lista e retornará um valor.

defaddition ():
res = []
DEFFUNC_SUM (VAL):
res.Anexar (Val)
sum_res = sum (res)
returnSum_res
returnfunc_sum
s = adição ()
t = s (2)
impressão (t)
t = s (5)
impressão (t)
t = s (10)
impressão (t)
t = s (100)
impressão (t)

Saída:

Ex: Neste exemplo, multiplique o número do parâmetro da função interna pelo parâmetro de função externa
def multiply_by_number (m):

# função interna
Derobramento (n):
# m é multiplicado por n
retornar n * m
# Retorne a função interna
Operação de retorno
multiply_by_10 = multiply_by_number (10)
# deve imprimir 20
Imprimir (multiply_by_10 (2))
# deve imprimir 100
Imprimir (multiply_by_10 (10))
# deve imprimir 120
Imprima (multiply_by_10 (12))

Saída:

Conclusão:

O fechamento do Python é uma função aninhada. Com isso, podemos evitar o uso de variáveis ​​globais usando variáveis ​​não locais. Isso fornece alguns dados que ocultam e compreendendo esse conceito útil na construção de um decorador Python.