def, parâmetros e return: empacotando lógica reaproveitável
Calcular o preço com desconto em três lugares diferentes do código, cada um com uma cópia quase idêntica da mesma conta, é um convite a bugs. Uma função resolve isso de vez.
Estudar esta lição interativa →Se o cálculo "preço menos desconto" aparece copiado em três lugares diferentes do seu código, e um dia a regra do desconto muda, você precisa lembrar de atualizar os três lugares, um por um, torcendo para não esquecer nenhum. Uma função resolve isso: você escreve a lógica uma vez, dá um nome a ela, e reaproveita esse nome sempre que precisar daquele cálculo.
def calcular_desconto(preco, percentual):
desconto = preco * (percentual / 100)
return preco - desconto
print(calcular_desconto(200, 10))
print(calcular_desconto(50, 20))A mesma função é chamada duas vezes, com valores diferentes.
A palavra def declara uma função; o que vem entre parênteses são os parâmetros (os nomes que recebem os valores passados na chamada); e return devolve um valor para quem chamou a função, encerrando a execução dela naquele ponto. Repare que calcular_desconto(200, 10) não imprime nada sozinho: ele devolve um número, que print(...), por fora, decide mostrar.
Pense numa função como uma máquina de suco: você coloca frutas (os parâmetros) numa entrada, aciona a máquina (chama a função) e recebe um copo de suco pronto pela saída (o return). A máquina não precisa mostrar o suco na sua cara sozinha, sem você pedir; ela só entrega o resultado, e cabe a você decidir o que fazer com ele, inclusive guardar num copo (uma variável) para usar depois.
É comum, no começo, confundir os dois. print(...) só exibe algo no console, sem devolver nada útil para o resto do programa usar. return devolve um valor de dentro da função para quem a chamou, permitindo guardar esse valor numa variável, usá-lo numa conta, ou passá-lo para outra função. Uma função pode ter os dois, ou só um, dependendo do que ela precisa fazer.
Se você esquecer o return, a função não quebra com erro nenhum: ela simplesmente devolve None (o "nenhum valor" do Python) para quem a chamou, sem avisar. Isso costuma gerar um bug silencioso e confuso, tipo total = calcular_desconto(200, 10) seguido de print(total) mostrando None em vez do número esperado. Sempre que uma função devolver None sem você esperar isso, o primeiro lugar a checar é: essa função tem mesmo um return no caminho que rodou?
Um exemplo útil para quem escreve para o público brasileiro: formatar dinheiro como R$ 1.234,50, com ponto nos milhares e vírgula nos centavos. Como o :,.2f do Python usa o formato americano (1,234.50), a função brl troca os separadores. É a mesma ideia de empacotar uma lógica numa função e reaproveitá-la em qualquer lugar onde um valor em reais apareça na tela.
def brl(valor):
# f"{valor:,.2f}" usa o formato americano (1,234.50); trocamos os separadores
texto = f"{valor:,.2f}"
texto = texto.replace(",", "X").replace(".", ",").replace("X", ".")
return "R$ " + texto
print(brl(8)) # R$ 8,00
print(brl(26.7)) # R$ 26,70
print(brl(1234.5)) # R$ 1.234,50Rode: os três valores saem no formato brasileiro.
def dobrar(numero):
resultado = numero * 2
print(dobrar(21))Adicione o return que falta.