Oi Matheus! Como vai?
Quando você declara uma variável fora de uma função, como value e discount no seu código, essas variáveis são consideradas globais e podem ser acessadas dentro da função aplly_discount(). No entanto, se você tentar definir uma variável dentro de uma função e usá-la fora dessa função, o Python não a reconhecerá, pois ela está fora do escopo.
No seu caso, quando você coloca o input() dentro da função, a variável discount é definida dentro do escopo da função, e por isso ela é reconhecida e utilizada corretamente. Fora da função, discount não teria um valor atribuído, a menos que fosse definido globalmente ou passado como argumento para a função.
Para resolver esse problema, você pode passar value e discount como argumentos para a função aplly_discount(). Veja como ficaria:
def aplly_discount(value, discount):
calc = value * (discount / 100)
discounted_value = value - calc
print(f'O valor original: {value}')
print(f'Cupom de % {discount}')
print(f'O mesmo valor com desconto aplicado: {discounted_value}')
value = float(input('Digite o valor do produto: '))
discount = float(input('Digite a porcentagem do cupom de desconto: '))
aplly_discount(value, discount)
Dessa forma, value e discount são passados para a função como argumentos, e você não terá problemas com escopo.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.