Fechamentos de Python

Fechamentos de Python
Precisamos compreender as funções aninhadas e as variáveis ​​não locais antes de podermos entender o que é o fechamento do Python.

As funções escritas no Python são consideradas objetos de primeira classe. O status equivalente dos outros objetos é dado às funções no Python. As funções podem ser criadas e destruídas dinamicamente, atribuídas a variáveis, salvas em coleções, fornecidas como argumentos e mais. O termo "funções aninhadas", às vezes conhecido como "funções internas", refere -se a funções que são definidas dentro das outras funções.


É uma função aninhada chamada mensagem de construção. Sua função principal externa é onde é definido e chamado.

Em sua forma mais básica, o fechamento é apenas uma função aninhada que tem acesso a uma variável livre sobrando após a execução de uma função de anexo. Um fechamento de Python tem essas três propriedades:

    • Está aninhado na função.
    • Ele pode acessar uma variável gratuita fora de seu escopo.
    • A função circundante retorna.

Diz -se que qualquer variável não ligada no escopo local é livre. A palavra-chave não local é necessária para que o fechamento funcione com variáveis ​​imutáveis, como cordas e números inteiros. Os fechamentos de Python oferecem algum tipo de mascaramento de dados e ajudam a evitar o uso de variáveis ​​globais.

Escopo de variáveis

Também devemos aprender sobre o escopo da variável python para compreender os fechamentos mais plenamente. O escopo é uma região onde a variável é observável. Somente o intervalo especificado de uma variável pode ser utilizado. De acordo com os três escopos diferentes, as variáveis ​​geralmente podem ser alocadas em três locais separados:

    • Âmbito global: A definição de uma variável quando está fora de todas as funções. Qualquer função no código pode utilizar facilmente uma variável global.
    • Escopo local: Uma variável é local para uma função quando é declarada dentro dela. Uma variável local só pode ser acessada de dentro dos limites dessa função onde é declarado.
    • Escopo não local: Uma variável alocada não é local às suas funções aninhadas quando é usado na função circundante. A função na qual uma variável não local foi definida, bem como todas as suas funções internas podem acessar essa variável.

Por que usar fechamentos?

Os principais motivos pelos quais contratamos decoradores são descritos na lista a seguir:

    • O fato de o fechamento de python oferecer alguma forma de mascaramento de dados, pois as funções de retorno de chamada são um dos principais benefícios de empregá -los. Consequentemente, a utilização de variáveis ​​globais diminui
    • O tamanho do código pode ser diminuído em algumas circunstâncias, utilizando os fechamentos em vez de classes.
    • Ao substituir as constantes codificadas, os fechamentos são uma ótima escolha.
    • A função decorativa dos fechamentos é altamente benéfica.

Quando o python cria o fechamento?

Python cria um novo escopo cada vez que uma função é invocada. Python produz adicionalmente um novo fechamento se essa função produzir um.


Crie uma função chamada multiplicadora que produz um fechamento primeiro. A multiplicação de duas entradas é o que a função multiplicadora retorna. Mas utiliza um fechamento no lugar disso. Adicione três chamadas à função multiplicadora a seguir. Três fechamentos são produzidos chamando essas funções. Um número é multiplicado por 2, 4 e 5 por cada função. Em seguida, execute as funções dos fechamentos.

Exemplo 1:

Para invocar uma função interna de fora da função externa, devemos primeiro descobrir como. Esses métodos podem retornar um valor. Aqui, "T" e "U" são variáveis ​​locais da função f ().


Como as variáveis ​​“t” e “u” não podem mais ser acessadas após a execução de H = f (), todas as variáveis ​​de f (local) se foram. No entanto, ainda mantemos o valor "T" que foi devolvido e salvo em H. Assim, podemos ser capazes de ter a função externa retornar a função interna. As funções de primeira classe do Python tornam viável para isso. Isso implica que, como o python interpreta as funções como valores, você pode atribuí -los às variáveis, fornecer como argumentos de função ou ter outra função devolvê -los.

