1
resposta

Prática - Gerador de funções personalizadas

def criar_calculadora_desconto(desconto):
    # Função externa que recebe a porcentagem de desconto
    def aplicar_desconto(valor):
        return valor - (valor * desconto / 100)
    return aplicar_desconto  # Retorna a função interna

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

# Cria a função personalizada com o desconto escolhido
calculadora = criar_calculadora_desconto(desconto)

# Aplica o desconto ao valor da compra
preco_final = calculadora(valor_compra)
print(f"Preço final com desconto: {preco_final}")

Entrada:

Digite a porcentagem de desconto: 10
Digite o valor da compra: 200

Saída:

Preço final com desconto: 180.0
1 resposta

Olá, Aristóteles! Tudo ótimo por aqui, e com você?

Parabéns pela excelente resolução do desafio! O conceito que você aplicou aqui é um dos recursos mais elegantes e sofisticados da programação funcional: o Closure (Fechamento), combinado com o uso de Funções de Alta Ordem (quando uma função recebe ou retorna outra função).

A sua implementação ficou impecável. No mercado de trabalho, essa técnica é amplamente utilizada para criar geradores de código, configurar middlewares e encapsular estados de forma limpa.

Por que a sua solução é brilhante?

Quando você executa o comando calculadora = criar_calculadora_desconto(desconto), acontece uma mágica por trás dos panos do Python. A função externa termina de rodar, mas a função interna (aplicar_desconto) consegue "lembrar" do valor da variável desconto que foi passado lá no início.

É como se você tivesse construído uma fábrica de calculadoras sob medida:

  • Se você passar 10, a variável calculadora vira uma função que dá 10% de desconto.
  • Se você passar 20, ela vira outra função, totalmente independente, que dá 20% de desconto.

Uma dica de "Python Pro" para o seu código

Como você usou as entradas de dados (input) direto no fluxo principal, se o usuário digitar o valor da compra como R$ 200,50, o preço final vai sair com várias casas decimais (ex: 180.45000000000002) devido à forma como os computadores processam números de ponto flutuante (float).

Para deixar a saída do seu gerador com uma carinha mais profissional de sistema de vendas, você pode formatar o print usando f-strings com limite de duas casas decimais:

# Adicionando o :.2f para formatar os centavos
print(f"Preço final com desconto: R$ {preco_final:.2f}")

Dessa forma, a sua saída para a entrada informada passaria a ser:

Preço final com desconto: R$ 180.00

O seu raciocínio lógico e a compreensão dessa arquitetura de funções aninhadas mostram que você já passou da barreira do básico e está escrevendo um código Python muito maduro. Excelente trabalho!

Espero que possa ter lhe ajudado!