Como estruturar uma Closure no código?
Para criar uma closure, sempre precisará de:
- Uma função mãe (externa).
- Uma função filha (interna) dentro dela.
- A função mãe precisa dar um return na função filha (sem os parênteses, apenas o nome dela!).
Olha como fica a estrutura para o sistema do Miguel:
# Esta é a função externa
def criar_calculadora_desconto(porcentagem):
# Esta é a função interna
def aplicar_desconto(valor_compra):
# Ela tem acesso à 'porcentagem' que veio lá de fora!
desconto = valor_compra * (porcentagem / 100)
return valor_compra - desconto
return aplicar_desconto
Como usar isso no programa principal?
É aqui que a mágica acontece. Quando chamamos a função de fora, ela cria a nossa closure. Veja o programa completo com as entradas do usuário:
porcentagem_user = float(input("Digite a porcentagem de desconto: "))
valor_user = float(input("Digite o valor da compra: "))
meu_cupom = criar_calculadora_desconto(porcentagem_user)
preco_final = meu_cupom(valor_user)
print(f"Preço final com desconto: {preco_final}")
Por que isso é útil na Ciência da Computação?
Imagine que o Miguel queira criar um cupom fixo de Black Friday ($30%$) e outro de Cliente VIP ($15%$). Com a closure, ele pode criar várias funções personalizadas sem ter que reescrever o código da conta matemática toda vez:
cupom_black_friday = criar_calculadora_desconto(30)
cupom_vip = criar_calculadora_desconto(15)
print(cupom_black_friday(1000))
print(cupom_vip(1000))