13.12.2012 Views

Tutorial Python

Tutorial Python

Tutorial Python

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!