Funções que Retornam Valores¶
A maioria das funções exigem argumentos, valores que controlam como a função realiza sua tarefa. Por exemplo, se você quer descobrir o valor absoluto de um número, você prcisa informar qual é o número. Python tem uma função interna para calcular o valor absoluto:
Neste exemplo, os argumentos para a função abs
são 5 e -5.
Algumas funções precisam de mais de um argumento. Por exemplo, o módulo math contém uma função
chamada pow
, que exige dois argumentos: a base e o expoente.
Nota
Obviamente, já vimos que podemos usar o operador ** para elevar uma base a um expoente.
Outra função que usa mais de um argumento é max
.
max
pode receber qualquer quantidade de argumentos, separados por vírgulas, e
retornará o valor máximo enviado. Os argumentos pode ser valores simples ou expressões.
No último exemplo, 503 é retornado, uma vez que é maior que 33, 125 e 1. Observe que max
também funciona em listas de valores.
Portanto, uma diferença fundamental entre essas funções e uma como desenhaQuadrado
é que
desenhaQuadrado
não foi executada porque queríamos calcular um valor — ao contrário,
escrevemos desenhaQuadrado
porque desejávamos ter uma forma de executar uma sequência de passos para desenhar um quadrado várias vezes.
Em muitas outras linguagens, uma função que não retorna um valor é chamado de procedimento, mas aqui iremos preservar a forma como Python também denomina isso de função, ou se quisermos reforçar a ideia, uma função que não retorna valores.
Funções que retornam valores ainda permitem que o usuário forneça informação (argumentos). Porém, agora há uma informação que é retornada da função.

Como escrever esse tipo de função? Para começar, vejamos um exemplo simples que chamaremos de
quadrado
. Essa função receberá um número como parâmetro e retornará o quadrado desse número.
Aqui está o digrama de caixa preta com o código Python em seguida:

O comando return é seguido de uma expressão que é avaliada. O resultado da expressão
é retornado para quem chamou a função. Uma vez que o comando return pode ter qualquer
expressão válida em Python, podemos até nem criar a variável temporária y
e apenas fazer return x*x
.
Tente modificar a função quadrado acima para ver se isso funciona.
Por outro lado, ao usarmos uma variável temporária como y
facilita a depuração.
Essas variáveis temporárias são chamadas de variáveis locais.
Observe um detalhe importante aqui: o nome da variável que passamos como um argumento
— num
— não tem nada a ver com o nome do parâmetro formal — x
. É como se
x = num
fosse executado no início da chamada da função quadrado
.
Não interessa como o valor é denominado na chamada. Em quadrado
, seu nome é x
.
Você pode ver isso claramente usando o codelens, onde as variáveis globais e as variáveis locais
da função quadrado estão em caixas separadas.
Ao executar passo a passo no codelens, observe que o comando return não apenas faz com que a função retorna um valor, mas também retorna o fluxo de controle de volta ao local do programa onde a função foi chamada.
(ch04_clsquare)
Outro detalhe importante para reparar ao executar passo a passo é o movimento das setas vermelha e verde: o codelens usa essas setas para mostrar onde está executando no momento. Lembre-se que a seta vermelha sempre aponta para próxima linha de código que será executada. Já a seta verde aponta para a linha que recém foi executada.
Quando você começar a executar essa demonstração em codelens, notará que há apenas uma seta vermelha, e que ela aponta para a linha 1. Isso é porque a linha 1 é a próxima a ser executada, e como é a primeira linha, não há linha anterior.
Quando você clicar no botão forward, observe que a seta vermelha se move para a linha 5, pulando as linhas 2 e 3 da função (e a seta verde agora apareceu na linha 1). Por que isso?
A resposta é que a definição de função não é a mesma cois que a execução da função. As linhas 2 e 3
não serão executadas até que a função seja chamada na linha 6. A linha 1 define a função e o
nome quadrado
é adicionado às variáveis globais, mas isso é tudo que def
faz aqui. O corpo
da função será executado depois. Continue a clicar no botão forward para ver como o fluxo de
controle se move da chamada, de volta para o corpo da função, e finalmente de volta à linha 7,
depois que função retornou o seu valor e ele foi associado à variável result
.
Finalmente, há mais um aspecto de retorno de valores que deve ser observado. Todas as funções
em Python retornam o valor None
, a menos que haja um comando return com outro valor.
Veja o erro comum feito por programadores iniciantes: ao executar o código passo a passo, preste bastante atenção no valor de retorno que aparece na caixa de variáveis locais. Depois observe o que é exibido quando a função retorna.
(ch04_clsquare_bad)
O problema com essa função é que apesar de mostrar o valor do quadrado, esse valor não será
retornado ao chamador. Uma vez que a linha 6 usa o valor de retorno numa atribuição, o resultado
armazenado em result
será None
. Neste caso, o resultado exibido na linha 7 estará
incorreto.
Veja se você entendeu
- Você nunca deve usar o comando print dentro de uma função.
- Não confunda print com return, mas você pode usar print dentro de funções, se for o caso.
- Você não pode ter comandos na função depois do comando return.
- Esse é um erro muito comum, portanto preste atenção!
- Você precisa calcular o valor de x+y+z antes de retorná-lo.
- Python calculará automaticamente o valor x+y+z e então retorná-lo sem problemas.
- Uma função não pode retornar um número.
- Funções podem retornar qualquer tipo de dado válido, como números, textos, tartarugas, etc.
func-2-1: O que está errado na seguinte definição de função?
def someTodos(x, y, z):
return x + y + z
print('A resposta é', x + y + z)
- Nada (sem valor)
- Nós usamos print ao invés de return. Dessa forma, a função retorna o valor None por padrão. Isso é um erro MUITO COMUM, então tome cuidado!
- O valor de x + y + z
- Cuidado! Esse é um erro muito comum. Aqui exibimos o valor x+y+z mas não retornamos ele. É preciso SEMPRE usar o comando return.
- O texto 'x + y + z'
- x+y+z calcula um número (assumindo que x+y+z são números) que representa a soma dos três valores.
func-2-2: O que a seguinte função retorna?
def somaTodos(x, y, z):
print(x + y + z)