1
resposta

[Dúvida] Função - Clousers

def multiplicador(n): # Função externa
def multiplica(x): # Função interna (closure)
return x * n
return multiplica

triplo = multiplicador(3)
valor = triplo(5)
print(valor)

Minha dúvida
Sei que clousers é uma função que está dentro de uma função.
Eu não entendi como deu uma saída 15. O número 5 foi para onde? Por que o x é 15? Sei que foi uma multiplacação de 5 * 3 = 15. Alguém poderia explicar por passo a passo?

1 resposta

Olá, Ana, como vai?

Vamos observar o código passo a passo para entender o que está acontecendo nesse processo. Quando você define a função multiplicador(n), está criando uma função externa que recebe um número e, dentro dela, existe outra função chamada multiplica(x). Essa função interna utiliza duas informações: o valor de x, que será passado no momento da chamada, e o valor de n, que veio da função externa.

Quando a linha triplo = multiplicador(3) é executada, o Python chama a função multiplicador passando o valor 3 como argumento. Nesse momento, a função interna multiplica é criada e “guarda” o valor de n = 3 no seu contexto. Em seguida, a função externa retorna a própria função interna. Portanto, a variável triplo não recebe um número, ela passa a apontar para a função multiplica, que já está configurada para usar o valor 3 nas multiplicações.

Inclusive, se você fizer um print(triplo) nesse momento do codigo vai receber algo como <function multiplicador.<locals>.multiplica at xxxxx> que é a representação textual de uma função em Python. Esse texto indica que existe um objeto do tipo função armazenado naquela variável, mostra o nome da função interna (multiplica), informa que ela foi criada dentro de multiplicador (por isso aparece <locals>) e também exibe o endereço de memória onde esse objeto está armazenado.

Depois disso, na linha valor = triplo(5), ocorre a chamada dessa função interna. O número 5 é enviado como argumento e passa a ser o valor da variável x. Dentro da função, o cálculo realizado é x * n, ou seja, 5 * 3. O resultado dessa operação é 15, que é retornado e armazenado na variável valor. Assim, o x não se transforma em 15, ele continua sendo 5. O que vale 15 é o resultado da multiplicação entre x e n.

Esse comportamento acontece porque closures permitem que funções internas "lembrem" dos valores do escopo onde foram criadas, mesmo depois que a função externa já terminou sua execução.

Espero ter ajudado.

Siga firme nos seus estudos e conte com o fórum sempre que precisar.

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado