You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
a variáveis são buscadas primeiramente na tabela local, então na tabela de símbolos global e finalmente na tabela<br />
de símbolos interna (built-in). Portanto, não se pode atribuir diretamente um valor a uma variável global dentro<br />
de uma função (a menos que se utilize a declaração global antes), ainda que variáveis globais possam ser<br />
referenciadas livremente.<br />
Os parâmetros reais (argumentos) de uma chamada de função são introduzidos na tabela de símbolos local da<br />
função chamada, portanto, argumentos são passados por valor (onde valor é sempre uma referência para objeto,<br />
não o valor do objeto) 1 Quando uma função chama outra, uma nova tabela de símbolos é criada para tal chamada.<br />
Uma definição de função introduz o nome da função na tabela de símbolos corrente. O valor do nome da função<br />
possui um tipo que é reconhecido pelo interpretador como uma função definida pelo usuário. Esse valor pode ser<br />
atribuído para outros nomes que também podem ser usados como funções. Esse mecanismo serve para renomear<br />
funções:<br />
>>> fib<br />
<br />
>>> f = fib<br />
>>> f(100)<br />
1 1 2 3 5 8 13 21 34 55 89<br />
Você pode afirmar que fib não é uma função, mas um procedimento. Em <strong>Python</strong>, assim como em C, procedimentos<br />
são apenas funções que não retornam valores. Na verdade, falando tecnicamente, procedimentos retornam<br />
um valor, ainda que meio chato. Esse valor é chamado None (é um nome interno). A escrita do valor None é<br />
supressa pelo interpretador se ele estiver sozinho. Você pode verificar isso se quiser.<br />
>>> print fib(0)<br />
None<br />
É muito simples escrever uma função que retorna a lista da série de Fibonacci, ao invés de imprimi-la:<br />
>>> def fib2(n):<br />
... """Retorna a lista contendo a serie de Fibonacci ate n"""<br />
... result = []<br />
... a, b = 0, 1<br />
... while b < n:<br />
... result.append(b) # veja abaixo<br />
... a, b = b, a+b<br />
... return result<br />
...<br />
>>> f100 = fib2(100) # invoca<br />
>>> f100 # escreve resultado<br />
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]<br />
Este exemplo, como sempre, demonstra algumas características novas:<br />
• A palavra-chave return termina a função retornando um valor. Se return não for seguido de nada,<br />
então retorna o valor None. Se a função chegar ao fim sem o uso explícito do return, então também será<br />
retornado o valor None.<br />
• O trecho result.append(b) chama um método do objeto lista result. Um método é uma função<br />
que pertence a um objeto e é chamada através de obj.methodname, onde obj é um objeto qualquer,<br />
e methodname é o nome de um método que foi definido pelo tipo do objeto. Tipos diferentes definem<br />
métodos diferentes. Sobretudo, métodos de diferentes tipos podem ser homônimos sem ambiguidade (é<br />
possível definir seus próprios tipos de objetos e métodos, utilizando classes, como será discutido mais tarde<br />
neste tutorial).<br />
1 De fato, passagem por referência para objeto seria uma melhor descrição, pois quando um objeto mutável for passado, o chamador irá<br />
perceber as alterações feitas pelo chamado (como a inserção de itens em uma lista).<br />
22 Capítulo 4. Mais Ferramentas de Controle de Fluxo