Funções aninhadas em Python
Uma função é um bloco de código que pode ser chamado repetidamente em um programa. Ele pode aceitar argumentos diferentes e pode retornar algum valor útil. Em todas as linguagens de programação, temos funções integradas e funções definidas pelo usuário.
Neste tutorial, aprenderemos como criar e usar funções aninhadas em Python.
A maioria das linguagens suporta o uso e a criação de funções aninhadas. Como o nome sugere, uma função aninhada é uma função dentro de uma função. A função aninhada dentro é chamada de função interna, e a função envolvente é chamada de função externa.
No código a seguir, criamos uma função aninhada básica.
def outer_f(s):
def inner_f(s):
print(s)
inner_f(s)
outer_f("Nested")
Resultado:
Nested
Usando o exemplo acima, podemos ter uma pequena ideia sobre o uso de funções aninhadas. Eles podem ser usados para ocultar uma função do mundo externo e implementar o encapsulamento de dados.
Outra coisa a saber é que a função aninhada pode usar a variável usada na função externa. Essas variáveis são chamadas de não locais. Funções aninhadas podem acessá-los, mas se precisarmos modificá-los, temos que usar a palavra-chave nonlocal
.
Vamos ver o seguinte exemplo.
def outer_f():
s = 5
def inner_f():
nonlocal s
s = s + 1
return s
return inner_f()
print(outer_f())
Resultado:
6
Aqui não poderíamos modificar a variável s
sem usar a palavra-chave nonlocal
.
Agora imagine se a função aninhada retorna algum valor. Isso nos leva a outro recurso útil das funções aninhadas, que são as funções de fechamento. Essas funções são criadas dinamicamente usando funções aninhadas. Pode ser uma maneira elegante e concisa de implementar ocultação de dados e usá-la como alternativa para classes.
Veja o seguinte código.
def incrementer(x):
def inc(y):
return x + y
return inc
by4 = incrementer(4)
by5 = incrementer(5)
print(by4(5), by5(5))
Resultado:
9 10
Agora, no código acima, criamos um método dinâmico para incrementar um número. O by4
e by5
são as duas funções de encerramento criadas usando a função aninhada. Isso se deve principalmente à capacidade das funções aninhadas de reter seu estado. Pode ser uma alternativa decente para classes e variáveis globais quando não há muitos atributos envolvidos. Podemos descobrir se uma função é um fechamento usando o atributo __closure__
. Todas as funções têm este atributo e ele retorna alguns objetos de célula quando usado com uma função de fechamento.
As funções aninhadas também são usadas para funções de decorador. As funções do decorador usam um objeto que pode ser chamado, como uma classe, função, e retornam outro objeto. Usamos o sinal @
para usar um decorador antes de qualquer objeto chamável. Dessa forma, pegamos o objeto que pode ser chamado como um argumento da função decorador e o usamos.
Criamos uma função de decorador muito simples para entender isso melhor no exemplo a seguir.
def dec(func):
def inner():
print("Hello")
func()
return inner
@dec
def world():
print("world")
world()
Resultado:
Hello
world
No exemplo acima, criamos uma função decoradora simples chamada dec()
, que decora a função world()
usando-a como um argumento e imprimindo uma mensagem adicional.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn