4.6 Defining Functions

Podemos criar uma função que grava a série Fibonacci em um limite arbitrário:

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while b >> # Now call the function we just defined:
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

A palavra-chave def introduz uma definição de função. Deve ser seguido pelo nome da função e pela lista de parâmetros formais entre parênteses. As instruções que formam o corpo da função começam na próxima linha e devem ser recuadas. A primeira instrução do corpo da função pode ser opcionalmente uma string literal; este string literal é a string de documentação da função, ou docstring.

Existem ferramentas que usam docstrings para produzir automaticamente documentação on-line ou impressa, ou para permitir que o usuário navegue interativamente pelo código; É uma boa prática incluir docstrings no código que você escreve, então tente criar um hábito.

A execução de uma função introduz uma nova tabela de símbolos usada para as variáveis ​​locais da função. Mais precisamente, todas as atribuições de variáveis ​​em uma função armazenam o valor na tabela de símbolos locais; enquanto que as referências de variáveis ​​primeiro aparecem na tabela de símbolos locais, depois na tabela de símbolos globais e depois na tabela de nomes incorporados. Assim, variáveis ​​globais não podem ser diretamente atribuídas a um valor dentro de uma função (a menos que seja nomeado em uma declaração global), embora possam ser referenciadas.

Os parâmetros reais (argumentos) para uma chamada de função são introduzidos na tabela de símbolos locais da função chamada quando é chamada; assim, argumentos são passados ​​usando chamada (call) por valor (onde o valor é sempre uma referência de objeto, não o valor do objeto). (1) Quando uma função chama outra função, uma nova tabela de símbolos locais é criada para aquela chamada.

Uma definição de função introduz o nome da função na tabela de símbolos atual. O valor do nome da função tem um tipo que é reconhecido pelo interpretador como uma função definida pelo usuário. Este valor pode ser atribuído a outro nome, que também pode ser usado como uma função. Isso serve como um mecanismo geral de renomeação:

>>> fib

>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89

Você pode achar que fib não é uma função, mas um procedimento. No Python, como em C, os procedimentos são apenas funções que não retornam um valor. Na verdade, tecnicamente falando, os procedimentos retornam um valor, embora um pouco chato. Esse valor é chamado None (é um nome interno). Escrever o valor None é normalmente suprimido pelo interpretador se este for o único valor escrito. Você pode ver se realmente quiser:

>>> print fib(0)
None

É simples escrever uma função que retorna uma lista dos números da série Fibonacci, em vez de imprimi-la:

>>> def fib2(n): # return Fibonacci series up to n
...     """Return a list of the Fibonacci series to n."""
...     result = []
...     a, b = 0, 1
...     while b >> f100 = fib2(100)    # call it
>>> f100                # write the result
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Este exemplo, como de costume, demonstra alguns novos recursos do Python:A declaração de retorno retorna com um valor de uma função. return sem uma expressão argumento retorna None. No final de um procedimento também retorna None. A instrução result.append (b) chama um método do resultado do objeto de lista. Um método é uma função que pertence a um objeto e é chamada obj.methodname, onde obj é algum objeto (isso pode ser uma expressão), e methodname é o nome de um método que é definido pelo tipo do objeto. Tipos diferentes definem métodos diferentes. Métodos de tipos diferentes podem ter o mesmo nome sem causar ambiguidade. (É possível definir seus próprios tipos de objetos e métodos, usando classes, como discutido mais adiante neste tutorial.) O método append() mostrado no exemplo é definido para objetos de lista; adiciona um novo elemento no final da lista. Neste exemplo, é equivalente a “result = result + [b]”, mas é mais eficiente.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s