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.

_images/blackboxfun.png

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:

_images/squarefun.png

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

Next Section - Variáveis e Parâmetros são Locais