1
resposta

Quando usar o Closure?

Entendo que esse é um exemplo didático para usar o conceito de Closure, como foi usado no gabarito:

def criar_desconto(porcentagem):  
   def calcular_preco(valor):  
       return valor - (valor * (porcentagem / 100))  
   return calcular_preco 

desconto = float(input("Digite a porcentagem de desconto: "))  
calcular_preco_final = criar_desconto(desconto) 
valor = float(input("Digite o valor da compra: "))  
print(f"Preço final com desconto: {calcular_preco_final(valor)}") 

Mas entendo que para esse caso, o Closure é dispensável, como na minha solução abaixo:

def calcular_preco(valor, desconto):  
    return valor - (valor * (desconto / 100))  

desconto = float(input("Digite a porcentagem de desconto: "))  
valor = float(input("Digite o valor da compra: "))  

preco_final = calcular_preco(valor, desconto)
print(f"Preço final com desconto: {preco_final:.2f}")

Pode me explicar melhor esse conceito ou me indicar uma documentação sobre o assunto para eu entender quando é melhor utilizar o Closure? Ainda não está claro para mim. E entendo que no dia a dia, eu terei que entender a necessidade/problema e desenvolver a melhor solução.

1 resposta

Olá, João! Como vai?

Closures são úteis quando você precisa criar funções que têm algum dado "lembrado" do contexto em que foram criadas. No seu exemplo, a função criar_desconto gera uma nova função calcular_preco que "lembra" a porcentagem de desconto passada quando criar_desconto foi chamada.

No seu exemplo, a closure é utilizada para criar uma função personalizada que aplica um desconto fixo. Isso pode ser especialmente útil se você precisa aplicar o mesmo desconto em várias partes do seu código sem ter que passar o valor do desconto toda vez. Por exemplo, se você tem um sistema que aplica um desconto de 10% em diversas compras, você pode criar a função de desconto uma vez e reutilizá-la sempre que necessário.

No seu código alternativo, você passa o desconto diretamente para a função calcular_preco a cada chamada. Isso é perfeitamente válido e pode ser mais simples em muitos casos, especialmente se o desconto varia com frequência ou se a função é chamada apenas uma vez.

Em resumo, closures são mais úteis quando você quer criar funções que encapsulam algum estado ou configuração (como um desconto fixo) que não muda entre as chamadas. Se o estado ou configuração é dinâmico, ou muda com frequência, passar os parâmetros diretamente pode ser mais prático.

Espero ter ajudado e bons estudos!

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