Exemplo 2:

Este exemplo mostra que a função interna “G” é retornada pela função externa f (t).


A função g () agora é retornada pela expressão f (t). Ao atribuir o valor de "G" a "H" quando escrevemos H = f (i), "H" agora pode ser considerado "G" e assumir o argumento de G. H (j) é equivalente a chamar "G" como resultado (J).

Exemplo 3:

A função g (), não um valor particular disso, é o que f (t) retorna. Leve esta instância em consideração para isso e escreva o seguinte:


Este código retorna um erro. Isso significa que encontramos um erro. Não podemos usar "h" para invocar uma função, pois retornamos o resultado de g (u) de f (t), o que é um motivo para o erro.

Exemplo 4:

Não precisamos manter f (a) em "h". A alternativa é chamar F (a) diretamente (b). Considere a seguinte ilustração:


A necessidade de fazer a diferença entre f (a, b) e f (a) deve sempre ser lembrada (b). Requer dois parâmetros para chamar a função f (a, b). A função f (a) (b), por outro lado, é uma série de funções aninhadas, cada uma das quais aceita apenas uma entrada. Conhecido como uma função unária, esse tipo de função aceita apenas uma entrada. Consequentemente, F (a) (b) é uma série de duas funções unilárias aninhadas. Então, f (a) é avaliado pela primeira vez. Para encadear essas funções, f (a) deve retornar uma função. Aqui, ele retorna a função interna "g". Consequentemente, f (a) (b) = g (b).

Exemplo 5:

O uso de uma série mais longa de funções unárias é simplesmente possível, estendendo a abordagem atual. As três funções unárias aninhadas também podem ser vistas neste caso. A primeira função, f (t), tem uma função nela chamada g (u), e g (u) tem uma função dentro dele chamada h (v). Cada função interna é retornada por sua função externa.


Aqui, definimos as funções. Essas funções retornam os valores. Em seguida, inicializamos três variáveis ​​e atribuímos três números inteiros diferentes. Em seguida, chamamos essas variáveis ​​de atributos da função.

Exemplo 6:

Suponha que existem algumas variáveis ​​não -locais na função externa. Vamos ver o que acontece.


Executar demonstra que opera sem problemas e que G (u) tem acesso a "T" e "V". No entanto, como é até concebível? Agora que estamos fora do alcance de F (t), assim "t" e "v" não deve ser alcançado depois que f (t) for realizado. Por que G (u) ainda é capaz de acessá -los? É pela razão que g (u), a função interna, agora é um fechamento.

Exemplo 7:

Vamos modificar a função interna usada nesta instância.


Se isso acontecer, não se pode mais dizer um fechamento. A explicação é que G (u) não acessa as variáveis ​​não -locais "T" e "V". Portanto, G (u) não é obrigado a registrá -los.

Exemplo 8:

Nesse caso, veremos se definirmos os valores de dois parâmetros das funções iguais, então essa função está definida como um fechamento ou não.


Mais uma vez, "t" é necessário apenas para inicializar "u" neste caso. Portanto, g (u) não é um fechamento porque "g" não precisa declarar "t".

Conclusão

Neste guia, conversamos sobre o fechamento do Python. Também executamos os diferentes códigos relacionados a este tópico. Exigimos uma função dentro do fechamento para definir o seguinte:

    • A função externa precisa fornecer de volta.
    • Algumas das variáveis ​​não locais da função externa devem ser capturadas por ela. Essas variáveis ​​podem ser acessadas diretamente, declaradas como variáveis ​​não -locais ou precisam ser capturadas por um fechamento aninhado.

Em outras palavras, uma função e um escopo expandido com variáveis ​​livres são considerados fechamentos. Chamar a função externa para retornar o fechamento é necessário após declarar o fechamento para inicializá -lo.