1
resposta

Gerador de funções personalizadas

def criar_cupom(porcentagem):
    def aplicar_desconto(preco_original):
        return preco_original * (1 - porcentagem / 100)
    return aplicar_desconto

if __name__ == "__main__":
    desconto_usuario = float(input("Digite a porcentagem do desconto: ").replace(",", "."))
    cupom_personalizado = criar_cupom(desconto_usuario)
    valor_compra = float(input("Digite o valor da compra: ").replace(",", ""))
    preco_final = cupom_personalizado(valor_compra)
    print(f"Preço original: R${valor_compra:.2f}")
    print(f"Preço com desconto: R${preco_final:.2f}")
1 resposta

Olá, Luísa. Como vai?

O seu código ficou excelente! Você aplicou um conceito avançado e extremamente poderoso no Python chamado Closures (ou funções internas), combinado com o conceito de funções de primeira classe (onde uma função pode receber ou retornar outra função).

A sua estrutura está muito bem desenhada: a função externa criar_cupom recebe a porcentagem e "lembra" desse valor, gerando uma nova função personalizada (aplicar_desconto) que sabe exatamente quanto aplicar de desconto quando for chamada mais tarde.

Gostaria de destacar duas ótimas práticas que você utilizou no seu script:

  • **O uso do if __name__ == "__main__":**: Isso é uma excelente prática no Python, pois garante que o bloco de teste e interação com o usuário só seja executado se o arquivo for rodado diretamente, permitindo que suas funções sejam importadas em outros arquivos no futuro sem gerar efeitos colaterais.
  • **Tratamento de strings com .replace()**: Pensar em substituir a vírgula pelo ponto na entrada do desconto evita que o programa quebre se o usuário digitar o padrão brasileiro (ex: 15,5).

Como o objetivo da atividade é praticar e aprofundar, notei um pequeno detalhe na linha onde você recebe o valor_compra. Você utilizou .replace(",", "") (substituindo a vírgula por nada). Se o usuário digitar um valor como 100,50, o Python vai entender como 10050.0, aumentando drasticamente o preço. O ideal seria manter o mesmo padrão que você usou no desconto: .replace(",", ".").

Para expandir ainda mais o seu projeto e ver o poder real dessa estrutura que você criou, veja como as closures permitem que você crie múltiplos cupons diferentes no mesmo código sem precisar reescrever a lógica matemática:

def criar_cupom(porcentagem):
    def aplicar_desconto(preco_original):
        return preco_original * (1 - porcentagem / 100)
    return aplicar_desconto

if __name__ == "__main__":
    # Criando fábricas de cupons fixos para o seu sistema
    cupom_black_friday = criar_cupom(50)
    cupom_cliente_novo = criar_cupom(10)
    
    valor_produto = 200.0
    
    # Aplicando os cupons dinamicamente
    print(f"Preço na Black Friday: R${cupom_black_friday(valor_produto):.2f}")
    print(f"Preço para Cliente Novo: R${cupom_cliente_novo(valor_produto):.2f}")

Dessa forma, a função criar_cupom funciona como uma verdadeira "fábrica" de descontos personalizados, tornando o seu código limpo, modular e muito elegante. Parabéns pelo excelente trabalho no desafio!

Espero que possa ter lhe ajudado!