Você está na página 1de 305

Computao

Cientca
com Python

Computao
Cientca
com Python

Uma introduo programao


para cientistas
Flvio Codeo Coelho

Petrpolis  RJ

Edio do Autor
2007

2007 Flvio Codeo Coelho

Todos os direitos reservados.


ISBN: 978-85-907346-0-4
Capa: Mosaico construdo com as guras deste livro imitando o logotipo da
linguagem Python. Concebido e realizado pelo autor, com o auxlio do software
livre Metapixel.
Reviso ortogrca: Paulo F. Coelho e Luciene C. Coelho.
Edio do autor. Petrpolis - RJ - Brasil

Primeira Edio:

Julho 2007

Este livro dedicado minha esposa e meu lho, sem


os quais nada disso valeria a pena.

Agradecimentos
Muitas pessoas foram indispensveis para que este livro se tornasse
uma realidade.

Seria impossvel listar todas elas.

Mas algumas

guras fundamentais merecem uma meno especial.

Richard M. Stallman.

Sem o Software Livre tudo o que eu sei

sobre programao, provavelmente se reduziria a alguns comandos de DOS.

Linus Torvalds.

Sem o Linux, nunca teria me aproximado o su-

ciente da programao para conhecer a linguagem Python.

Guido van Rossum.

Muito obrigado por esta bela linguagem, e

por acreditar que elegncia e clareza so atributos importantes de uma linguagem de programao.

Comunidade Python.

Obrigado por todas esta extenses ma-

ravilhosas ao Python. comunidade de desenvolvedores do


Numpy e Scipy segue um agradecimento especial por facilitar
a adoo do Python por cientistas.
Alem destas pessoas gostaria ainda de agradecer ao Fernando Perez (criador e mantenedor do Ipython) por este incrivelmente til
software e por permitir que eu utilizasse alguns dos exemplos da
sua documentao neste livro.

Sumrio
Sumrio

Lista de Figuras

vii

Lista de Tabelas

Listagens

xi

Prefcio: Computao Cientca

Da Computao Cientca e sua denio pragmtica.


Do porqu esta se diferencia, em metas e ferramentas, da
Cincia da Computao.

Python

xvii

1 Fundamentos da Linguagem

Breve introduo a conceitos bsicos de programao


e linguagem Python. A maioria dos elementos bsicos
da linguagem so abordados neste captulo, com exceo
de classes, que so discutidas em detalhe no captulo 2.
Pr-requisitos: Conhecimentos bsicos de programao
em qualquer linguagem.
i

SUMRIO

ii

1.1

Primeiras impresses . . . . . . . . . . . . . . . . . .

1.2

Uso Interativo

1.3
1.4

Execuo a Partir de Scripts . . .

Operaes com Nmeros . . . . . . . . . . . . . . . .

Nomes, Objetos e Espaos de Nomes . . . . . . . . .

11

Estruturas de Dados . . . . . . . . . . . . . . . . . .

13

Listas

1.5

vs.

. . . . . . . . . . . . . . . . . . . . . . . . . .

13

Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . .

20

Strings . . . . . . . . . . . . . . . . . . . . . . . . . .

22

Dicionrios

24

. . . . . . . . . . . . . . . . . . . . . . .

Conjuntos . . . . . . . . . . . . . . . . . . . . . . . .

27

Controle de uxo . . . . . . . . . . . . . . . . . . . .

28

Condies . . . . . . . . . . . . . . . . . . . . . . . .

28

Iterao

. . . . . . . . . . . . . . . . . . . . . . . . .

Lidando com erros: Excees


1.6

1.7
1.8

Funes

. . . . . . . . . . . . . . . . . . . . . . . . .

34
37

Geradores . . . . . . . . . . . . . . . . . . . . . . . .

38

Decoradores . . . . . . . . . . . . . . . . . . . . . . .

39

Strings de Documentao

41

Mdulos e Pacotes

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

42

Pacotes teis para Computao Cientca . . . . . .

45

Documentando Programas . . . . . . . . . . . . . . .

47

Pydoc

48

. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .

49

Exerccios . . . . . . . . . . . . . . . . . . . . . . . .

50

2 Orientao a Objeto

Introduo programao orientada a objetos e sua


implementao na linguagem Python. Pr-requisitos:
Ter lido o captulo 1.
2.1

29
32

Funes lambda . . . . . . . . . . . . . . . . . . . . .

Epydoc
1.9

. . . . . . . . . . . . .

Objetos

. . . . . . . . . . . . . . . . . . . . . . . . .

Denindo Objetos e seus Atributos em Python

51

52

. . .

53

Adicionando Funcionalidade a Objetos . . . . . . . .

55

Herana . . . . . . . . . . . . . . . . . . . . . . . . .

56

iii

Utilizando Classes como Estruturas de Dados Gen2.2

ricas. . . . . . . . . . . . . . . . . . . . . . . .

57

Exerccios . . . . . . . . . . . . . . . . . . . . . . . .

57

3 Criando Grcos em Python

Introduo produo de guras de alta qualidade utilizando o pacote matplotlib. Pr-requisitos: Captulo 1.

3.1

3.2

Introduo ao Matplotlib

. . . . . . . . . . . . . . .

59

Congurando o MPL . . . . . . . . . . . . . . . . . .

61

Comandos Bsicos

. . . . . . . . . . . . . . . . . . .

62

Exemplos Simples

. . . . . . . . . . . . . . . . . . .

63

O comando

plot . .
subplot

. . . . . . . . . . . . . . . . . .

63

. . . . . . . . . . . . . . . . . .

65

Adicionando Texto a Grcos . . . . . . . . . . . . .

68

Exemplos Avanados . . . . . . . . . . . . . . . . . .

69

Mapas . . . . . . . . . . . . . . . . . . . . . . . . . .

69

O Comando
3.3

4 Ferramentas de Desenvolvimento

Exposio de ferramentas voltadas para o aumento da


produtividade em um ambiente de trabalho em computao cientca. Pr-requisitos: Captulos 1 e 2

4.1

Ipython

. . . . . . . . . . . . . . . . . . . . . . . . .

Primeiros Passos
4.2

73
74

Comandos Mgicos . . . . . . . . . . . . . . . . . . .

75

Editores de Cdigo . . . . . . . . . . . . . . . . . . .

80

Editores Genricos

80

. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .

Controle de Verses em Software

83

. . . . . . . . . . .

86

Entendendo o Mercurial . . . . . . . . . . . . . . . .

88

5 Interagindo com Outras Linguagens

Introduo a vrios mtodos de integrao do Python


com outras linguagens. Pr-requisitos: Captulos 1 e 2.
5.1

73

. . . . . . . . . . . . . . . . . . . .

Editores Especializados
4.3

59

Introduo . . . . . . . . . . . . . . . . . . . . . . . .

99
99

SUMRIO

iv

5.2

Integrao com a Linguagem

. . . . . . . . . . . . 100

Weave . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Ctypes . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Pyrex
5.3

. . . . . . . . . . . . . . . . . . . . . . . . . . 106

Integrao com

C++

. . . . . . . . . . . . . . . . . . . 111

Shedskin . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.4

Integrao com a Linguagem

f2py
5.5

Fortran

. . . . . . . . 117

. . . . . . . . . . . . . . . . . . . . . . . . . . . 118

A Pton que sabia Javans  Integrao com Java


O interpretador Jython

. 126

. . . . . . . . . . . . . . . . 126

Criando Applets em Jython . . . . . . . . . . . . . 128


5.6

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 131

II Aplicaes

133

6 Modelagem Matemtica

Introduo modelagem matemtica e sua implementao computacional. Discusso sobre a importncia da


Anlise dimensional na modelagem e apresentao do pacote Unum para lidar com unidades em Python. Prrequisitos:Conhecimentos bsicos de clculo.
6.1

135

Modelos . . . . . . . . . . . . . . . . . . . . . . . . . 137
Lineares . . . . . . . . . . . . . . . . . . . . . . . . . 137
Exponenciais

6.2

. . . . . . . . . . . . . . . . . . . . . . 142

Construindo Modelos Dinmicos

. . . . . . . . . . . 145

Modelando Iterativamente . . . . . . . . . . . . . . . 145


Integrao Numrica . . . . . . . . . . . . . . . . . . 148
6.3

Grandezas, Dimenses e Unidades


Anlise Dimensional

. . . . . . . . . . 155

. . . . . . . . . . . . . . . . . . 158

O Pacote Unum . . . . . . . . . . . . . . . . . . . . . 159


6.4

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 167

7 Teoria de Grafos

Breve introduo a teoria de grafos e sua representao computacional. Introduo ao Pacote NetworkX,
voltado para a manipulao de grafos. Pr-requisitos:
Programao orientada a objetos.
7.1
7.2

169

Introduo . . . . . . . . . . . . . . . . . . . . . . . . 169
NetworkX . . . . . . . . . . . . . . . . . . . . . . . . 172
Construindo Grafos . . . . . . . . . . . . . . . . . . . 173
Manipulando Grafos

. . . . . . . . . . . . . . . . . . 174

Criando Grafos a Partir de Outros Grafos . . . . . . 175


Gerando um Grafo Dinamicamente . . . . . . . . . . 176
Construindo um Grafo a Partir de Dados
7.3

. . . . . . 179

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 182

8 Interao com Bancos de Dados

Apresentao dos mdulos de armazenamento de dados Pickle e Sqlite3 que fazem parte da distribuio padro do Python. Apresentao do pacote SQLObject para
comunicao com os principais sistemas de bancos de dados existentes. Pr-requisitos: Conhecimentos bsicos
de bancos de dados e SQL.

185

8.1

O Mdulo Pickle

8.2

O mdulo Sqlite3 . . . . . . . . . . . . . . . . . . . . 187

8.3

. . . . . . . . . . . . . . . . . . . . 186

O Pacote SQLObject . . . . . . . . . . . . . . . . . . 190


Construindo um aranha digital

8.4

. . . . . . . . . . . . 190

Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 197

9 Simulaes Estocsticas

Seleo de problemas relacionados com a simulao e


anlise de processos estocsticos. Pr-requisitos: Conhecimentos avanados de estatstica.
9.1

199

Nmeros Aleatrios . . . . . . . . . . . . . . . . . . . 199


Hipercubo Latino - LHS . . . . . . . . . . . . . . . . 200

9.2

Inferncia Bayesiana

. . . . . . . . . . . . . . . . . . 203

SUMRIO

vi

9.3
9.4

Simulaoes Estocsticas

. . . . . . . . . . . . . . . . 205

Integrao Monte Carlo

. . . . . . . . . . . . . . . . 205

Amostragem por Rejeio

. . . . . . . . . . . . . . . 207

Mtodo do Envelope . . . . . . . . . . . . . . . . . . 208


Aplicando ao Teorema de Bayes . . . . . . . . . . . . 210
9.5
9.6

Cadeias de Markov . . . . . . . . . . . . . . . . . . . 214


MCMC (Markov Chain Monte Carlo)

. . . . . . . . 217

O Amostrador de Metropolis-Hastings

. . . . . . . . 217

O Amostrador de Gibbs
9.7

. . . . . . . . . . . . . . . . 220

Mtodos Monte Carlo Sequenciais

. . . . . . . . . . 223

Sampling Importance Resampling  SIR . . . . . . . 224


9.8

Funes de Verossimilhana . . . . . . . . . . . . . . 229


Denio da funo de verossimilhana . . . . . . . . 229

9.9

Inferncia Bayesiana com Objetos.

. . . . . . . . . . 235

9.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 248

Console Gnu/Linux

Guia de sobrevivncia no console do Gnu/Linux

A linguagem BASH

253

. . . . . . . . . . . . . . . . . . . . . 254

Alguns Comando teis . . . . . . . . . . . . . . . . . 254


Entradas e Sadas, redirecionamento e "Pipes". . . . . . . 257
Redirecionamento . . . . . . . . . . . . . . . . . . . . 258
Pipelines . . . . . . . . . . . . . . . . . . . . . . . . 258
Prolas Cientcas do Console Gnu/Linux . . . . . . . . . 259
Gnu plotutils

ndice Remissivo

. . . . . . . . . . . . . . . . . . . . . . 259

267

Lista de Figuras
HTML

da documentao gerada pelo

Epydoc.

1.1

Verso

3.1

Histograma simples a partir da listagem 3.2 . . . . . . .

61

3.2

Reta simples a partir da listagem 3.3 . . . . . . . . . . .

63

3.3

Grco com smbolos circulares a partir da listagem 3.4

65

3.4

Figura com dois grcos utilizando o comando subplot,


a partir da listagem 3.5

3.5
3.6
4.1

. . .

. . . . . . . . . . . . . . . . . .

50

67

Formatao de texto em guras. Gerada pela listagem


3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

Mapa mundi na projeo de Robinson. . . . . . . . . . .

72

Editor emacs em modo Python e com Code Browser


ativado

. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .

82

4.2

Editor Scite.

4.3

Editor Gnu Nano.

4.4

Editor Jython Jedit

. . . . . . . . . . . . . . . . . . .

85

4.5

IDE Boa-Constructor

. . . . . . . . . . . . . . . . . . .

86

4.6

IDE Eric.

4.7

IDE Pydev

. . . . . . . . . . . . . . . . . . . . .

83
84

. . . . . . . . . . . . . . . . . . . . . . . . . .

87

. . . . . . . . . . . . . . . . . . . . . . . . .

88

4.8

Diagrama de um repositrio do Mercurial. . . . . . . . .

89

4.9

Operao de commit. . . . . . . . . . . . . . . . . . . .

90

4.10 Repositrio da Ana.

. . . . . . . . . . . . . . . . . . . .
vii

91

LISTA DE FIGURAS

viii

4.11 Modicaes de Bruno.

. . . . . . . . . . . . . . . . . .

92

4.12 Modicaes de Ana. . . . . . . . . . . . . . . . . . . . .

92

4.13 Repositrio atualizado de Bruno. . . . . . . . . . . . . .

93

4.14 Repositrio de Bruno aps a fuso. . . . . . . . . . . . .

94

5.1

Comparao da performance entre o Python e o


ave) para um loop simples.

(we-

O eixo y est em escala

logaritmica para facilitar a visualizao das curvas. . . . 103


5.2

Regra trapezoidal para integrao aproximada de uma


funo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

5.3
6.1

Sada da listagem 5.25. . . . . . . . . . . . . . . . . . . . 129


Diagrama de disperso do exemplo do taxi. A reta superior descreve o cenrio com bandeirada e a inferior,
sem bandeirada.

6.2

. . . . . . . . . . . . . . . . . . . . . . 139

Populao crescendo de forma linear, devido chegada


de um nmero constante de novos indivduos por ano.

6.3

um nmero constante de indivduos por ano.


6.4

. . . . . . . . . . . . . . . . . . . . . . . . 142

b.

. . . . . . . . . . . . . . . . . . . . . . . . 143

Crescimento de uma populao de bactrias por bipartio.

6.7

a.

Representao grca de um modelo linear. Efeito do


parmetro

6.6

. . . . . . 141

Representao grca de um modelo linear. Efeito do


parmetro

6.5

. 140

Populao diminui de forma linear, devido saida de

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Modelos populacionais discretos. Modelo 2 esquerda


e modelo 1 direita. . . . . . . . . . . . . . . . . . . . . 146

6.8

Grco com o resultado da integrao do modelo 6.2.

. 153

7.1

Um grafo simples.

7.2

Diagrama de um grafo . . . . . . . . . . . . . . . . . . . 174

7.3

Grafo, produto cartesiano e complemento. . . . . . . . . 177

7.4

Resultado da simulao do exemplo 7.5. . . . . . . . . . 180

7.5

Rede social a partir de mensagens de email. . . . . . . . 183

. . . . . . . . . . . . . . . . . . . . . 171

ix

9.1

Amostragem (n=20) de uma distribuio normal com


mdia 0 por LHS (histograma mais escuro) e amostragem padro do scipy (histograma mais claro). . . . . . . 201

9.2

Distribuio acumulada da varivel

x N (0, 1),

mos-

trando o particionamento do espao amostral em segmentos equiprovveis.


9.3

. . . . . . . . . . . . . . . . . . . 202

Resultado da amostragem por envelope de uma distribuio beta(1,1)

. . . . . . . . . . . . . . . . . . . . . . 211

9.4

Amostragem por rejeio da posterior Bayesiana. . . . . 214

9.5

Cadeia de Markov com kernel de transio exponencial.

9.6

Amostrador de Metropolis-Hastings(n=10000).

9.7

216

. . . . . 220

Estrutura de dependncia circular utilizada na listagem


9.7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

9.8

Amostrador de Gibbs aplicado a uma distribuio trivariada.

9.9

. . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Processo markoviano e suas observaes. . . . . . . . . . 225

9.10 Funo de verossimilhana para a comparao de sequncias de DNA.

. . . . . . . . . . . . . . . . . . . . . . . . 232

9.11 Log-verossimilhana da funo descrita anteriormente. . 234


9.12 Resultado da listagem 9.21. . . . . . . . . . . . . . . . . 243
1

Konsole: janela contendo uma sesso bash (ou outra)

Usando

Interpolando uma curva em um plano. . . . . . . . . . . 263

Atrator de Lorenz. . . . . . . . . . . . . . . . . . . . . . 266

no KDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

spline. .

. . . . . . . . . . . . . . . . . . . . . . 262

Lista de Tabelas
1.1

Mtodos de Listas. . . . . . . . . . . . . . . . . . . . . .

16

1.2

Mtodos de Dicionrios. . . . . . . . . . . . . . . . . . .

26

3.1

Principais comandos de plotagem do MPL . . . . . . . .

62

3.2

Argumentos que podem ser passados juntamente com a


funo plot para controlar propriedades de linhas.

. . .

66

3.3

Argumentos opcionais dos comandos de insero de texto. 68

6.1

Valor de corridas de taxi . . . . . . . . . . . . . . . . . . 138

6.2

Dimenses bsicas. . . . . . . . . . . . . . . . . . . . . . 156

6.3

Dimenses derivadas. . . . . . . . . . . . . . . . . . . . . 157

6.4

Prexos de Unidades . . . . . . . . . . . . . . . . . . . . 165

Listagens
1.1

O console interativo do Python . . . . . . . . . . . .

1.2

Palavras reservadas no podem ser utilizadas como

1.3

Denio da palavra reservada

1.4

Usando o Python como uma calculadora.

. . . . . .

1.5

Executando script.py via comando de linha. . . . . .

1.7

Executando um script Python executvel.

. . . . . .

1.6

Tornando um script executvel

. . . . . . . . . . . .

1.8

Operaes aritmticas

. . . . . . . . . . . . . . . . .

1.9

Atribuindo valores

. . . . . . . . . . . . . . . . . . .

nomes de variveis

. . . . . . . . . . . . . . . . . . .

for. .

. . . . . . . . .

1.10 Atribuindo o mesmo valor a mltiplas variveis . . .


1.11 Nmeros complexos

3
4
5

. . . . . . . . . . . . . . . . . .

10

1.12 Explorando nmeros complexos . . . . . . . . . . . .

10

1.13 Atribuindo objetos a nomes (variveis) . . . . . . . .

11

1.14 Exemplo de NameError

. . . . . . . . . . . . . . . .

12

. . . . . . . . . . . . . . . . . . . . .

14

1.16 Fatiando uma lista . . . . . . . . . . . . . . . . . . .

14

1.17 Selecionando o nal de uma lista. . . . . . . . . . . .

15

1.18 selecionando todos os elementos de uma lista. . . . .

15

1.19 Adicionando elementos a listas. . . . . . . . . . . . .

16

1.20 Estendendo uma lista.

. . . . . . . . . . . . . . . . .

17

1.21 Efetuando buscas em listas. . . . . . . . . . . . . . .

17

1.22 Removendo elementos de uma lista. . . . . . . . . . .

18

1.15 Criando listas.

xi

LISTAGENS

xii

1.23 Operaes com listas . . . . . . . . . . . . . . . . . .

18

1.24 Criando listas numricas sequenciais. . . . . . . . . .

19

1.25 Denindo uma Tupla.

. . . . . . . . . . . . . . . . .

20

1.26 Outras formas de denir tuplas. . . . . . . . . . . . .

20

1.27 Strings.

22

. . . . . . . . . . . . . . . . . . . . . . . . .

1.28 Formatando strings.

. . . . . . . . . . . . . . . . . .

23

1.29 Problemas com a concatenao de strings. . . . . . .

24

1.30 Criando e manipulando dicionrios. . . . . . . . . . .

24

1.31 Iterando dicionrios.

25

. . . . . . . . . . . . . . . . . .

1.32 Exemplo do emprego de ramicaes.


1.33 Implementando a funcionalidade de

if

. . . . . . . .
e

elif

28

por

meio de um dicionrio. . . . . . . . . . . . . . . . . .

29

1.34 Comandos de lao no Python. . . . . . . . . . . . . .

30

1.35 A funo enumerate. . . . . . . . . . . . . . . . . . .

30

1.36 Iterando sobre mais de uma sequncia. . . . . . . . .

31

1.37 Iterando sobre uma sequncia ordenada. . . . . . . .

31

1.38 Exemplo de uma exceo

32

. . . . . . . . . . . . . . .

1.39 Contornando uma diviso por zero

. . . . . . . . . .

1.40 Lidando com diferentes tipos de erros.

. . . . . . . .

33
34

1.41 Denindo uma funo com um argumento obrigatrio e outro opcional (com valor default"). . . . . . .

35

1.42 lista de argumentos varivel . . . . . . . . . . . . . .

36

1.43 Desempacotando argumentos. . . . . . . . . . . . . .

36

1.44 Passando todos os argumentos por meio de um dicionrio. . . . . . . . . . . . . . . . . . . . . . . . . . .

37

1.45 Retornando valores a partir de uma funo. . . . . .

37

1.46 Funes lambda . . . . . . . . . . . . . . . . . . . . .

38

1.47 Geradores . . . . . . . . . . . . . . . . . . . . . . . .

38

1.48 Decorador bsico. . . . . . . . . . . . . . . . . . . . .

39

1.49 Utilizando um decorador . . . . . . . . . . . . . . . .

39

1.50 Limpando a gerao de decoradores . . . . . . . . . .

40

1.51 Usando Docstrings

. . . . . . . . . . . . . . . . . . .

41

. . . . . . . . . . . . . . . . . . . .

43

1.52 Mdulo exemplo

1.53 Executing a module from the console.

. . . . . . . .

44

xiii

1.54 importing a package

. . . . . . . . . . . . . . . . . .

45

1.55 Calculando e mostrando o determinante de uma matriz.

. . . . . . . . . . . . . . . . . . . . . . . . . . .

1.56 Listando as opes do Epydoc.

45

. . . . . . . . . . . .

49

2.1

Denindo uma classe . . . . . . . . . . . . . . . . . .

53

2.2

Denindo atributos de uma classe . . . . . . . . . . .

54

caption=Instanciando uma classe.,label=ex:classe3 . . . .

54

2.3

Passando atributos na criao de um objeto . . . . .

54

2.4

Herana . . . . . . . . . . . . . . . . . . . . . . . . .

56

2.5

Classe como uma estrura de dados

. . . . . . . . . .

57

3.1

Instalando o matplotlib

. . . . . . . . . . . . . . . .

60

3.2

Criando um histograma no modo interativo

. . . . .

60

3.3

Grco de linha . . . . . . . . . . . . . . . . . . . . .

63

3.4

Grco de pontos com valores de

64

3.5

Figura com dois grcos utilizando o comando subplot. 66

3.6

Formatando texto e expresses matemticas . . . . .

69

3.7

Plotando o globo terrestre . . . . . . . . . . . . . . .

70

5.1

Otimizao de loops com o

5.2

Calculando iterativamente a srie de Fibonacci em

5.3

Executando o cdigo do exemplo 5.2. . . . . . . . . . 105

5.4

Carregando bibliotecas em

5.5

Chamando fues em bibliotecas importadas com o

5.6

Calculando nmeros primos em Pyrex

5.7

Gerando Compilando e linkando

5.8

Calculando nmeros primos em Python

5.9

Comparando performances dentro do ipython . . . . 110

Python e em

ctypes

weave

C(weave.inline)
C.

x e y especicados.

. . . . . . . . . . . 100

. . . . . . . . . . . . 102
. . . . . . . . . . . . . 106

. . . . . . . . . . . . . . . . . . . . . . . . . . 106
. . . . . . . . 107

. . . . . . . . . . . 108
. . . . . . . 109

5.10 Automatizando a compilao de extenses em

Pyrex

por meio do setuptools . . . . . . . . . . . . . . . . . 110


5.11 Utilizando Setuptools para compilar extenses em
Pyrex

. . . . . . . . . . . . . . . . . . . . . . . . . . 111

5.12 implementao da regra trapezoidal(utilizando lao


for) conforme especicada na equao 5.3

. . . . . . 112

LISTAGENS

xiv

5.13 Executando a listagem 5.12

. . . . . . . . . . . . . . 114

C++ . . . . . .
C++ gerado pelo Shed-skin a partir do script

5.14 Vericando o tempo de execuo em


5.15 Cdigo

trapintloopy.py

. . . . . . . . . . . . . . . . . . . . . 115

5.16 implementao em

Fortran da regra trapezoidal.

label118

5.17 Compilando e executando o programa da listagem


5.18 Compilando com

f2py

Fortran via

. . . . . . . . . . . . . . . . . . . . . . . . . . . 121

5.20 Executando

trapintloopcomp.py

. . . . . . . . . . 123

5.21 Implementao vetorizada da regra trapezoidal


5.22
5.23

?? 120

. . . . . . . . . . . . . . . . . 121

5.19 Script para comparao entre Python e

f2py

. 114

. . . 123

setup.py para distribuir programas com extenses


em Fortran . . . . . . . . . . . . . . . . . . . . . .
Usando o interpretador Jython . . . . . . . . . . .

. 125
. 127

5.24 Um programa simples em Java usando a classe Swing.127


5.25 Verso Jython do programa da listagem 5.24.

Jython

5.26 Criando um applet em


5.27 Compilando appletp.py

. . . . 128

. . . . . . . . . . . . 128

. . . . . . . . . . . . . . . . 129

5.28 Documento HTML contendo o applet.

. . . . . . . 130

6.1

Dois modelos discretos de crescimento populacional . 147

6.2

Integrando um sistema de equaes diferenciais or-

6.3

Integrao numrica utilizando a classe ODE. . . . . 153

6.4

Criando novas unidades. . . . . . . . . . . . . . . . . 162

7.1

Denindo um grafo como um dicionrio. . . . . . . . 170

7.2

Obtendo a lista de vrtices.

7.3

Denindo um grafo atravs de seus vrtices

7.4

Diagrama de um grafo . . . . . . . . . . . . . . . . . 172

7.5

Construindo um grafo dinamicamente

7.6

Construindo uma rede social a partir de e-mails . . . 179

8.1

Exemplo de uso do mdulo

8.2

Mdulos necessrios

8.3

Especicando o banco de dados.

8.4

Especicando a tabela

dinrias

. . . . . . . . . . . . . . . . . . . . . . . . . 149

. . . . . . . . . . . . . . 171

pickle

. . . . . 172

. . . . . . . . 176

. . . . . . . . . . 186

. . . . . . . . . . . . . . . . . . 190

ideia

. . . . . . . . . . . 191

do banco de dados. . . 192

xv

8.5

Restante do cdigo da aranha.

9.1

Amostragem por Hipercubo latino (LHS)

9.2

Integrao Monte Carlo

9.3

Amostragem por rejeio utilizando o mtodo do en-

9.4

Amostragem da Posterior Bayesiana por rejeio. . . 212

9.5

Cadeia de Markov com kernel de transio exponencial215

9.6

Amostrador de Metropolis-Hastings . . . . . . . . . . 218

9.7

Amostrador de Gibbs aplicado uma distribuio

9.8

Filtro de partculas usando algoritmo SIR

9.9

Funo de verossimilhana para

velope

. . . . . . . . . . . . 193
. . . . . . 201

. . . . . . . . . . . . . . . . 206

. . . . . . . . . . . . . . . . . . . . . . . . . . 209

tri-variada . . . . . . . . . . . . . . . . . . . . . . . . 221

igual a

. . . . . . 225

0.

. . . . . 230

9.10 Calculando a verossimilhana da comparao de duas


sequncias de DNA . . . . . . . . . . . . . . . . . . . 231
9.11 Log-verossimilhana

. . . . . . . . . . . . . . . . . . 234

9.12 Maximizando a verossimilhana . . . . . . . . . . . . 235


9.13 Classe Varivel Aleatria Bayesiana  Requisitos. . . 236
9.14 Classe Varivel Aleatria Bayesiana  Inicializao. . 237
9.15 Classe Varivel Aleatria Bayesiana  Herana dinmica de mtodos. . . . . . . . . . . . . . . . . . . . . 238
9.16 Classe Varivel Aleatria Bayesiana  Herana dinmica de mtodos. . . . . . . . . . . . . . . . . . . . . 238
9.17 Classe Varivel Aleatria Bayesiana  Adio de dados e clculo da Verossimilhana. . . . . . . . . . . . 239
9.18 Classe Varivel Aleatria Bayesiana  Amostras e
PDF da

a priori.

. . . . . . . . . . . . . . . . . . . . 240

9.19 Classe Varivel Aleatria Bayesiana  Gerando a


posterior.

. . . . . . . . . . . . . . . . . . . . . . . . 241

9.20 Classe Varivel Aleatria Bayesiana  Cdigo de teste.242


9.21 Classe Varivel Aleatria Bayesiana  Listagem completa . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
22

Redirecionando STDIN e STDOUT . . . . . . . . . . 258

23

Lista ordenada dos usurios do sistema.

24

Plotando dados em um arquivo. . . . . . . . . . . . . 260

. . . . . . . 258

LISTAGENS

xvi

25

Desenhando um quadrado. . . . . . . . . . . . . . . . 261

26

Uso do

27

Interpolando uma curva em um plano. . . . . . . . . 261

28

spline

. . . . . . . . . . . . . . . . . . . . . 261

Resolvendo uma equao diferencial simples no console do Linux. . . . . . . . . . . . . . . . . . . . . . . 264

29

Sistema de trs equaes diferenciais acopladas

. . . 265

Prefcio: Computao
Cientca
Da Computao Cientca e sua denio pragmtica.
Do porqu esta se diferencia, em metas e ferramentas,
da Cincia da Computao.

omputao

cientca no uma rea do conhecimento muito

bem denida. A denio utilizada neste livro a de uma rea

de atividade/conhecimento que envolve a utilizao de ferramentas


computacionais (software) para a soluo de problemas cientcos
em reas da cincia no necessariamente ligadas disciplina da
cincia da computao, ou seja, a computao para o restante da
comunidade cientca.
Nos ltimos tempos, a computao em suas vrias facetas, tem
se tornado uma ferramenta universal para quase todos os segmentos
da atividade humana. Em decorrncia, podemos encontrar produtos computacionais desenvolvidos para uma enorme variedade de
aplicaes, sejam elas cientcas ou no. No entanto, a diversidade
de aplicaes cientcas da computao quase to vasta quanto
o prprio conhecimento humano.

Por isso, o cientista frequente-

mente se encontra com problemas para os quais as ferramentas


computacionais adequadas no existem.
No desenvolvimento de softwares cientcos, temos dois modos
principais de produo de software: o desenvolvimento de softwares
comerciais, feito por empresas de software que contratam prograxvii

xviii

PREFCIO: COMPUTAO CIENTFICA

madores prossionais para o desenvolvimento de produtos voltados


para uma determinada aplicao cientca, e o desenvolvimento
feito por cientistas (fsicos, matemticos, bilogos, etc., que no
so programadores prossionais), geralmente de forma colaborativa atravs do compartilhamento de cdigos fonte.
Algumas disciplinas cientcas, como a estatstica por exemplo,
representam um grande mercado para o desenvolvimento de softwares comerciais genricos voltados para as suas principais aplicaes,
enquanto que outras disciplinas cientcas carecem de massa crtica
(em termos de nmero de prossionais) para estimular o desenvolvimento de softwares comerciais para a soluo dos seus problemas
computacionais especcos.

Como agravante, o desenvolvimento

lento e centralizado de softwares comerciais, tem se mostrado incapaz de acompanhar a demanda da comunidade cientca, que precisa ter acesso a mtodos que evoluem a passo rpido. Alm disso,
esto se multiplicando as disciplinas cientcas que tm como sua
ferramenta principal de trabalho os mtodos computacionais, como
por exemplo a bio-informtica, a modelagem de sistemas complexos, dinmica molecular e etc.
Cientistas que se vem na situao de terem de desenvolver
softwares para poder viabilizar seus projetos de pesquisa, geralmente tm de buscar uma formao improvisada em programao
e produzem programas que tem como caracterstica bsica serem
minimalistas, ou seja, os programas contm o mnimo nmero de
linhas de cdigo possvel para resolver o problema em questo. Isto
se deve conjugao de dois fatos: 1) O cientista raramente possui
habilidades como programador para construir programas mais sosticados e 2) Frequentemente o cientista dispe de pouco tempo
entre suas tarefas cientcas para dedicar-se programao.
Para complicar ainda mais a vida do cientista-programador, as
linguagens de programao tradicionais foram projetadas e desenvolvidas por programadores para programadores e voltadas ao desenvolvimento de softwares prossionais com dezenas de milhares
de linhas de cdigo. Devido a isso, o nmero de linhas de cdigo

xix

mnimo para escrever um programa cientco nestas linguagens


muitas vezes maior do que o nmero de linhas de cdigo associado
com a resoluo do problema em questo.
Quando este problema foi percebido pelas empresas de software cientco, surgiu uma nova classe de software, voltado para a
demanda de cientistas que precisavam implementar mtodos computacionais especcos e que no podiam esperar por solues comerciais.
Esta nova classe de aplicativos cientcos, geralmente inclui uma
linguagem de programao de alto nvel, por meio da qual os cientistas podem implementar seus prprios algoritmos, sem ter que
perder tempo tentando explicar a um programador prossional o
que, exatamente, ele deseja.

Exemplos destes produtos incluem

TM , MathematicaTM , MapleTM , entre outros.

MATLAB

Nestes

aplicativos, os programas so escritos e executados dentro do prprio aplicativo, no podendo ser executados fora dos mesmos. Estes
ambientes, entretanto, no possuem vrias caractersticas importantes das linguagens de programao: No so portteis, ou seja,
no podem ser levados de uma mquina para a outra e executados a menos que a mquina-destino possua o aplicativo gerador do

TM , etc.) que custa milhares de dlares por

programa (MATLAB

licena, Os programas no podem ser portados para outra plataforma computacional para a qual no exista uma verso do aplicativo gerador. E, por ltimo e no menos importante, o programa
produzido pelo cientista no lhe pertence, pois, para ser executado,
necessita de cdigo proprietrio do ambiente de desenvolvimento
comercial.
Este livro se prope a apresentar uma alternativa livre (baseada em Software Livre), que combina a facilidade de aprendizado e
rapidez de desenvolvimento, caractersticas dos ambientes de desenvolvimento comerciais apresentados acima, com toda a exibilidade
das linguagens de programao tradicionais. Programas cientcos
desenvolvidos inteiramente com ferramentas de cdigo aberto tem
a vantagem adicional de serem plenamente escrutinveis pelo sis-

PREFCIO: COMPUTAO CIENTFICA

xx

tema de reviso por pares (peer review), mecanismo central da


cincia para validao de resultados.
A linguagem Python apresenta as mesmas solues propostas
pelos ambientes de programao cientca, mantendo as vantagens
de ser uma linguagem de programao completa e de alto nvel.

Apresentando o Python
O Python uma linguagem de programao dinmica e orientada
a objetos, que pode ser utilizada no desenvolvimento de qualquer
tipo de aplicao, cientca ou no.

O Python oferece suporte

integrao com outras linguagens e ferramentas, e distribuido com


uma vasta biblioteca padro. Alm disso, a linguagem possui uma
sintaxe simples e clara, podendo ser aprendida em poucos dias.
O uso do Python frequentemente associado com grandes ganhos
de produtividade e ainda, com a produo de programas de alta
qualidade e de fcil manuteno.
A linguagem de programao Python

1 comeou a ser desen-

volvida ao nal dos anos 80, na Holanda, por Guido van Rossum.
Guido foi o principal autor da linguagem e continua at hoje desempenhando um papel central no direcionamento da evoluo. Guido
reconhecido pela comunidade de usurios do Python como Benevolent Dictator For Life (BDFL), ou ditador benevolente vitalcio
da linguagem.
A primeira verso pblica da linguagem (0.9.0) foi disponibilizada.

Guido continou avanando o desenvolvimento da lingua-

gem, que alcanou a verso 1.0 em 1994. Em 1995, Guido emigrou


para os EUA levando a responsabilidade pelo desenvolvimento do
Python, j na verso 1.2, consigo. Durante o perodo em que Guido

trabalhou para o CNRI , o Python atingiu a verso 1.6, que foi rpidamente seguida pela verso 2.0. A partir desta verso, o Python

1 www.python.org
2 Corporation for National

Research Initiatives

xxi

passa a ser distribudo sob a Python License, compatvel com a

GPL , tornando-se ocialmente software livre. A linguagem passa


a pertencer ocialmente Python Software Foundation. Apesar da
implementao original do Python ser desenvolvida na Linguagem
C (CPython), Logo surgiram outras implementaes da Lingua-

gem, inicialmente em Java (Jython ), e depois na prpria lingua-

5
gem Python (PYPY ), e na plataforma

.NET

(IronPython ).

Dentre as vrias caractersticas da linguagem que a tornam interessante para computao cientca, destacam-se:

Multiplataforma:

O Python pode ser instalado em qualquer pla-

taforma computacional: Desde PDAs at supercomputadores


com processamento paralelo, passando por todas as plataformas de computao pessoal.

Portabilidade:

Aplicativos desenvolvidos em Python podem ser

facilmente distribudos para vrias plataformas diferentes daquela em que foi desenvolvido, mesmo que estas no possuam
o Python instalado.

Software Livre:

O Python software livre, no impondo qual-

quer limitao distribuio gratuita ou venda de programas.

Extensibilidade:

O Python pode ser extendido atravs de m-

dulos,escritos em Python ou rotinas escritas em outras linguagens, tais como C ou Fortran (Mais sobre isso no captulo
5).

Orientao a objeto:

Tudo em Python um objeto:

funes,

variveis de todos os tipos e at mdulos (programas escritos


em Python) so objetos.

3 GNU General Public License


4 www.jython.org
5 pypy.org
6 www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython

PREFCIO: COMPUTAO CIENTFICA

xxii

Tipagem automtica:
oat, etc.)

O tipo de uma varivel (string, inteiro,

determinado durante a execuo do cdigo;

desta forma, voc no necessita perder tempo denindo tipos


de variveis no seu programa.

Tipagem forte:

Variveis de um determinado tipo no podem

ser tratadas como sendo de outro tipo. Assim, voc no pode


somar a string '123' com o inteiro 3. Isto reduz a chance de
erros em seu programa. A variveis podem, ainda assim, ser
convertidas para outros tipos.

Cdigo legvel:

O Python, por utilizar uma sintaxe simplicada

e forar a diviso de blocos de cdigo por meio de indentao, torna-se bastante legvel, mesmo para pessoas que no
estejam familiarizadas com o programa.

Flexibilidade:

O Python j conta com mdulos para diversas

aplicaes, cientcas ou no, incluindo mdulos para interao com os protocolos mais comuns da Internet (FTP, HTTP,
XMLRPC, etc.). A maior parte destes mdulos j faz parte
da distribuio bsica do Python.

Operao com arquivos:

A manipulao de arquivos, tais como

a leitura e escrita de dados em arquivos texto e binrio,


muito simplicada no Python, facilitando a tarefa de muitos
pesquisadores ao acessar dados em diversos formatos.

Uso interativo:

O Python pode ser utilizado interativamente, ou

invocado para a execuco de scripts completos. O uso interativo permite experimentar comandos antes de inclu-los em
programas mais complexos, ou usar o Python simplesmente
como uma calculadora.

etc...
Entretanto, para melhor compreender todas estas vantagens
apresentadas, nada melhor do que comear a explorar exemplos

xxiii

de computao cientca na linguagem Python. Mas para inspirar


o trabalho tcnico, nada melhor do que um poema:

import

1 >>>

2 The Zen
3
4

Beautiful

Explicit

Simple

Complex
Flat

Sparse

Python ,

better

is

than

better

Readability

11

Special

12

Although

13

Errors

aren ' t

never

Unless

explicitly

15

In

face

of

should

19

is

to

be

that

first

18 Now

If

the
's

21

If

the

way

way may

is

bad

's

23 >>>

do

the

preferably
do

only

it .

be

obvious

at

Dutch .

never .
better

than

right

is

hard

to

explain ,

it

is

easy

to

explain ,

it

idea .

implementation

Namespaces

purity .

refuse

not

often

implementation
a

to

you ' r e

than

never

may be

22

break

guess .

now .

20

to

silently .

one and

unless

better

Although

enough

silenced .

o b v i o u s

Although

beats

pass

ambiguity ,

temptation

17

special

practicality

14

one

dense .

rules .

should

the

nested .

than

counts .

cases

the

There

Peters

i s b e t t e r than u g l y .
i s b e t t e r than i m p l i c i t .

10

16

by Tim

i s b e t t e r than complex .
i s b e t t e r than c o m p l i c a t e d .

is

this

of

good

are

one

more

of

idea .
honking
those !

great

idea

let

PREFCIO: COMPUTAO CIENTFICA

xxiv

Usando este Livro

Este livro foi planejado visando a versatilidade de uso. Sendo assim,


ele pode ser utilizado como livro didtico (em cursos formais) ou
como referncia pessoal para auto-aprendizagem ou consulta.
Como livro didtico, apresenta, pelo menos, dois nveis de aplicao possveis:
1. Um curso introdutrio linguagem Python, no qual se faria
uso dos captulos da primeira parte.

O nico pr-requisito

seria uma exposio prvia dos alunos a conceitos bsicos


de programao (que poderia ser condensada em uma nica
aula).
2. Um curso combinado de Python e computao cientca. O
autor tem ministrado este tipo de curso com grande sucesso.
Este curso faria uso da maior parte do contedo do livro, o
instrutor pode selecionar captulos de acordo com o interesse
dos alunos.
Como referncia pessoal, este livro atende a um pblico bastante amplo, de leigos a cientistas.

No incio de cada captulo

encontram-se os pr-requisitos para se entender o seu contedo.


Mas no se deixe inibir; as aplicaes cientcas so apresentadas
juntamente com uma breve introduo teoria que as inspira.
Recomendo aos auto-didatas que explorem cada exemplo contido no livro; eles ajudaro enormemente na compreenso dos t-

picos apresentados . Para os leitores sem sorte, que no dispem


de um computador com o sistema operacional GNU/Linux instalado, sugiro que o instalem, facilitar muito o acompanhamento dos
exemplos. Para os que ainda no esto prontos para abandonar o

7O

cdigo fonte do exemplos est disponvel na seguinte URL:

fccoelho.googlepages.com/CCP_code.zip

http://

xxv

Windows

TM , instalem o Linux em uma mquina virtual8 ! A dis-

tribuio que recomendo para iniciantes o Ubuntu (www.ubuntu.

com).

Enm, este livro foi concebido para ser uma leitura prazeirosa
para indivduos curiosos como eu, que esto sempre interessados
em aprender coisas novas!
Bom Proveito! Flvio Codeo Coelho

Petrpolis, 2007

8 Recomendo
tstico!

o VirtualBox (www.virtualbox.org), software livre e fan-

Parte I

Introduo ao Python e
Ferramentas de
Desenvolvimento

Captulo 1

Fundamentos da Linguagem
Breve introduo a conceitos bsicos de programao e
linguagem Python. A maioria dos elementos bsicos
da linguagem so abordados neste captulo, com exceo
de classes, que so discutidas em detalhe no captulo 2.
Pr-requisitos: Conhecimentos bsicos de programao em qualquer linguagem.

este

Captulo, faremos uma breve introduo linguagem

Python.

Esta introduo servir de base para os exemplos

dos captulos subseqentes. Para uma introduo mais completa


linguagem, recomendamos ao leitor a consulta a livros e outros documentos voltados especicamente para programao em Python.

1.1 Primeiras impresses


Para uma primeira aproximao linguagem, vamos examinar suas
caractersticas bsicas. Faamos isso interativamente, a partir do
console Python. Vejamos como invoc-lo:
Listagem 1.1: O console interativo do Python

python
3

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

Python

2.5.1

( r251 :54863 ,

May

2007 ,

16:56:35)

[GCC 4 . 1 . 2

( Ubuntu

4 . 1 . 2 0 u bu n tu 4 ) ]

linux2

4 Type " h e l p " ,


license"

" copyright " ,

for

more

" credits "

on

or

"

information .

5 >>>
Toda linguagem, seja ela de programao ou linguagem natural,
possui um conjunto de palavras que a caracteriza. As linguagens
de programao tendem a ser muito mais compactas do que as
linguagens naturais. O Python pode ser considerado uma linguagem compacta, mesmo em comparao com outras linguagens de
programao.
As palavras que compem uma linguagem de programao so
ditas reservadas, ou seja, no podem ser utilizadas para nomear
variveis. Se o programador tentar utilizar uma das palavras reservadas como varivel, incorrer em um erro de sintaxe.
Listagem 1.2: Palavras reservadas no podem ser utilizadas como
nomes de variveis

1 >>>
2
3
4
5

for =1

File

"<s t d i n >" ,

for =1

line

^
SyntaxError :

invalid

syntax

A linguagem Python em sua verso atual (2.5), possui 30 pala-

and, as, assert, break, class, continue,


def, del, elif, else, except, exec, finally, for, from, global,
if, import, in, is, lambda, not, or, pass, print, raise, return,
try, while e yield. Alm destas palavras, existem constantes,
vras reservadas. So elas:

tipos e funes internas ao Python, que esto disponveis para a


construo de programas. Estes elementos podem ser inspecionados atravs do comando

dir(__builtins__).

Nenhum dos ele-

1.2. USO INTERATIVO


SCRIPTS
mentos do mdulo

VS.

EXECUO A PARTIR DE

__builtins__

deve ser redenido . O console

interativo do Python possui um sistema de ajuda integrado que


pode ser usado para acessar a documentao de qualquer elemento
da linguagem.

O comando

help(),

inicia a ajuda interativa.

partir da, podemos por exemplo, digitar

keywords

ajuda das palavras reservadas listadas acima.

para acessar a

Se digitarmos

for

em seguida, obteremos a seguinte ajuda:


Listagem 1.3: Denio da palavra reservada

7.3

The

2
3

The

for

for
the

( such

as

statement

is

statement
elements
a

of

string ,

iterable

for.

used
a

to

iterate

sequence

tuple

or

list )

or

over
other

object :

...

1.2 Uso Interativo Execuo a Partir de


Scripts
vs.

Usurios familiarizados com ambientes de programao cientcos


tais como Matlab, R e similares, caro satisfeitos em saber que o
Python tambm pode ser utilizado de forma interativa. Para isso,
basta invocar o interpretador na linha de comando (Python shell,
em Unix) ou invocar um shell mais sosticado como o Idle, que
vem com a distribuio padro do Python, ou o Ipython (ver 4.1).
Tanto no uso interativo, como na execuo a partir de scripts, o
interpretador espera encontrar apenas uma expresso por linha do
programa. Caso se deseje inserir mais de uma expresso em uma
linha, as expresses devem ser separadas por

1 Ateno,

;.

Mas esta prtica

os componentes de __builtins__, no geram erros de sintaxe

ao ser redenidos.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

deve ser evitada. Expresses podem continuar em outra linha se


algum de seus parnteses, colchetes, chaves ou aspas ainda no tiver
sido fechado. Alternativamente, linhas podem ser quebradas pela
aposio do caractere

ao nal da linha.

Listagem 1.4: Usando o Python como uma calculadora.

1 >>> 1+1
2

3 >>>
No cabealho da shell do Python, acima (listagem 1.1), o interpretador identica a verso instalada, data e hora em que foi compilada, o compilador C utilizado, detalhes sobre o sistema operacional
e uma linhazinha de ajuda para situar o novato.
Para executar um programa, a maneira usual (em Unix) digitar:

python script.py.
*.py.

No Windows basta um duplo clique sobre

arquivos

Listagem 1.5: Executando script.py via comando de linha.

python

s c r i p t . py

No Linux e em vrios UNIXes, podemos criar scripts que so


executveis diretamente, sem precisar invocar o interpretador antes.

Para isso, basta incluir a seguinte linha no topo do nosso

script:

1 #!

/ u s r / b i n / env

Note que os caracteres

python

#!

devem ser os dois primeiros caracteres

do arquivo (como na listagem 1.6).


Depois, resta apenas ajustar as permisses do arquivo para que
possamos execut-lo:

chmod +x script.py

(listagem 1.7).

Listagem 1.7: Executando um script Python executvel.

chmod +x

s c r i p t . py

1.2. USO INTERATIVO


SCRIPTS

VS.

EXECUO A PARTIR DE

Listagem 1.6: Tornando um script executvel

1 #!
2

/ u s r / b i n / env

print

sys : 1 :

python

" A l Mundo ! "

. / s c r i p t . py
DeprecationWarning :

character
3,

but

no

' \ xf4 '

in

encoding

NonASCII

file

./ teste

declared ;

see

on

line

http

: / /www . p y t h o n . o r g / p e p s / pep 0 2 6 3 . h t m l

for

details

A l Mundo !
Mas que lixo aquele antes do nosso 

Al mundo?

Trata-

se do interpretador reclamando do acento circunexo em 

Al.

Para que o Python no reclame de acentos e outros caracteres da


lngua portuguesa no contidos na tabela ASCII, precisamos adicionar a seguinte linha ao script:

# -*- coding: latin-1 -*-.

Experimente editar o script acima e veja o resultado.


No exemplo da listagem 1.6, utilizamos o comando

print

para

fazer com que nosso script produzisse uma string como sada, ou

seja, para escrever no stdout .

Como podemos receber informa-

stdin?
input('texto'),

que executa o que o usurio digitar, sendo por-

tanto perigoso, e

que retorna uma string

es pelo

O Python nos oferece duas funes para isso:

raw_input('texto'),

com a resposta do usurio.


Nas listagens que se seguem, alternaremos entre a utilizao
de scripts e a utilizao do Python no modo interativo (como na
listagem 1.4). A presena do smbolo  >>>, caracterstico da shell

2 Todos

os processos no Linux e outros sistemas operacionais possuem vias

de entrada e sada de dados denominados de stdin e stdout, respectivamente.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

do Python ser suciente para diferenciar os dois casos. Exemplos


de scripts viro dentro de caixas.

Operaes com Nmeros


Noventa e nove por cento das aplicaes cientcas envolvem algum
tipo de processamento numrico. Vamos iniciar nosso contato com
o Python atravs dos nmeros (Listagem 1.8).
Listagem 1.8: Operaes aritmticas

1 >>> 2+2
2

3 >>> # C o m e n t r i o
4

...

22

6 >>> 2 2
7

# Comentrio

na mesma

linha

8 >>> ( 5 0 5 6 ) / 4
9

10 >>> # D i v i s o
11

...

12

de

inteiros

retorna

" floor ":

7/3

13 >>> 7/ 3
14

15 >>> 7 / 3 .
16

2.3333333333333335

Nosso primeiro exemplo numrico (Listagem 1.8) , trata nmeros em sua representao mais simples: como constantes. desta
forma que utilizamos uma calculadora comum. Em programao
mais comum termos nmeros associados a quantidades, a que

3 Repare

como o Python trata a diviso de dois inteiros.

resultado arredondado para baixo

Ela retorna o

1.2. USO INTERATIVO


SCRIPTS

VS.

EXECUO A PARTIR DE

precisamos nos referenciar e que podem se modicar. Esta representao de nmeros chama-se varivel.
O sinal de

= utilizado para atribuir valores a variveis(Listagem

1.9).
Listagem 1.9: Atribuindo valores

1 >>> l a r g u r a = 2 0
2 >>> a l t u r a = 5 9
3 >>> l a r g u r a
4

altura

900
Um valor pode ser atribudo a diversas variveis com uma nica

operao de atribuio, ou mltiplos valores a mltiplas variveis


(Listagem 1.10). Note que no exemplo de atribuio de mltiplos
valores a mltiplas variveis (Listagem 1.10, linha 9) os valores
poderiam estar em uma tupla.
Listagem 1.10: Atribuindo o mesmo valor a mltiplas variveis

1 >>> x = y = z = 0

# Zero

x,

2 >>> x
3

4 >>> y
5

6 >>> z
7

8 >>> a , b , c = 1 , 2 , 3
9 >>> a
10

11 >>> b
12

13 >>> c
14

3
O Python tambm reconhece nmeros reais (ponto-utuante)

e complexos naturalmente.

Em operaes entre nmeros reais e

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

10

inteiros o resultado ser sempre real. Da mesma forma, operaes


entre nmeros reais e complexos resultam sempre em um nmero
complexo. Nmeros complexos so sempre representados por dois
nmeros ponto-utuante:

a parte real e a parte imaginria.

parte imaginria representada com um suxo j ou J.


Listagem 1.11: Nmeros complexos

1 >>> 1 j

1J

complex ( 0 , 1 )

2 (1+0 j )
3 >>> 1 j
4 (1+0 j )
5 >>> 3+1 j 3
6

(3+3 j )

7 >>> (3+1 j ) 3
8

(9+3 j )

9 >>> (1+2 j ) /(1+1 j )


10

(1.5+0.5 j )

Um Nmero complexo para o Python, um objeto . Podemos extrair as partes componentes de um nmero complexo
atributos do tipo complexo:

c.real

c.imag.

utilizando

A funo

abs,

que

retorna o mdulo de um numero inteiro ou real, retorna o comprimento do vetor no plano complexo, quando aplicada a um nmero
complexo. O mdulo de um nmero complexo tambm denominado magnitude (listagem 1.12).
Listagem 1.12: Explorando nmeros complexos

1 >>> a = 3 . 0 + 3 . 0 j
2 >>> a . r e a l
3

3.0

4 >>> a . imag
5

3.0

6 >>> a b s ( a )
4 Assim

# sqrt (a . real

como os outros tipos de nmeros.

+ a . imag 2 )

1.3. NOMES, OBJETOS E ESPAOS DE NOMES


7

11

4.2426406871192848

1.3 Nomes, Objetos e Espaos de Nomes


Nomes em Python so identicadores de objetos, e tambm so
chamados de variveis. Nomes devem ser iniciados por letras maisculas ou minsculas e podem conter algarismos, desde que no sejam o primeiro caractere. O Python faz distino entre maisculas
e minsculas portanto,

nome != Nome.

No Python, todos os dados so objetos tipados, que so associ-

ados dinamicamente a nomes. O sinal de igual (=), liga o resultado


da avaliao da expresso do seu lado direito a um nome situado
sua esquerda. A esta operao damos o nome de atribuio (ver
exemplo na listagem 1.13).
Listagem 1.13: Atribuindo objetos a nomes (variveis)

1 >>> a =3 2 7
2 >>> a , b = ( ' l a r a n j a ' , ' banana ' )
As variveis criadas por atribuio cam guardadas na memria
do computador. Para evitar preenchimento total da memria, assim que um objeto deixa de ser referenciado por um nome (deixa de
existir no espao de nomes corrente), ele imediatamente apagado
da memria pelo interpretador.
O conceito de espao de nomes uma caracterstica da linguagem Python que contribui para sua robustez e ecincia. Espaos
de nomes so dicionrios (ver 1.4) contendo as variveis, objetos
e funes disponveis durante a execuo de um programa. A um
dado ponto da execuo de um programa, existem sempre dois dicionrios disponveis para a resoluo de nomes: um local e um
global. Estes dicionrios podem ser acessados para leitura atravs
das funes

locals()

globals(),

respectivamente. Sempre que

o interpretador Python encontra uma palavra que no pertence ao

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

12

conjunto de palavras reservadas da linguagem, ele a procura, primeiro no espao de nomes local e depois no global. Se a palavra
no encontrada, um erro do tipo

NameError acionado (exemplo

1.14).
Listagem 1.14: Exemplo de NameError

1 >>> m a r i a
2

Traceback

3
4

File

( most

recent

"<s t d i n >" ,

NameError :

name

line

' maria '

call

last ) :

in ?
i s not

1,

defined

O espao de nomes local, muda ao longo da execuo de um


programa. Toda a vez que a execuo adentra uma funo, o espao
de nomes local passa a reetir apenas as variveis denidas dentro

daquela funo .

Ao sair da funo, o dicionrio local torna-se

igual ao global.

1 >>> a=1
2 >>> l e n ( g l o b a l s ( ) . i t e m s ( ) )
3

4 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
5

6 >>>
7

...

...

...

10

...

def

fun ( ) :
a= ' novo

print
print

valor '

len ( l o c a l s () . items () )
a

11 >>> f u n ( )
12

13

novo

14 >>>
15

valor

print

16 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
5 Mais

quaisquer variveis explicitamente denidas como globais

1.4. ESTRUTURAS DE DADOS


17

13

18 >>> l o c a l s ( )
19

{ ' __builtins__ ' : <module

in ) >,

built

' : <f u n c t i o n
__doc__ ' :

' __builtin__ '

'__name__ ' :
fun

None ,

at
'a ' :

'__main__ ' ,

0 xb7c18ed4 >,

(
' fun

'

1}

Tambm importante lembrar que o espao de nomes local


sempre inclui os

__builtins__

como vemos na listagem 1.3.

1.4 Estruturas de Dados


Qualquer linguagem de programao pode ser simplisticamente
descrita como uma ferramenta, atravs da qual, dados e algoritmos so implementados e interagem para a soluo de um dado
problema.

Nesta seo vamos conhecer os tipos e estruturas de

dados do Python para que possamos, mais adiante, utilizar toda a


sua exibilidade em nossos programas.
No Python, uma grande nfase dada simplicidade e exibilidade de forma a maximizar a produtividade do programador. No
tocante aos tipos e estruturas de dados, esta losoa se apresenta
na forma de uma tipagem dinmica, porm forte. Isto quer dizer
que os tipos das variveis no precisam ser declarados pelo programador, como obrigatrio em linguagens de tipagem esttica
como o C, FORTRAN, Visual Basic, etc.

Os tipos das variveis

so inferidos pelo interpretador. As principais estruturas de dados


como

Listas e Dicionrios, podem ter suas dimenses alteradas,

dinamicamente durante a execuo do Programa , o que facilita


enormemente a vida do programador, como veremos mais adiante.

Listas
As listas formam o tipo de dados mais utilizado e verstil do
Python.

Listas so denidas como uma sequncia de valores se-

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

14

parados por vrgulas e delimitada por colchetes:


Listagem 1.15: Criando listas.

1 >>> l i s t a = [ 1 ,

'a ' ,

' pe ' ]

2 >>> l i s t a
3

[1 ,

'a ' ,

' pe ' ]

4 >>> l i s t a [ 0 ]
5

6 >>> l i s t a [ 2 ]
7

' pe '

8 >>> l i s t a [ 1 ]
9

' pe '
Na listagem 1.15, criamos uma lista de trs elementos.

Uma

lista uma sequncia ordenada de elementos, de forma que podemos selecionar elementos de uma lista por meio de sua posio.
Note que o primeiro elemento da lista
tagens em Python comeam em

0.

lista[0].

Todas as con-

Uma lista tambm pode possuir elementos de tipos diferentes.


Na listagem 1.15, o elemento
tros elementos so strings.

type(lista[0]).

um inteiro enquanto que os ou-

Para vericar isso, digite o comando

Uma caracterstica muito interessante das listas do Python,


que elas podem ser indexadas de trs para frente, ou seja,

lista[-1]

o ltimo elemento da lista. Como listas so sequncias de tamanho varivel, podemos assessar os ltimos

n elementos, sem ter que

contar os elementos da lista.


Listas podem ser fatiadas, ou seja, podemos selecionar uma
poro de uma lista que contenha mais de um elemento.
Listagem 1.16: Fatiando uma lista

1 >>> l i s t a =[ ' a ' , ' p e ' ,


2 >>> l i s t a [ 1 : 3 ]
3

[ ' pe ' ,

' que ' ]

' que ' ,

1]

1.4. ESTRUTURAS DE DADOS

15

4 >>> l i s t a [ 1 ]
5

6 >>> l i s t a [ 3 ]
7

8 >>>

lista[1:3], delimita uma fatia que vai do ele1 (o segundo elemento) ao elemento imediatamente anterior
elemento 3. Note que esta seleo inclui o elemento corresponO comando

mento
ao

dente ao limite inferior do intervalo, mas no o limite superior.


Isto pode gerar alguma confuso, mas tem suas utilidades. ndices
negativos tambm podem ser utilizados nestas expresses.
Para retirar uma fatia que inclua o ltimo elemento, temos que
usar uma variao deste comando seletor de intervalos:
Listagem 1.17: Selecionando o nal de uma lista.

1 >>> l i s t a [ 2 : ]
2

[ ' que ' ,

1]

3 >>>
Este comando signica todos os elementos a partir do elemento
2 (o terceiro), at o nal da lista. Este comando poderia ser utilizado para selecionar elementos do incio da lista:
que desta vez no incluindo o elemento

lista[:3],

(o quarto elemento).

Se os dois elementos forem deixados de fora, so selecionados


todos os elementos da lista:
Listagem 1.18: selecionando todos os elementos de uma lista.

1 >>> l i s t a [ : ]
2

[ 'a ' ,

' pe ' ,

' que ' ,

1]

3 >>>
S que no a mesma lista, uma nova lista com os mesmos
elementos. Desta forma,

lista[:]

uma maneira de fazer uma

cpia completa de uma lista. Normalmente este recurso utilizado


junto com uma atribuio

a = lista[:].

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

16

Listagem 1.19: Adicionando elementos a listas.

1 >>> l i s t a [ : ]
2

[ 'a ' ,

' pe ' ,

' que ' ,

1]

3 >>> l i s t a . append ( 2 ) #a d i c i o n a
4

[ 'a ' ,

' pe ' ,

' que ' ,

1,

ao

final

2]

5 >>> l i s t a . i n s e r t ( 2 , [ ' a ' , ' b ' ] )


6 >>> l i s t a
7

[ 'a ' ,

' pe ' ,

[ 'a ' ,

'b ' ] ,

' que ' ,

1,

2]

8 >>>
As listas so conjuntos mutveis, ao contrrio de tuplas e strings,
portanto pode-se adicionar(listagem 1.19), modicar ou remover
(tabela 1.1) elementos de uma lista.
Tabela 1.1: Mtodos de Listas.

Mtodo

L.append(objeto)
L.count(elemento)
L.extend( list )
L.index(value)
L. insert ( i , o)
L.pop([indice ])
L.remove(value)
L.reverse ()
L.sort ()

Efeito

Adiciona um elemento ao nal da lista.


Retorna o nmero de ocorrncias do elemento.
Concatena listas.
Retorna ndice da primeira ocorrncia do valor.
Insere objeto (o) antes de ndice (i).
Remove e retorna objeto no ndice.
ou o ltimo elemento.
remove primeira ocorrncia do valor.
Inverte lista. In situ
Ordena lista. In locus

Note que as operaes

in situ

no alocam memria extra para

a operao, ou seja, a inverso ou a ordenao descritas na tabela


1.1, so realizadas no mesmo espao de memria da lista original.
Operaes

in situ

alteram a varivel em si sem fazer uma cpia da

mesma e, portanto no retornam nada.


O mtodo

L.insert insere um objeto antes da posio indicada

pelo ndice. Repare, na listagem 1.19, que o objeto em questo era

1.4. ESTRUTURAS DE DADOS

17

uma lista, e o mtodo insert no a fundiu com a lista original. Este


exemplo nos mostra mais um aspecto da versatilidade do objeto
lista, que pode ser composto por objetos de qualquer tipo.
Listagem 1.20: Estendendo uma lista.

1 >>> l i s t a 2 =[ ' a ' , ' b ' ]


2 >>> l i s t a . e x t e n d ( l i s t a 2 )
3 >>> l i s t a
4

[ 'a ' ,

' pe ' ,

[ 'a ' ,

'b ' ] ,

' que ' ,

1,

2,

'a ' ,

'b

' ]
J na listagem 1.20, os elementos da segunda lista so adicionados, individualmente, ao nal da lista original.
Listagem 1.21: Efetuando buscas em listas.

1 >>> l i s t a . i n d e x ( ' q u e ' )


2

3 >>> l i s t a . i n d e x ( ' a ' )


4

5 >>> l i s t a . i n d e x ( ' z ' )


6

Traceback

File

( most

ValueError :

9 >>>
10

'z '

recent

"<i n p u t >" ,

in

line

call
1,

l i s t . index ( x ) :

in
x

last ) :
?

not in

list

lista

0
Conforme ilustrado na listagem 1.21, o mtodo

o ndice da primeira ocorrncia do valor dado.


existir, o interpretador retorna um

ValueError.

L.index retorna
Se o valor no

Para testar se um

elemento est presente em uma lista, pode-se utilizar o comando

in6

como ilustrado na listagem 1.21. Caso o elemento faa parte

da lista, este comando retornar

6O

inverso do operador

in,

1,

caso contrrio retornar

o operador

not in

07 .

e tambm vlido para

todas as sequncias.

7 Verdadeiro

e falso: Em Python, quase qualquer coisa pode ser utilizada

em um contexto booleano, ou seja, como verdadeiro ou falso. Por exemplo

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

18

Existem dois mtodos bsicos para remover elementos de uma


lista:

L.remove

L.pop

 listagem 1.22.

O primeiro remove o

elemento nomeado sem nada retornar, o segundo elimina e retorna


o ltimo ou o elemento da lista (se chamado sem argumentos), ou o
determinado pelo ndice, passado como argumento (Listagem 1.22).
Listagem 1.22: Removendo elementos de uma lista.

1 >>> l i s t a . remove ( " q u e " )


2 >>> l i s t a
3

[ 'a ' ,

' pe ' ,

[ 'a ' ,

'b ' ] ,

1,

2,

'a ' ,

'b ' ]

4 >>> l i s t a . pop ( 2 )
5

[ 'a ' ,

'b ' ]

6 >>> l i s t a
7

[ 'a ' ,

' pe ' ,

1,

2,

'a ' ,

'b ' ]

8 >>>
Operadores aritmticos tambm podem ser utilizados para ope-

raes com listas. O operador de soma,  +, concatena duas listas.


O operador  += um atalho para o mtodo

L.extend

conforme

mostrado na listagem 1.23.


Listagem 1.23: Operaes com listas

1 >>> l i s t a =[ ' a ' ,

' pe ' ,

1,

2,

2 >>> l i s t a = l i s t a + [ ' novo ' ,

'a ' ,

'b ' ]

' elemento ' ]

3 >>> l i s t a
4

[ 'a ' ,

' pe ' ,

1,

2,

'a ' ,

'b ' ,

' novo ' ,

'b ' ,

'd ' ,

'

elemento ' ]

5 >>> l i s t a += ' d o i s '


6 >>> l i s t a
7

[ 'a ' ,

' pe ' ,

1,

2,

'a ' ,

'o ' ,

' i ' ,

'

s ' ]

8 >>> l i s t a += [ ' d o i s ' ]


falso enquanto que todos os outros nmeros so verdadeiros.Uma string, lista,
dicionrio ou tupla vazias so falsas enquanto que as demais so verdadeiras.

1.4. ESTRUTURAS DE DADOS

19

Listagem 1.24: Criando listas numricas sequenciais.

1 >>> r a n g e ( 1 0 )
2

[0 ,

1,

2,

3,

4,

5,

6,

7,

8,

3 >>> r a n g e ( 2 , 2 0 , 2 )#nmeros
4

[2 ,

4,

6,

8,

10 ,

12 ,

14 ,

16 ,

5 >>> r a n g e ( 1 , 2 0 , 2 )#nmeros
6

[1 ,

3,

5,

7,

9,

11 ,

13 ,

9]

pares
18]

mpares

15 ,

17 ,

19]

9 >>> l i s t a
10

[ 'a ' ,

' pe ' ,

s ' ,

11 >>>

2,

'a ' ,

'b ' ,

'd ' ,

'o ' ,

' i ' ,

'

l i =[1 ,2]

12 >>>

li

13

2,

[1 ,

1,

' dois ' ]

3
1,

2,

1,

2]

14 >>>

lista = lista + lista2 cria uma nova


+= aproveita a lista original e a
diferena faz com que o operador += seja muito

Note que a operao

lista

enquanto que o comando

extende.

Esta

mais rpido, especialmente para grandes listas.


multiplicao,

O operador de

*, um repetidor/concatenador de listas conforme

mostrado ao nal da listagem 1.23. A operao de multiplicao

in situ (*=) tambm vlida.

Um tipo de lista muito til em aplicaes cientcas, lista


numrica sequencial. Para construir estas listas podemos utilizar o
comando

range

(exemplo 1.24). O comando

range

aceita 1, 2 ou

trs argumentos: incio, m e passo, respectivamente (ver exemplo


1.24).

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

20

Tuplas
Uma tupla, uma lista imutvel, ou seja, ao contrrio de uma lista,
aps a sua criao, ela no pode ser alterada. Uma tupla denida
de maneira similar a uma lista, com exceo dos delimitadores do
conjunto de elementos que no caso de uma tupla so parnteses
(listagem 1.25).
Listagem 1.25: Denindo uma Tupla.

1 >>> t u = ( ' G e n e r o ' ,

' especie ' ,

' peso ' ,

'

estagio ' )

2 >>> t u [ 0 ]
3

' Genero '

4 >>> t u [ 1 : 3 ]
5

( ' especie ' ,

' peso ' )

6 >>>
Os elementos de uma tupla podem ser referenciados atravs de
ndices, (posio) de forma idntica a como feito em listas. Tuplas
tambm podem ser fatiadas, gerando outras tuplas.
As tuplas no possuem mtodos.
tuplas serem imutveis. Os mtodos

Isto se deve ao fato de as

append, extend,

pop

natu-

ralmente no se aplicam a tuplas, uma vez que no se pode adicionar ou remover elementos de uma tupla. No podemos fazer busca
em tuplas, visto que no dispomos do mtodo
podemos usar

in

index.

No entanto,

para determinar se um elemento existe em uma

tupla, como se faz em listas.


Listagem 1.26: Outras formas de denir tuplas.

1 >>> t u =()
2 >>> t u
3

()

4 >>> t u= ' c a s a ' , #<R e p a r e na


final !

5 >>> t u

vrgula

ao

1.4. ESTRUTURAS DE DADOS


6

21

( ' casa ' ,)

7 >>> t u = 1 , 2 , 3 , 4
8 >>> t u
9

(1 ,

2,

3,

4)

10 >>> v a r =w , x , y , z
11 >>> v a r
12

(w , x , y , z )

13 >>> v a r = t u
14 >>> w
15

16 >>> x
17

18 >>> y
19

20 >>> z
21

4
Conforme exemplicado em 1.26, uma tupla vazia, denida

pela expresso

(), j no caso de uma tupla unitria, isto , com ape-

nas um elemento, fazemos a atribuio com uma vrgula aps o ele-

mento, caso contrrio (tu=('casa') ), o interpretador no poder


distinguir se os parnteses esto sendo utilizados como delimitadores normais ou delimitadores de tupla. O comando

tu=('casa',)

equivalente ao apresentado na quarta linha da listagem 1.26, apenas mais longo.


Na stima linha da listagem 1.26, temos uma extenso do conceito apresentado na linha anterior: a denio de uma tupla sem
a necessidade de parnteses. A este processo, se d o nome de

pacotamento de sequncia.

em-

O empacotamento de vrios elementos

sempre gera uma tupla.


As tuplas, apesar de no serem to versteis quanto as listas, so
mais rpidas. Portanto, sempre que se precisar de uma sequnca
de elementos para servir apenas de referncia, sem a necessidade
de edio, deve-se utilizar uma tupla. Tuplas tambm so teis na

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

22

formatao de strings como veremos na listagem 1.28.


Apesar das tuplas serem imutveis, pode-se contornar esta limitao fatiando e concatenando tuplas.
ser convertidas em tuplas, com a funo

Listas tambm podem

tuple(lista),

assim

como tuplas podem ser convertidas em listas atravs da funo

list(tupla).

Uma outra aplicao interessante para tuplas, mostrada na listagem 1.26, a atribuio mltipla, em que uma tupla de valores,
atribuda a uma lista de nomes de variveis armazenados em uma
tupla.

Neste caso, as duas sequncias devem ter, exatamente, o

mesmo nmero de elementos.

Strings
Strings so um terceiro tipo de sequncias em Python. Strings so
sequncias de caracteres delimitados por aspas simples,
ou duplas

"string".

'string345'

Todos os operadores discutidos at agora para

outras sequncias, tais como

+, *, in, not in, s[i] e s[i:j], tam-

bm so vlidos para strings. Strings tambm podem ser denidas


com trs aspas (duplas ou simples). Esta ltima forma utilizada
para denir strings contendo quebras de linha.
Listagem 1.27: Strings.

1 >>> s t= ' 1 2 3

de

oliveira4 '

2 >>> l e n ( s t )
3

16

4 >>> min ( s t )
5

'

'

6 >>> max ( s t )
7

'v '

8 >>> t e x t o = " " " p r i m e i r a


9
10

segunda
terceira

11 >>>

linha

print

l i n h a """
texto

linha

1.4. ESTRUTURAS DE DADOS


12

primeira

13

segunda

14

terceira

23

linha
linha
linha

Conforme ilustrado na listagem 1.27, uma string uma sequncia de quaisquer caracteres alfanumricos, incluindos espaos.
funo

len(),

retorna o comprimento da string, ou de uma lista

ou tupla. As funes

min()

max()

retornam o valor mnimo e o

mximo de uma sequncia, respectivamente. Neste caso, como a


sequncia uma string, os valores so os cdigos ASCII de cada
caracter. Estes comandos tambm so vlidos para listas e tuplas.
O tipo String possui 33 mtodos distintos (na verso 2.2.1 do
Python). Seria por demais enfadonho listar e descrever cada um
destes mtodos neste captulo. Nesta seo vamos ver alguns mtodos de strings em ao no contexto de alguns exemplos. Outros
mtodos aparecero em outros exemplos nos demais captulos.
O uso mais comum dado a strings a manipulao de textos que
fazem parte da entrada ou sada de um programa. Nestes casos,
interessante poder montar strings, facilmente, a partir de outras
estruturas de dados. Em Python, a insero de valores em strings
envolve o marcador

%s.

Listagem 1.28: Formatando strings.

1 >>> a n i m a l= ' Hamster 1 '


2 >>> p e s o =98
3 >>>
4

'%s : %s

' Hamster

1:

gramas ' % ( animal , p e s o )


98

gramas '

Na listagem 1.28, temos uma expresso de sintaxe no to bvia mas de grande valor na gerao de strings. O operador

(m-

dulo), indica que os elementos da tupla seguinte sero mapeados,


em sequncia, nas posies indicadas pelos marcadores

%s na string.

Esta expresso pode parecer uma complicao desnecessria


para uma simples concatenao de strings.
porqu:

Mas no .

Vejamos

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

24

Listagem 1.29: Problemas com a concatenao de strings.

1 >>> a n i m a l= ' Hamster 1 '


2 >>> p e s o =98
3 >>>
4

'%s : %s

' Hamster

gramas ' % ( animal , p e s o )

1:

98

5 >>> a n i m a l+ ' :
6

Traceback

7
8

File

( most

recent

"<i n p u t >" ,

TypeError :
'

gramas '
'+p e s o+ '

cannot

line

gramas '
call

in

1,

last ) :
?

concatenate

' str '

and

' int

objects

9 >>>
Pelo erro apresentado na listagem 1.29, vemos que a formatao
da string utilizando o operador mdulo e os marcadores

%s, faz mais

do que apenas concatenar strings, tambm converte a varivel

peso

(inteiro) em uma string.

Dicionrios
O dicionrio um tipo de dado muito interessante do Python:
uma estrutura que funciona como um banco de dados em miniatura, no sentido de que seus elementos consistem de pares 

: valor, armazenados sem ordenao.

chave

Isto signica que no exis-

tem ndices para os elementos de um dicionrio, a informao


acessada atravs das chaves.
Listagem 1.30: Criando e manipulando dicionrios.

1 >>> Z={ 'C ' : 1 2 ,

'O ' : 1 6 ,

'N ' : 1 2 ,

' Na ' : 4 0 }

2 >>> Z [ 'O ' ]


3

16

4 >>> Z [ 'H ' ]=1


5 >>> Z
6

{ ' Na ' :

40 ,

12}

'C ' :

12 ,

'H ' :

1,

'O ' :

16 ,

'N ' :

1.4. ESTRUTURAS DE DADOS

25

7 >>> Z . k e y s ( )
8

[ ' Na ' ,

'C ' ,

'H ' ,

'O ' ,

'N ' ]

9 >>> Z . has_key ( 'N ' )


10

1
As chaves podem ser de qualquer tipo imutvel: nmeros, strings,

tuplas (que contenham apenas tipos imutveis). Dicionrios possuem os mtodos listados na tabela 1.2.
Os conjuntos (chave:valor) so chamados de tens do dicionrios. Esta terminologia importante pois podemos acessar, separadamente, chaves, valores ou tens de um dicionrio.
Os valores de um dicionrio podem ser de qualquer tipo, nmeros, strings, listas, tuplas e at mesmo outros dicionrios. Tambm
no h qualquer restrio para o armazenamento de diferentes tipos
de dados em um mesmo dicionrio.
Conforme exemplicado em 1.30, pode-se adicionar novos tens
a um dicionrio, a qualquer momento, bastando atribuir um valor
a uma chave. Contudo, preciso ter cuidado. Se voc tentar criar
um tem com uma chave que j existe, o novo tem substituir o
antigo.
Os mtodos D.iteritems (),

D.iterkeys()

D.itervalues()

criam iteradores. Iteradores permitem iterar atravs dos tens, chaves ou valores de um dicionrio. Veja a listagem 1.31:
Listagem 1.31: Iterando dicionrios.

1 >>> Z . i t e m s ( )
2

[ ( ' Na ' ,

40) ,

( 'N ' ,

( 'C ' ,

12) ,

( 'H ' ,

1) ,

( 'O ' ,

16) ,

12) ]

3 >>> i =Z . i t e r i t e m s ( )
4 >>> i
5 <d i c t i o n a r y i t e r a t o r
6 >>> i . n e x t ( )
7

( ' Na ' ,

40)

8 >>> i . n e x t ( )

object

at

0 x 8 9 8 5 d 0 0>

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

26

Tabela 1.2: Mtodos de Dicionrios.

Mtodo

D.clear()
D.copy()
D.get(k[,d])
D.has_key(k)
D.items()
D.iteritems()
D.iterkeys()
D.itervalues ()
D.keys()
D.popitem()
D.update(E)
D.values()

( 'C ' ,

Efeito

Remove todos os itens do dicionrio.


Cria uma cpia de um dicionrio.
Retorna D[k], se a chave k existir. Seno, d.
Retorna 1 se D possuir a chave k.
Retorna lista de tuplas (chave:valor).
Retorna objeto iterador para D.
Idem para chaves.
Idem para valores.
Retorna lista com todas as chaves.
Remove e retorna um tem (chave:valor).
Copia itens de E para D.
Retorna lista com todas os valores.

12)

10 >>> # e

assim

por

diante . . .

11 >>> k=Z . i t e r k e y s ( )
12 >>> k . n e x t ( )
13

' Na '

14 >>> k . n e x t ( )
15

'C '

16 >>> k . n e x t ( )
17

'H '

18 >>> k . n e x t ( )
19

'O '

20 >>> k . n e x t ( )
21

'N '

22 >>> k . n e x t ( )
23
24
25

Traceback
File

( most

recent

"<i n p u t >" ,

StopIteration

line

call
1,

in

last ) :
?

1.4. ESTRUTURAS DE DADOS

27

O uso de iteradores interessante quando se precisa acessar


o contedo de um dicionrio, elemento-a-elemento, sem repetio.
Ao nal da iterao, o iterador retorna um aviso:

StopIteration.

Conjuntos
Rearmando sua vocao cientca, a partir da verso 2.4, uma
estrutura de dados para representar o conceito matemtico de conjunto foi introduzida na linguagem Python. Um conjunto no Python
uma coleo de elementos sem ordenao e sem repeties.

objeto conjunto em Python aceita operaes matemticas de conjuntos tais como unio, interseo, diferena e diferena simtrica
(exemplo 1.4).

1 >>> a = s e t ( ' p i r a p o r a ' )


2 >>> b = s e t ( ' paranapanema ' )
3 >>> a #l e t r a s
4

set ([ ' i ' ,

5 >>> a
6

'r ' ,

b #L e t r a s

set ([ ' i ' ,

7 >>> a

em a

'p ' ,

'o ' ])

mas

em a

ou

no em b

'o ' ])

b #l e t r a s

set ([ 'a ' ,

'a ' ,

em a

'e ' ,

' i ' ,

'm ' ,

b
'o ' ,

'n ' ,

'p ' ,

'r '

])

9 >>> a & b #l e t r a s
10

set ([ 'a ' ,

'p ' ,

11 >>> a ^ b #l e t r a s
12

set ([ ' i ' ,

'm ' ,

em a

'r ' ])
em a

'e ' ,

ou

'o ' ,

b mas

no em ambos

'n ' ] )

No exemplo 1.4 pode-se observar as seguintes correspondncias entre a notao do Python e a notao matemtica convencional:

a - b:

A B8

a | b:

AB

8 Por

conveno representa-se conjuntos por letras maisculas.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

28

a & b: A B
a b: (A B) (A B)

1.5 Controle de uxo


Em condies normais o interpretador executa as linhas de um
programa uma a uma. As excees a este caso so linhas pertencentes denio de funo e classe, que so executadas apenas
quando a respectiva funo ou classe chamada. Entretanto algumas palavras reservadas tem o poder de alterar a direo do uxo
de execuo das linhas de um programa.

Condies
Toda linguagem de programao possui estruturas condicionais que
nos permitem representar decises: se isso, faa isso, caso contrrio
faa aquilo. Estas estruturas tambm so conhecidas por ramicaes. O Python nos disponibiliza trs palavras reservadas para este
m:

if , elif e else.

O seu uso melhor demonstrado atravs de

um exemplo (Listagem 1.32).


Listagem 1.32: Exemplo do emprego de ramicaes.

if

a == 1 :

2
3
4
5
6
7

#e s t e

elif

pass

pass

executado

se

for

bloco

executado

se

for

bloco

executado

se

else :

#e s t e

#s e

11

a == 2 :
#e s t e

8
10

bloco

se

nenhum

#a n t e r i o r e s

pass

dos

tiver

blocos
sido

executado

1.5. CONTROLE DE FLUXO

29

No exemplo 1.32, vemos tambm emprego da palavra reservada

pass,

que apesar de no fazer nada muito til quando ainda no

sabemos quais devem ser as consequncias de determinada condio.


Uma outra forma elegante e compacta de implementar uma
ramicao condicional da execuo de um programa atravs de
dicionrios (Listagem 1.33).

As condies so as chaves de um

dicionrio cujos valores so funes. Esta soluo no contempla o

else,

porm.

Listagem 1.33: Implementando a funcionalidade de

if

elif

por

meio de um dicionrio.

d e s f e c h o s = { 1 : fun1 , 2 : fun2 }

desfechos [ a ]

Iterao
Muitas vezes em problemas computacionais precisamos executar
uma tarefa, repetidas vezes. Entretanto no desejamos ter que escrever os mesmos comandos em sequncia, pois alm de ser uma
tarefa tediosa, iria transformar nosso belo programa em algo similar a uma lista telefnica.

A soluo tradicional para resolver

este problema a utilizao de laos (loops) que indicam ao interpretador que ele deve executar um ou mais comandos um nmero
arbitrrio de vezes.

Existem vrios tipos de laos disponveis no

Python.

O lao

while:

O lao

while

repete uma tarefa enquanto uma

condio for verdadeira (Listagem 1.34). Esta tarefa consiste em


um ou mais comandos indentados em relao ao comando que inicia
o lao.

O m da indentao indica o m do bloco de instrues

que deve ser executado pelo lao.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

30

Listagem 1.34: Comandos de lao no Python.

while True :
pass#r e p e t e

1 >>>
2

indefinidamente

3 >>> i =0
4 >>>

while

i <

+=1

10:

print

7 # saida

omitida

for

8 >>>

i in r a n g e ( 1 ) :
print i

O lao

for:

O lao

for

nos permite iterar sobre uma sequn-

cia atribuindo os elementos da mesma a uma varivel, sequencialmente, medida que prossegue. Este lao se interrompe automaticamente ao nal da sequncia.

Iterao avanada:

O Python nos oferece outras tcnicas de

iterao sobre sequncias que podem ser bastante teis na reduo da complexidade do cdigo. No exemplo 1.31 ns vimos que
dicionrios possuem mtodos especcos para iterar sobre seus componentes. Agora suponhamos que desejssemos iterar sobre uma
lista e seu ndice?

for

1 >>>

Listagem 1.35: A funo enumerate.


n,e

' ]) :

2
3
4

0:

1:

2:

3:

4:

in

print

enumerate ( [ ' a ' , ' b ' , ' c ' , ' d ' , ' e
"%s : %s "%(n , e )

1.5. CONTROLE DE FLUXO


A funo

enumerate

31

(exemplo 1.35) gera um iterador similar ao

visto no exemplo 1.31. O lao

for chama o mtodo next deste iteStopIteration

rador repetidas vezes, at que receba a mensagem


(ver exemplo 1.31).
O comando

zip nos permite iterar sobre um conjunto de seqen-

cias pareando sequencialmente os elementos das mltiplas listas


(exemplo 1.36).
Listagem 1.36: Iterando sobre mais de uma sequncia.

1 >>> p e r g u n t a s = [ ' nome ' , ' c a r g o ' , ' p a r t i d o ' ]


2 >>> r e s p o s t a s = [ ' L u l a ' , ' P r e s i d e n t e ' , 'PT ' ]
3 >>>

for

in z i p ( p e r g u n t a s , r e s p o s t a s ) :
print " q u a l o s e u %s ? %s "%(p , r )

p, r

5
6
7

qual

seu

nome ?

qual

seu

cargo ?

qual

seu

p a r t i d o ? PT

Lula
Presidente

Podemos ainda desejar iterar sobre uma sequncia em ordem


reversa (exemplo 1.5), ou iterar sobre uma sequncia ordenada sem
alterar a sequncia original (exemplo 1.37). Note que no exemplo
1.37, a lista original foi convertida em um conjunto (set) para
eliminar as repeties.

1 >>>

for

2
3

i in r e v e r s e d ( r a n g e ( 5 ) ) :
print i

Listagem 1.37: Iterando sobre uma sequncia ordenada.

1 >>>

for

in

sorted ( set ( l ) ) :

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

32

print

2
3

laranja

leite

5 manga
6

ovos

uva
Iteraes podem ser interrompidas por meio da palavra reser-

vada

break.

Esta pode ser invocada quando alguma condio se

concretiza. Podemos tambm saltar para a prxima iterao (sem


completar todas as instrues do bloco) por meio da palavra reservada

continue.

A palavra reservada

else

tambm pode ser

aplicada ao nal de um bloco iterativo. Neste caso o bloco denido


por

else s ser executado se a iterao se completar normalmente,


break.

isto , sem a ocorrncia de

Lidando com erros: Excees


O mtodo da tentativa e erro no exatamente aceito na ortodoxia
cientca mas, frequentemente, utilizado no dia a dia do trabalho
cientco. No contexto de um programa, muitas vezes somos forados a lidar com possibilidades de erros e precisamos de ferramentas
para lidar com eles.
Muitas vezes queremos apenas continuar nossa anlise, mesmo
quando certos erros de menor importncia ocorrem; outras vezes,
o erro justamente o que nos interessa, pois nos permite examinar
casos particulares onde nossa lgica no se aplica.
Como de costume o Python nos oferece ferramentas bastante

intuitivas para interao com erros .


Listagem 1.38: Exemplo de uma exceo

1 >>> 1 / 0
9 Os

erros tratados nesta seo no so erros de sintaxe mas erros que

ocorrem durante a execuo de programas sintaticamente corretos. Estes erros


sero denomidados

excees

1.5. CONTROLE DE FLUXO


2
3
4

Traceback
File

( most

recent

"<s t d i n >" ,

ZeroDivisionError :
modulo

by

line

33

call
1,

integer

in

last ) :
?

division

or

zero

Suponhamos que voc escreva um programa que realiza divises


em algum ponto, e dependendo dos dados fornecidos ao programa,
o denominador torna-se zero. Como a diviso por zero no possvel, o seu programa para, retornando uma mensagem similar a da
listagem 1.38. Caso voc queira continuar com a execuo do programa apesar do erro, poderamos solucionar o problema conforme
o exposto na listagem 1.39
Listagem 1.39: Contornando uma diviso por zero

1 >>>
2

...

...

...

...

...

for

...

Diviso

1.0

i in
try :

range (5) :
q =1./ i

print q
except Z e r o D i v i s i o n E r r o r :
print " D i v i s o p o r z e r o ! "
por

zero !

10

0.5

11

0.333333333333

12

0.25
A construo

try:...except:

nos permite vericar a ocorrn-

cia de erros em partes de nossos programas e responder adequadamente a ele.

o Python reconhece um grande nmero de tipos

de excees, chamadas built-in exceptions. Mas no precisamos


sab-las de cor, basta causar o erro e anotar o seu nome.
Certas situaes podem estar sujeitas ocorrncia de mais de
um tipo de erro. neste caso, podemos passar uma tupla de excees
para a palavra-chave

except: except (NameError, ValueError,IOError):pass,

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

34

ou simplesmente no passar nada:

except:

pass.

Pode aconte-

cer ainda que queiramos lidar de forma diferente com cada tipo de
erro (listagem 1.40).
Listagem 1.40: Lidando com diferentes tipos de erros.

1 >>>

try :

f = open ( ' a r q . t x t ' )

s = f . readline ()

= int ( s . strip () )

except I O E r r o r ,
print " E r r o

5
6

errno ,

( errno ,
de

strerror )

except V a l u e E r r o r :
print "No f o i

7
8

dado em

except :
print

9
10

" Erro

strerror ) :

I /O (% s ) : %s " % (

possvel

converter

Inteiro . "
desconhecido . "

A construo try:...except: acomoda ainda uma clusula


else opcional, que ser executada sempre que o erro esperado no
ocorrer, ou seja, caso ocorra um erro imprevisto a clusula else
ser executada (ao contrrio de linhas adicionais dentro da clusula

try).

Finalmente,

try permite uma outra clusula opcional, finally,

que sempre executada (quer haja erros quer no). Ela util para
tarefas que precisam ser executadas de qualquer forma, como fechar
arquivos ou conexes de rede.

1.6 Funes
No Python, uma funo um bloco de cdigo denido por um
cabealho especco e um conjunto de linhas indentadas, abaixo
deste. Funes, uma vez denidas, podem ser chamadas de qualquer ponto do programa (desde que pertenam ao espao de no-

1.6. FUNES

35

mes). Na verdade, uma diferena fundamental entre uma funo e


outros objetos o fato de ser chamvel. Isto decorre do fato de to-

10 chamado

das as funes possuirem um mtodo

__call__.

Todos

11 .

os objetos que possuam este mtodo podero ser chamados

O ato de chamar um objeto, em Python, caracterizado pela


aposio de parnteses ao nome do objeto. Por exemplo:
Estes parnteses podem ou no conter argumentos.

func().

Continue

lendo para uma explicao do que so argumentos.


Funes tambm possuem seu prprio espao de nomes, ou seja,
todas as variveis denidas no escopo de uma funo s existem
dentro desta. Funes so denidas pelo seguinte cabealho:

def

nome ( p a r 1 ,
args ,

par2 ,

p a r 3=v a l o r d e f a u l t ,

k w a r g s ) :

A palavra reservada

def

indica a denio de uma funo; em

seguida deve vir o nome da funo que deve seguir as regras de


formao de qualquer nome em Python.

Entre parnteses vem,

opcionalmente, uma lista de argumentos que sero ser passados


para a funo quando ela for chamada.
valores default se listados da forma

a=1.

Argumentos podem ter


Argumentos com valores

default devem vir necessariamente aps todos os argumentos sem


valores default(Listagem 1.41).
Listagem 1.41: Denindo uma funo com um argumento obrigatrio e outro opcional (com valor default").

1 >>>
2

...

...

def

f u n ( a , b=1) :

print

a,b

4 >>> f u n ( 2 )
5

10 Veja o captulo
11 O leitor, neste

2 para uma explicao do que so mtodos.


ponto deve estar imaginando todo tipo de coisas inte-

ressantes que podem advir de se adicionar um mtodo


normalmente no chamveis.

__call__

a objetos

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

36

6 >>> f u n ( 2 , 3 )
7

fun ( b=5 ,2)

SyntaxError :

3
nonke ywo rd

arg

after

key wor d

arg
Por m, um nmero varivel de argumentos adicionais pode ser
previsto atravs de argumentos precedidos por

* ou **.

No exemplo

acima, argumentos passados anonimamente (no associados a um


nome) sero colocados em uma tupla de nome

t,

e argumentos

passados de forma nominal (z=2,q='asd')sero adicionados a um


dicionrio, chamado

d(Listagem

1.42).

Listagem 1.42: lista de argumentos varivel

1 >>>

def

fun ( t ,

print

t ,

d ) :
d

3 >>> f u n ( 1 , 2 , c =2 , d=4)
4

(1 ,2)

{ ' c ' :3 , 'd ' :4}

Funes so chamadas conforme ilustrado na linha 3 da listagem


1.42. Argumentos obrigatrios, sem valor default, devem ser passados primeiro. Argumentos opcionais podem ser passados fora de
ordem, desde que aps os argumentos obrigatrios, que sero atribudos sequencialmente aos primeiros nomes da lista denida no
cabealho da funo(Listagem 1.41).
Muitas vezes conveniente desempacotar os argumentos passados para uma funo a partir de uma tupla ou dicionrio.
Listagem 1.43: Desempacotando argumentos.

1 >>>

def

fun ( a , b , c , d ) :

print

a,b,c ,d

3 >>> t = ( 1 , 2 ) ; d i = { ' d ' :


4 >>> f u n ( t , d i )
5

3,

'c ' :

4}

1.6. FUNES

37

Argumentos passados dentro de um dicionrio podem ser utilizados simultneamente para argumentos de passagem obrigatria
(declarados no cabealho da funo sem valor default) e para argumentos opcionais, declarados ou no(Listagem 1.44).
Listagem 1.44:

Passando todos os argumentos por meio de um

dicionrio.

1 >>>
2

...

...

def

fun2 ( a ,

print

b =1 , o u t r o s ) :

a,

b,

outros

4 >>> d i c = { ' a ' : 1 , ' b ' : 2 , ' c ' : 3 , ' d ' : 4 }


5 >>> f u n 2 ( d i c )
6

{ 'c ' :

3,

'd ' :

4}

Note que no exemplo 1.44, os valores cujas chaves correspondem a argumentos declarados, so atribudos a estes e retirados do
dicionrio, que ca apenas com os tens restantes.
Funes podem retornar valores por meio da palavra reservada

return.

Listagem 1.45: Retornando valores a partir de uma funo.

1 >>>
2
3

def

4 >>> soma
5

soma ( a , b ) :

return a+b
print " i g n o r a d o ! "
(3 ,4)

7
A palavra return indica sada imediata do bloco da funo le-

vando consigo o resultado da expresso sua direita.

Funes lambda
Funes lambda so pequenas funes annimas que podem ser
denidas em apenas uma linha. Por denio, podem conter uma
nica expresso.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

38

1 >>>

def
n

Listagem 1.46: Funes lambda


r a i z ( n ) :#d e f i n i n d o

uma

raiz

de

ordem

return lambda ( x ) : x ( 1 . / n )

3 >>> r 4 = r a i z ( 4 )#r 4

calcula

raiz

de

ordem

4 >>> r 4 ( 1 6 ) #u t i l i z a n d o
5

2
Observe no exemplo (1.46), que lambda lembra a denio de

variveis do espao de nome em que foi criada.

Assim,

r4

passa

a ser uma funo que calcula a raiz quarta de um nmero. Este


exemplo nos mostra que podemos modicar o funcionamento de
uma funo durante a execuo do programa: a funo raiz retorna
uma funo raiz de qualquer ordem, dependendo do argumento que
receba.

Geradores
Geradores so um tipo especial de funo que retm o seu estado
de uma chamada para outra.

So muito convenientes para criar

iteradores, ou seja, objetos que possuem o mtodo

1 >>>

def

2
3
4 >>>
5

for

next().

Listagem 1.47: Geradores


l e t r a s ( palavra ) :

for

in

yield

in

palavra :
i

l e t r a s ( ' gato ' ) :

print

Como vemos na listagem 1.47 um gerador uma funo sobre


a qual podemos iterar.

1.6. FUNES

39

Decoradores
Decoradores so uma alterao da sintaxe do Python, introduzida a partir da verso 2.4, para facilitar a modicao de funes
(sem alter-las), adicionando funcionalidade.
ilustrar o uso bsico de decoradores.

Nesta seo vamos

Usos mais avanados po-

http://wiki.python.org/moin/

dem ser encontrados nesta url:

PythonDecoratorLibrary.

Listagem 1.48: Decorador bsico.

1
2

def

faznada ( f ) :

def

3
4

novaf ( args , kwargs ) :

print " chamando . . . " , a r g s , k w a r g s


return f ( a r g s , k w a r g s )

n o v a f . __name__ = f . __name__

n o v a f . __doc__ = f . __doc__

7
8

n o v a f . __dict__ . u p d a t e ( f . __dict__ )

return

novaf

Na listagem 1.48, vemos um decorador muito simples.

Como

seu nome diz, no faz nada, alm de ilustrar a mecnica de um decorador. Decoradores esperam um nico argumento: uma funo.
A listagem 1.49, nos mostra como utilizar o decorador.
Listagem 1.49: Utilizando um decorador

1 >>>@ f a z n a d a
2
3

def

soma ( a , b ) :

return

a+b

4
5 >>> soma ( 1 , 2 )
6

chamando . . .

(1 ,

2)

{}

7 Out [ 5 ] : 3
O decorador da listagem 1.48, na verdade adiciona uma linha
de cdigo funo que decora:

print "chamando...",args,kwargs.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

40

Repare que o decorador da listagem 1.48, passa alguns atributos bsicos da funo original para a nova funo, de forma que
a funo decorada possua o mesmo nome, docstring, etc.
funao original.

que a

No entanto, esta passagem de atributos polui

o cdigo da funo decoradora.

Podemos evitar a poluio e o

trabalho extra utilizando a funcionalidade do mdulo functools.


Listagem 1.50: Limpando a gerao de decoradores

1 >>>
2 >>>

from f u n c t o o l s import
def m e u D e c o r a d o r ( f ) :

...

...

...

@wraps ( f )

def

novaf ( args ,

print

decorada

...

...

8
9

wraps

kwds ) :

' Chamando

funcao

'

return f ( a r g s ,
return n o v a f

kwds )

...
>>> @meuDecorador

10

...

11

...

12

...

def

exemplo ( ) :
""" Docstring """

print

' funcao

exemplo

executada ! '

13

...

14

>>> e x e m p l o ( )

15

Chamando

16

funcao

17
18
19
20

funcao

exemplo

decorada
executada !

>>> e x e m p l o . __name__
' exemplo '
>>> e x e m p l o . __doc__
' Docstring '
Decoradores nao adicionam nenhuma funcionalidade nova ao

que j possvel fazer com funes, mas ajudam a organizar o


cdigo e reduzir a necessidade duplicao.

Aplicaes cientcas

1.6. FUNES

41

de decoradores so raras, mas a sua presena em pacotes e mdulos de utilizao genrica vem se tornando cada vez mais comum.
Portanto, familiaridade com sua sintaxe aconselhada.

Strings de Documentao
Strings posicionadas na primeira linha de uma funo, ou seja,
diretamente abaixo do cabealho, so denominadas strings de documentao, ou simplesmente

docstrings.

Estas strings devem ser utilizadas para documentar a funo


explicitando sua funcionalidade e seus argumentos. O contedo de
uma docstring est disponvel no atributo

__doc__

da funo.

Ferramentas de documentao de programas em Python extraem estas strings para montar uma documentao automtica
de um programa.

A funo help(nome_da_funo) tambm re-

torna a docstring. Portanto a incluso de docstrings auxilia tanto


o programador quanto o usurio.
Listagem 1.51: Usando Docstrings

def

1 >>>

soma ( a , b ) :

"""

Esta

funcao

soma

"""

return

numeros :

a+b

8 >>> h e l p ( soma )
9

dois

>>> soma ( 2 , 3 )

Help

on

function

soma

in

module __main__ :

10
11
12
13
14

soma ( a ,
Esta

b)
funcao

soma

>>> soma ( 2 , 3 )
5

dois

numeros :

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

42

No exemplo 1.51, adicionamos uma docstring explicando a nalidade da funo soma e ainda inclumos um exemplo. Incluir um
exemplo de uso da funo cortado e colado diretamente do console
Python (incluindo o resultado), nos permitir utilizar o mdulo

doctest

para testar funes, como veremos mais adiante.

1.7 Mdulos e Pacotes


Para escrever programas de maior porte ou agregar colees de
funes e/ou objetos criados pelo usurio, o cdigo Python pode
ser escrito em um arquivo de texto, salvo com a terminao
facilitando a re-utilizao daquele cdigo.

.py,

Arquivos com cdigo

Python contrudos para serem importados, so denominados mdulo. Existem algumas variaes na forma de se importar mdulos. O comando

import meumodulo

cria no espao de nomes um

objeto com o mesmo nome do mdulo importado. Funes, classes


(ver captulo 2) e variveis denidas no mdulo so acessveis como
atributos deste objeto.

O comando

from modulo import *

im-

porta todas as funes e classes denidas pelo mdulo diretamente

12 do nosso script. Deve ser utilizado

para o espao de nomes global

com cuidado pois nomes iguais pr-existentes no espao de nomes


global sero redenidos. Para evitar este risco, podemos substituir
o

por uma sequncia de nomes correspondente aos objetos que

from modulo import nome1, nome2. Podeimport numpy as


from numpy import det as D.

desejamos importar:

mos ainda renomear um objeto ao import-lo:

ou ainda

Seja um pequeno mdulo como o do exemplo 1.52.

Podemos

importar este mdulo em uma sesso do interpretador iniciada no


mesmo diretrio que contm o mdulo (exemplo 1.7).

1 >>>

import

12 Dicionrio
um script

fibo

de nomes de variveis e funes vlidos durante a execuo de

1.7. MDULOS E PACOTES

43

Listagem 1.52: Mdulo exemplo

1 # Disponvel

no

pacote

de

programas

como :

f i b o . py

2 #modulo

para

ate

3
4

def

calcular

numero

b = 0,

while b <
print

a,

9
10

if

serie

de

fibonacci

fib (n) :
a,

n.

1
n:
b,

b = b,

a+b

__name__=="__main__" :

13

import s y s
print __name__
print s y s . a r g v

14

f i b ( i n t ( sys . argv [ 1 ] ) )

11
12

2 >>> f i b o . f i b ( 5 0 )
3

13

21

34

4 >>> f i b o . __name__
5

' fibo '


Note que a funo declarada em

mtodo de

fibo.

fibo.py

chamada como um

Isto porque mdulos importados so objetos

(como tudo o mais em Python).


Quando um mdulo importado ou executado diretamente ,
torna-se um objeto com um atributo

__name__.

O contedo deste

atributo depende de como o mdulo foi executado. Se foi executado


por meio de importao,
(sem a terminao .py).

modulo.py), __name__

__name__

igual ao nome do mdulo

Se foi executado diretamente (python

igual a

__main__.

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

44

Durante a importao de um mdulo, todo o cdigo contido no


mesmo executado, entretanto como o
e no

__main__,

__name__ de bo fibo


if no so executadas.

as linhas abaixo do

Qual ento a funo destas linhas de cdigo? Mdulos podem ser


executados diretamente pelo interpretador, sem serem importados
primeiro. Vejamos isso no exemplo 1.53. Podemos ver que agora
o

__name__

__main__ e, portanto, as linhas de


if so executadas. Note que neste caso
sys, cujo atributo argv nos retorna uma

do mdulo

cdigo dentro do bloco


importamos o mdulo

lista com os argumentos passados para o mdulo a partir da posio

1.

A posio

sempre o nome do mdulo.

Listagem 1.53: Executing a module from the console.

python

f i b o . py

60

2 __main__
3

[ ' f i b o . py ' ,

'60 ']
13

21

34

55

Qualquer arquivo com terminao

.py

considerado um m-

dulo Python pelo interpretador Python. Mdulos podem ser executados diretamente ou importados por outros mdulos.
A linguagem Python tem como uma de suas principais vantagens uma biblioteca bastante ampla de mdulos, includa com a
distribuio bsica da linguagem. Nesta seo vamos explorar alguns mdulos da biblioteca padro do Python, assim como outros,
mdulos que podem ser obtidos e adicionados sua instalao do
Python.
Para simplicidade de distribuio e utilizao, mdulos podem
ser agrupados em pacotes.

Um pacote nada mais do que um

diretrio contendo um arquivo denominado

__init__.py

(este ar-

quivo no precisa conter nada). Portanto, pode-se criar um pacote


simplesmente criando um diretrio chamado, por exemplo, pacote
contendo os seguintes mdulos:

13 Alm

de

__init__.py,

modulo1.py

naturalmente.

modulo2.py13 .

Um

1.7. MDULOS E PACOTES

45

pacote pode conter um nmero arbitrrio de mdulos, assim como


outros pacotes.
Como tudo o mais em Python, um pacote tambm um objeto.
Portanto, ao importar o pacote pacote em uma sesso Python,
modulo1 e modulo2 aparecero como seus atributos (listagem 1.54).
Listagem 1.54: importing a package

1 >>>

import

pacote

2 >>> d i r ( p a c o t e )
3

[ ' modulo1 ' , ' modulo2 ' ]

Pacotes teis para Computao Cientca

Numpy
Um dos pacotes mais importantes, seno o mais importante para
quem deseja utilizar o Python em computao cientca, o

numpy.

Este pacote contm uma grande variedade de mdulos voltados


para resoluo de problemas numricos de forma eciente.
Exemplos de objetos e funes pertencentes ao pacote

numpy

aparecero regularmente na maioria dos exemplos deste livro. Uma


lista extensiva de exemplos de Utilizao do Numpy pode ser consultada neste endereo:

List

http://www.scipy.org/Numpy_Example_

Na listagem 1.55, vemos um exemplo de uso tpico do numpy. O


numpy nos oferece um objeto matriz, que visa representar o conceito
matemtico de matriz. Operaes matriciais derivadas da algebra
linear, so ainda oferecidas como funes atravs do subpacote linalg (Listagem 1.55).
Listagem 1.55:
matriz.

1 >>>

from

Calculando e mostrando o determinante de uma

numpy

import

2 >>> a = a r a n g e ( 9 )

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

46

3 >>>
4

[0

print

5 >>> a . s h a p e
6 >>>

print

[[0

2]

[3

5]

[6

8]]

10 >>>

from

8]

=(3 ,3)

numpy . l i n a l g

import

det

11 >>> d e t ( a )
12

0.0

13 >>>
Na primeira linha do exemplo 1.55, importamos todas as funes e classes denidas no mdulo numpy.
Na segunda linha, usamos o comando
um vetor

arange(9)

para criar

de 9 elementos. Este comando equivalente ao

range

para criar listas, s que retorna um vetor (matriz unidimensional).


Note que este vetor composto de nmeros inteiros sucessivos comeando em zero.

Todas as enumeraes em Python comeam

a[0] o primeiro elemento do vea. O objeto que criamos, do tipo array, denido no mdulo numpy. Uma outra forma de criar o mesmo objeto seria: a =
array([0,1,2,3,4,5,6,7,8]).
Na terceira linha, ns mostramos o contedo da varivel a com
o comando print. Este comando imprime na tela o valor de uma

em zero. Como em uma lista,


tor

varivel.
Como tudo em Python um objeto, o objeto array apresenta
diversos mtodos e atributos. O atributo chamado

shape contm o

formato da matriz como uma tupla, que pode ser multi-dimensional


ou no. Portanto, para converter vetor
atribuir o valor

(3,3)

shape.

a em uma matriz 33, basta

Conforme j vimos, atributos e

mtodos de objetos so referenciados usando-se esta notao de


ponto

14 .

14 nome_da_varivel.atributo

1.8. DOCUMENTANDO PROGRAMAS


Na quinta linha, usamos o comando
terao na forma da varivel

a.

print

47

para mostrar a al-

det do mdulo numpy.linalg


det(a) nos
da matriz a 0.0.

Na sexta linha importamos a funo

para calcular o determinante da nossa matriz. A funo


informa, ento, que o determinante

Scipy
Outro mdulo muito til para quem faz computao numrica com
Python, o

scipy.

scipy

depende do numpy e prov uma

grande coleo de rotinas numricas voltadas para aplicaes em


matemtica, engenharia e estatstica.
Diversos exemplos da segunda parte deste livro se utilizaro
do scipy, portanto, no nos extenderemos em exemplos de uso do

scipy.

Uma lista extensa de exemplos de utilizao do

scipy pode ser

encontrada no seguinte endereo:http://www.scipy.org/Documentation.

1.8 Documentando Programas


Parte importante de um bom estilo de trabalho em computao cientca a documentao do cdigo produzido. Apesar do Python
ser uma linguagem bastante clara e de fcil leitura por humanos,
uma boa dose de documentao sempre positiva.
O Python facilita muito a tarefa tanto do documentador quanto
do usurio da documentao de um programa.

Naturalmente, o

trabalho de documentar o cdigo deve ser feito pelo programador,


mas todo o resto feito pela prpria linguagem.
A principal maneira de documentar programas em Python
atravs da adio de strings de documentao (docstrings) a funes e classes ao redigir o cdigo. Mdulos tambm podem possuir
docstrings contendo uma sinopse da sua funcionalidade.

Estas

strings servem no somente como referncia para o prprio programador durante o desenvolvimento, como tambm como material

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

48

para ferramentas de documentao automtica. A principal ferramenta de documentao disponvel para desenvolvedores o

pydoc,

que vem junto com a distribuio da linguagem.

Pydoc
O

pydoc

uma ferramenta que extrai e formata a documentao

de programas Python. Ela pode ser utilizada de dentro do console


do interpretador Python, ou diretamente do console do Linux.

pydoc

pydoc

No exemplo acima, utilizamos o

pydoc

tao do prprio mdulo pydoc.

acessar qualquer mdulo disponvel no


O

pydoc

para examinar a documen-

Podemos fazer o mesmo para

PYTHONPATH.

possui algumas opes de comando muito teis:

-k <palavra>

Procura por palavras na documentao de todos

os mdulos.

-p <porta> <nome>

Gera a documentao em html iniciando

um servidor HTTP na porta especicada da mquina local.

-g

til para sistemas sem fcil acesso ao console, inicia um servidor


HTTP e abre uma pequena janela para busca.

-w <nome>

escreve a documentao requisitada em formato HTML,

no arquivo

<nome>.html,

onde

<nome>

pode ser um mdulo

instalado na biblioteca local do Python ou um mdulo ou pacote em outra parte do sistema de arquivos. Muito til para
gerar documentao para programas que criamos.
Alm do

pydoc,

outras ferramentas mais sosticadas, desen-

volvidas por terceiros, esto disponveis para automatizar a documentao de programas Python. Exploraremos uma alternativa a
seguir.

1.8. DOCUMENTANDO PROGRAMAS

49

Epydoc

Epydoc uma ferramenta consideravelmente mais sosticada do


pydoc. Alm de prover a funcionalidade j demontrada para o pydoc, oferece outras facilidades como a gerao da
documentao em formato PDF ou HTML e suporte formatao das
O

que o mdulos

docstrings.
O uso do Epydoc similar ao do

pydoc.

Entretanto, devido

sua maior versatilidade, suas opes so bem mais numerosas


(1.56).

Listagem 1.56: Listando as opes do Epydoc.

epydoc

Epydoc
man do programa.

No vamos discutir em detalhes as vrias opes do


pois estas encontram-se bem descritas na pgina

Ainda assim, vamos comentar algumas funcionalidades interessantes.

AT X, facilita a
A capacidade de gerar a documentao em L
E
customizao da mesma pelo usurio e a exportao para outros
formatos.

A opo

url,

nos permite adicionar um link para o

website de nosso projeto ao cabealho da documentao. O

Epydoc

tambm verica o quo bem nosso programa ou pacote encontrase documentado. Usando-se a opo

check

somos avisados sobre

todos os objetos no documentados.


A partir da verso 3.0, o

Epydoc

adiciona links para o cdigo

fonte na ntegra, de cada elemento de nosso mdulo ou pacote. A


opo

graph

pode gerar trs tipos de grcos sobre nosso pro-

grama, incluindo um diagrama

UML(Figura

1.1).

15 .

Dada toda esta funcionalidade, vale apena conferir o Epydoc

15 http://epydoc.sourceforge.net

CAPTULO 1. FUNDAMENTOS DA LINGUAGEM

50

Figura 1.1: Verso

HTML

da documentao gerada pelo

Epydoc.

1.9 Exerccios
1. Repita a iterao do exemplo 1.35 sem utilizar a funo enumerate. Execute a iterao do objeto gerado por
manualmente, sem o auxlio do lao

for

enumerate

e observe o seu re-

sultado.
2. Adicione a funcionalidade

else

listagem 1.33 utilizando

excees.
3. Escreva um exemplo de iterao empregando
e

else(ao

nal).

break, continue

Captulo 2

Programao Orientada a
Objetos

Introduo programao orientada a objetos e sua implementao na linguagem Python. Pr-requisitos:


Ter lido o captulo 1.
rogramao

orientada a objetos um tema vasto na litera-

tura computacional. Neste captulo introduziremos os recur-

sos presentes na linguagem Python para criar objetos e, atravs de


exemplos, nos familiarizaremos com o paradigma da programao
orientada a objetos.
Historicamente, a elaborao de programas de computador passou por diversos paradigmas. Programas de computador comearam como uma simples lista de instrues a serem executadas, em
sequncia, pela CPU. Este paradigma de programao foi mais
tarde denominado de programao no-estruturada. Sua principal
caracterstica a presena de comandos para desviar a execuo
para pontos especcos do programa (goto, jump, etc.)

Exem-

plos de linguagens no-estruturadas so Basic, Assembly e Fortran.


Mais tarde surgiram as linguagens estruturadas, que permitiam a
organizao do programa em blocos que podiam ser executados em
qualquer ordem. As Linguagens C e Pascal ganham grande popu51

CAPTULO 2. ORIENTAO A OBJETO

52

laridade, e linguagens at ento no estruturadas (Basic, Fortran,


etc.)

ganham verses estruturadas.

Outros exemplos de lingua-

gens no estruturadas incluem Ada, D, Forth,PL/1, Perl, maple,


Matlab, Mathematica, etc.
A estruturao de programas deu origem a diversos paradigmas de programao, tais como a programao funcional, na qual
a computao vista como a avaliao sequencial de funes matemticas, e cujos principais exemplos atuais so as linguagens Lisp
e Haskell.
A programao estruturada atingiu seu pico em versatilidade e
popularidade com o paradigma da programao orientada a objetos. Na programao orientada a objetos, o programa dividido
em unidades (objetos) contendo dados (estado) e funcionalidade
(mtodos) prpria.

Objetos so capazes de receber mensagens,

processar dados (de acordo com seus mtodos) e enviar mensagens


a outros objetos. Cada objeto pode ser visto como uma mquina
independente ou um ator que desempenha um papel especco.

2.1 Objetos
Um tema frequente em computao cientca, a simulao de
sistemas naturais de vrios tipos, fsicos, qumicos, biolgicos, etc.
A orientao a objetos uma ferramenta natural na construo de
simulaes, pois nos permite replicar a arquitetura do sistema natural em nossos programas, representando componentes de sistemas
naturais como objetos computacionais.
A orientao a objeto pode ser compreendida em analogia ao
conceito gramatical de objeto. Os componentes principais de uma
frase so:

sujeito, verbo e objeto.

Na programao orientada a

objeto, a ao est sempre associada ao objeto e no ao sujeito,


como em outros paradigmas de programao.
Um dos pontos altos da linguagem Python que facilita sua assimilao por cientistas com experincia prvia em outras linguagens

2.1. OBJETOS

53

Listagem 2.1: Denindo uma classe

class

Objeto :

pass

de programao, que a linguagem no impe nenhum estilo de


programao ao usurio. Em Python pode-se programar de forma
no estruturada, estruturada, procedural, funcional ou orientada a
objeto.

Alm de acomodar as preferncias de cada usurio, per-

mite acomodar as convenincias do problema a ser resolvido pelo


programa.
Neste captulo, introduziremos as tcnicas bsicas de programao orientada a objetos em Python.

Em exemplos de outros

captulos, outros estilos de programao aparecero, justicados


pelo tipo de aplicao a que se prope.

Denindo Objetos e seus Atributos em Python


Ao se construir um modelo de um sistema natural, uma das caractersticas desejveis deste modelo, um certo grau de generalidade.
Por exemplo, ao construir um modelo computacional de um automvel, desejamos que ele (o modelo) represente uma categoria de
automveis e no apenas nosso automvel particular. Ao mesmo
tempo, queremos ser capazes de ajustar este modelo para que ele
possa representar nosso automvel ou o de nosso vizinho sem precisar re-escrever o modelo inteiramente do zero. A estes modelos
de objetos d-se o nome de classes.
A denio de classes em Python pode ser feita de forma mais
ou menos genrica. partir das classes, podemos construir instncias ajustadas para representar exemplares especcos de objetos
representados pela classe.

Na listagem 2.1, temos uma denio

mnima de uma classe de objetos.

Criamos uma classe chamada

CAPTULO 2. ORIENTAO A OBJETO

54

Listagem 2.2: Denindo atributos de uma classe

class

pessoa :

i d a d e =20

a l t u r a =170

s e x o= ' m a s c u l i n o '

p e s o =70

Objeto, inteiramente em branco. Como uma classe completamente


vazia no possvel em Python, adicionamos o comando

pass

que

no tem qualquer efeito.


Para criar uma classe mais til de objetos, precisamos denir
alguns de seus

atributos.

que represente pessoas.

Como exemplo vamos criar uma classe

Na listagem 2.2, denimos alguns atribu-

tos para a classe pessoa. Agora, podemos criar instncias do objeto


pessoa e estas instncias herdaro estes atributos.

1 >>> m a r i a = p e s s o a ( )
2 >>> m a r i a . p e s o
3

70

4 >>> m a r i a . s e x o
5

' masculino '

6 >>> m a r i a
7 <__main__ . p e s s o a

instance

at

0 x402f196c>

Entretanto, os atributos denidos para o objeto pessoa (listagem


2.2), so atributos que no se espera que permaneam os mesmos
para todas as possveis instncias (pessoas). O mais comum que
os atributos especcos das instncias sejam fornecidos no momento
da sua criao.

Para isso, podemos denir quais as informaes

necessrias para criar uma instncia do objeto pessoa.


Listagem 2.3: Passando atributos na criao de um objeto

1 >>>

class

pessoa :

2.1. OBJETOS
2

55

def

...

__init__ ( s e l f , i d a d e , a l t u r a , s e x o ,

peso ) :

...

s e l f . i d a d e=i d a d e

...

s e l f . a l t u r a=a l t u r a

...

s e l f . s e x o=s e x o

...

s e l f . p e s o =70

7 >>> m a r i a = p e s s o a ( )
8
9
10

Traceback
File

( most

TypeError :

(1

call

line

__init__ ( )

arguments

11

recent

"<s t d i n >" ,

1,

in

takes

last ) :
?
exactly

given )

m a r i a=p e s s o a ( 3 5 , 1 5 5 , ' f e m i n i n o ' , 5 0 )

12 >>> m a r i a . s e x o
13

' feminino '

A funo

__init__

que denimos na nova verso da classe pessoa

(listagem 2.3), uma funo padro de classes, que executada


automaticamente, sempre que uma nova instncia criada. Assim,
se no passarmos as informaes requeridas como argumentos pela
funo

__init__ (listagem 2.3, linha 7), recebemos uma mensagem

de erro. Na linha 11 da listagem 2.3 vemos como instanciar a nova


verso da classe pessoa.

Adicionando Funcionalidade a Objetos


Continuando com a analogia com objetos reais, os objetos computacionais tambm podem possuir funcionalidades, alm de atributos.
Estas funcionalidades so denominadas

mtodos

de objeto. Mto-

dos so denidos como funes pertencentes ao objeto. A funo

__init__

que vimos h pouco um mtodo presente em todos os

objetos, ainda que no seja denida pelo programador. Mtodos


so sempre denidos com, pelo menos, um argumento:

self,

que

pode ser omitido ao se invocar o mtodo em uma instncia do objeto (veja linha 11 da listagem 2.3). O argumento

self

tambm

CAPTULO 2. ORIENTAO A OBJETO

56

deve ser o primeiro argumento a ser declarado na lista de argumentos de um mtodo.

Herana
Para simplicar a denio de classes complexas, classes podem
herdar atributos e mtodos de outras classes. Por exemplo, uma
classe Felino, poderia herdar de uma classe mamfero, que por sua
vez herdaria de outra classe, vertebrados. Esta cadeia de herana
pode ser extendida, conforme necessrio (Listagem 2.4).

1 >>>
2

class

Listagem 2.4: Herana


Vertebrado :

v e r t e b r a = True

3 >>>
4

class

Mamifero ( V e r t e b r a d o ) :

mamas = True

5 >>>

class

C a r n i v o r o ( Mamifero ) :

l o n g o s _ c a n i n o s = True

7 >>> b i c h o = C a r n i v o r o ( )
8 >>> d i r ( b i c h o )
9

[ '__doc__ ' ,
' mamas ' ,

' __module__ ' ,

' longos_caninos ' ,

' vertebra ' ]

10 >>> i s s u b c l a s s ( C a r n i v o r o , V e r t e b r a d o )
11

True

12 >>> b i c h o . __class__
13

<

class

__main__ . C a r n i v o r o

at

0 x b 7 a 1 d 1 7 c>

14 >>> i s i n s t a n c e ( b i c h o , M a m i f e r o )
15

True
Na listagem 2.4, vemos um exemplo de criao de um objeto,

instncia da classe Carnivoro, herdando os atributos dos ancestrais


desta.

Vemos tambm que possivel testar a pertinncia de um

objeto a uma dada classe, atravs da funo

issubclass,

isinstance.

A funo

de forma anloga, nos permite vericar as relaes

parentais de duas classes.

2.2. EXERCCIOS

57

Utilizando Classes como Estruturas de Dados


Genricas.
Devido natureza dinmica do Python, podemos utilizar uma
classe como um compartimento para quaisquer tipos de dados. Tal
construto seria equivalente ao tipo

struct

da linguagem

C.

Para

exemplicar, vamos denir uma classe vazia:


Listagem 2.5: Classe como uma estrura de dados

1 >>>
2

class C a c h o r r o :
pass

3 >>> r e x=C a c h o r r o ( )
4 >>> r e x . dono = ' P e d r o '
5 >>> r e x . r a c a = ' P a s t o r '
6 >>> r e x . p e s o =25
7 >>> r e x . dono
8

' Pedro '

9 >>> l a i k a = C a c h o r r o ( )
10 >>> l a i k a . dono
11

AttributeError :
attribute

Cachorro

instance

has

no

' dono '

No exemplo 2.5, a classe

Cachorro

criada vazia, mas ainda

assim, atributos podem ser atribuidos a suas instncias, sem alterar


a estrutura da classe.

2.2 Exerccios
1. Utilizando os conceitos de herana e os exemplos de classes

Cachorro que herde atriCarnivoro e Mamfero e crie instncias que

apresentados, construa uma classe


butos das classes

possuam donos, raas, etc.


2. No Python, o que dene um objeto como chamvel (funes,
por exemplo) a presena do mtodo

__call__.

Crie uma

CAPTULO 2. ORIENTAO A OBJETO

58

classe, cujas instncias podem ser chamadas, por possurem


o mtodo

__call__.

Captulo 3

Criando Grcos em Python

Introduo produo de guras de alta qualidade utilizando o pacote matplotlib. Pr-requisitos: Captulo
1.
xiste

um nmero crescente de mdulos para a criao de gr-

cos cientcos com Python. Entretanto, at o momento da

publicao deste livro, nenhum deles fazia parte da distribuio


ocial do Python.
Para manter este livro prtico e conciso, foi necessrio escolher
apenas um dos mdulos de grcos disponveis, para apresentao
neste captulo.
O critrio de escolha levou em considerao os principais valores
da losoa da linguagem Python (ver listagem ):

simplicidade,

elegncia, versatilidade, etc. poca, a aplicao destes critrios

nos deixou apenas uma opo: o mdulo matplotlib .

3.1 Introduo ao Matplotlib


O mdulo matplotlib (MPL) voltado para a gerao de grcos
bi-dimensionais de vrios tipos, e se presta para utilizao tanto in-

1 http://matplotlib.sourceforge.net
59

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

60

terativa quanto em scripts, aplicaes web ou integrada a interfaces


grcas (GUIs) de vrios tipos.
A instalao do MPL tambm segue o padro de simplicidade
do Python (listagem 3.1). Basta baixar o pacote

tar.gz do stio,

descompactar e executar o comando de instalao.


Listagem 3.1: Instalando o matplotlib

python

s e t u p . py

install

O MPL procura tornar simples tarefas de plotagem, simples e


tarefas complexas, possveis (listagem3.2, gura 3.1). Os grcos
gerados podem ser salvos em diversos formatos: jpg, png, ps, eps e
svg. Ou seja, o MPL exporta em formatos raster e vetoriais (svg)
o que torna sua sada adequada para insero em diversos tipos de
documentos.
Listagem 3.2: Criando um histograma no modo interativo

1 >>>
2 >>>

from
from

pylab

import

numpy . random

import

3 >>> x=n o r m a l ( 0 , 1 , 1 0 0 0 )
4 >>> h i s t ( x , 3 0 )
5

...

6 >>> show ( )
Podemos tambm embutir a sada grca do MPL em diversas GUIs:

GTK, WX e TKinter.

Naturalmente a utilizao do

MPL dentro de uma GUI requer que os mdulos adequados para

o desenvolvimento com a GUI em questo estejam instalados .


Para gerar os grcos e se integrar a interfaces grcas, o MPL
se utiliza de diferentes backends de acordo com nossa escolha
(Wx, GTK, Tk, etc).

2 Veja

no sitio do MPL os pr-requisitos para cada uma das GUIs

3.1. INTRODUO AO MATPLOTLIB

61

Figura 3.1: Histograma simples a partir da listagem 3.2

Congurando o MPL
O MPL possui valores
cos gerados.
chamado

default

para propriedades genricas dos gr-

Estas conguraes cam em um arquivo texto

matplotlibrc,

que deve ser copiado da distribuio do

MPL, editado conforme as preferncias do usurio e renomeado


para

/.matplotlibrc,

quivo oculto no diretrio

ou seja, deve ser colocado como um ar-

home do usurio.

A utilizao de conguraes padro a partir do

matplotlibrc

mais til na utilizao interativa do MPL, pois evita a necessidade


de congurar cada gura de acordo com as nossas preferncias, a

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

62

bar
cohere
csd
errorbar
hist
imshow
pcolor
plot
psd
scatter
specgram
stem

Grco de barras
Grco da funo de coerncia
Densidade espectral cruzada
Grco com barras de erro
Histograma
Plota imagens
Grco de pseudocores
Grco de linha
Densidade espectral de potncia
Diagrama de espalhamento
Espectrograma
Pontos com linhas verticais

Tabela 3.1: Principais comandos de plotagem do MPL

cada vez que usamos o MPL .

Comandos Bsicos
Os comandos relacionados diretamente gerao de grcos so
bastante numerosos(tabela 3.1); mas, alm destes, existe um outro
conjunto ainda maior de comandos, voltados para o ajuste no de
detalhes dos grcos (ver tabela 3.2, para uma amostra), tais como
tipos de linha, smbolos, cores, etc. Uma explicao mais detalhada
dos comandos apresentados na tabela 3.1, ser dada nas prximas
sees no contexto de exemplos.

3 Para

uma descrio completa das caractersticas de grcos que podem

ser conguradas, veja o ememplo de matplotlibrc que fornecido com a


distribuio do MPL.

3.2. EXEMPLOS SIMPLES

63

Figura 3.2: Reta simples a partir da listagem 3.3

3.2 Exemplos Simples


O comando

plot

O comando plot um comando muito verstil, pode receber um


nmero varivel de argumentos, com diferentes sadas.
Listagem 3.3: Grco de linha

from

plot ([1 ,2 ,3 ,4])

show ( )

pylab

import

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

64

Quando

plot recebe apenas uma sequncia de nmeros (lista, tupla

ou array), ele gera um grco (listagem 3.3) utilizando os valores


recebidos como valores de

enquanto que os valores de

x so as

posies destes valores na sequncia.


Caso duas sequncias de valores sejam passadas para
tagem 3.4), a primeira atribuida a

x e a segunda a y.

plot (lisNote que,

neste exemplo, ilustra-se tambm a especicao do tipo de sada


grca como uma sequncia de pontos. O parmtero

'ro'

indica

que o smbolo a ser usado um crculo vermelho.


Listagem 3.4: Grco de pontos com valores de

from

plot ([1 ,2 ,3 ,4] ,

import

axis ([0 ,

pylab
6,

0,

x e y especicados.

[1 ,4 ,9 ,16] ,

' ro ' )

20])

s a v e f i g ( ' p o n t o . png ' )

show ( )

Na linha 3 da listagem 3.4 especica-se tambm os limites dos eixos


como uma lista de quatro elementos: os valores mnimo e mximo
dos eixos

savefig

x e y,

respectivamente.

Na linha 4, vemos o comando

que nos permite salvar a gura gerada no arquivo cujo

nome dado pela string recebida. O tipo de arquivo determinado


pela extenso (.png, .ps, .eps, .svg, etc).
O MPL nos permite controlar as propriedades da linha que
forma o grco.

Existe mais de uma maneira de determinar as

propriedades das linhas geradas pelo comando

plot.

Uma das

maneiras mais diretas atravs dos argumentos listados na tabela


3.2.

Nos diversos exemplos apresentados neste captulo, alguns

outros mtodos sero apresentados e explicados .

plot aceita, tanto listas,


Numpy, Numeric ou numarray. Na ver-

Vale a pena ressaltar que o comando


quanto arrays dos mdulos

4 Para

maiores

detalhes

consulte

(http://matplotlib.sourceforge.net).

documentao

do

MPL

3.2. EXEMPLOS SIMPLES

65

Figura 3.3: Grco com smbolos circulares a partir da listagem


3.4

dade todas a sequncias de nmeros passadas para o comando


so convertidas internamente para

O Comando

arrays.

subplot

O MPL trabalha com o conceito de

xos.

plot

O comando

gcf()

gura

independente do de

retorna a gura atual, e o comando

ei-

gca()

retorna os eixos atuais. Este detalhe nos permite posicionar os eixos de um grco em posies arbitrrias dentro da gura. Todos
os comandos de plotagem so realizados nos eixos atuais.

Mas,

para a maioria dos usurios, estes detalhes so transparentes, ou

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

66

Tabela 3.2: Argumentos que podem ser passados juntamente com


a funo plot para controlar propriedades de linhas.
Propriedade

Valores

alpha
antialiased
color
label
linestyle
linewidth
marker
markeredgewidth
markeredgecolor
markerfacecolor
markersize

transparncia (0-1)
true | false
Cor: b,g,r,c,m,y,k,w
legenda

-- : -. Espessura da linha (pontos)

+ o . s v x > < ^

Espessura da margem do smbolo


Cor da margem do smbolo
Cor do smbolo
Tamanho do smbolo (pontos)

seja, o usrio no precisa tomar conhecimento deles. A listagem


3.5 apresenta uma gura com dois eixos feita de maneira bastante
simples.
Listagem 3.5: Figura com dois grcos utilizando o comando subplot.

1 # Disponivel
2
3
4
5
6
7

from
def

no

pacote

de

programas

s u b p l o t . py
pylab

import

f(t):
s1 = cos (2 pi t )
e 1 = e x p ( t )

return

m u l t i p l y ( s1 , e1 )

8
9

t1 = arange ( 0 . 0 ,

5.0 ,

0.1)

10

t2 = arange ( 0 . 0 ,

5.0 ,

0.02)

como :

3.2. EXEMPLOS SIMPLES

67

Figura 3.4: Figura com dois grcos utilizando o comando subplot,


a partir da listagem 3.5

11
12

figure (1)

13

subplot (211)

14

p l o t ( t1 ,

f ( t1 ) ,

' bo ' ,

t2 ,

f ( t2 ) ,

15
16

subplot (212)

17

p l o t ( t2 ,

18

s a v e f i g ( ' s u b p l o t . png ' , d p i =400)

19

show ( )

cos (2 pi t2 ) ,

' r ' )

'k ' )

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

68

Tabela 3.3:

Argumentos opcionais dos comandos de insero de

texto.

Propriedades

Valores

alpha

Transparncia (0-1)

color

Cor

fontangle

italic | normal | oblique

fontname

Nome da fonte

fontsize

Tamanho da fonte

fontweight

normal | bold | light4

horizontalalignment

left | center | right

rotation

horizontal | vertical

verticalalignment

bottom | center | top

O comando

figure(1), na linha 11 da listagem 3.5, opcional,

mas pode vir a ser importante quando se deseja criar mltiplas


guras, antes de dar o comando
mando
um par

plot

show().

Note pelo primeiro co-

da listagem 3.5, que o comando

plot

aceita mais de

(x,y), cada qual com seu tipo de linha especicado inde-

pendentemente.

Adicionando Texto a Grcos


O MPL nos oferece quatro comandos para a adio de texto a guras:

title, xlabel, ylabel,

ttulo e nomes para os eixos

text.

O trs primeiros adicionam

x e y, respectivamente.

Todos os comandos de insero de texto aceitam argumentos


(tabela 3.3) adicionais para formatao do texto.

O MPL tam-

bm nos permite utilizar um subconjunto da linguagem TEXpara


formatar expresses matemticas (Listagem 3.6 e gura 3.5. Para
inserir expresses em TEX, necessrio que as strings contendo
5
as expresses matemticas sejam raw strings , e delimitadas por

5 exemplo:

r'raw string'

3.3. EXEMPLOS AVANADOS

69

cifres($).
Listagem 3.6: Formatando texto e expresses matemticas

1 # Disponivel

no

pacote

de

programas

como :

m a t h t e x t . py

from

t = arange ( 0 . 0 ,

s = s i n (2 pi t )

plot (t , s )

pylab

import

2.0 ,

0.01)

t i t l e ( r ' $\ alpha_i > \ beta_i$ ' ,

text (1 ,

0.6 ,

f o n t s i z e =20)

r ' $ \sum_{ i =0}^\ i n f t y

x_i$ ' ,

f o n t s i z e =20)

text (0.6 ,

0.6 ,

r ' $ \ c a l {A} \rm{ s i n } ( 2

\ omega

)$ ' ,

f o n t s i z e =20)

10

x l a b e l ( ' time

11

y l a b e l ( r ' $ V o l t a g e m ( \mu V) $ ' )

(s) ')

12

s a v e f i g ( ' m a t h t e x t . png ' , d p i =400)

13

show ( )

3.3 Exemplos Avanados


O MPL capaz produzir uma grande variedade grcos mais sosticados do que os apresentados at agora.

Explorar todas as

possibilidades do MPL, foge ao escopo deste texto, mas diversos


exemplos de outros tipos de grcos sero apresentados junto com
os exemplos da segunda parte deste livro.

Mapas
O matplotlib pode ser extendido para plotar mapas. Para isso precisamos instalar o Basemap toolkit. Se voc j instalou o matplo-

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

70

Figura 3.5: Formatao de texto em guras. Gerada pela listagem


3.6

tlib, basta baixar o arquivo tar.gz do Basemap, descompactar para


um diretrio e executar o j conhecido

python setup.py install.

O Basemap j vem com um mapa mundi includo para demonstrao.

Vamos utilizar este mapa em nosso exemplo (Listagem

3.7).
Listagem 3.7: Plotando o globo terrestre

1 # Disponivel
2

from

no

pacote

de

programas

mapa . py
m a t p l o t l i b . t o o l k i t s . basemap
Basemap

como :

import

3.3. EXEMPLOS AVANADOS


3

import

pylab

as

71

4
5 map = Basemap ( p r o j e c t i o n= ' r o b i n ' , l a t _ 0 = 23,
lon_0 = 46,

r e s o l u t i o n= ' l ' , a r e a _ t h r e s h
=1000.)

7 map . d r a w c o a s t l i n e s ( )
8 map . d r a w c o u n t r i e s ( )
9 map . f i l l c o n t i n e n t s ( c o l o r= ' c o r a l ' )
10 map . drawmapboundary ( )
11 map . d r a w m e r i d i a n s ( p . a r a n g e ( 0 , 3 6 0 , 3 0 ) )
12 map . d r a w p a r a l l e l s ( p . a r a n g e ( 9 0 , 9 0 , 3 0 ) )
13 p . show ( )
Na listagem 3.6, criamos um objeto map, que uma instncia,
da classe Basemap (linha 4). A classe Basemap possui diversos atributos, mas neste exemplo estamos denindo apenas alguns como
a projeo (Robinson), coordenadas do centro do mapa,

lon_0,

mnimo de detalhes a serem desenhados,


como

lat_0

resoluo dos contornos, ajustada para baixa, e tamanho

1000km2 .

area_thresh,

denido

72

CAPTULO 3. CRIANDO GRFICOS EM PYTHON

Figura 3.6: Mapa mundi na projeo de Robinson.

Captulo 4

Ferramentas de
Desenvolvimento
Exposio de ferramentas voltadas para o aumento da
produtividade em um ambiente de trabalho em computao cientca. Pr-requisitos: Captulos 1 e 2

omo

em todo ambiente de trabalho, para aumentar a nossa

produtividade em Computao Cientca, existem vrias fer-

ramentas alm da linguagem de programao. Neste captulo falaremos das ferramentas mais importantes, na opinio do autor.

4.1 Ipython
A utilizao interativa do Python de extrema valia. Outros am-

TM ,

bientes voltados para computao cientca, tais como Matlab

TM dentre outros, usam o modo interativo como seu


R, Mathematica

principal modo de operao. Os que desejam fazer o mesmo com o


Python, podem se beneciar imensamente do

Ipython.

O Ipython uma verso muito sosticada da shell do Python


voltada para tornar mais eciente a utilizao interativa da linguagem Python.
73

74

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Primeiros Passos
Para iniciar o Ipython, digitamos o seguinte comando:

ipython

[ opes ]

arquivos

Muita das opes que controlam o funcionamento do Ipython no


so passadas na linha de comando, esto especicadas no arquivo

ipythonrc

dentro do diretrio

/.ipython.

Quatro opes do Ipython so consideradas especiais e devem


aparecer em primeiro lugar, antes de qualquer outra opo:

-qthread, -wthread, -pylab.

-gthread,

As trs primeiras opes so vol-

tadas para o uso interativo de mdulos na construo de GUIs


(interfaces grcas), respectivamente

GTK, Qt, WxPython.

Estas

opes iniciam o Ipython em um thread separado, de forma a permitir o controle interativo de elementos grcos. A opo

-pylab

permite o uso interativo do pacote matplotlib (Ver captulo 3).


Esta opo executar

from pylab import ao iniciar, e permite

que grcos sejam exibidos sem necessidade de invocar o comando

show(),

mas executar scripts que contm

show()

ao nal, corre-

tamente.
Aps uma das quatro opes acima terem sido especicadas,
as opes regulares podem seguir em qualquer ordem.

Todas as

opes podem ser abreviadas forma mais curta no-ambgua,


mas devem respeitar maisculas e minsculas (como nas linguagens Python e Bash, por sinal).

Um ou dois hfens podem ser

utilizados na especicao de opes.


Todas as opes podem ser prexadas por no para serem desligadas (no caso de serem ativas por default).
Devido ao grande nmero de opes existentes, no iremos listlas aqui. consulte a documentao do Ipython para aprender sobre
elas. Entretanto, algumas opes podero aparecer ao longo desta
seo e sero explicadas medida em que surgirem.

4.1. IPYTHON

75

Comandos Mgicos
Uma das caractersticas mais teis do Ipython o conceito de comandos mgicos.

No console do Ipython, qualquer linha come-

ada pelo caractere %, considerada uma chamada a um comando


mgico. Por exemplo,

%autoindent

liga a indentao automtica

dentro do Ipython.
Existe uma opo que vem ativada por default no
denomidada

automagic.

cos podem ser chamados sem o %, ou seja


dido como

ipythonrc,

Com esta funo, os comandos mgi-

%autoindent.

autoindent

enten-

Variveis denidas pelo usurio podem

mascarar comandos mgicos.


vel autoindent = 1, a palavra

Portanto, se eu denir uma vari-

autoindent

no mais reconhecida

como um comando mgico e sim como o nome da varivel criada


por mim. Porm, ainda posso chamar o comando mgico colocando
o caractere % no incio.
O usurio pode extender o conjunto de comandos mgicos com
suas prprias criaes.
como fazer isso.

Veja a documentao do Ipython sobre

%magic

O comando mgico

retorna um explicao dos coman-

dos mgicos existentes.

%Exit

Sai do console Ipython.

%Pprint
%Quit

Liga/desliga formatao do texto.

Sai do Ipython sem pedir conrmao.

%alias

Dene um sinnimo para um comando.

Voc pode usar %1 para


alias foi chamado, por

In

[2]:

alias

all

parnteses :

In

Entrada

[3]:

all

representar a linha em que o comando


exemplo:
echo

" Entrada

entre

(% l ) "

Ola mundo

entre

parnteses :

( Ola mundo )

76

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

%autocall

Liga/desliga modo que permite chamar funes sem os

parnteses. Por exemplo:

%autoindent
%automagic
%bg

fun 1

vira fun(1).

Liga/desliga auto-indentao.

Liga/desliga auto-mgica.

Executa um comando em segundo plano, em um thread separado. Por exemplo:

%bg func(x,y,z=1).

Assim que a exe-

cuo se inicia, uma mensagem impressa no console informando o nmero da tarefa. Assim, pode-se ter acesso ao resultado da tarefa nmero 5 por meio do comando

jobs.results[5]

O Ipython possui um gerenciador de tarefas acessvel atravs

jobs. Para maiores informaes sobre este objeto dijobs?. O Ipython permite completar automaticamente um

do objeto
gite

comando digitado parcialmente.


objeto

jobs

%bookmark

experimente digitar

Para ver todos os mtodos do

jobs.seguido

Gerencia o sistema de marcadores do Ipython.

saber mais sobre marcadores digite

%cd

da tecla <TAB>.

%bookmark?.

Para

Muda de diretrio.

%colors

Troca o esquema de cores.

%cpaste

Cola e executa um bloco pr-formatado da rea de trans-

ferncia (clipboard). O bloco tem que ser terminado por uma


linha contendo

%dhist
%ed

Imprime o histrico de diretrios.

Sinnimo para

%edit

%edit

Abre um editor e executa o cdigo editado ao sair.

comando aceita diversas opes, veja a documentao.

Este

4.1. IPYTHON

77

%edit o que estiver de$EDITOR. Se esta varivel no estiver


vi. Se no for especicado o nome de

O editor a ser aberto pelo comando


nido na varivel de ambiente
denida, o Ipython abrir o

um arquivo, o Ipython abrir um arquivo temporrio para a edio.


O comando

%edit apresenta algumas convenincias. Por exemfun em uma sesso de edio ao sair

plo: se denirmos uma funco

e executar o cdigo, esta funo permanecer denida no espao


de nomes corrente.

Ento podemos digitar apenas

%edit fun

o Ipython abrir o arquivo que a contm, posicionando o cursor,


automaticamente, na linha que a dene. Ao sair desta sesso de
edio, a funo editada ser atualizada.

In

IPython

[ 6 ] : % ed
will

make

temporary

file

named :

tmp/ ipython_edit_GuUWr_ . py

done .

Executing

4 Out [ 6 ] : " d e f
ndef

edited

fun ( ) : \ n

funa ( ) : \ n

code . . .
print

print

' fun '\ n

' f u n a ' \ n"

5
6

In

fun

[ 7 ] : fun ( )

8
9
10

In

[ 8 ] : funa ( )

funa

11
12
13

In

[ 9 ] : % ed

done .

%hist

fun

Executing

Sinnimo para

%history

edited

code . . .

%history.

Imprime o histrico de comandos. Comandos anteriores

tambm podem ser acessados atravs da varivel


o n-simo comando do histrico.

_i<n>,

que

78

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

In

[1]:% hist

1:

_ip . m a g i c ( "%h i s t

")

3
4

In

[2]:% hist

1:

_ip . m a g i c ( "%h i s t

")

2:

_ip . m a g i c ( "%h i s t

")

O Ipython possui um sosticado sistema de registro das sesses. Este sistema controlado pelos seguintes comandos mgicos:

%logon, %logoff, %logstart e %logstate.

Para maiores infor-

maes consulte a documentao.

%lsmagic
%macro

Lista os comandos mgicos disponveis.

Dene um conjunto de linhas de comando como uma macro

para uso posterior:

44-47 49.
%p

%macro teste 1 2

ou

%macro macro2

Sinnimo para print.

%pdb

liga/desliga depurador interativo.

%pdef

Imprime o cabealho de qualquer objeto chamvel.

Se o

objeto for uma classe, retorna informao sobre o construtor


da classe.

%pdoc

Imprime a docstring de um objeto.

%pfile

Imprime o arquivo onde o objeto encontra-se denido.

%psearch

Busca por objetos em espaos de nomes.

%psource

Imprime o cdigo fonte de um objeto. O objeto tem que

ter sido importado a partir de um arquivo.

%quickref
%quit

Mostra um guia de referncia rpida

Sai do Ipython.

4.1. IPYTHON
%r

79

Repete o comando anterior.

%rehash Atualiza a tabela de sinnimos com todas as entradas em


$PATH. Este comando no verica permisses de execuo e
se as entradas so mesmo arquivos. %rehashx faz isso, mas
mais lento.

%rehashdir

Adiciona os executveis dos diretrios especicados

tabela de sinnimos.

%rehashx

Atualiza a tabela de sinnimos com todos os arquivos

executveis em

%reset

$PATH.

Re-inicializa o espao de nomes removendo todos os nomes

denidos pelo usurio.

%run

Executa o arquivo especicado dentro do Ipython como um


programa.

%runlog
%save
%sx

Executa arquivos como logs.

Salva um conjunto de linhas em um arquivo.

Executa um comando no console do Linux e captura sua sada.

%store

Armazena variveis para que estejam disponveis em uma

sesso futura.

%time

Cronometra a execuo de um comando ou expresso.

%timeit

Cronometra a execuo de um comando ou expresso uti-

lizando o mdulo

timeit.

%unalias

Remove um sinnimo.

%upgrade

Atualiza a instalao do Ipython.

%who

Imprime todas as variveis interativas com um mnimo de


formatao.

80

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

%who_ls
%whos

Retorna uma lista de todas as variveis interativas.

Similar ao

%who,

com mais informao sobre cada varivel.

Para nalizar, o Ipython um excelente ambiente de trabalho interativo para computao cientca, especialmente quando
invocado coma opo

-pylab.

O modo

pylab

alm de grcos,

tambm oferece uma srie de comandos de compatibilidade com o

TM (veja captulo 3). O pacote principal do

MATLAB

bm ca exposto no modo

pylab.

numpy

tam-

Subpacotes do numpy precisam

ser importados manualmente.

4.2 Editores de Cdigo


Na edio de programas em Python, um bom editor de cdigo pode
fazer uma grande diferena em produtividade. Devido a signicncia dos espaos em branco para a linguagem, um editor que mantm
a indentao do cdigo consistente, muito importante para evitar

bugs.

Tambm desejvel que o editor conhea as regras de in-

dentao do Python, por exemplo: indentar aps  :, indentar com


espaos ao invs de tabulaes. Outra caracterstica desejvel a
colorizao do cdigo de forma a ressaltar a sintaxe da linguagem.
Esta caracterstica aumenta, em muito, a legibilidade do cdigo.
Os editores que podem ser utilizados com sucesso para a edio
de programas em Python, se dividem em duas categorias bsicas:
editores genricos e editores especializados na linguagem Python.
Nesta seo, vamos examinar as principais caractersticas de alguns
editores de cada categoria.

Editores Genricos
Existe um sem-nmero de editores de texto disponveis para o Ambiente Gnu/Linux. A grande maioria deles cumpre nossos requisitos bsicos de indentao automtica e colorizao. Selecionei al-

4.2. EDITORES DE CDIGO

81

guns que se destacam na minha preferncia, quanto a usabilidade


e versatilidade.

Emacs:

Editor incrivelmente completo e verstil, funciona como

ambiente integrado de desenvolvimento (gura 4.1). Precisa


ter python-modeinstalado. Para quem no tem experincia
prvia com o Emacs, recomendo que o pacote

Easymacs1

seja

tambm instalado. este pacote facilita muito a interface do


Emacs, principalmente para adio de atalhos de teclado padro

Scite:

CUA.

Pode-se ainda utilizar o Ipython dentro do Emacs.

Editor leve e eciente, suporta bem o Python (executa o

script com <F5>) assim como diversas outras linguagens.


Permite congurar comando de compilao de C e Fortran, o
que facilita o desenvolvimento de extenses. Completamente
congurvel (gura 4.2).

Gnu Nano:

Levssimo editor para ambientes de console, possui

suporte a auto indentao e colorizao em diversas linguagens, incluindo o Python (gura 4.3). Ideal para utilizar em
conjuno com o Ipython (comando

Jedit:

%edit).

Inclu o Jedit nesta lista, pois oferece suporte ao desenvol-

vimento em Jython (ver Seo 5.5).

Afora isso, um edi-

tor bastante poderoso para java e no to pesado quanto o


Eclipse (gura 4.4).

Kate/Gedit

Editores padro do KDE e Gnome respectivamente.

Bons para uso casual, o Kate tem a vantagem de um console


embutido.

1 http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Easymacs/

82

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.1: Editor emacs em modo Python e com Code Browser


ativado

4.2. EDITORES DE CDIGO

83

Figura 4.2: Editor Scite.

Editores Especializados
Editores especializados em Python tendem a ser mais do tipo IDE
(ambiente integrado de desenvolvimento), oferecendo funcionalidades que s fazem sentido para gerenciar projetos de mdio a grande
porte, sendo demais para se editar um simples Script.

Boa-Constructor:

O Boa-constructor um IDE, voltado para o

projetos que pretendam utilizar o WxPython como interface

84

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.3: Editor Gnu Nano.

grca.

Neste aspecto ele muito bom, permitindo cons-

truo visual da interface, gerando todo o cdigo associado


com a interface. Tambm traz um excelente depurador para
programas em Python e d suporte a mdulos de extenso
escritos em outras linguagens, como

Eric:

Pyrex

ou

C(gura

4.5).

O Eric tambm um IDE desenvolvido em Python com a


interface em PyQt. Possui boa integrao com o gerador de
interfaces

Qt Designer,

tornando muito fcil o desenvolvi-

mento de interfaces grcas com esta ferramenta. Tambm


dispe de timo depurador. Alm disso o Eric oferece muitas
outras funes, tais como integrao com sistemas de controle

4.2. EDITORES DE CDIGO

85

Figura 4.4: Editor Jython Jedit

de verso, geradores de documentao, etc.(Figura 4.6).

Pydev (Eclipse):

O Pydev, um IDE para Python e Jython

desenvolvido como um plugin para Eclipse.

Para quem j

tem experincia com a plataforma Eclipse, pode ser uma boa


alternativa, caso contrrio, pode ser bem mais complicado
de operar do que as alternativas mencionadas acima (Figura
4.7). Em termos de funcionalidade, equipara-se ao Eric e ao
Boa-constructor.

86

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.5: IDE Boa-Constructor

4.3 Controle de Verses em Software


Ao se desenvolver software, em qualquer escala, experimentamos
um processo de aperfeioamento progressivo no qual o software
passa por vrias verses.

Neste processo muito comum, a um

certo estgio, recuperar alguma funcionalidade que estava presente


em uma verso anterior, e que, por alguma razo, foi eliminada do
cdigo.
Outro desao do desenvolvimento de produtos cientcos (software ou outros) o trabalho em equipe em torno do mesmo objeto (frequentemente um programa). Normalmente cada membro
da equipe trabalha individualmente e apresenta os seus resultados

4.3. CONTROLE DE VERSES EM SOFTWARE

87

Figura 4.6: IDE Eric.

para a equipe em reunies regulares. O que fazer quando modicaes desenvolvidas por diferentes membros de uma mesma equipe
se tornam incompatveis? Ou mesmo, quando dois ou mais colaboradores esto trabalhando em partes diferentes de um programa,
mas que precisam uma da outra para funcionar?
O tipo de ferramenta que vamos introduzir nesta seo, busca
resolver ou minimizar os problemas supracitados e pode ser aplicado tambm ao desenvolvimento colaborativo de outros tipos de
documentos, no somente programas.
Como este um livro baseado na linguagem Python, vamos utilizar um sistema de controle de verses desenvolvido inteiramente

88

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.7: IDE Pydev

em Python:

Mercurial2 .

Na prtica o mecanismo por trs de

todos os sistemas de controle de verso muito similar.

Migrar

de um para outro uma questo de aprender novos nomes para


as mesmas operaes.

Alm do mais, o uso dirio de sistema de

controle de verses envolve apenas dois ou trs comandos.

Entendendo o Mercurial
O Mercurial um sistema de controle de verses descentralizado,
ou seja, no h nenhuma noo de um servidor central onde ca

2 http://www.selenic.com/mercurial

4.3. CONTROLE DE VERSES EM SOFTWARE

89

Figura 4.8: Diagrama de um repositrio do Mercurial.

depositado o cdigo.

Repositrios de cdigos so diretrios que

podem ser clonados de uma mquina para outra.


Ento, em que consiste um repositrio?

A gura 4.8 uma

representao diagramtica de um repositrio.

Para simplicar

nossa explanao, consideremos que o repositrio j foi criado ou


clonado de algum que o criou. Veremos como criar um repositrio
a partir do zero, mais adiante.
De acordo com a gura 4.8, um repositrio composto por
um Arquivo

3 e por um diretrio de trabalho. O Arquivo contm

a histria completa do projeto.

O diretrio de trabalho contm

uma cpia dos arquivos do projeto em um determinado ponto no


tempo (por exemplo, na reviso 2). no diretrio de trabalho que
o pesquisador trabalha e atualiza os arquivos.

3 Doravante
muns(les).

grafado com A maisculo para diferenciar de arquivos co-

90

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.9: Operao de commit.

Ao nal de cada ciclo de trabalho, o pesquisador envia suas


modicaes para o arquivo numa operao denominada com-

mit(gura 4.9) .
Aps um

commit,

como as fontes do diretrio de trabalho no

correspondiam ltima reviso do projeto, o

Mercurial automati-

camente cria uma ramicao no arquivo. Com isso passamos a ter


duas linhas de desenvolvimento seguindo em paralelo, com o nosso
diretrio de trabalho pertencendo ao ramo iniciado pela reviso 4.

Mercurial agrupa as mudanas enviadas por um usurio


commit), em um conjunto de mudanas atmico, que constitui

O
(via

4 Vou

adotar o uso da palavra commit para me referir a esta operao daqui

em diante. Optei por no tentar uma traduo pois este termo um jargo
dos sistemas de controle de verso.

4.3. CONTROLE DE VERSES EM SOFTWARE

91

Figura 4.10: Repositrio da Ana.

uma reviso.

Estas revises recebem uma numerao sequencial

(gura 4.9). Mas como o

Mercurial

permite desenvolvimento de

um mesmo projeto em paralelo, os nmeros de reviso para diferentes desenvolvedores poderiam diferir.

Por isso cada reviso

tambm recebe um identicador global, consistindo de um nmero


hexadecimal de quarenta dgitos.
Alm de ramicaes, fuses (merge) entre ramos podem ocorrer a qualquer momento.

Sempre que houver mais de um ramo

Mercurial denominar as revises mais recentes de cada ramo(heads, cabeas). Dentre estas, a que tiver
maior nmero de reviso ser considerada a ponta (tip) do repo-

em desenvolvimento, o

sitrio.

Exemplo de uso:
Nestes exemplos, exploraremos as operaes mais comuns num ambiente de desenvolvimento em colaborao utilizando o

Mercurial.

Vamos comear com nossa primeira desenvolvedora, chamada


Ana. Ana possui um arquivo como mostrado na gura 4.10.
Nosso segundo desenvolvedor, Bruno, acabou de se juntar ao

time e clona o repositrio Ana .

hg

clone

s s h : / / maquinadana / p r o j e t o

meuprojeto

requesting

5 Assumimos

all

changes

aqui que a mquina da ana est executando um servidor

ssh

92

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.11: Modicaes de Bruno.

Figura 4.12: Modicaes de Ana.

adding

changesets

adding

manifests

adding

added

file
4

changes

changesets

with

changes

to

files

URLs vlidas:
le://
http://
https://
ssh://
static-http://
Aps o comando acima, Bruno receber uma cpia completa
do arquivo de Ana, mas seu diretrio de trabalho,
permanecer independente.
trabalhar e logo faz dois

meu projeto,

Bruno est ansioso para comear a

commits

(gura 4.11).

Enquanto isso, em paralelo, Ana tambm faz suas modicaes


(gura 4.12).
Bruno ento decide puxar o repositrio de Ana para sincronizlo com o seu.

hg

pull

4.3. CONTROLE DE VERSES EM SOFTWARE

93

Figura 4.13: Repositrio atualizado de Bruno.

pulling

searching

adding

changesets

adding

manifests

adding

added

( run

from

file
1

s s h : / / maquinadaana / p r o j e t o

for

changes

changes

changesets

' hg

heads '

with

to

see

changes

heads ,

' hg

to

files

merge '

to

merge )
O comando

hg pull,

se no especicada a fonte, ir puxar

da fonte de onde o repositrio local foi clonado.

Este comando

atualizar o Arquivo local, mas no o diretrio de trabalho.


Aps esta operao o repositrio de Bruno ca como mostrado
na gura 4.13. Como as mudanas feitas por Ana, foram as ltimas
adicionadas ao repositrio de Bruno, esta reviso passa a ser a
ponta do Arquivo.
Bruno agora deseja fundir seu ramo de desenvolvimento, com
a ponta do seu Arquivo que corresponde s modicaes feitas

hg
update para sincronizar nosso diretrio de trabalho com o Arquivo
por Ana. Normalmente, aps puxar modicaes, executamos
recm atualizado. Ento Bruno faz isso.

hg

update

this

update

spans

following

h e l l o . py

files :

( resolve )

branch

affecting

the

94

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

Figura 4.14: Repositrio de Bruno aps a fuso.

aborting

update

spanning

branches !

( use

merge '

to

across

' hg
' hg

update

C '

merge
to

lose

branches

or

changes )

Devido ramicao no Arquivo de Bruno, o comando

update

no sabe a que ramo fundir as modicaes existentes no diretrio


de trabalho de Bruno. Para resolver isto, Bruno precisar fundir
os dois ramos. Felizmente esta uma tarefa trivial.

merging

hg

merge

tip

h e l l o . py

No comando

merge,

se nenhuma reviso especicada, o dire-

trio de trabalho cabea de um ramo e existe apenas uma outra


cabea, as duas cabeas sero fundidas. Caso contrrio uma reviso
deve ser especicada.
Pronto! agora o repositrio de Bruno cou como a gura 4.14.
Agora, se Ana puxar de Bruno, receber todas as mocaes de
Bruno e seus repositrios estaro plenamente sincronizados, como
a gura 4.14.

Criando um Repositrio
Para criar um repositrio do zero, preciso apenas um comando:

hg

init

4.3. CONTROLE DE VERSES EM SOFTWARE

95

.hg criado
Mercurial ir armazenar todas
repositrio no diretrio .hg. O contedo

Quando o diretrio criado, um diretrio chamado


dentro do diretrio de trabalho. O
as informaes sobre o

deste diretrio no deve ser alterado pelo usurio.

Para saber mais


Naturalmente, muitas outras coisas podem ser feitas com um sistema de controle de verses. O leitor encorajado a consultar a
documentao do

Mercurial

para descobr-las. Para servir de re-

ferncia rpida, use o comando

hg help -v <comando>

com qual-

quer comando da lista abaixo.

add

Adiciona o(s) arquivo(s) especicado(s) no prximo commit.

addremove

Adiciona todos os arquivos novos, removendo os faltan-

tes.

annotate

Mostra informao sobre modicaes por linha de ar-

quivo.

archive

Cria um arquivo (compactado) no versionado, de uma

reviso especicada.

backout
branch

Reverte os efeitos de uma modicao anterior.

Altera ou mostra o nome do ramo atual.

branches
bundle

Lista todas os ramos do repositrio.

Cria um arquivo compactado contendo todas as modica-

es no presentes em um outro repositrio.

cat

Retorna o arquivo especicado, na forma em que ele era em


dada reviso.

clone

Replica um repositrio.

96

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

commit
copy

Arquiva todas as modicaes ou os arquivos especicados.

Copia os arquivos especicados, para outro diretrio no prximo

diff

commit.

Mostra diferenas entre revises ou entre os arquivos especicados.

export

Imprime o cabealho e as diferenas para um ou mais con-

juntos de modicaes.

grep

Busca por palavras em arquivos e revises especcas.

heads
help

Mostra cabeas atuais.

Mostra ajuda para um comando, extenso ou lista de comandos.

identify
import

Imprime informaes sobre a cpia de trabalho atual.

Importa um conjunto ordenado de atualizaes (patches).

Este comando a contrapartida de Export.

incoming

Mostra novos conjuntos de modicaes existentes em

um dado repositrio.

init

Cria um novo repositrio no diretrio especicado. Se o diretrio no existir, ele ser criado.

locate
log

Localiza arquivos.

Mostra histrico de revises para o repositrio como um todo


ou para alguns arquivos.

manifest

Retorna o manifesto (lista de arquivos controlados) da

reviso atual ou outra.

merge

Funde o diretrio de trabalho com outra reviso.

4.3. CONTROLE DE VERSES EM SOFTWARE


outgoing

97

Mostra conjunto de modicaes no presentes no repo-

sitrio de destino.

parents
paths
pull
push

Mostra os pais do diretrio de trabalho ou reviso.

Mostra denio de nomes simblicos de caminho.

Puxa atualizaes da fonte especicada.


Envia modicaes para o repositrio destino especicado.
a contra-partida de

recover

pull.

Desfaz uma transao interrompida.

remove

Remove os arquivos especicados no prximo commit.

rename

Renomeia arquivos; Equivalente a

revert

Reverte arquivos ao estado em que estavam em uma dada

copy + remove.

reviso.

rollback
root

Desfaz a ltima transao neste repositrio.

Imprime a raiz do diretrio de trabalho corrente.

serve

Exporta o diretrio via HTTP.

showconfig Mostra
vos hgrc.
status
tag

Mostra arquivos modicados no diretrio de trabalho.

Adiciona um marcador para a reviso corrente ou outra.

tags
tip

a congurao combinada de todos os arqui-

Lista marcadores do repositrio.

Mostra a reviso ponta.

unbundle

Aplica um arquivo de modicaes.

98

CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO

update

Atualiza ou funde o diretrio de trabalho.

verify

Verica a integridade do repositrio.

version

Retorna verso e informao de copyright.

Captulo 5

Interagindo com Outras


Linguagens
Introduo a vrios mtodos de integrao do Python
com outras linguagens. Pr-requisitos: Captulos 1 e
2.

5.1 Introduo
O Python uma linguagem extremamente poderosa e verstil, perfeitamente apta a ser, no somente a primeira, como a ltima linguagem de programao que um cientista precisar aprender. Entretanto, existem vrias situaes nas quais torna-se interessante
combinar o seu cdigo escrito em Python com cdigos escritos em
outras linguagens.

Uma das situaes mais comuns, a necessi-

dade de obter maior performance em certos algoritmos atravs da


re-implementao em uma linguagem compilada. Outra Situao
comum possibilidade de se utilizar de bibliotecas desenvolvidas
em outras linguagens e assim evitar ter que reimplement-las em
Python.
O Python uma linguagem que se presta. extremamente bem.
a estas tarefas existindo diversos mtodos para se alcanar os obje99

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

100

tivos descritos no pargrafo acima. Neste captulo, vamos explorar


apenas os mais prticos e ecientes, do ponto de vista do tempo de
implementao.

5.2 Integrao com a Linguagem C


A linguagem

uma das linguagens mais utilizadas no desenvol-

vimento de softwares que requerem alta performance.

Um bom

exemplo o Linux (kernel) e a prpria linguagem Python.


fato torna o

Este

um candidato natural para melhorar a performance

de programas em Python.
Vrios pacotes cientcos para Python como o

Numpy

Scipy,

por exemplo, tem uma grande poro do seu cdigo escrito em

para mxima performance.

Coincidentemente, o primeiro m-

todo que vamos explorar para incorporar cdigo


Python, oferecido como parte do pacote

Scipy.

em programas

Weave
O

weave um mdulo do pacote scipy,


C ou C++ dentro

de cdigo escrito em

Existem vrias formas de se utilizar o


de aplicao que se tem.
aplicao do mdulo

que permite inserir trechos


de programas em Python.

weave

dependendo do tipo

Nesta seo, vamos explorar apenas a

inline

do

weave,

por ser mais simples e co-

brir uma ampla gama de aplicaes. Alm disso, utilizaes mais

weave,

avanadas do
linguagem

C,

exigem um conhecimento mais profundo da

o que est fora do escopo deste livro. Caso os exem-

plos includos no satisfaam os anseios do leitor, existe uma farta


documentao no site

www.scipy.org.
weave

Vamos comear a explorar o

com um exemplo trivial

(computacionalmente) um simples loop com uma nica operao


(exemplo 5.1).

5.2. INTEGRAO COM A LINGUAGEM C


Listagem 5.1: Otimizao de loops com o

1 # e n c o d i n g : l a t i n
2 # Disponivel

no

101

weave

pacote

de

programas

como :

w e a v e l o o p . py

3
4
5

from s c i p y . weave import


import t i m e
from p y l a b import

inline , converters

6
7

c o d e=" " "

int

while

i =0;
( i < n)

10

11

i ^3;

12

i ++;

13

}"""

14

def

15

loopp (n) :
i =0

while

16

i < n:

17

18

i +=1

19
20

def

21

loopc (n) :

return

i n l i n e ( code , [ ' n ' ] ,

t y p e _ c o n v e r t e r s=c o n v e r t e r s . b l i t z
, c o m p i l e r= ' g c c ' )

22
23

def

b e n c h ( max ) :

24

ptim =

[]

25

ctim =

[]

26

for

in

x r a n g e ( 1 0 0 , max , 1 0 0 ) :

27

t = time . time ( )

28

loopp (n)

29

t 1=t i m e . t i m e ( ) t

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

102

30

p t i m . append ( t 1 )

31

t = time . time ( )

32

loopc (n)

33

t 1=t i m e . t i m e ( ) t

34

return

35

c t i m . append ( t 1 )
ptim , c t i m , max

36
37

ptim , c t i m , max = b e n c h ( 1 0 0 0 0 )

38

s e m i l o g y ( x r a n g e ( 1 0 0 , max , 1 0 0 ) , ptim , ' bo ' ,

39

y l a b e l ( ' tempo em

x r a n g e ( 1 0 0 , max , 1 0 0 ) , c t i m , ' go ' )


de

40

s e g u n d o s ' ) ; x l a b e l ( u ' Nmero

operaes ' ) ; grid ()

l e g e n d ( [ ' Python ' , 'C ' ] )

41

s a v e f i g ( ' w e a v e l o o p . png ' , d p i =400)

42

show ( )
No exemplo 5.1 podemos ver como funciona o

string contm o cdigo

a ser compilado. A funo

weave.
inline

Uma
com-

pila o cdigo em questo, passando para o mesmo as variveis necessrias.


Note que, na primeira execuo do loop, o

weave

mais lento

que o Python, devido compilao do cdigo; mas em seguida,


com a rotina j compilada e carregada na memria, este atraso no
existe mais.
O

weave.inline tem
C equivalente,

grama em

uma performance inferior de um proexecutado fora do Python.

Mas a sua

simplicidade de utilizao, compensa sempre que se puder obter


um ganho de performance sobre o Python puro.
Listagem 5.2: Calculando iterativamente a srie de Fibonacci em
Python e em

C(weave.inline)

1 # Disponivel
2

from

no

pacote

w e a v e f i b . py
scipy

import

weave

de

programas

como :

5.2. INTEGRAO COM A LINGUAGEM C

Figura 5.1:

103

Comparao da performance entre o Python e o

(weave) para um loop simples. O eixo y est em escala logaritmica


para facilitar a visualizao das curvas.

3
4
5
6

from s c i p y . weave import


import t i m e
from s c i p y . s t a t s import
from p y l a b import

7
8

c o d e=\

"""

10

while

(b < n)

11

12

int

savea = a ;

converters
bayes_mvs

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

104

13

a=b ;

14

b=s a v e a+b ;

15

16

return_val = a ;

17

"""

18

def

fibp (n) :

19

"""

20

Calcula

21

"""

22

a , b = 0 ,1

while

23
24
26
27

def

de

Fibonacci

em Python

b < n:

return

25

srie

a , b = b , a+b
a

fibw (n) :

28

"""

29

Verso

30

"""

31

a = 0

32

b = 1

return

33

weave . i n l i n e

weave . i n l i n e ( c o d e , [ ' n ' , ' a ' , ' b

' ] ,

34

t y p e _ c o n v e r t e r s=c o n v e r t e r s . b l i t z ,
c o m p i l e r= ' g c c ' )

35
36

ptim = [ ] ; c t i m = [ ]

for

in

range (100) :

37

t = time . time ( )

38

pn = f i b p ( 1 0 0 0 0 0 0 0 0 0 )

39

p t = t i m e . t i m e ( ) t ; p t i m . append ( p t )

40

f i b w ( 1 0 )#t o

41

t = time . time ( )

42

cn = f i b w ( 1 0 0 0 0 0 0 0 0 0 )

43
44

compile

c t = t i m e . t i m e ( ) t ;

print

' Tempo mdio

no

before

timing

c t i m . append ( c t )

p y t h o n : %g

s e g u n d o s '%

5.2. INTEGRAO COM A LINGUAGEM C

105

pt

45

print

' Tempo mdio

no

weave : %g

s e g u n d o s '%

ct

46
47

S t a t s = bayes_mvs ( a r r a y ( p t i m ) / a r r a y ( c t i m ) )

print

" Acelerao

mdia : %g + %g

"% ( S t a t s

[0][0] ,

48

Stats [ 2 ] [ 0 ] )
No exemplo 5.2, o ganho de performance do

weave.inline

no to acentuado.
Listagem 5.3: Executando o cdigo do exemplo 5.2.

python

w e a v e f i b . py

2 Tempo mdio no p y t h o n :
3 Tempo mdio no weave :
4

Acelerao

mdia :

1 . 6 9 2 7 7 e 05
1 . 3 1 1 3 e 05

segundos

segundos

1 . 4 9 5 5 4 + 0 . 7 6 4 2 7 5

Ctypes
O pacote

ctypes,

parte integrante do Python a partir da verso

2.5, um mdulo que nos permite invocar funes de bibliotecas


em

pr-compiladas, como se fossem funes em Python. Apesar

da aparente facilidade de uso, ainda necessrio ter conscincia do


tipo de dados a funo, que se deseja utilizar, requer. Por conseguinte, necessrio que o usuario tenha um bom conhecimento da
linguagem

C.

Apenas alguns objetos do python podem ser passados para

None, inteiros, inteiros longos,


strings, e strings unicode. Outros tipos de dados devem ser
convertidos, utilizando tipos fornecidos pelo ctypes, compatveis
com C.
Dado seu estgio atual de desenvolvimento, o ctypes no
funes atravs do ctypes:

a ferramenta mais indicada ao cientista que deseja fazer uso das

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

106

convenincias do

em seus programas Python. Portanto, vamos

apenas dar dois exemplos bsicos para que o leitor tenha uma ideia
de como funciona o

ctypes.

Para maiores informaes recomen-

damos o tutorial do ctypes (http://python.net/crew/theller/

ctypes/tutorial.html)

Nos exemplos abaixo assumimos que o leitor est utilizando


Linux pois o uso do

ctypes

no Windows no idntico.

Listagem 5.4: Carregando bibliotecas em

1 >>>

from

ctypes

import

2 >>> l i b c = c d l l . L o a d L i b r a r y ( " l i b c . s o . 6 " )


3 >>> l i b c
4 <CDLL

' l i b c . so . 6 ' ,

handle

...

at

... >

Uma vez importada uma biblioteca (listagem 5.4), podemos


chamar funes como atributos das mesmas.
Listagem 5.5: Chamando fues em bibliotecas importadas com o
ctypes

1 >>> l i b c . p r i n t f
2 <_FuncPtr

object

3 >>>

l i b c . t i m e ( None )

print

at

0x . . . >

1150640792

5 >>> p r i n t f = l i b c . p r i n t f
6 >>> p r i n t f ( " Ola , %s \ n " ,
7

Ola ,

"Mundo ! " )

Mundo !

Pyrex
O Pyrex uma linguagem muito similar ao Python feita para gerar
mdulos em

para o Python.

Desta forma, envolve um pouco

mais de trabalho por parte do usurio, mas de grande valor para


acelerar cdigo escrito em Python com pouqussimas modicaes.

5.2. INTEGRAO COM A LINGUAGEM C

107

O Pyrex no inclui todas as possibilidades da linguagem Python.


As principais modicaes so as que se seguem:

No permitido denir funes dentro de outras funes;

denies de classe devem ocorrer apenas no espao de nomes global do mdulo, nunca dentro de funes ou de outras
classes;

No permitido

import *.

As outras formas de

import

so

permitidas;

Geradores no podem ser denidos em Pyrex;

As funes

globals() e locals() no podem ser utilizadas.

Alm das limitaes acima, existe um outro conjunto de limitaes que considerado temporrio pelos desenvolvedores do Pyrex.
So as seguintes:

Denies de classes e funes no podem ocorrer dentro de


estruturas de controle (if, elif, etc.);

Operadores

in situ

(+=, *=, etc.) no so suportados pelo

Pyrex;

List comprehensions no so suportadas;

No h suporte a Unicode.

Para exemplicar o uso do Pyrex, vamos implementar uma funo geradora de nmeros primos em Pyrex (listagem 5.6).
Listagem 5.6: Calculando nmeros primos em Pyrex

1 #
2

def

Calcula

numeros

primes ( i n t

primos

kmax ) :

cdef

int

n,

cdef

int

p[1000]

k,

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

108

result

if

6
7

[]

kmax > 1 0 0 0 :
kmax = 1 0 0 0

k = 0

n = 2

10

while

11

k < kmax :

= 0

12

while

13

if

14

i < k

n % p [ i ] <>

0:

i == k :

15

p[k]

16

k = k + 1

17

and

+ 1
= n

r e s u l t . append ( n )

18

n = n + 1

return

19

result

Vamos analisar o cdigo Pyrex, nas linhas onde ele difere do que
seria escrito em Python.

Na linha 2 encontramos a primeira pe-

culiaridade: o argumento de entrada kmax denido como inteiro


por meio da expresso

int kmax.

Em Pyrex, devemos declarar os

tipos das variveis. Nas linhas 3 e 4 tambm ocorre a declarao


dos tipos das variveis que sero utilizadas na funo. Note como
denida uma lista de inteiros. Se uma varivel no declarada,
o Pyrex assume que ela um objeto Python.
Quanto mais variveis conseguirmos declarar como tipos bsicos

C, mais eciente ser o cdigo C gerado pelo Pyrex. A varivel


result(linha 5) no declarada como uma lista de inteiros, pois
de

no sabemos ainda qual ser seu tamanho. O restante do cdigo


equivalente ao Python. Devemos apenas notar a preferncia do

for i in range(x). Este


range do Python.
O prximo passo gerar a verso em C da listagem 5.6, compilar

lao

while

ao invs de um lao do tipo

ultimo seria mais lento devido a incluir a funo

e link-lo, transformando-o em um mdulo Python.

5.2. INTEGRAO COM A LINGUAGEM C

109

Listagem 5.7: Gerando Compilando e linkando

pyrexc

gcc

gcc

p r i m e s . pyx

c fPIC I / u s r / i n c l u d e / p y t h o n 2 . 4 /

primes . c

s h a r e d

primes . o

primes . so

Agora vamos comparar a performance da nossa funo com


uma funo em Python razovelmente bem implementada (Listagem 5.8). Anal temos que dar uma chance ao Python, no?
Listagem 5.8: Calculando nmeros primos em Python

1 # Disponivel
2
3
4
5
6
7

def

no

pacote

if

como :

N <= 3 :

return

#t e s t a

r a n g e ( 2 ,N)

apenas

primos =

[2]

os
+

numeros

impares

r a n g e ( 3 , N, 2 )

index = 1
#c o n v e r t e n d o

#p a r a

while

12

if

em

acelerar

t o p = i n t (N

11
13

programas

p r i m e s (N) :

8
10

de

p r i m e s 2 . py

inteiro
comparacao

abaixo

0.5)

1:
= primos [ index ]

14

i >t o p :

break

15

i n d e x += 1

16

primos =
i )

17

return

18

primes (100000)

or

[x

for

in

primos

if

(x %

( x == i ) ]

primos

Comparemos agora a performance das duas funes para encontrar todos os nmeros primos menores que 100000. Para esta

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

110

comparao utilizaremos o ipython que nos facilita esta tarefa atravs da funo mgica

%timeit.

Listagem 5.9: Comparando performances dentro do ipython

from
from

In

[1]:

In

[2]:

In

[3]:\% timeit

10

loops ,

In

[4]:\% timeit

10

loops ,

primes
primes2

best
best

import p r i m e s
import p r i m e s

as

primesp

primes (100000)
of

3:

19.6

ms

per

loop

primesp (100000)
of

3:

5 1 2 ms

per

loop

Uma das desvantagens do Pyrex a necessidade de compilar e


linkar os programas antes de poder utiliz-los. Este problema se
acentua se seu programa Python utiliza extenses em Pyrex e precisa ser distribuido a outros usurios. Felizmente, existe um meio
de automatizar a compilao das extenses em Pyrex, durante a
instalao de um mdulo. O pacote setuptools, d suporte compilao automtica de extenses em

Pyrex.

Basta escrever um script

de instalao similar ao da listagem 5.10. Uma vez criado o script


(batizado, por exemplo, de

setupyx.py), para compilar a nossa expython setupix.py

tenso, basta executar o seguinte comando:

build.

Para compilar uma extenso Pyrex, o usurio deve naturalmente ter o Pyrex instalado. Entretanto para facilitar a distribuio destas extenses, o pacote setuptools, na ausncia do Pyrex,
procura a verso em

C gerada pelo autor do programa, e se ela esti-

ver incluida na distribuio do programa, o setuptools passa ento


para a etapa de compilao e linkagem do cdigo
Listagem 5.10:

Pyrex

Automatizando a compilao de extenses em

por meio do setuptools

1 # Disponivel
2

C.

from

no

s e t u p y x . py
setuptools

pacote

de

programas

import

setup

como :

5.3. INTEGRAO COM C++

111

Listagem 5.11: Utilizando Setuptools para compilar extenses em


Pyrex

import s e t u p t o o l s
from s e t u p t o o l s . e x t e n s i o n import

Extension

from

Extension

setuptools . extension

import

4
5

p r i m e s p i x = E x t e n s i o n ( name =

' primespix ' ,

sources =

[ ' p r i m e s . pyx

' ]

8
9

s e t u p ( name =

' primes ' ,

10

ext_modules =

11

[ primespix ]

5.3 Integrao com C++


A integrao de programas em Python com bibliotecas em

C++

normalmente feita por meio ferramentas como SWIG (www.swig.

org), SIP(www.riverbankcomputing.co.uk/sip/) ou Boost.Python


(http://www.boost.org/libs/python/). Estas ferramentas, apesar de relativamente simples, requerem um bom conhecimento de

C++

por parte do usurio e, por esta razo, fogem ao escopo deste

captulo. No entanto, o leitor que deseja utilizar cdigo j escrito


em

C++

pode e deve se valer das ferramentas supracitadas, cuja

documentao bastante clara.


Elegemos para esta seo sobre
O ShedSkin.

C++.

uma ferramenta original.

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

112

Shedskin
O ShedSkin (http://shed-skin.blogspot.com/)se auto intitula
um compilador de Python para

C++

otimizado. O que ele faz ,

na verdade, converter programas escritos em Python para


permitindo assim grandes ganhos de velocidade.

C++,

Apesar de seu

potencial, o ShedSkin ainda uma ferramenta um pouco limitada.


Uma de suas principais limitaes, que o programa em Python a
ser convertido deve possuir apenas variveis estticas, ou seja as
variveis devem manter-se do mesmo tipo durante toda a execuo
do programa. Se uma varivel denida como um nmero inteiro,
nunca poder receber um nmero real, uma lista ou qualquer outro
tipo de dado.
O ShedSkin tambm no suporta toda a biblioteca padro do
Python na verso testada (0.0.15). Entretanto, mesmo com estas
limitaes, esta ferramenta pode ser muito til. Vejamos um exemplo: A integrao numrica de uma funo, pela regra do trapzio.
Esta regra envolve dividir a rea sob a funo em um dado intervalo
em multiplos trapzios e somar as suas reas(gura 5.2.
Matemticamente, podemos expressar a regra trapezoidal da
seguinte frmula.

f (x) dx
a

n1
X
h
(f (a) + f (b)) + h
f (a + ih),
2
i=1

h=

ba
n

(5.1)

Na listagem 5.12 podemos ver uma implementao simples da


regra trapezoidal.
Listagem 5.12: implementao da regra trapezoidal(utilizando lao
for) conforme especicada na equao 5.3

1 # e n c o d i n g : l a t i n
2 # Disponivel

no

pacote

de

programas

como :

t r a p i n t l o o p . py

3 # copyright

2007

by

Flvio

Codeo

Coelho

5.3. INTEGRAO COM C++

113

Figura 5.2: Regra trapezoidal para integrao aproximada de uma


funo.

4
5
6
7

from
from
def

time
math

import
import

clock
exp ,

log ,

sin

t i n t ( a , b , fun ) :

"""

Integrao

numrica

pela

regra

trapezoidal

10

"""

11

n = 5000000

12

h2 = ( ba ) / ( n 2 . )

13
14

r e s = h2 f u n ( a )+h2 f u n ( b )

for

in

xrange ( n ) :

2 h2

15

p = a+ i

16

r e s += 2 h2 f u n ( p )

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

114

return

17

res

18
19 # Rodando

as

funcoes

20

start

21

r =

22

stop = clock ()

23

= clock ()

tint (1.0 ,5.0 ,

print

em Python

lambda ( x ) :1+ x )

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r , s t o p

s t a r t )

24

start

25

r =

= clock ()

tint (1.0 ,5.0 ,

lambda ( x ) : e x p ( x 2 l o g ( x+x

sin (x) ) ) )

26
27

stop = clock ()

print

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r , s t o p

s t a r t )

Executando o script da Listagem 5.12 (trapintloop.py) observamos o tempo de execuo da integrao das duas funes.
Listagem 5.13: Executando a listagem 5.12

resultado :

python

3 Tempo :
4

t r a p i n t l o o p . py

resultado :

5 Tempo :

16

11.68

seg

49029

26.96

seg

Para converter o script 5.12 em

C++ tudo o que precisamos fazer

:
Listagem 5.14: Vericando o tempo de execuo em

ss

C++

t r a p i n t l o o p . py
SHED SKIN Pythont o C++ C o m p i l e r

0.0.15

Copyright

2005 ,

2006

GNU GPL v e r s i o n

Mark
2

or

Dufour ;
later

License

( See

LICENSE )

5.3. INTEGRAO COM C++


4

( If

your

program

mail

me

at

does

115

not

compile ,

please

mark . d u f o u r @ g m a i l . com ! ! )

5
6

WARNING

trapintloop :13:

enumerate '
for

and

[ iterative

type

iterations :

[ generating

c++ c o d e . . ]

11

12

g++

13

./ trapintloop

14

resultado :

16

templates :

55

run

O3

...
16

0.06

resultado :

17 Tempo :

lists

analysis . . ]

10

15 Tempo :

'

return

now

make

' xrange ' ,

' reversed '

seg
49029

1.57

seg

Com estes dois comandos, geramos, compilamos e executamos


uma verso

C++ do programa listado em 5.12.

O cdigo

C++ gerado

pelo Shed-Skin pode ser conferido na listagem 5.15


Como pudemos vericar, o ganho em performance considervel.

Lamentvelmente, o Shed-Skin no permite criar mdulos

de extenso que possam ser importados por outros programas em


Python, s programas independentes. Mas esta limitao pode vir
a ser superada no futuro.
Listagem 5.15: Cdigo

C++ gerado pelo Shed-skin a partir do script

trapintloopy.py

1
2
3

#include
namespace

" t r a p i n t l o o p . hpp "


__trapintloop__

4
5

str

const_0 ;

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

116

6
7
8
9

double

r ,

double

__lambda0__ (

10

return

11
12
13
14

double

19

double

x)

double

x)

(1+ x ) ;

__lambda1__ (

return

16
18

stop ;

15
17

start ,

e x p ( ( ( x x ) l o g ( ( x+(x s i n ( x ) ) ) ) ) ) ;

int

20

__main ( )

const_0 =
%s

new

s t r ( " r e s u l t a d o : %d \nTempo :

seg " ) ;

21
22

start

23

r =

24

stop = clock () ;

25

p r i n t ( "%s \ n " , __mod( c o n s t _ 0 ,

= clock () ;

tint (1.0 ,

new

5.0 ,

__lambda0__ ) ;

26

start

27

r =

28

stop = clock () ;

29

p r i n t ( "%s \ n " , __mod( c o n s t _ 0 ,

30

__int ( r ) ,

f l o a t _ ( ( s t o p s t a r t ) ) ) ) ;

= clock () ;

tint (1.0 ,

new

5.0 ,

__lambda1__ ) ;
__int ( r ) ,

f l o a t _ ( ( s t o p s t a r t ) ) ) ) ;

31
32

33

Integrao

numrica

pela

regra

b,

lambda0

trapeziodal

34
35

double

tint (

double

a,

double

fun )

5.4. INTEGRAO COM A LINGUAGEM FORTRAN

117

double h2 , p ,
int __0, __1,

36
37

res ;
i ,

n;

38
39

n = 5000000;

40

h2 = ( ( ba ) / ( n 2 . 0 ) ) ;

41

r e s = ( ( h2 f u n ( a ) ) +(h2 f u n ( b ) ) ) ;

42
43

FAST_FOR( i , 0 , n , 1 , 0 , 1 )

2 ) h2 ) ) ;

44

p = ( a +(( i

45

r e s += ( ( 2 h2 ) f u n ( p ) ) ;

46

END_FOR

47

return

48
49

res ;

50
51
52
53

//

int

module
main (

int

namespace
argc ,

char

a r g v )

54

__shedskin__ : : _ _ i n i t ( ) ;

55

__math__ : : _ _ i n i t ( ) ;

56

__time__ : : _ _ i n i t ( ) ;

57
58

__trapintloop__ : : __main ( ) ;
}

5.4 Integrao com a Linguagem Fortran


A linguagem

Fortran

uma das mais antigas linguagens de pro-

gramao ainda em uso.

Desenvolvida nos anos 50 pela IBM,

foi projetada especicamente para aplicaes cientcas.

A sigla

Fortran

deriva de IBM mathematical FORmula TRANslation

system.

Dada a sua longa existncia, existe uma grande quan-

tidade de cdigo cientco escrito em

Fortran disponvel para uso.

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

118

Felizmente, a integrao do

Fortran

com o Python pode ser feita

de forma extremamente simples, atravs da ferramenta

f2py,

que

demonstraremos a seguir.

f2py
Esta ferramenta est disponvel como parte do Pacote numpy (www.

scipy.org).

Para ilustrar o uso do

f2py, vamos voltar ao problema

da integrao pela regra trapezoidal (equao 5.3). Como vimos, a

for,
Fortran,

implementao deste algoritmo em Python, utilizando um lao


ineciente. Para linguagens compiladas como

C++

ou

laos so executados com grande ecincia. Vejamos a performance


de uma implementao em

??).

Fortran da regra trapezoidal (listagem

Listagem 5.16: implementao em

Fortran

da regra trapezoidal.

label

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

program t r a p e z i o
intrinsic exp , l o g , s i n
real l i n e a r , n o n l
external l i n e a r
external n o n l
call tint (1.0 ,5.0 , linear , res )
print , " R e s u l t a d o : " , r e s
c a l l t i n t ( 1 . 0 , 5 . 0 , nonl , r e s )
print , " R e s u l t a d o : " , r e s
end
subroutine t i n t ( a , b , f u n , r e s )
real a , b , r e s
integer 8 n
real h2 , a l f a
real f u n
external f u n

5.4. INTEGRAO COM A LINGUAGEM FORTRAN


18

n = 5000000

19

Cf2py

20

Cf2py

21

Cf2py

22

Cf2py

intent ( in ) a
intent ( in ) b
intent ( in ) f u n
intent ( out , h i d e , c a c h e )

res

h2 = ( ba ) / ( 2 n )

23
24

a l f a =h2 f u n ( a )+h2 f u n ( b )

25

r e s =0.0

do

26

i =1 , n

2 h2

27

p = a+ i

28

r e s = r e s +2 h2 f u n ( p )

end do

29
30

r e s = r e s+ a l f a

return
end

31
32
33

real function l i n e a r ( x )
real x
intent ( in , out ) x

34
35
36

Cf2py

37

linear

return
end

38
39
40

= x +1.0

real function n o n l ( x )
real x
intent ( in , out ) x

41
42
43

119

Cf2py

n o n l = e x p ( x 2 l o g ( x+x s i n ( x ) ) )

44

return
end

45
46

A listagem 5.17 nos mostra como compilar e executar o cdigo


da listagem
possua o

??.

GCC

Este comando de compilao pressupe que voc

(Gnu Compiler Collection) verso 4.0 ou superior.

No caso de verses mais antigas deve-se substituir

gfortran

por

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

120

g77

f77.

ou

Listagem 5.17: Compilando e executando o programa da listagem

??
1

gfortran

time

trapint

trapint . f

./ trapint

Resultado :

16.01428

Resultado :

48941.40

5
6

real

0m2 . 0 2 8 s

user

0m1 . 7 1 2 s

sys

0m0 . 0 1 3 s

Como em

Fortran

no temos a convenincia de uma funo

para cronometrar nossa funo, utilizamos o comando


Unix.

time

do

Podemos constatar que o tempo de execuo similar ao

obtido com a verso em

C++

(listagem 5.15).

Ainda que no seja estritamente necessrio, recomendvel


que o cdigo

Fortran

seja preparado com comentrios especiais

(Cf2py), antes de ser processado e compilado pelo


gem

f2py.

A lista-

?? j inclui estes comentrios, para facilitar a nossa exposio.

Estes comentrios nos permitem informar ao

f2py

as variveis de

entrada e sada de cada funo e algumas outras coisas. No exemplo

??, os principais parametros passados ao f2py, atravs das linhas


de comentrio

Cf2py intent(), so in, out, hide e cache.

As

duas primeiras identicam as variveis de entrada e sada da fun-

O parmetro hide faz com que a varivel de


res, obrigatoriamente declarada no cabealho da procedure
Fortran que oculta ao ser importada no Python. O parme-

o ou procedure.
sada
em

tro cache reduz o custo da realocao de memria em variveis que


so redenidas dentro de um lao em

Fortran.

Antes que possamos importar nossas funes em

Fortran para

uso em um programa em Python, precisamos compilar nossos fontes

5.4. INTEGRAO COM A LINGUAGEM FORTRAN


em

Fortran

com o

f2py.

121

A listagem 5.18 nos mostra como fazer

isso.
Listagem 5.18: Compilando com

f2py

trapintf

f2py

trapint . f

Uma vez compilados os fontes em

Fortran com o f2py, podetrapintloop.py (lis-

mos ento escrever uma variao do script

tagem 5.12) para vericar os ganhos de performance. A listagem


5.19 contm nosso script de teste.
Listagem 5.19: Script para comparao entre Python e
via

f2py
# e n c o d i n g : l a t i n 1

2 # Disponivel
3
4
5
6

from
from
from
def

no

pacote

de

programas

como :

t r a p i n t l o o p c o m p . py

import c l o c k
import exp , l o g , s i n
t r a p i n t f import t i n t a s f t i n t

time

math

linear ,

nonl
tint (a ,b , f ) :

n = 5000000

h2 = ( ba ) / ( n 2 . )
r e s = h2 f ( a )+h2 f ( b )

for

10

in

xrange ( n ) :

2 h2

11

p = a+ i

12

r e s += 2 h2 f ( p )

return

13

14 # Rodando

as

start

16

r =

17

stop = clock ()

em Python

= clock ()

tint (1 ,5 ,

print

res

funcoes

15

18

Fortran

lambda ( x ) :1+ x )

' r e s u l t a d o : %d \nTempo : %s

s t a r t )

s e g ' %(r , s t o p

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

122

19

start

20

r =

= clock ()

tint (1 ,5 ,

lambda ( x ) : e x p ( x 2 l o g ( x+x s i n (

x) ) ) )

21
22

stop = clock ()

print

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r , s t o p

s t a r t )

23 #Rodando

as

funes

em

Fortran

chamando

Python

24

print

" tempo

do

Fortran

com

funcoes

em

Python "

25

start

26

r =

27

= clock ()

ftint (1. ,5. ,

print

lambda ( x ) :1+ x )

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r ,

c l o c k ( ) s t a r t )

28

start

29

r =

= clock ()

ftint (1. ,5. ,

lambda ( x ) : e x p ( x 2 l o g ( x+x

sin (x) ) ) )

30

print

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r ,

c l o c k ( ) s t a r t )

31 #Rodando
32

print

as

funes

" tempo

do

em

Fortran

Fortran
com

puro

funcoes

em

Fortran "

33

start

34

r =

35

= clock ()

ftint (1. ,5. , linear )

print

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r ,

c l o c k ( ) s t a r t )

36

start

37

r =

38

= clock ()

f t i n t ( 1 . , 5 . , nonl )

print

' r e s u l t a d o : %d \nTempo : %s

s e g ' %(r ,

c l o c k ( ) s t a r t )

A listagem 5.19 contem uma verso da regra trapezoidal em


Python puro e importa a funo
A funo em

Fortran

tint do nosso programa em Fortran.

chamado de duas formas: uma para inte-

5.4. INTEGRAO COM A LINGUAGEM FORTRAN

123

grar funes implementadas em Python (na forma funes


e outra substituindo as funes

Fortran.

Executando

lambda

trapintloopcomp.py,

lambda)

pelos seus equivalentes em


podemos avaliar os ganhos

em performance (listagem 5.20). Em ambas as formas de utilizao

ftint, existem chamadas para objetos Python dentro


DO. Vem da a degradao da performance, em relao
execuo do programa em Fortran, puramente.
da funo

do lao

Listagem 5.20: Executando

resultado :

python

3 Tempo :
4

t r a p i n t l o o p c o m p . py

tempo

resultado :

do

12

resultado :

14

do

4.85

15 Tempo :

6.42

em Python

com

funcoes

em

seg
seg

Fortran

resultado :

funcoes

48941

24.95

tempo

com

16

7.31

11

13 Tempo :

seg

Fortran

resultado :

10 Tempo :

seg

49029

29.14

8 Tempo :

16

13.29

resultado :

5 Tempo :

trapintloopcomp.py

Fortran

16
seg
48941
seg

Neste ponto, devemos parar e fazer uma reexo.

Ser justo

comparar a pior implementao possvel em Python (utilizando


laos

for), com cdigos compilados em C++ e Fortran?

Realmente,

no justo. Vejamos como se sai uma implementao competente


da regra trapezoidal em Python (com uma ajudinha do pacote
numpy). Consideremos a listagem 5.21.
Listagem 5.21: Implementao vetorizada da regra trapezoidal

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

124

1 # e n c o d i n g : l a t i n
2 # Disponivel
3
4
5
6

from
from
def

no

pacote

de

programas

como :

t r a p i n t v e c t . pt
numpy
time

import
import c l o c k

t i n t ( a , b , fun ) :

"""

Integrao

numrica

pela

regra

trapezoidal

"""

10

n = 5000000.

11

h = ( ba ) / n

12

r e s = h / 2 f u n ( a )+h / 2 f u n ( b )+h sum (

13

return

fun ( arange ( a , b , h ) ) )

14
15

if

res

__name__== '__main__ ' :

16

start

17

r =

print

18

= clock ()

tint (1 ,5 ,

lambda ( x ) :1+ x )

' r e s u l t a d o : %d \nTempo : %s

seg '

%(r , c l o c k ( ) s t a r t )

19

start

20

r =

= clock ()

tint (1 ,5 ,

lambda ( x ) : e x p ( x 2 l o g (

x+x s i n ( x ) ) ) )

print

21

' r e s u l t a d o : %d \nTempo : %s

seg '

%(r , c l o c k ( ) s t a r t )

Executando a listagem 5.21, vemos que a implementao vetorizada em Python ganha (0.28 e 2.57 segundos)de nossas solues
utilizando

f2py.

Da mesma forma que com o

Pyrex,

podemos distribuir progra-

mas escritos em Python com extenses escritas em


a ajuda do pacote setuptools.

Fortran,

com

Na listagem 5.22 vemos o exem-

5.4. INTEGRAO COM A LINGUAGEM FORTRAN

125

plo de como escrever um setup.py para este m. Neste exemplo,


temos um

setup.py

extrememente limitado, contendo apenas os

parmetros necessarios para a compilao de uma extenso denominada


arquivo

flib, a partir de uma programa em Fortran, localizado no


flib.f, dentro do pacote  meupacote. Observe, que ao

denir mdulos de extenso atravs da funo Extension, podemos


passar tambm outros argumentos, tais como outras bibliotecas das
quais nosso cdigo dependa.

Listagem 5.22:
em

Fortran

setup.py para distribuir programas com extenses

import

ez_setup . u s e _ s e t u p t o o l s ( )

3
4

ez_setup

import s e t u p t o o l s
from numpy . d i s t u t i l s . c o r e import

setup ,

Extension

flib

= E x t e n s i o n ( name= ' m e u p a c o t e . f l i b ' ,

l i b r a r i e s =[] ,

library_dirs =[] ,

f2py_options =[] ,

s o u r c e s =[ ' m e u p a c o t e /
flib . f ' ]

10
11

)
s e t u p ( name =

' mypackage ' ,

12

version =

13

packages =

14

ext_modules =

15

' 0.3.5 ' ,


[ ' meupacote ' ] ,
[ flib ]

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

126

5.5 A Pton que sabia Javans  Integrao


com Java

Peo licena ao mestre Lima Barreto, para parodiar o ttulo do seu


excelente conto, pois no pude resistir analogia.

A linguagem

Python, conforme descobrimos ao longo deste livro, extremamente verstil, e deve esta versatilidade, em parte, sua biblioteca
padro.

Entretanto existe uma outra linguagem que excede em

muito o Python (ao menos atualmente), na quantidade de mdulos disponveis para os mais variados ns: o
A linguagem

Java

Java.

tem, todavia, contra si uma srie de fatores:

A complexidade de sua sintaxe rivaliza com a do

C++,

e no e-

ciente, como esperaramos que o fosse, uma linguagem compilada,


com tipagem esttica. Mas todos estes aspectos negativos no so
sucientes para anular as vantagens do vasto nmero de bibliotecas
disponveis e da sua portabilidade.
Como poderamos capturar o que o

Java tem de bom, sem levar


Jython.

como brinde seus aspectos negativos? aqui que entra o


O

Java.

Jython uma implementao completa do Python 2.21 em


Com o Jython programadores Java podem embutir o Python

em seus aplicativos e applets e ns, programadores Python, podemos utilizar, livremente, toda (ou quase toda) a biblioteca padro
do Python com classes em

Java.

Alm destas vantagens, O

Jython

tambm uma linguagem Open Source, ou seja de cdigo aberto.

O interpretador Jython
Para iniciar nossa aventura com o

Jython, precisaremos instal-lo,


Java (ou JVM) verso 1.4 ou

e ter instalada uma mquina virtual


mais recente.

1O
desenvolvimento
do
Jython continua, mas no se sabe ainda
quando alcanar o CPython (implementao em C do Python).

5.5. A PTON QUE SABIA JAVANS  INTEGRAO COM


JAVA

127

Vamos tentar us-lo como usaramos o interpretador Python e


ver se notamos alguma diferena.
Listagem 5.23: Usando o interpretador

Jython

jython
2.1

java1 .4.2 01

on

3 Type " c o p y r i g h t " ,


more

4 >>>
5

Jython

6 >>>

or

null )

for

"license"

information .

print

hello

( JIT :

" credits "

' hello

world '

world

import

math ( )

7 >>> d i r ( math )
8

[ ' acos ' ,

' asin ' ,

' atan ' ,

classDictInit ' ,
' ,

' fabs ' ,

hypot ' ,
' pi ' ,
tan ' ,

' floor ' ,

' ldexp ' ,


' pow ' ,

' atan2 ' ,

' cos ' ,

' fmod ' ,

' log ' ,

' sin ' ,

' ceil ' ,

' cosh ' ,

'e ' ,

' frexp ' ,

' log10 ' ,

' sinh ' ,

'

' exp
'

' modf ' ,

' sqrt ' ,

'

' tanh ' ]

9 >>> math . p i
10

3.141592653589793
At agora, tudo parece funcionar muito bem. Vamos tentar um

exemplo um pouco mais avanado e ver de que forma o


pode simplicar um programa em
Listagem 5.24:

Java.

Jython

Um programa simples em Java usando a classe

Swing.

1
2
3

import j a v a x . s w i n g . J O p t i o n P a n e ;
class t e s t D i a l o g {
public static void main ( S t r i n g [ ]

args

j a v a x . s wi n g . JOptionPane .
showMessageDialog
um

teste . "

) ;

null ,

" Isto

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

128

}
A verso apresentada na listagem 5.24 est escrita em

Vamos ver como caria a verso em

Jython.

Java.

Listagem 5.25: Verso Jython do programa da listagem 5.24.

1 >>>

import

j a v a x . s wi n g . JOptionPane

2 >>> j a v a x . s w i n g . J O p t i o n P a n e .
s h o w M e s s a g e D i a l o g ( None , " I s t o

e um

teste .

")
Podemos observar, na listagem 5.25, que eliminamos a verborragia caracterstica do

Java,

e que o programa em

Jython

cou

bem mais pitnico. Outro detalhe que vale a pena comentar,


que no precisamos compilar (mas podemos se quisermos) o cdigo
em

Jython,

como seria necessrio com o

grande vantagem do
invs do

Java,

Jython.

Java.

S isto j uma

Em suma, utilizado-se o

Jython

ganha-se em produtividade duas vezes:

ao

Uma, ao

escrever menos linhas de cdigo e outra, ao no ter que recompilar


o programa a cada vez que se introduz uma pequena modicao.
Para no deixar os leitores curiosos acerca da nalidade do cdigo apresentado na listagem 5.25, seu resultado encontra-se na
gura 5.3.

Criando Applets em Jython


Para os conhecedores de

Java,

Jython

pode ser utilizado para

criar servlets, beans e applets com a mesma facilidade que


criamos um aplicativo em

Jython.

Vamos ver um exemplo de ap-

plet(listagem 5.26).
Listagem 5.26: Criando um applet em

import

java . a p p l e t . Applet ;

Jython

5.5. A PTON QUE SABIA JAVANS  INTEGRAO COM


JAVA

129

Figura 5.3: Sada da listagem 5.25.

2
3

class a p p l e t p ( j a v a . a p p l e t . A p p l e t
def p a i n t ( s e l f , g ) :

g . drawString

Jython ! ' ' ,


Para quem no conhece

` ` Eu
5,

Java,

) :

s o u um A p p l e t

um applet um mini-aplicativo

feito para ser executado dentro de um Navegador (Mozilla, Opera


etc.) que disponha de um plug-in para executar cdigo em

Java.

Portanto, desta vez, precisaremos compilar o cdigo da listagem


5.26 para que a mquina virtual

Java

possa execut-lo. Para isso,

salvamos o cdigo e utilizamos o compilador do

Jython, o jythonc.

Listagem 5.27: Compilando appletp.py

jythonc

d e e p c o r e j

a p p l e t p . py

processing

appletp

3
4
5

Required

packages :

java . applet

6
7

Creating

adapters :

Creating

. java

8
9

files :

appletp . j a r

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

130

10

appletp

11

module

appletp

extends

java . a p p l e t . Applet

12
13

Compiling

. java

14

Compiling

with

to

. class . . .

args :

[ ' / o p t / b l a c k d o w n j d k

1.4.2.01/ bin / javac

' ,

' c l a s s p a t h ' ,

'/

2.1. j a r :/ usr
/ s h a r e / l i b r e a d l i n e j a v a / l i b / l i b r e a d l i n e
usr / share / jython / l i b / jython

j a v a . j a r : . : . / jpywork : : / u s r / s h a r e / j y t h o n /
t o o l s / jythonc :/

home/ f c c o e l h o / Documents /

L i v r o P y t h o n / . : / u s r / s h a r e / j y t h o n / Lib ' ,
' . / jpywork / a p p l e t p . java ' ]

15

Note :

. / jpywork / a p p l e t p . j a v a

overrides

16

Note :

Recompile

deprecated
with

uses

or

API .

d e p r e c a t i o n

for

details .

17
18

Building

archive :

19

Tracking

java

appletp . j a r

dependencies :

Uma vez compilado nosso applet, precisamos embuti-lo em


um documento HTML (listagem 5.28. Ento, basta apontar nosso
navegador para este documento e veremos o applet ser executado.
Listagem 5.28: Documento HTML contendo o applet.

html>
head>
<meta content=" t e x t / h t m l ;

1 <
2 <
3

c h a r s e t=ISO

8859 1"

4
5

h t t p e q u i v=" c o n t e n t t y p e ">

t i t l e>j y t h o n
head>
<body>
<

6 </
7
8

Este

a p p l e t</

t i t l e>

5.6. EXERCCIOS

131

o s e u a p p l e t em J y t h o n :<br>
br>
<br>
<center>
<applet code=" a p p l e t p " archive=" a p p l e t p . j a r "
name=" A p p l e t em J y t h o n "
alt=" T h i s b r o w s e r d o e s n ' t s u p p o r t JDK 1 . 1
a p p l e t s . " align=" bottom "
height=" 5 0 " width=" 1 6 0 ">
<PARAMNAME=" c o d e b a s e " VALUE=" . ">
<h3>A l g o s a i u e r r a d o ao c a r r e g a r
e s t e a p p l e t .</ h3>
</ applet>
</ center>
<br>
<br>
</ body>
</ html>

9 &e a c u t e ;
10 <
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Na compilao, o cdigo em
mente em cdigo

Java

Java

Jython

convertido completa-

e ento compilado atravs do compilador

padro.

5.6 Exerccios
1. Compile a listagem 5.1 com o Shed-skin e veja se h ganho de
performance. Antes de compilar, remova as linhas associadas
ao uso do Weave.
2. Aps executar a funo primes (listagem 5.6), determine o
tamanho da lista de nmeros primos menor do que 1000.
Em seguida modique o cdigo Pyrex, declarando a varivel
results como uma lista de inteiros, e eliminando a funo

CAPTULO 5. INTERAGINDO COM OUTRAS


LINGUAGENS

132

append

do lao

while.

Compare a performance desta nova

verso com a da verso original.

Parte II

Aplicando o Python a
Problemas Cientcos
Concretos

133

Captulo 6

Modelagem Matemtica
Introduo modelagem matemtica e sua implementao computacional. Discusso sobre a importncia da
Anlise dimensional na modelagem e apresentao do
pacote Unum para lidar com unidades em Python. Prrequisitos:Conhecimentos bsicos de clculo.
A construo de modelos uma etapa imprescindvel, na cadeia de procedimentos normalmente associada ao mtodo cientco.
Modelos matemticos so uma tentativa de representar de forma
lgico/quantitativa, mecanismos que observamos na natureza.
Todo modelo por denio falso. O modelo um instrumento
de organizao de idias e hipteses. Como tal, o modelo bom
aquele que representa bem nossas idias. O que o far til para o
conhecimento do mundo, depender, em grande parte, da qualidade
de nossa concepo de mundo. Assim, bons modelos exigem uma
boa compreenso do sistema a ser modelado. Algum pode estar
pensando:

Se preciso conhecer bem para modelar, ento para

que modelar, se o objetivo for conhecer bem? O grande segredo da


modelagem que o ato de modelar , em si, um ato de conhecer.
Isto , para criar um modelo, o autor precisa escrutinar todo o
seu conhecimento do sistema-alvo: identicar seus componentes,
135

CAPTULO 6. MODELAGEM MATEMTICA

136

discriminar o que relevante do que no , hipotetizar sobre as


relaes causais que regem os processos observados, etc.
Ao se deter nestes detalhes, comeam a surgir os vazios do conhecimento, buracos a serem preenchidos com experimentos e observaes ainda no pensados. Do mesmo modo, observaes e intuies que antes no faziam muito sentido, comeam a se encaixar
melhor. . .
Muitas vezes, o resultado nal de um modelo parece to bvio,
que nos perguntamos para que serviu. No entanto, o bvio s se
tornou bvio, por causa do ato de modelar.
E aquilo que neste momento se revelar aos povos, no
surpreender a todos por ser extico, mas pelo fato de
ter sempre estado oculto, quando ter sido, o bvio
Caetano Veloso
Outras vezes, os modelos abrem novas avenidas de escrutnio,
ao apontar para fenmenos pouco intuitivos (como o caos determinstico).
Para matematizar um modelo, existem dois pontos de partida.
Podemos construir do zero ou pegar emprestado. Pegar emprestado
signica adaptar um modelo proposto por algum. A vantagem de
pegar emprestado que o modelo j vem com alguma bagagem
analtica.
ativa.

A desvantagem que ele tolhe a nossa liberdade cri-

Ao olharmos para a histria da modelagem, encontramos

alguns modelos que caram de tal forma inseridos no imaginrio


do modelador que parecem ser os nicos existentes. Um exemplo
o modelo de Lotka-Volterra.

Ele to usado, que as vezes se

torna difcil escrever alguma coisa nova sem, inconscientemente,


comparar o modelo novo com este padro.
Modelos, embora falsos, devem ser corretos. Existem dois nveis de correo de um modelo matemtico: modelos devem ter
coerncia lgica (isto , no se pode somar alhos com bugalhos) e
coerncia com o modelo mental proposto (isto , ele deve representar aquilo que o autor quer dizer).

6.1. MODELOS

137

Computacionalmente falando, modelos so como mquinas transformadoras, produzem informao a partir de informao.

So

equivalentes, portanto, a funes que, a partir de argumentos, produzem um resultado que consiste na transformao do argumento
de entrada, de acordo com o mecanismo codicado dentro de si.
Vamos comear nossa jornada, em direo representao computacional de modelos matemticos, com uma breve introduo ao
modelos mais simples e suas implementaes.

6.1 Modelos
Lineares
Modelos lineares representam a relao entre grandezas que variam
de forma proporcional.

Um exemplo simples o da corrida de

taxi. O valor pago ao motorista numa corrida de taxi calculado


em funo da quilometragem rodada, mais o valor da bandeirada
inicial. Digamos que Joo cobre 0.50 reais por quilmetro rodado e
uma bandeirada de 2,00. Se rodarmos 10km, pagaremos 0.5x10 =
5 reais (+ a bandeirada); se rodarmos o dobro (20km), pagaremos
o dobro pela corrida (10 reais) + bandeirada. As duas grandezas quilometragem rodada e valor pago pela quilometragem - variam de
forma proporcional. Vamos supor que Joo tenha um caderno onde
ele registra todas as corridas que faz, incluindo quilometragem,
valor pago pela quilometragem e valor total pago (quilometragem
+ bandeirada).
Se zermos um diagrama de disperso com os dados da tabela
6.1, obteremos uma reta representando o cenrio sem bandeirada
e outra para o cenrio com bandeirada.
O clculo da corrida nal feito pela equao:

R$ = a Km + b

CAPTULO 6. MODELAGEM MATEMTICA

138

Tabela 6.1: Valor de corridas de taxi


corrida

km

valor/kilometragem

valor total

2,50

4,50

4,00

6,00

1,50

3,50

10

5,00

7,00

4,50

6,50

2,00

4,00

15

7,50

9,50

onde

o valor pago por quilmetro rodado (a

= 0, 50)

valor inicial pago (isto , a bandeirada). Em Python:

1 >>>

def

t a x i ( t a r i f a , km ,

return

tarifa

band =2) :

km+band

3 >>> p r = t a x i ( 0 . 5 , 1 0 )
4 >>> p r
5

7.0
Vamos ver outros exemplos:

Crescimento populacional por imigrao constante.

Uma po-

pulao composta inicialmente por 100 indivduos. A partir do


ano que chamaremos 0, passaram a chegar 10 novos indivduos por
ano. Esta populao crescer, isto , ter 110 indivduos no ano
1, 120 indivduos no ano 2, 130 indivduos no ano 3, etc. Se ns
zermos um grco da relao ano x nmero de indivduos, teremos uma reta crescente.

Esta reta intercepta o eixo vertical no

ponto 100 (populao inicial) e tem inclinao dada pelo nmero


de individuos acrescidos por unidade de tempo (isto ,

a = 10).

Decrescimento populacional por emigrao constante.

Agora,

suponha que ao invs de entrar, esto saindo 10 indivduos a cada


ano. Se a populao composta inicialmente por 100 indivduos,
ento teremos 90 indivduos no ano 1; 80 indivduos no ano 2; 70

6.1. MODELOS

Figura 6.1:

139

Diagrama de disperso do exemplo do taxi.

A reta

superior descreve o cenrio com bandeirada e a inferior, sem bandeirada.

indivduos no ano 3, etc.

Se ns zermos um grco da relao

entre ano e nmero de indivduos, teremos uma reta decrescente.


Esta reta intercepta o eixo vertical no ponto 100 (populao inicial)
e tem inclinao negativa, cujo valor absoluto dado pelo nmero
de individuos perdidos por unidade de tempo (isto ,

a = 10).

Todos os exemplos dados so especicaes de modelos cujo


formato geral :

CAPTULO 6. MODELAGEM MATEMTICA

140

Figura 6.2: Populao crescendo de forma linear, devido chegada


de um nmero constante de novos indivduos por ano.

Y =aX +b
a, chamado de coeciente angular, a taxa de variao da
Y por unidade de X e b, chamado de coeciente linear,
o valor de Y quando X = 0. Este modelo se expressa gracamente
como uma reta com ngulo a em relao a linha horizontal e que
cruza o eixo vertical no ponto b. Esta reta ser crescente se a
for maior do que 0; horizontal, se a = 0, e decrescente, se a for
onde

grandeza

negativo.

6.1. MODELOS

141

Figura 6.3: Populao diminui de forma linear, devido saida de


um nmero constante de indivduos por ano.

Propriedades

Uma propriedade importante do modelo linear

que a variao de crescimento ou decrescimento constante e independente do valor de X. No caso da imigrao, por exemplo,
estavam entrando 10 pessoas todos os anos, independentemente do
nmero de pessoas j existentes na populao. No caso do taxi, o
valor pago por quilmetro rodado no mudava se a pessoa j tivesse
rodado 5 ou 20 km.

CAPTULO 6. MODELAGEM MATEMTICA

142

Figura 6.4: Representao grca de um modelo linear. Efeito do


parmetro

a.

Exponenciais
O modelo linear descrito na seo anterior, pode ser um bom modelo para descrever o crescimento de uma populao por imigrao
constante. Porm, no nos serve para descrever o crescimento por
reproduo. Vejamos o clssico exemplo do crescimento bacteriano
por bipartio. Digamos que temos uma populao com uma bactria no tempo t=0. Aps 1 hora, cada bactria se divide e forma
duas bactrias-lha. Estas duas bactrias geram 4 novas bactrias

6.1. MODELOS

143

Figura 6.5: Representao grca de um modelo linear. Efeito do


parmetro

b.

em mais uma hora e assim por diante. Se zermos um grco do


nmero de bactrias na populao, teremos algo como a gura 6.6.
Veja que o nmero de novos indivduos a cada gerao no
constante, como no modelo linear. Agora, ele aumenta de forma
geomtrica.

Na primeira gerao foram 2 novos indivduos, na

segunda gerao foram 4 e assim por diante. O crescimento muito


mais acelerado e parece tender para uma exploso demogrca! Em
apenas 10 horas, teremos uma populao com 1024 indivduos e,
em um dia, 16.677.216 bactrias!

CAPTULO 6. MODELAGEM MATEMTICA

144

Figura 6.6: Crescimento de uma populao de bactrias por bipartio.

No entanto, embora o crescimento no seja constante no tempo,


ele constante por indivduo. O que isso quer dizer? Cada indivduo na populao contribui com o mesmo nmero de lhos para a
gerao seguinte,de forma que uma populao pequena gerar um
nmero menor de lhotes do que uma populao grande.
Este tipo de crescimento dependente do nmero de indivduos
presentes chamado de exponencial, pelo fato da varivel indepen-

6.2. CONSTRUINDO MODELOS DINMICOS

145

dente estar no expoente. Matematicamente, ele tem o formato:

Y = wB X
onde

o nmero inicial de bactrias (w

= 1).

Ao contrrio do modelo linear, onde a taxa de variao era


independente do nmero de indivduos presentes, no modelo exponencial, a taxa de variao uma funo, isto , depende, do
nmero de indivduos presentes.

6.2 Construindo Modelos Dinmicos


Na seo anterior vimos como representar fenmenos simples como
expresses matemticas. Agora vamos explorar representaes mais
sosticadas: Vamos modelar processos dinmicos. Processos dinmicos modicam-se em funo de uma varivel independente que,
nos casos mais comuns, pode ser o tempo ou o espao.
Nos modelos estticos da seo anterior, buscamos expressar o
estado do sistema em funo de outras variveis. Uma vez determinado os valor destas variveis, o estado do sistema permanece
inalterado. Agora, no sabemos o que determina o estado do sistema, necessriamente, mas podemos descrever mecanismos que
alteram um estado inicial dado.
Neste tipo de modelagem utilizamos equaes de diferena(varivel
independente discreta) ou diferenciais (varivel independente contnua), para modelar a taxa de variao do sistema, representada
pelas chamadas variveis de estado.

Modelando Iterativamente
Vamos comear a explorar os modelos dinmicos, atravs de modelos com dinmica temporal discreta. Neste caso, podemos representar o tempo discreto como a execuo iterativa de uma funo.

146

CAPTULO 6. MODELAGEM MATEMTICA

Figura 6.7: Modelos populacionais discretos. Modelo 2 esquerda


e modelo 1 direita.

Na listagem 6.1, vemos dois modelos populacionais:

M odelo 1 : Nt+1 = Nt + rNt mNt + i eNt



Ct+1 = Ct + ra At mc Ct eCt
M odelo 2 :
At+1 = At + eCt ma At
No modelo 1, temos o tamanho da populao no tempo seguinte
(Nt+1 ) sendo expresso como uma alterao da populao atual pelo
nascimento de indivduos a uma taxa
por uxos migratrios (eNt e

r,

pela mortalidade (m), e

i).

No modelo 2, temos uma demograa similar, porm agora com


a populao dividida em dois grupos: crianas (Ct ) e adultos (At ).

6.2. CONSTRUINDO MODELOS DINMICOS

147

for

Nestes modelos, utilizamos um simples lao

para resolver

numericamente as equaes de diferena. Representaes recursivas tambm seriam possveis, mas para este exemplo no so necessrias.
Listagem 6.1: Dois modelos discretos de crescimento populacional

1 # Disponivel

no

pacote

de

programas

como :

m o d e l o . py

2 # e n c o d i n g : l a t i n
3

from

pylab

import

4
5 N = [ 1 0 0 0 0 ] #s e r i e
6

n0 = 1 0 0 0 0

t = 100

temporal

#p o p u l a c a o

de

populacao

inicial

#p e r i o d o

de

tempo

da

simulacao

r = 0.02

#n a t a l i d a d e

9 m = 0.03

#t a x a

de

mortalidade

10 im = 0

#t a x a

de

imigrao

11 em = 0

#t a x a

de

emigrao

12 #p a r m e t r o s

modelo2

13 mc = 0 . 0 1

#t a x a

de

mortalidade

14 ma = 0 . 0 1

#t a x a

de

mortalidade

15

ra = 0.02

#t a x a

de

reproducao

16

e = 0.1

#t a x a

de

envelhecimento

infantil
adulta

17 C = [ 1 0 0 0 0 ]

#s e r i e

temporal

de

crianas

18 A = [ 0 ]

#s e r i e

temporal

de

adultos

19

#p o p u l a c a o

inicial

de

#p o p u l a c a o

inicial

de

a0 = 0
adultos

20

c0 = 10000
criancas

21
22
23

def

Modelo ( n0 ) :
n f = n0 + r n0

m n0

+im

em n0

CAPTULO 6. MODELAGEM MATEMTICA

148

24

N . append ( n f )

return

25
26
27

def

nf

Modelo2 ( c0 , a 0 ) :

28

c f = c0 + r a a0

29

a f = a0 + e c 0

30

C . append ( c f )

31

A . append ( a f )

32

cf , af

33
34

return

for

in

mc c 0 e c 0
ma a 0

xrange ( t ) :

35

c0 , a 0 = Modelo2 ( c0 , a 0 )

36

n0 = Modelo ( n0 )

37
38

subplot (121)

39

p l o t (A, ' . ' ,

40

legend ( [ ' Adultos ' , ' Criancas ' ] )

C, ' r^ ' )

41

x l a b e l ( ' tempo ' )

42

subplot

43

p l o t (N, ' . ' )

44

l e g e n d ( [ u ' Populao ' ] )

45

x l a b e l ( ' tempo ' )

(122)

46

s a v e f i g ( ' pop . png ' , d p i =400)

47

show ( )

Integrao Numrica
A simulao de modelos onde a varivel independente contnua,
tcnicamente mais complexa. Por isso, neste caso, lanaremos mo

do pacote scipy .

1 http://www.scipy.org

6.2. CONSTRUINDO MODELOS DINMICOS

149

Modelos dinmicos contnuos so comumente representados por


sistemas de equaes diferenciais ordinrias, e sua resoluo envolve
a integrao destas numericamente.
O pacote

scipy

contm um pacote dedicado integrao nu-

mrica de equaes diferenciais: o

In

[1]:

from

scipy

integrate.

import

Nesta seo utilizaremos o pacote

integrate

integrate

para resolver um

sistema de equaes diferenciais ordinrias bem simples:

dP
dt
dQ
dt

= rP pP Q

(6.1)

= mQ + P Q

O sistema de equaes 6.2, representa a dinmica de duas populaes,

Q onde Q(predador) alimenta-se de P(presa). Em nossa


odeint do pacote integrate2 .

implementao, utilizaremos a funo

Esta funo tem como argumentos uma funo que retorna as derivadas, a partir das condies iniciais, e um vetor de valores da
varivel independente(t) para os quais os valores das variveis de
estado sero calculados.
Listagem 6.2: Integrando um sistema de equaes diferenciais ordinrias

1 #modelo_ode . py
2 # Disponivel

no

pacote

de

programas

como :

modelo_ode . py

3 # e n c o d i n g : u t f 8
4

from

scipy

import

integrate

2 A funo odeint encapsula a tradicional biblioteca lsoda implementada em


Fortran. Esta biblioteca determina dinmicamente o algoritmo de integrao
mais adequado a cada passo de integrao, selecionando entre o mtodo de
Adams e o BDF.

CAPTULO 6. MODELAGEM MATEMTICA

150

5
6
7
8
9

from numpy import


import p y l a b a s P

class Model :
def __init__ ( s e l f

, equations , i n i t s ,

trange , ) :

10

"""

11

Equations :

Lista

com

diferenciais

equaes

forma

de

condies

da

simulao

12

inits :

13

trange :

14

"""

15

s e l f . eqs = equations

sequencia

as

na

de

strings

iniciais
extenso

16
17

self . Inits

18

s e l f . Trange = a r a n g e ( 0 , t r a n g e , 0 . 1 )

19

s e l f . compileEqs ( )

20
21

def

22

inits

compileEqs ( s e l f ) :
"""

23

C om p il a

24

"""

as

equaes .

try :

25
26

s e l f . ceqs =

[ compile ( i

equation>' , ' eval ' )

, '<

for

in

s e l f . eqs ]

except S y n t a x E r r o r :
print ' H um e r r o

27
28

de

sintaxe

e q u a e s , \ n C o n s e r t e o

tente

29
30
31

def

Run ( s e l f ) :
"""

novamente '

nas

6.2. CONSTRUINDO MODELOS DINMICOS

151

32

Faz

33

"""

34

t_courseList =

35

t _ c o u r s e L i s t . append ( i n t e g r a t e . o d e i n t

integrao

numrica .

[]

( s e l f . Equations , s e l f . I n i t s , s e l f .
Trange ) )

return

36
37

def

38

( t _ c o u r s e L i s t , s e l f . Trange )

Equations ( s e l f , y , t ) :

39

"""

40

Define

os

sistema

cada

41

com

base

no

valor

retornando

42

d e EDOs

calculando

equao
as

anterior

derivadas .

"""
# C r i a

43

vetor

de

equaes

44

eqs =

45

Neq=l e n ( e q s )

46

y d o t = z e r o s ( ( Neq ) , ' d ' )

for

47
48

51

in

x r a n g e ( Neq ) :

ydot [ k ]

return

49
50

s e l f . ceqs

if

= eval ( eqs [ k ] )

ydot

__name__=="__main__" :

52

inits

53

eqs =

[1 ,1]

[ ' 3.0 y [0]

2.0 y [ 0 ] y [ 1 ]

' , '

2.0 y

[1]+ y [ 0 ] y [ 1 ] ' ]

54

ODE = Model ( e q s , i n i t s , 1 0 )

55

y , t = ODE. Run ( )

56

#p r i n t

57

P. plot

(t ,y [0][: ,0] ,

' v ' , t , y [ 0 ] [ : , 1 ] , ' o

' )
58

P . l e g e n d ( [ ' Presa ' , ' Predador ' ] )

CAPTULO 6. MODELAGEM MATEMTICA

152

59

P . s a v e f i g ( ' l v . png ' , d p i =400)

60

P . show ( )
O modelo implementado como uma classe. A implementao

poderia ser mais simples, at mesmo feita diretamente do console do


Python. Entretanto, esta implementao mais longa nos permite
apresentar algumas outras tcnicas interessantes.
O modelo denido durante a inicializao do objeto, atravs de
atributos obrigatrios. Um mtodo Run() utilizado para executar
a integrao numrica.

neste mtodo que chamamos a funo

odeint, passando os argumentos requeridos, a saber:

a funo que

implementa as equaes, os valores iniciais das variveis de estado


e o vetor de tempos.
A equaes so passadas pelo usurio na forma de strings. Estas
strings devem conter uma expresso Python vlida.
O mtodo

Equations precisa combinar as expresses das equa-

es para poder calcular o valor das derivadas em cada ponto do


tempo. Por isso, uma notao de lista foi utilizada para permitir
referncias entre as equaes. Desta forma, cada varivel de estado
um elemento da lista

y.

As expresses representando as equaes, so interpretadas por


meio da funo

eval,

a cada passo da integrao numrica. Isto

requer que as strings contendo as expresses, sejam compiladas


para byte-code, e ento interpretadas pelo Python.
que esta operao seja repetida a cada passo, o mtodo

Para evitar

compileEqs

pr-compila estas expresses, o que acelera em muito a execuo


do programa 6.2.
Ao nal da listagem 6.2, vemos a especicao do modelo e, na
gura 6.8, o seu resultado.
O pacote

integrate

tambm nos oferece uma outra interface

para a integrao numrica chamada

ode. A classe ode uma alodeint. A listagem 6.3,

ternativa orientada a objetos, funo

mostra como implementar o mesmo sistema de equaes (6.2) utilizando a classe

ode.

6.2. CONSTRUINDO MODELOS DINMICOS

153

Figura 6.8: Grco com o resultado da integrao do modelo 6.2.

Listagem 6.3: Integrao numrica utilizando a classe ODE.

1 # Disponivel

no

pacote

de

programas

como :

modelo_ode_minimo . py

2 # e n c o d i n g : u t f 8
3
4
5
6
7

from s c i p y import
from numpy import
import p y l a b a s P
def

Equations ( t , y ) :

"""

Define

os

cada

10

integrate

com

base

sistema

d e EDOs

calculando

equacao
no

valor

anterior

retornando

CAPTULO 6. MODELAGEM MATEMTICA

154

as

derivadas .

11

"""

12

# C r i a

vetor

de

equacoes

= [ ' 3.0 y [0] 2.0 y [ 0 ] y [ 1 ]


[1]+ y [ 0 ] y [ 1 ] ' ]

13

eqs

14

Neq=l e n ( e q s )

15

y d o t = z e r o s ( ( Neq ) , ' d ' )

for

16
17

20

in

return
if

2.0 y

x r a n g e ( Neq ) :

ydot [ k ]

18
19

' , '

= eval ( eqs [ k ] )

ydot

__name__=="__main__" :

21

r = i n t e g r a t e . ode ( E q u a t i o n s ) .

22

r . set_initial_value ([1 ,1] ,0)

s e t _ i n t e g r a t o r ( ' vode ' )

23

tf

24

dt = 0 . 1

= 10 #tempo

25

t =

[]

26

y =

[]

27
28

while

final

r . successful ()

and

r . t <=

tf :

r . i n t e g r a t e ( r . t+d t )

29

t . append ( r . t )

30

y . append ( r . y )

31

print

32

#P l o t a

resultados

33

P. plot

( t , array (y) [ : , 0 ] ,

r .y
' v ' , t , a r r a y ( y )

[ : , 1 ] , ' o ' )

34

P. t i t l e ( ' Integrador

35

P . l e g e n d ( [ ' Presa ' , ' Predador ' ] )

36

P . s a v e f i g ( ' l v 2 . png ' , d p i =400)

37

P . show ( )

Vode ' )

Se voc necessita construir, simular e analisar modelos de equa-

6.3. GRANDEZAS, DIMENSES E UNIDADES

155

es diferenciais com freqncia, talvez prera utilizar um software

mais completo, desenvolvido por mim, chamado Model-Builder .

6.3 Grandezas, Dimenses e Unidades


Ao se construir modelos matemticos, cedo ou tarde nos deparamos
com a necessidade de aproximar o modelo conceitual do sistema
real para dar valor preditivo ao modelo. Este processo envolve o
mapeamento da mtrica do sistema real no modelo matemtico,
ou seja, fazer com que os parmetros ou constantes do nosso modelo correspondam, numericamente, a mensuraes efetuadas no
sistema real.
Este processo de parametrizao envolve, frequentemente, a utilizao de medidas das diferentes

dimenses do sistema real (massa,

comprimento, temperatura, etc). Estas mensuraes raramente so


efetuadas pelo modelador. Este, frequentemente, se utiliza de medidas publicadas na literatura cientca, expressas nas mais variadas

unidades

de medida. A escolha das unidades de medida no

altera as dimenses do objeto de estudo (medir a nossa mesa de


trabalho em milmetros ao invs de metros no a torna mais longa),
mas altera a ordem de

grandeza

do valor numrico que representa

a dimenso medida.
Os modelos matemticos relacionam as vrias dimenses do sistema estudado, por meio das grandezas numricas que as representam.

Por isso, fundamental que as variveis e parmetros do

nosso modelo que representem uma mesma dimenso do objeto,


sejam expressas nas mesmas unidades de medida.

Por exemplo,

se desenvolvemos um modelo que pretende correlacionar massa do


corao com massa corporal, no podemos expressar a massa do

corao em gramas(g) e a massa corporal em quilogramas(kg) .

3 http://model-builder.sourceforge.net
4 A menos que adicionemos contantes ao modelo
o do ponto de vista dimensional

que re-equilibrem a equa-

CAPTULO 6. MODELAGEM MATEMTICA

156

Tabela 6.2: Dimenses bsicas.

Grandeza fsica

Dimenso Unidade (SI) Smbolo

Comprimento

metro

Massa

quilograma

kg

Tempo

segundo

Temperatura

kelvin

K
mol

Quantidade
de uma substncia

mol

Corrente eltrica

ampre

Intensidade luminosa

candela

cd

Grandeza, dimenso

unidade

no so sinnimos e devido

ubiquidade da sua utilizao em modelagem, so conceitos que devem estar muito bem denidos na mente de todo modelador.
Unidades derivadas de nomes prprios (e.g.

Lord Kelvin,

tabela 6.2),tm seu smbolo maisculo, mas o nome da unidade


grafado em minsculas.
As dimenses de variveis e parmetros utilizados em um modelo podem representar dimenses fsicas diretamente mensurveis
do sistema, como massa, comprimento, etc. ou podem ser construtos do investigador, que visam representar propriedades do sistema
que interessam ao modelo (preo, periculosidade, fecundidade etc.).
Devido a isso, antes de comear um trabalho de modelagem, devemos denir quais so as nossas

dimenses bsicas.

Estas dimenses

so escolhidas de forma a que todas as outras dimenses utilizadas


no modelo, possam ser expressas em termos destas dimenses bsicas, ou seja, atravs de operaes algbricas entre as dimenses
bsicas. A tabela 6.2 lista algumas dimenses bsicas que podem
ser teis no contexto da modelagem de sistemas biolgicos.
Vrias dimenses

derivadas

podem ser construdas a partir do

limitado conjunto de dimenses bsicas apresentado na tabela 6.2.

6.3. GRANDEZAS, DIMENSES E UNIDADES

157

Tabela 6.3: Dimenses derivadas.

Grandeza fsica
rea
Volume
Velocidade
Acelerao
Fora
Energia
Potncia
Presso
Viscosidade
Voltagem
Resistncia elt.

Dimenso
(derivao)

L2
L3
LT 1
LT 2
M LT 2
M L2 T 2
M L2 T 3
M L1 T 2
M L1 T 1 101
M L2 T 3 I 1
M L2 T 3 I 2

ngulo
Veloc. angular
Frequncia

T 1
T 1

Unidade (SI)

Smbolo

metro2
metro3
metro/segundo
metro/segundo2
newton
joule
watt
pascal
poise
volt
ohm
graus, radianos
radianos/seg.
hertz

m2
m3
m/s
m/s2
N (kg m s2 )
J (kg m2 s2 )
W (kg m2 s3 )
P a (N m2 )
P
V
(V /A)
graus, radianos
radianos/s
Hz (s1 )

A tabela 6.3 lista dimenses familiares ao leitor e suas derivaes.


interessante notar que algumas grandezas fsicas so adimensionais (e.g. ngulo, tabela 6.3). Este fato no as impede, entretanto, de possuir unidades.
Um ngulo calculado como a razo entre um dado arco e
o raio da circunferncia que o dene. Portanto, sua dimenso

L/L = 1.
O fato de um ngulo ser adimensional, faz com que seu valor
numrico no se altere, ao se utilizar diferentes unidades de medida
para o raio e o arco da circunferncia que o contm. Funes trigonomtricas so adimensionais pois o argumento destas um ngulo,
que adimensional. O expoente de uma funo exponencial nada
mais do que um logaritmo, e se os logaritmos so adimensionais,

CAPTULO 6. MODELAGEM MATEMTICA

158

os expoentes tambm o sero.

Outros adimensionais:
Funes trigonomtricas,
Expoentes,
Logaritmos,
Contagens,

, e,

etc.

Por exemplo, em uma equao de crescimento exponencial

ekt ,

onde t o tempo, o parmetro k deve ter dimenso

T 1

y=

para

que o expoente seja adimensional.

Anlise Dimensional
Um modo eciente de evitar erros dimensionais na construo das
equaes que compem o nosso modelo, consiste em construir uma
verso da equao em questo, substituindo-se as variveis e parmetros por suas unidades ou dimenses. Em seguida, expande-se
as expresses em ambos os lados da igualdade em termos das dimenses bsicas. Ento simplicamos ao mximo os dois lados da
equao e vericamos se so de fato iguais. A este processo d-se
o nome de anlise dimensional.
Todas as equaes cientcas devem estar dimensionalmente
corretas, assim sendo, a anlise dimensional uma excelente ferramentar para analisar nossas formulaes. Vamos listar algumas
regras bsicas da anlise dimensional:
1. Dimenses e unidades podem ser combinadas e manipuladas,
utilizando-se regras algbricas.
2. Os dois lados de uma equao devem ser dimensionalmente
idnticos.
3. Deve-se tomar cuidado para no cancelar unidades idnticas
de objetos independentes. Por exemplo,

ml CO2
ml sangue no uma

6.3. GRANDEZAS, DIMENSES E UNIDADES

159

expresso adimensional, apesar de ser uma razo entre dois


volumes.
4. Grandezas de dimenses diferentes no podem ser somadas
nem subtradas.
Unidades tambm podem ser utilizadas, diretamente, em anlise dimensional. Unidades derivadas podem ser construdas a partir de unidades bsicas. Porm, frequentemente, as unidades derivadas recebem smbolos especiais para simplicar sua notao (e.g.

N, W, J

etc. na tabela 6.3).

O Pacote Unum
5 Quando escrevemos nossos modelos em Python, podemos fazer
uso de unidades para nossas variveis de forma a no cometer erros
quanto s dimenses do nosso problema. Vamos explorar algumas
possibilidades interativamente dentro do

from

In

[1]:

In

[ 2 ] :M

3 Out [ 2 ] : 1 . 0

unum . u n i t s

Ipython.

import

[m]

Uma vez importadas as unidades do mdulo units, podemos


representar nmeros com unidades.
representao de 1 metro.

No exemplo acima temos a

As classes que representam as unida-

des so derivadas das classes que representam os nmeros puros


em Python; portanto, todas as operaes aritmticas vlidas para
nmeros, so possveis para nmeros com unidades. O Unum vem
com muitas unidades pr denidas, mas estas podem ser redenidas, durante a sesso, assim como novas unidades podem ser denidas. Todas as unidades prdenidas so denidas em maisculas
para facilitar a sua diferenciao de nomes associados a variveis.

5O

pacote Unum pode ser baxado de

Unum.html.

http://home.scarlet.be/be052320/

CAPTULO 6. MODELAGEM MATEMTICA

160

Qualquer grandeza pode ser denida multiplicando-se um nmero


por uma unidade.

In

[ 3 ] : a=3M

In

[ 4 ] : t =1 S

In

[ 5 ] : a/ t

4 Out [ 5 ] : 3 . 0
5

In

[m/ s ]

[ 6 ] : 1 / ( 3 M/ S )

6 Out [ 6 ] : 0 . 3 3 3 3 3 3 3 3 3 3 3 3
7

In

8 Out [ 7 ] : 2 5 . 0
9

In

[ m2 ]

[ 8 ] : ( 3 M)

10 Out [ 8 ] : 1 2 . 0
11

In

[ s /m]

[ 7 ] : 2 5 M 2

( 4 M)
[ m2 ]

[ 9 ] : 1 3 KGM/ S 2

12 Out [ 9 ] : 1 3 . 0

[ kg .m/ s 2 ]

Grandeza adimensionais tambm podem ser representadas.

In

[10]:(2

2 Out [ 1 0 ] : 6 . 0

M/ S )

(3

S /M)

[]

Agora que j aprendemos a operar com unidades, vamos implementar um simples modelo com unidades.
[ 1 1 ] : massa = 1 . 5 KG

In

In

[ 1 2 ] : v e l o c i d a d e =2M/ S

In

[ 1 3 ] : e n e r g i a _ c i n e t i c a =( massa v e l o c i d a d e

In

[ 1 4 ] : energia_cinetica

2 ) /2
5 Out [ 1 4 ] : 3 . 0

[ kg . m2/ s 2 ]

Evitando Erros
Utilizar unidades no apenas uma questao esttica, tambm pode
ajudar a evitar enganos:

6.3. GRANDEZAS, DIMENSES E UNIDADES

161

[ 1 5 ] : e n e r g i a _ c i n e t i c a +3KG

In

DimensionError :

[ kg . m2/ s 2 ]

incompatible

with

[ kg ]
[ 1 6 ] :MKG

In

DimensionError :

unit

[ kg ]

unexpected

No exemplo acima, somos lembrados de que no podemos somar


grandezas com unidades diferentes, nem elevar metros a quilogramas! Expoentes devem sempre ser adimensionais.
Tambm podemos fazer converses de unidades.

Vamos con-

verter nossa energia cintica em joules:

In

[ 1 7 ] : e n e r g i a _ c i n e t i c a . as ( J )

2 Out [ 1 7 ] : 3 . 0

[J]

Integrao com Funes Matemticas


J vimos que logaritmos e ngulos so adimensionais; portanto funes logartmicas e trigonomtricas no aceitam nmeros com unidades. No caso dos ngulos podemos usar pseudo-unidades como

RAD(radianos)

ARCDEG(graus).

from

import

In

[18]:

In

[ 1 9 ] : l o g 1 0 (M/ANGSTROM)

math

pi , log10 ,

sin , cos

3 Out [ 1 9 ] : 1 0 . 0
4

In

[ 2 0 ] : c o s ( 1 8 0 ARCDEG)

5 Out [ 2 0 ] :
6

In

1.0

[ 2 4 ] : c o s ( p i RAD)

7 Out [ 2 4 ] :

1.0

In

[ 2 5 ] : f = 4 4 0 HZ

In

[ 2 6 ] : sin ( f )

10

DimensionError :

11

In

[ 2 7 ] : dt = 0 . 1

12

In

[ 2 8 ] : s i n ( f dt 2 p i )

13 Out [ 2 8 ] :

unit

[ Hz ]

unexpected

3 . 9 1 9 8 2 4 5 3 4 4 0 4 0 9 2 7 e 14

CAPTULO 6. MODELAGEM MATEMTICA

162

As unidade do

Unum tambm funcionam bem com outras estru-

turas de dados, como matrizes do Numpy, por exemplo.

from
from

import
import

In

[1]:

In

[2]:

In

[ 3 ] : a= a r a n g e ( 1 0 ) M

In

[4]:a

unum . u n i t s
numpy

5 Out [ 4 ] :
6

array ( [ 0 . 0
4.0

[m] ,

[m] ,
7.0

1.0

5.0

[m] ,

[m] ,

[m] ,
8.0

2.0

6.0

[m] ,

[m] ,

3.0

[m] ,

[m] ,
9.0

[m ] ] ,

d t y p e=

object )

In

[ 5 ] : a 2

9 Out [ 5 ] :
10

array ( [ 0 . 0
] ,

11

[ m2 ] ,

16.0

1.0

[ m2 ] ,

36.0

[ m2 ] ,

[ m2 ] ,

25.0
49.0

[ m2 ] ] ,

4.0

[ m2 ] ,

9.0

[ m2

[ m2 ] ,
[ m2 ] ,

64.0

[ m2 ] ,

81.0

d t y p e=o b j e c t )

Por m, o Unum tambm simplica automticamente expresses de unidades. No exemplo abaixo, o

Unum sabe que uma presso

multiplicada por uma rea uma fora. Portanto, converte a unidade para Newtons (N).

In

[ 6 ] : f o r c a = PA

In

[ 7 ] : forca

3 Out [ 7 ] : 1 . 0

M 2

[N]

Conforme j mencionamos, tambm podemos criar novas unidades. Vejamos abaixo como fazer isso:
Listagem 6.4: Criando novas unidades.

from

import

In

[1]:

In

[ 2 ] : u n i t = Unum . u n i t

In

[ 3 ] : LEGUA = u n i t ( ' l e g u a ' )

In

[ 4 ] : LEGUA

unum

Unum

6.3. GRANDEZAS, DIMENSES E UNIDADES


5 Out [ 4 ] : 1 . 0

163

[ legua ]

In

[ 5 ] : KLEGUA = u n i t ( ' k i l o l e g u a ' , 1 0 0 0 LEGUA)

In

[ 6 ] : 2 0 KLEGUA+1LEGUA

8 Out [ 6 ] : 2 0 . 0 0 1

[ kilolegua ]

Uma Aplicao Concreta


Muitas vezes, ao modelar um sistema biolgico, a relao entre
grandezas biolgicas e fsicas no bvia. Nestes casos, a anlise
dimensional pode ajudar a validar nossas formulaes.

Suponha

que um pesquisador deseje determinar o trabalho realizado pelo


corao. Ele se lembra da fsica que:

T rabalho(J) = F orca(N ) dist


ancia(m)
Esta equao no diretamente aplicvel ao corao, pois este no
se desloca e a fora que exerce no facilmente mensurvel. Contudo, a fora exercida pelo corao se reete na presso sangunea,
e o volume de sangue bombeado parece ser anlogo distncia
da frmula original. Ento nosso pesquisador-modelador escreve,
timidamente, a seguinte frmula:

T rabalho = P ress
ao V olume
Mas como saber se esta relao correta? Fazendo a anlise dimensional.

T rabalho(J) = P ress
ao V olume =
Esta denio de Trabalho (N

m),

N
m3 = N m = J
m2

no a mesma da tabela 6.3

mas um pouco de lgebra pode demonstrar a sua validade . Com


o

Unum,

isso seria uma tarefa trivial:

6 Lembre-se

de que Trabalho=Energia.

CAPTULO 6. MODELAGEM MATEMTICA

164

In

[ 8 ] : J == PA

M 3

2 Out [ 8 ] : True
Para que uma anlise dimensional funcione com unidades, devemos nos manter em um mesmo sistema de unidades. O sistema
utilizado em cincia o chamado Sistema Internacional (SI). As
unidades apresentadas nas tabelas 6.2 e 6.3 esto de acordo com o
SI.
Um detalhe em relao a unidades que frequentemente mal
entendido, a aplicao de fatores de escala normalmente expressos
como prexos s unidades (ver tabela 6.4). Devido a este fato o
SI frequentemente denominado sistema MKS (metro, kilograma,
segundo). Um outro sistema que frequentemente confundido com
o SI o CGS (centmetro, grama, segundo). Apesar deste ltimo se
diferenciar do SI apenas nos prexos, um sistema completamente
diferente.

MKS

vs.

CGS

Fora(MKS):
Newton (m

kg/s2 )

Fora(CGS):
Dyne (cm

g/s2 )

Ao adicionar ou modicar prexos de unidades estamos abandonando nosso sistema de unidades original e nossas equaes no
estaro mais equilibradas dimensionalmente, a menos que realizemos as correes necessrias nos demais termos da equao.
Para re-equilibrar dimensionalmente equaes cujas unidades
de uma ou mais de suas variveis tenham sido modicadas, precisamos incluir fatores de correo.
Consideremos a relao entre a massa corporal e a massa do
Corao:

Y = 0.006M

6.3. GRANDEZAS, DIMENSES E UNIDADES

165

Tabela 6.4: Prexos de Unidades


Smbolo

Fator

Prexo

Smbolo

Fator

yocto

deca

da

zepto

hecto

atto

femto

pico

nano

micro

mili

centi

deci

1024
1021
1018
1015
1012
109
106
103
102
101

10
102
103
106
109
1012
1015
1018
1021
1024

Prexo

kilo

mega

giga

tera

peta

exa

zetta

yotta

colocando esta equao em termos dimensionais:

M =1M
se quisermos expressar a massa do corao em gramas (CGS), mantendo a massa corporal em kg (SI/MKS), basta apenas multiplicarmos o lado direito da equao por 1000 para reequilibrar a equao.
Assim, teramos:

Y = 6M
Contudo, nem sempre a determinao dos fatores de correo
to bvia. Vejamos a seguinte equao, que relaciona a massa do
fgado com a massa corporal (ambas em kg):

Mf = 0.082 Mc0.87

(6.2)

Esta relao se mantm, para mamferos, ao longo de vrias ordens


de magnitude de tamanho. Se estivssemos interessados apenas em
pequenos roedores, seria mais conveniente trabalhar com gramas ao
invs de kilogramas. O investigador desavisado, determina a massa
de um hamster (200g), o aplica na equao 6.2: e obtm o seguinte

CAPTULO 6. MODELAGEM MATEMTICA

166

resultado:

Mf = 8.24
Este valor no seria correto nem em gramas e muito menos em
kg!

O que poderia estar errado?

Por desencargo de conscincia,

ele decide realizar o clculo novamente aplicando a massa em kg


(0.2kg):

Mf = 0.020kg
este resultado (20g) parece mais realstico. Analisando dimensionalmente a equao, podemos entender o que deu errado em nossa
converso de unidades:

Mf

0.082 (1000 Mc )0.87

Se esta equao possui apenas duas variveis, ambas de massa,


porque a simples substituio de unidades no funciona?

A res-

posta est no fato de que a massa corporal est elevada a 0.87,


portanto sua unidade no mais

Kg, da mesma forma que 1 metro

quadrado no igual a 1 metro. Para a equao ser vlida dimensionalmente, a constante 0.082 no pode ser adimensional.

Para

descobrir a sua unidade basta rearranjarmos a equao,

Mf
= 0.082
Mc0.87
e resolv-la com o

kg 0.13 .

In

Unum.

Como vemos a unidade de nossa constante

[ 1 3 ] : KG/KG 0 . 8 7

2 Out [ 1 3 ] : 1 . 0

[ kg0 . 1 3 ]

se quisermos multiplicar a unidade da massa do corao por 1000


(Kg

g ),

temos que multiplicar a unidade da constante por 1000

tambm e isso representa multiplic-la por

10000.13 .

Podemos ve-

ricar que esta operao retorna um nmero 1000 vezes o valor em

Kg,

ou seja, o valor em gramas.

6.4. EXERCCIOS
1

In

167

[ 2 0 ] : 1 0 0 0 0 . 1 3 KG 0 . 1 3

1 0 0 0 0 . 8 7 KG

0.87
2 Out [ 2 0 ] : 1 0 0 0 . 0
3

In

[ kg ]

[21]:0.082(10000.13)

(2000.87)

4 Out [ 2 1 ] : 2 0 . 2 1 6 6 8 5 1 9 9 7 9 1 5 6 3

6.4 Exerccios
1. Determine as dimenses das seguintes grandezas (manualmente e depois utilizando o Unum):
a) Volume
b) Acelerao (velocidade/tempo)
c) Densidade (massa/volume)
d) Fora (massa

acelerao)

e) Carga eltrica (corrente

tempo)

2. Utilizando as repostas da questo anterior determine as dimenses das seguintes grandezas:


a) Presso (fora/rea)
b) (volume)

c) Campo eltrico (fora/carga eltrica)


d) Trabalho (fora

distncia)

e) Energia Potencial Gravitacional (=


lerao gravitacional

altura)

mgh =massa

ace-

Captulo 7

Teoria de Grafos
Breve introduo a teoria de grafos e sua representao
computacional. Introduo ao Pacote NetworkX, voltado para a manipulao de grafos. Pr-requisitos:
Programao orientada a objetos.

7.1 Introduo
A teoria de grafos uma disciplina da matemtica cujo objeto de
estudo se presta, muito bem, a uma representao computacional
como um objeto. Matematicamente, um grafo denido por um
conjunto nito de vrtices (V ) e por um segundo conjunto (A) de
relaes entre estes vrtices, denominadas arestas. Grafos tem aplicaes muito variadas, por exemplo: uma rvore genealgica um
grafo onde as pessoas so os vrtices e suas relaes de parentesco
so as arestas do grafo.
Um grafo pode ser denido de forma no ambgua, por sua lista
de arestas (A), que implica no conjunto de vrtices que compem
o grafo. Grafos podem ser descritos ou mensurados atravs de um
conjunto de propriedades:

Grafos podem ser

direcionados
169

ou no;

CAPTULO 7. TEORIA DE GRAFOS

170

ordem

tamanho

de um grafo corresponde ao seu nmero de vrtices;


de um grafo corresponde ao seu nmero de ares-

tas;

Vrtices, conectados por uma aresta, so ditos

adjacentes ;
A

ordem

vizinhos

ou

de um vrtice corresponde ao seu nmero de vizi-

nhos;

Um

caminho

uma lista de arestas que conectam dois vrti-

ces;

Um

ciclo

um caminho que comea e termina no mesmo

vrtice;

Um grafo sem ciclos denominado

acclico.

A lista acima no exaure as propriedades dos grafos, mas


suciente para esta introduo.
Podemos representar um grafo como um objeto Python de vrias maneiras, dependendo de como desejamos utiliz-lo. A forma
mais trivial de representao de um grafo em Python seria feita
utilizando-se um dicionrio. A Listagem 7.1 mostra um dicionrio
representando o grafo da gura 7.1.

Neste dicionrio, utilizamos

como chaves os vrtices do grafo associados a suas respectivas listas


de vizinhos.

Como tudo em Python um objeto, poderamos j

nos aproveitar dos mtodos de dicionrio para analisar nosso grafo


(Listagem 7.2).
Listagem 7.1: Denindo um grafo como um dicionrio.

1 >>> g = { ' a ' : [ ' c ' , ' d ' , ' e ' ] , ' b ' : [ ' d ' , ' e ' ] , ' c '
: [ 'a ' , 'd ' ] , 'd ' : [ 'b ' , ' c ' , 'a ' ] , ' e ' : [ 'a ' , 'b
' ]}

7.1. INTRODUO

171

Figura 7.1: Um grafo simples.

Podemos utilizar o mtodo

keys

para obter uma lista dos vr-

tices de nosso grafo.


Listagem 7.2: Obtendo a lista de vrtices.

1 >>> g . k e y s ( )
2

[ 'a ' ,

'c ' ,

'b ' ,

'e ' ,

'd ' ]

Uma extenso do conceito de grafos o conceito de redes. Redes


so grafos nos quais valores numricos so associados s suas arestas. Redes herdam as propriedade dos grafos e possuem algumas
propriedades especcas.
A representao de redes, a partir de objetos pitnicos simples,
como um dicionrio, tambm possivel.

Porm, para dar mais

alcance aos nossos exemplos sobre teoria de grafos, vamos nos uti-

CAPTULO 7. TEORIA DE GRAFOS

172

lizar do pacote

NetworkX1

que j implementa uma representao

bastante completa de grafos e redes em Python.

7.2 NetworkX
NetworkX

O pacote

se presta criao, manipulao e estudo da

estrutura, dinmica e funes de redes complexas.


A criao de um objeto grafo a partir de seu conjunto de ares-

A, muito
{W, X, Y, Z}:
tas,

simples.

Seja um grafo

com vrtices

V =

G : A = {(W, Z), (Z, Y ), (Y, X), (X, Z)}


Listagem 7.3: Denindo um grafo atravs de seus vrtices

1 # Disponivel

no

pacote

de

programas

como :

g r a p h 1 . py

import

networkx

a s NX

3
4 G = NX. Graph ( )
5 G . add_edges_from ( [ ( 'W' , ' Z ' ) , ( ' Z ' , 'Y ' ) , ( 'Y ' , '
X ' ) , ( 'X ' , ' Z ' ) ] )

print

G. n o d e s ( ) , G. e d g e s ( )

Executando o cdigo acima, obtemos:

[0 Y 0 ,0 X 0 ,0 Z 0 ,0 W 0 ][(0 Y 0 ,0 X 0 ), (0 Y 0 ,0 Z 0 ), (0 X 0 ,0 Z 0 ), (0 Z 0 ,0 W 0 )]
Ao lidar com grafos, conveniente represent-los gracamente.
Vejamos como obter o diagrama do grafo da listagem 7.3:
Listagem 7.4: Diagrama de um grafo

1 https://networkx.lanl.gov/

7.2. NETWORKX
1 # Disponivel

173

no

pacote

de

programas

como :

g r a p h 2 . py

import

networkx

a s NX

3
4 G = NX. Graph ( )
5 G . add_edges_from ( [ ( 'W' , ' Z ' ) , ( ' Z ' , 'Y ' ) , ( 'Y ' , '
X ' ) , ( 'X ' , ' Z ' ) ] )

6
7

import

pylab

as P

8 NX. draw (G)


9 P . show ( )
A funcionalidade do pacote

NetworkX

bastante ampla.

seguir exploraremos um pouco desta funcionalidade.

Construindo Grafos
O

NetworkX oferece diferentes classes de grafos, dependendo do tipo

de aplicao que desejada. Abaixo, temos uma lista dos comandos


para criar cada tipo de grafo.

G=Graph() Cria um grafo simples e vazio G.


G=DiGraph() Cria grafo direcionado e vazio G.
G=XGraph() Cria uma rede vazia, ou seja, com arestas que podem receber dados.

G=XDiGraph() Cria uma rede direcionada.


G=empty_graph(n) Cria um grafo vazio com n vrtices.
G=empty_graph(n,create_using=DiGraph()) Cria um grafo
direcionado vazio com n vrtices.

G=create_empty_copy(H)
tipo que H.

Cria um novo grafo vazio do mesmo

CAPTULO 7. TEORIA DE GRAFOS

174

Figura 7.2: Diagrama de um grafo

Manipulando Grafos
Uma vez de posse de um objeto grafo instanciado a partir de uma
das classes listadas anteriormente, de interesse poder manipul-lo
de vrias formas.

O prprio objeto dispe de mtodos para este

m:

G.add_node(n)

Adiciona um nico vrtice a G.

G.add_nodes_from(lista)
G.delete_node(n)

Adiciona uma lista de vrtices a G.

Remove o vrtice

G.delete_nodes_from(lista)
G.

de G.

Remove uma lista de vrtices de

7.2. NETWORKX
G.add_edge(u,v)

175

Adiciona a aresta

(u,v)

a G. Se G for um

grafo direcionado, adiciona uma aresta direcionada


Equivalente a

G.add_edge((u,v)).

G.add_edges_from(lista)
G.delete_edge(u,v)

u v .

Adiciona uma lista de arestas a G.

Remove a aresta

G.delete_edges_from(lista)

(u,v).

Remove uma lista de arestas de

G.

G.add_path(listadevertices)

Adiciona vrtices e arestas de forma

a compor um caminho ordenado.

G.add_cycle(listadevertices)

O mesmo que

add_path,

exceto

que o primeiro e o ltimo vrtice so conectados, formando


um ciclo.

G.clear()

Remove todos os vrtices e arestas de G.

G.copy()

Retorna uma cpia rasa do grafo G.

G.subgraph(listadevertices)

Retorna subgrafo correspondente

lista de vrtices.

Criando Grafos a Partir de Outros Grafos

subgraph(G, listadevertices)

Retorna subgrafo de G correspon-

dente lista de vrtices.

union(G1,G2)

Unio de grafos.

disjoint_union(G1,G2)

Unio disjunta, ou seja, assumindo que

todos os vrtices so diferentes.

2 Uma

cpia rasa signica que se cria um novo objeto grafo referenciando

o mesmo contedo. Ou seja, se algum vrtice ou aresta for alterado no grafo


original, a mudana se reete no novo grafo.

CAPTULO 7. TEORIA DE GRAFOS

176

cartesian_product(G1,G2)

Produto cartesiano de dois grafos

(Figura 7.3).

compose(G1,G2)

Combina grafos, identicando vrtices com mesmo

nome.

complement(G)

Retorna o complemento do grafo(Figura 7.3).

create_empty_copy(G)

Cpia vazia de G.

convert_to_undirected(G)

Retorna uma cpia no direcionada

de G.

convert_to_directed(G)

Retorna uma cpia no direcionada

de G.

convert_node_labels_to_integers(G)

Retorna uma cpia com

os vrtices renomeados como nmeros inteiros.

Gerando um Grafo Dinamicamente


Muitas vezes, a topologia da associao entre componentes de um
sistema complexo no est dada a priori.

Frequentemente, esta

estrutura dada pela prpria dinmica do sistema.


No exemplo que se segue, simulamos um processo de contgio
entre os elementos de um conjunto de vrtices, observando ao nal,
a estrutura produzida pelo contgio.
Listagem 7.5: Construindo um grafo dinamicamente

1 # Disponivel

no

pacote

de

programas

g r a f o d i n . py

2
3
4
5

import
import
class

networkx

a s NX

t h r e a d i n g , random ,
Contagio :

pylab

as P

como :

7.2. NETWORKX

177

Figura 7.3: Grafo, produto cartesiano e complemento.

def

__init__ ( s e l f , nome ) :

s e l f . nome = nome

s e l f . doente = 0

9
10
11
12
13

def

s e l f . transmite ()
transmite ( s e l f ) :

if

for

G . d o e n t e s == G . o r d e r ( ) :

return
a l v o in

random . s a m p l e (G . n o d e s ( )

,3) :

14
15
16

i f not

alvo . doente :

G . add_edge ( ( s e l f , a l v o ) )

print

"%s

i n f e c t o u %s "%( s e l f

CAPTULO 7. TEORIA DE GRAFOS

178

. nome ,

a l v o . nome )

17

t = t h r e a d i n g . Thread ( t a r g e t=

18

t . start ()

alvo . contraiu () )

19

def

contraiu ( s e l f ) :

20

s e l f . d o e n t e +=1

21

G . d o e n t e s +=1

22

s e l f . transmite ()

23
24 G = NX. XDiGraph ( )
25 G . d o e n t e s = 0
26

nos =

[ Contagio ( n )

for

in

xrange (80) ]

27 G . add_nodes_from ( n o s )
28
29
30

c a s o _ i n d i c e = G. n o d e s ( ) [ 0 ]
caso_indice . contraiu ()

print

" usamos %s

das

arestas

p o s s i v e i s "%(NX.

d e n s i t y (G) )

31

print

32

nomes = d i c t ( [ ( no , no . nome )

NX. d e g r e e _ h i s t o g r a m (G) , G . d o e n t e s

for

no

in

G. n o d e s

() ])

33 NX. draw (G, l a b e l s =nomes ,


s t y l e= ' d o t t e d ' ,

a l p h a = 0 . 7 , w i d t h =2 ,

n o d e _ s i z e =450 ,

font_size

=14)

34 P . s a v e f i g ( ' c o n t a g i o . png ' , d p i =400)


35 P . show ( )

Mdulo threading:

Permite executar mais de uma parte do

programa em paralelo, em um o de execuo independente.


Este os, compartilham todas as variveis globais e qualquer
alterao nestas imediatamente visvel a todos os outros os.
O objeto grafo do

NetworkX

aceita qualquer objeto como um

vrtice. Na listagem 7.5, nos valemos deste fato para colocar ins-

7.2. NETWORKX
tncias da classe

179

Contagio

como vrtices do grafo

G.

O grafo G

contrudo somente por vrtices (desconectado). Ento infectamos


um vrtice do grafo, chamando o seu mtodo

contraiu().

O vr-

tice, aps declarar-se doente e incrementar o contador de doentes


a nvel do grafo, chama o mtodo
O mtodo

transmite

transmite().

assume que durante seu perodo infec-

cioso, cada vrtice tem contatos efetivos com apenas dez outros
vrtices.

Ento cada vrtice ir transmitir para cada um destes,

desde que no estejam j doentes.


Cada vrtice infectado inicia o mtodo
read separado.

contraiu

em um th-

Isto signica que cada vrtice sai infectando os

restantes, em paralelo. Na verdade, como o interpretador Python


s executa uma instruo por vez, cada um destes objetos recebe
do interpretador uma fatia de tempo por vez, para executar suas
tarefas. Pode ser que o tempo de uma destas fatias seja suciente
para infectar a todos no seu grupo, ou no. Depois que o processo
se desenrola, temos a estrutura do grafo como resultado (Figura
7.4)

Construindo um Grafo a Partir de Dados


O conceito de grafos e redes extremamente til na representao
e anlise de sistemas complexos, com muitos componentes que se
relacionam entre si. Um bom exemplo uma rede social, ou seja,
uma estrutura de interao entre pessoas.

Esta interao pode

ser medida de diversas formas. No exemplo que se segue, vamos


tentar inferir a rede social de um indivduo, por meio de sua caixa
de mensagens.
Listagem 7.6: Construindo uma rede social a partir de e-mails

1 # Disponivel

no

pacote

mnet . py

2
3

import
import

email ,

sys

email . Errors

de

programas

como :

CAPTULO 7. TEORIA DE GRAFOS

180

Figura 7.4: Resultado da simulao do exemplo 7.5.

4
5
6
7
8

import m a i l b o x
import n e t w o r k x a s NX
from p y l a b import show
def

return e m a i l . m e s s a g e _ f r o m _ f i l e ( f p )
except e m a i l . E r r o r s . M e s s a g e P a r s e E r r o r :
return ' '

10
11
12
13
14
15

msgfactory ( fp ) :

try :

def

s t a r G ( mess , G) :

try :

7.2. NETWORKX

181

16

c e n t r o = me s s . g e t ( ' f r o m ' ) . s p l i t ( )

17

pontas =

1]. s t r i p (

for

'<> ' )

[ j . s p l i t () [
j

in

1]. s t r i p (

split ( ' , ') ]

18

arestas =

'<> ' )

m es s . g e t _ a l l ( ' t o ' ) [ 0 ] .

[ ( centro , k)

for

in

pontas ]

19

G . add_edges_from ( a r e s t a s )

return G
except :
print ' f a l h o u '

20
21
22
23
24

d i r= ' /home/ f l a v i o / M a i l / i n b o x '

25 # V e j a

documentacao

26 # p a r a

outros

tipo

do
de

modulo

27 mbox = m a i l b o x . M a i l d i r ( d i r ,
mailbox

do

mailbox

mailboxes .
msgfactory ) #

kmail

28 G = NX. DiGraph ( )
29

for

in

= mbox . n e x t ( )

30
31
32

xrange (50) :

s t a r G ( i , G)

print

G. n o d e s ( )

33 G = NX. c o n v e r t _ n o d e _ l a b e l s _ t o _ i n t e g e r s (G)
34 NX. draw (G,

w i d t h =2 ,

s t y l e= ' d o t t e d ' ,

alpha

=0.5)

35

show ( )
Na Listagem 7.6, usamos dois mdulos interessantes da bibli-

oteca padro do Python: O mdulo

mailbox.

Mdulo email:
por emails.

email

e o mdulo mailbox.

Mdulo para decodicar, manusear, e com-

CAPTULO 7. TEORIA DE GRAFOS

182

Mdulo mailbox:

Conjuto de classes para lidar com caixas

de correio no formato Unix, MMDF e MH.


Neste exemplo, utilizei a minha mailbox associada com o programa Kmail; portanto, se voc usa este mesmo programa, basta
substituir o diretrio de sua mailbox e o programa ir funcionar
para voc. Caso use outro tipo de programa de email, consulte a
documentaao do Python para buscar a forma correta de ler o seu
mailbox.
A classe

Maildir

retorna um iterador, que por sua vez, retor-

nar mensagens decodicadas pela funo msgfactory, denida por


ns.

Esta funo se utiliza do mdulo email para decodicar a

mensagem.
Cada mensagem recebida processada para gerar um grafo do
tipo estrela, com o remetente no centro e todos os destinatrios
da mensagem nas pontas. Este grafo ento adicionado ao grafo
original, na forma de uma lista de arestas.

Depois de todas as

mensagens terem sido assim processadas, geramos a visualizao


do grafo (Figura 7.5).

7.3 Exerccios
1. Determine o conjunto de arestas

que maximiza o tamanho

do grafo cujos vrtices so dados por

V = {a, b, c, d, e}.

2. No exemplo do contgio, verique se existe alguma relao


entre o tamanho da amostra de cada vrtice e a densidade
nal do grafo.
3. Ainda no exemplo do contgio, refaa o experimento com um
grafo de topologia dada a priori no qual os vrtices s podem
infectar seus vizinhos.

7.3. EXERCCIOS

183

Figura 7.5: Rede social a partir de mensagens de email.

4. Insira um print no lao for do exemplo 7.6 para ver o formato


de sada do iterador mbox.
5. Modique o programa 7.6 para associar apenas mensagens
que contm uma palavra em comum.

Captulo 8

Interao com Bancos de


Dados

Apresentao dos mdulos de armazenamento de dados


Pickle e Sqlite3 que fazem parte da distribuio padro
do Python. Apresentao do pacote SQLObject para
comunicao com os principais sistemas de bancos de
dados existentes. Pr-requisitos: Conhecimentos bsicos de bancos de dados e SQL.

gerenciamento de dados no se constitui numa disciplina cientca per se. Entretanto, cada vez mais, permeia as atividades

bsicas de trabalho cientco. O volume crescente de dados e o aumento de sua complexidade h muito ultrapassou a capacidade de
gerenciamento atravs de simples planilhas.
Atualmente, muito comum a necessidade de se armazenar dados quantitativos, qualitativos e mdias dos mais diferentes formatos(imagens, vdeos, sons) em uma plataforma integrada de onde
possam ser facilmente acessados para ns de anlise, visualizaco
ou simplesmente consulta.
A linguagem Python dispe de solues simples para resolver
esta necessidade em seus mais distintos nveis de sosticao. Seguindo a losoa de baterias includas do Python, a sua biblioteca
185

186

CAPTULO 8. INTERAO COM BANCOS DE DADOS

padro nos apresenta o mdulo Pickle e cPickle e, a partir da verso


2.5, o banco de dados relacional sqlite3.

8.1 O Mdulo Pickle


O mdulo

pickle

e seu primo mais veloz

cPickle,

implementam

algoritmos que permitem armazenar, em um arquivo, objetos implementados em Python.


Listagem 8.1: Exemplo de uso do mdulo

In

In

3
4

import p i c k l e
[ 2 ] : class o i :
.2.:
def d i g a o i ( s e l f ) :
.2.:
print " o i "

pickle

[1]:

In

[ 3 ] : a= o i ( )

In

[ 4 ] : f = o p e n ( ' p i c t e s t e ' , 'w ' )

In

[ 5 ] : p i c k l e . dump ( a , f )

In

[ 6 ] : f . close ()

In

[ 7 ] : f = open ( ' p i c t e s t e ' , ' r ' )

10

In

[ 8 ] : b=p i c k l e . l o a d ( f )

11

In

[ 9 ] : b . digaoi ()

12

oi

Como vemos na listagem 8.1, com o mdulo pickle podemos armazenar objetos em um arquivo, e recuper-lo sem problemas para uso
posterior.

Contudo, uma caracterstica importante deste mdulo

no ca evidente no exemplo 8.1.


nado por meio do mdulo

pickle,

Quando um objeto armazenem o cdigo da classe, nem

seus dados, so incluidos, apenas os dados da instncia.

In

[10]:

.10.:

.10.:

class
def

oi :
d i g a o i ( s e l f , nome= ' f l a v i o ' ) :

print

' o i %s ! '%nome

4
5

In

[ 1 1 ] : f = open ( ' p i c t e s t e ' , ' r ' )

8.2. O MDULO SQLITE3


6

In

In

[ 1 3 ] : b . digaoi ()

oi

flavio !

187

[ 1 2 ] : b=p i c k l e . l o a d ( f )

Desta forma, podemos modicar a classe, e a instncia armazenada reconhecer o novo cdigo ao ser restaurada a partir do
arquivo, como podemos ver acima.
que os

pickles

Esta caracterstica signica

no se tornam obsoletos quando o cdigo em que

foram baseados atualizado (naturalmente isto vale apenas para


modicaes que no removam atributos j includos nos
O mdulo

pickle

pickles).

no foi construdo para armazenamento de

dados, pura e simplesmente, mas de objetos computacionais complexos, que podem conter em si, dados. Apesar desta versatilidade,
peca por consistir em uma estrutura de armazenamento legvel apenas pelo prprio mdulo

pickle

em um programa Python.

8.2 O mdulo Sqlite3


Este mdulo passa a integrar a biblioteca padro do Python a partir
da verso 2.5.

Portanto, passa a ser uma excelente alternativa

para usurios que requerem a funcionalidade de um banco de dados


relacional compatvel com

SQL1 .

O Sqlite nasceu de uma biblioteca em

que disponibilizava

um banco de dados extremamente leve e que dispensa o conceito


servidor-cliente. No

sqlite,

nipulado atravs da biblioteca

o banco de dados um arquivo ma-

sqlite.

Para utilizar o sqlite em um programa Python, precisamos importar o mdulo

In

[1]:

1 SQL

sqlite3.

import

sqlite3

signica Structured Query Language. o

SQL um padro internaci-

onal na interao com bancos de dados relacionais. Para saber mais, consulte

http://pt.wikipedia.org/wiki/SQL

188

CAPTULO 8. INTERAO COM BANCOS DE DADOS


O prximo passo a criao de um objeto conexo, atravs

do qual podemos executar comandos SQL.

In

[2]: c =

s q l i t e 3 . c o n n e c t ( ' /tmp/ e x e m p l o ' )

Agora dispomos de um banco de dados vazio, consistindo no


arquivo

exemplo,

localizado no diretrio

/tmp.

sqlite

tambm

permite a criao de bancos de dados em RAM; para isso basta

:memory:.

substituir o nome do arquivo pela string

Para po-

dermos inserir dados neste banco, precisamos primeiro criar uma


tabela.

In

[3]: c.

execute ( ' ' ' c r e a t e

nome

text ,

altura

2 Out [ 3 ] : < s q l i t e 3 . C u r s o r
Note que os comandos
objeto

Connection,

real ,

table

especimes (

peso

object

at

real ) ' ' ' )


0 x83fed10>

SQL so enviados como strings atravs do


execute. O comando create table

mtodo

cria uma tabela; ele deve ser necessriamente seguido do nome da


tabela e de uma lista de variveis tipadas(entre parnteses), correspondendo s variveis contidas nesta tabela. Este comando cria
apenas a estrutura da tabela.

Cada varivel especicada corres-

ponder a uma coluna da tabela.

Cada registro, inserido subse-

quentemente, formar uma linha da tabela.

In

[4]: c.

execute ( ' ' ' i n s e r t

into

especimes

v a l u e s ( ' tom ' , 1 2 . 5 , 2 . 3 ) ' ' '


O comando

insert

mais um comando

registros em uma tabela.


Apesar dos comandos

SQL

SQL

til para inserir

serem enviados como strings atravs

da conexo, no se recomenda, por questo de segurana, utilizar


os mtodos de formatao de strings ( ' ... values(%s,%s)'%(1,2))
do Python. Ao invs, deve-se fazer o seguinte:

In

[ 5 ] : t = ( ' tom ' , )

In

[ 6 ] : c . execute ( ' s e l e c t
where

nome=? ' , t )

from

especimes

8.2. O MDULO SQLITE3


3

In

[ ( ' tom ' ,

189

[ 7 ] : c . fetchall ()
12.5 ,

2.2999999999999998) ]

No exemplo acima utilizamos o mtodo


rar o resultado da operao.
registro, usaramos

fetchone.

fetchall para recupe-

Caso desejssemos obter um nico

Abaixo, vemos como inserir mais de um registro a partir de


estruturas de dados existentes.

Neste caso, trata-se de repetir a

operao descrita no exemplo anterior, com uma sequncia de tuplas representando a sequncia de registros que se deseja inserir.

In

[ 8 ] : t = ( ( ' j e r r y ' , 5 . 1 , 0 . 2 ) , ( ' butch '

In

[9]:

,42.4 ,10.3) )

for

.9.:

in

t :

c . execute ( ' i n s e r t

into

especimes

values (? ,? ,?) ' , i )

O objeto

cursor

tambm pode ser utilizado como um iterador

para obter o resultado de uma consulta.

In

[ 1 0 ] : c . execute ( ' s e l e c t
by

In

from

especimes

peso ' )

[11]:

for

r e g in c :
print r e g

( ' jerry ' ,5.1 ,0.2)

( ' tom ' ,

( ' butch ' , 4 2 . 4 , 1 0 . 3 )

12.5 ,

2.2999999999999998)

O mdulo sqlite realmente verstil e til, porm, requer que


o usurio conhea, pelo menos, os rudimentos da linguagem

SQL.

A soluo apresentada a seguir procura resolver este problema de


uma forma mais pitnica.

190

CAPTULO 8. INTERAO COM BANCOS DE DADOS

8.3 O Pacote SQLObject


O pacote SQLObject

2 estende as solues apresentadas at agora

de duas maneiras: oferece uma interface orientada a objetos para


bancos de dados relacionais e, tambm, nos permite interagir com
diversos bancos de dados sem ter que alterar nosso cdigo.
Para exemplicar o

sqlobject, continuaremos utilizando o sqlite

devido sua praticidade.

Construindo um aranha digital


Neste exemplo, teremos a oportunidade de construir uma aranha

digital que recolher informaes da web (Wikipedia ) e as armazenar em um banco sqlite via sqlobject.
Para este exemplo, precisaremos de algumas ferramentas que
vo alm do banco de dados.

Vamos explorar a capacidade da

biblioteca padro do Python para interagir com a internet, e vamos nos utilizar de um pacote externo para decodicar as pginas
obtidas.
Listagem 8.2: Mdulos necessrios

1 # disponivel

no

pacote

de

programas

como :

a r a n h a . py

2
3
4

import n e t w o r k x a s NX
from B e a u t i f u l S o u p import
from

BeautifulSoup
BeautifulSoup

as

SoupStrainer ,

BS

import

BeautifulStoneSoup

a s XS

5
6

import s y s , o s , u r l l i b 2 ,
from s q l o b j e c t import
2 http://www.sqlobject.org/
3 http://pt.wikipedia.org

urllib ,

re

8.3. O PACOTE SQLOBJECT


O pacote

BeautifulSoup4

191

um destrinchador de pginas da

web. Um dos problemas mais comuns ao se lidar com pginas html,


que muitas delas possuem pequenos defeitos em sua construo
que nossos navegadores ignoram, mas que podem atrapalhar uma
anlise mais minuciosa. Da o valor do

BeautifulSoup;

ele ca-

paz de lidar com pginas defeituosas, retornando uma estrutura de


dados com mtodos que permitem uma rpida e simples extrao
da informao que se deseja.
com outra codicao, o

Alm disso, se a pgina foi criada

BeautifulSoup,

retorna todo o contedo

em Unicode, automaticamente, sem necessidade de interveno do


usurio.
Da biblioteca padro, vamos nos servir dos mdulos

urllib, urllib2

re.

sys, os,

A utilidade de cada um car clara

medida que avanarmos no exemplo.


O primeiro passo especicar o banco de dados. O sqlobject

MySQL, PostgreSQL, sqlite, Firebird,


ADODBAPI. Entretanto, conforme j exrestringiremos ao uso do banco sqlite.

nos permite escolher entre

MAXDB, Sybase, MSSQL,


plicamos, nos

ou

Listagem 8.3: Especicando o banco de dados.

l a r a c n a d i r = os . path . expanduser ( ' ~/. l a r a c n a '

i f not

10
11

os . path . e x i s t s ( l a r a c n a d i r ) :

o s . mkdir ( l a r a c n a d i r )
sqlhub . p r o c e s s C o n n e c t i o n = connectionForURI (
' s q l i t e : / / '+l a r a c n a d i r+ ' / knowdb ' )
Na listagem 8.3, criamos o diretrio(os.mkdir) onde o banco

de dados residir (se necessrio) e denimos a conexo com o


banco.

Utilizamos

os.path.exists

para vericar se o diretrio

existe. Como desejamos que o diretrio que na pasta do usurio,


e no temos como saber, de antemo, qual este diretrio, utiliza-

4 http://www.crummy.com/software/BeautifulSoup/

CAPTULO 8. INTERAO COM BANCOS DE DADOS

192

mos

os.path.expanduser

para substituir o

por

/home/usuario

como aconteceria no console unix normalmente.


Na linha 11 da listagem 8.3, vemos o comando que cria a conexo a ser utilizada por todos os objetos criados neste mdulo.
Em seguida, passamos a especicar a tabela do nosso banco
de dados como se fora uma classe, na qual seus atributos so as
colunas da tabela.
Listagem 8.4: Especicando a tabela

16

class

ideia

do banco de dados.

I d e i a ( SQLObject ) :

17

nome = U n i c o d e C o l ( )

18

nlinks = IntCol ()

19

links

20

ender = StringCol ( )

= PickleCol ()

A classe que representa nossa tabela herdeira da classe

SQLObject.

Nesta classe, a cada atributo (coluna da tabela) deve ser atribuido


um objeto que dene o tipo de dados a ser armazenado.

Neste

exemplo, vemos quatro tipos distintos, mas existem vrios outros.

UnicodeCol

representa textos codicados como Unicode, ou seja,

podendo conter caracteres de qualquer lngua.


a nmeros inteiros.

PickleCol

IntCol corresponde

um tipo muito interessante pois

permite armazenar qualquer tipo de objeto Python.

O mais in-

teressante deste tipo de coluna, que no requer que o usurio


invoque o mdulo pickle para armazernar ou ler este tipo de varivel, As variveis so convertidas/reconvertidas automaticamente,

StringCol que uma


UnicodeCol, aceitando apenas strings de
SQL comum termos que especicar dife-

de acordo com a operao. Por m, temos


verso mais simples de
caracteres

ascii.

Em

rentes tipos, de acordo com o comprimento do texto que se deseja


armazenar em uma varivel.

No

sqlobject,

no h limite para

o tamanho do texto que se pode armazenar tanto em


quanto em

UnicodeCol

StringCol

8.3. O PACOTE SQLOBJECT

193

A funcionalidade da nossa aranha foi dividida em duas classes:

Crawler,

que o rastejador propriamente dito, e a classe

UrlFac

que constri as urls a partir da palavra que se deseja buscar na


Wikipedia.
Cada pgina puxada pelo mdulo

urllib2.

A funo

urlencode

do mdulo urllib, facilita a adio de dados ao nosso pedido, de


forma a no deixar transparecer que este provm de uma aranha
digital. Sem este disfarce, a Wikipedia recusa a conexo.
o
a

A pginas so ento analisadas pelo mtodo verResp, no qual


BeautifulSoup tem a chance de fazer o seu trabalho. Usando
funo SoupStrainer, podemos ltrar o resto do documento,

que no nos interessa, analizando apenas os links (tags 'a') cujo


destino so urls comeadas pela string /wiki/.
da wikipedia, comeam desta forma.

Todos os artigos

Assim, evitamos perseguir

links externos. A partir da sopa produzida, extramos apenas as


urls, ou seja, o que vem depois de

href=.

Podemos ver na listagem

8.5 que fazemos toda esta ltragem sosticada em duas linhas de


cdigo(55 e 56), graas ao

BeautifulSoup.

Listagem 8.5: Restante do cdigo da aranha.

15
16

urlatual =

class

' '

I d e i a ( SQLObject ) :

17

nome = U n i c o d e C o l ( )

18

nlinks = IntCol ()

19

links

20

ender = StringCol ( )

21
22
23
24
25

= PickleCol ()

class C r a w l e r :
def __init__ ( s e l f
try :

Ideia . createTable ()

27

except :
pass

28

s e l f . SU =

26

, s t a r t u r l , depth ) :

starturl

194

CAPTULO 8. INTERAO COM BANCOS DE DADOS

29

s e l f . depth = depth

30

s e l f . f i l a =[]

31

s e l f . depth = depth

32

s e l f . curdepth = 0

33

s e l f . started = 0

34

s e l f . nlinks = 0

35

s e l f . history =

36

s e l f . G = NX. Graph ( )

37

def

[]

parsePag ( s e l f , urlend ) :

38

urlatual = urlend

39

user_agent =

' Mozilla /4.0

compatible ;

MSIE

5.5;

Windows NT

) '

40

v a l u e s = { ' name '

41

' location '

42

' language '

43

Smith ' ,

' Python '

user_agent
data =

' John

' Northampton ' ,


}

' U s e r Agent '

headers = {

44

u r l l i b . urlencode ( values )

45

print

" Abrindo

46

req =

u r l l i b 2 . Request ( u r l e n d , data ,

47

fd =

48

html = f d . r e a d ( )

",

urlend

headers )

return

49
50
51

u r l l i b 2 . urlopen ( req )

def

html

ver Resp ( s e l f , html ) :

52

' ' '

53

Verifica

54

' ' '

55

lnkart = SoupStrainer ( ' a ' ,

se

resposta

e um

c o m p i l e ( ' ^/ w i k i / ' ) )

56

artlist

[ tag [ ' h r e f ' ]

BS ( html ,

hit

for

ou

nao

h r e f=r e .
tag

in

p a r s e O n l y T h e s e=l n k a r t ) ]

8.3. O PACOTE SQLOBJECT


if

57

195

a r t l i s t [ 0 ] . e n ds wi t h ( ' Disambig . svg


'):

58

s e l f . f i l a . append ( ' h t t p : / / '+


l a n g a t u a l+ ' . w i k i p e d i a . o r g '+
artlist [3])

59

self . curlinks =

artlist

61

self . curlinks =

artlist

62

I d e i a ( nome=n o m e a t u a l , n l i n k s =

else :

60

len ( a r t l i s t ) ,

links

a r t l i s t , ender = u r l a t u a l )

63

s e l f . G . add_edges_from ( [ (

for

nomeatual , i )

if

64
65
66

in

self .

curlinks ])
s e l f . curdepth >

return

s e l f . depth :

s e l f . f i l a . e x t e n d ( [ ' h t t p : / / '+
l a n g a t u a l+ ' . w i k i p e d i a . o r g ' +

for

67
68
69
70
71
72
73

in

artlist ])

s e l f . c u r d e p t h +=1

def

move ( s e l f ) :

i f not s e l f . f i l a :
i f not s e l f . s t a r t e d :

while

s e l f . f i l a . append ( s e l f . SU )
self . fila :

74

s e l f . started = 1

75

urlatual =

76

nomeatual = u r l a t u a l . s p l i t ( ' / ' )


[ 1]

78

if
if

79

print

77

s e l f . f i l a . pop ( 0 )

":"

in

nomeatual :

nomeatual

in

s e l f . history :
" buscando

continue

[ ' Main_page ' ]+

continue

",

nomeatual ,

196

CAPTULO 8. INTERAO COM BANCOS DE DADOS


print
try :

80
81
82

" Faltam

html =

",

len ( s e l f . f i l a )

s e l f . parsePag (

urlatual )

84

except :
continue

85

s e l f . ve rResp ( html )

86

s e l f . nlinks

87

s e l f . h i s t o r y . append ( n o m e a t u a l )

83

+=1

88
89
90
91
92

class U r l F a c :
def __init__ ( s e l f , l a n g= ' e n ' ) :
global l a n g a t u a l

93

s e l f . lang = lang

94

langatual = lang

def

95

u r l i f i c a ( s e l f , palavra ) :

96

nomeatual = p a l a v r a

97

u = " h t t p : / / "+ s e l f . l a n g+" . w i k i p e d i a .

98

urlatual = u

o r g / w i k i / "+p a l a v r a

return

99
100
101

if

__name__=="__main__" :

102

UF = U r l F a c ( ' p t ' )

103

u = UF . u r l i f i c a ( s y s . a r g v [ 1 ] )

104

Cr = C r a w l e r ( u , 1 )

105

Cr . move ( )
A listagem 8.5 mostra o restante do cdigo da aranha e o lei-

tor poder explorar outras soluo implementadas para otimizar


o trabalho da aranha.

Note que no estamos guardando o html

completo das pginas para minimizar o espao de armazenamento,


mas este programa pode ser modicado facilmente de forma a reter

8.4. EXERCCIOS

197

todo o contedo dos artigos.

8.4 Exerccios
1. Modique a aranha apresentada neste captulo, para guardar
os documentos varridos.
2. Crie uma classe capaz de conter os vrios aspectos (links,
guras, etc) de um artigo da wikipedia, e utilize a aranha para
criar instncias desta classe para cada artigo encontrado, a
partir de uma nica palavra chave. Dica: para simplicar a
persistncia, armazene o objeto artigo como um Pickle, no
banco de dados.

Captulo 9

Simulaes Estocsticas

Seleo de problemas relacionados com a simulao e


anlise de processos estocsticos. Pr-requisitos: Conhecimentos avanados de estatstica.

este

captulo, ilustraremos mtodos computacionais voltados

para a gerao e anlise de processos estocsticos.

Em probabilidade, um processo estocstico uma funo que

produz resultados aleatrios.

Se o domnio desta funo for o

tempo, o processo estocstico se manifestar como uma srie temporal. Processos estocsticos espaciais, geram os chamados campos
aleatrios
Exemplos de processo estocticos so sries temporais de preos
de aes, utuaes de populaes, distribuio espacial de poluio particulada.
Muitos processos estocsticos naturais possuem estrutura em
meio aleatoriedade. Muitas das tcnicas desenvolvidas para lidar
com estes processos visam encontrar esta estrutura.

9.1 Nmeros Aleatrios


Ao se estudar processos estocsticos por meio computacional, o
primeiro problema que se precisa resolver o da gerao de nme199

CAPTULO 9. SIMULAES ESTOCSTICAS

200

ros aleatrios de forma convel. Felizmente, hoje em dia, pacotes


como o

numpy

ou o

scipy,

fornecem geradores de nmeros aleat-

rios de qualidade para muitas famlias de distribuies, de forma


que na maioria das vezes no precisamos nos preocupar com este
problema.

Vez por outra, problemas de amostragem mais com-

plexos podem exigir geradores mais sosticados.

Neste captulo

exploraremos algumas destas situaes.

Hipercubo Latino - LHS


A tcnica de amostragem do hipercubo latino, mais conhecida pelo
seu nome original Latin Hypercube Sampling ou simplesmente
LHS, uma tcnica de gerao de amostras aleatrias a partir de
uma distribuio conhecida.

O diferencial deste algoritmo que

ele garante a amostragem de reas de baixa probabilidade, mesmo


em amostras de tamanho pequeno a moderado (Figura 9.1).
A vantagem de se utilizar o LHS est na reduo do custo computacional necessrio para cobrir o espao amostral, sem deixar
brechas signicativas.
O algoritmo do LHS funciona particionando o suporte da varivel em um nmero

de intervalos equiprovveis, onde

nmero de amostras que se deseja obter (Figura 9.2).

Ento re-

tiramos uma amostra de cada intervalo (quantis) denido no eixo

da gura 9.2 .

Isto feito por amostragem uniforme naqueles

intervalos (Linha 8 da listagem 9.1).

Invertendo-se a funo de

x correspondentes.
ppf (percentile point

densidade acumulada, obtemos as amostras de


Esta inverso calculada por meio da funo

function) que o inverso da funo de densidade acumulada (Linha 9 da listagem 9.1).

As amostras assim geradas equivalem a

amostras retiradas da distribuio de


homognea do seu suporte.

x,

mas com uma cobertura

Na listagem 9.1, a amostragem por

Hipercubo Latino implementadada como uma funo de apenas

1 Veja

no programa

lhsexp.py

como o grco da gura 9.2 foi gerado

9.1. NMEROS ALEATRIOS

201

Figura 9.1: Amostragem (n=20) de uma distribuio normal com


mdia 0 por LHS (histograma mais escuro) e amostragem padro
do scipy (histograma mais claro).

trs linhas, graas utizao dos geradores de nmeros aleatrios


disponveis no mdulo

stats do scipy.

Neste mdulo os geradores

rvs
ppf(ou percentile point function)

so classes portadoras de mtodos muito convenientes como o


que gera amostras aleatrias, e o

que representa a inversa da funo de densidade acumulada. Alm


dos mtodos utilizados neste exemplo, existem muitos outros. O
leitor encorajado a explorar estas classes e seus mtodos.
Listagem 9.1: Amostragem por Hipercubo latino (LHS)

1 #! / u s r / b i n / p y t h o n
2 # Disponivel

no

pacote

de

programas

como :

CAPTULO 9. SIMULAES ESTOCSTICAS

202

Figura 9.2: Distribuio acumulada da varivel

x N (0, 1),

mos-

trando o particionamento do espao amostral em segmentos equiprovveis.

from

l h s . py
pylab

import

plot ,

f i g u r e , h i s t , show ,

savefig

4
5
6
7

import
import
def

scipy . stats

as

stats

numpy

lhs ( dist ,

parms ,

n =100) :

p e r c = numpy . a r a n g e ( 0 , 1 . , 1 . / n )

smp =

10

v =

[ s t a t s . uniform ( i , 1 . / n ) . rvs ( )

in

for

perc ]

d i s t ( parms [ 0 ] , 1 . / parms [ 1 ] ) . p p f ( smp )

9.2. INFERNCIA BAYESIANA


return

11
12
13

if

203

__name__== '__main__ ' :

14

c=l h s ( s t a t s . norm ,

15

hist (c)

16

n =

17

h i s t ( n . r a v e l ( ) , f a c e c o l o r= ' r ' , a l p h a

18

s a v e f i g ( ' l h s . png ' , d p i =400)

19

show ( )

[0 ,1] ,20)

s t a t s . norm . r v s ( s i z e =20)
=0.3)

9.2 Inferncia Bayesiana


Atualmente, a resoluo de problemas de inferncia Bayesiana de
considervel complexidade, tem se tornado cada vez mais acessvel,
graas

utilizao de mtodos computacionais. Isto no signica

que a computao bayesiana seja simples; pelo contrrio.

Entre-

tanto, as vantagens da inferncia Bayesiana sobre a abordagem


frequentista, justicam um certo esforo por parte do pesquisador
no sentido de dominar estas tcnicas.
Antes de chegarmos s tcnicas computacionais utilizadas para
resolver os problemas da inferncia Bayesiana, vamos nos deter
um pouco sobre o porqu da intratabilidade analtica da inferncia
Bayesiana, aplicada a modelos complexos.
Sejam dois eventos
dado

F.

A probabilidade condicional de

dada por:

P (E | F ) =

P (E F )
P (F )

A partir desta frmula, podemos obter a verso mais simples


do teorema de Bayes.

P (E | F ) =

P (F | E)P (E)
P (F )

CAPTULO 9. SIMULAES ESTOCSTICAS

204

Se particionarmos o eventos

em

eventos, mutuamente ex-

cludentes, pelo teorema da probabilidade total, chegaremos verso mais comumente utilizada da frmula de Bayes:

P (F | Ei )P (Ei )
P (Ei | F ) = Pn
i=1 P (F | Ei )P (Ei )
O teorema de Bayes nos permite calcular as probabilidades de um
conjunto de hipteses explanatrias (Ei ), dado que observamos certos fatos (F ):

P (Ei | F ).

Mas o teorema de Bayes tambm nos

diz que estas probabilidades dependem das probabilidades

ori

das hipteses

P (Ei )

(antes da observao dos fatos).

a pri-

Dadas

estas, o teorema de Bayes nos fornece uma excelente ferramenta


para atualizao de nossos conhecimentos prvios,
novos fatos

P (Ei )

luz de

P (Ei | F ).

A denio acima reete uma situao em que temos um conjunto discreto de hipteses explanatrias (Ei ), sobre as quais desejamos realizar nossa inferncia.

Quando nossas hipteses so

representadas, no por um conjunto enumervel de opes, mas


pelo valor de uma ou mais variveis contnuas,
dos denotados por

X,

representados por distribuies de probabilidade


condicionados s hipteses,
de verossimilhana

e os fatos ou da-

nossos conhecimentos prvios passam a ser

f (x | ),

p()

e os dados,

so representados pela funo

L(; x).

Com a ajuda de alguma lgebra e do teorema da probabilidade


total, em sua verso contnua, chegamos forma contnua do teorema de Bayes:

( | x) = R

p()L(; x)
L(; x)p()d

Ao resolvermos a integral no denominador, este deixa de ser


uma funo de

e torna-se apenas uma constante de proporciona-

lidade que garante que a integral de

( | x)

seja igual a

nos permite re-escrever a equao acima como:

1.

Isto

9.3. SIMULAOES ESTOCSTICAS

205

( | x) p()L(; x)
Logo, a densidade posterior de

a priori

proporcional sua densidade

multiplicada pela verossimilhana.

Conforme vimos acima, a inferncia Bayesiana pode ser bastante intuitiva, conceitualmente. Na prtica, porm, quando queremos calcular a distribuio posterior dos parmetros, nos deparamos com vrios problemas numricos de considervel diculdade.
Para encontrar a constante de proporcionalidade mencionada
na seo anterior, precisamos integrar o produto da distribuio

a priori
.

dos parmetros pela verossimilhana, sobre o suporte de

Se este suporte innito e/ou multidimensional, temos um

problema de integrao numrica complicadssimo.


Uma vez obtida a constante de proporcionalidade, se o espao
de parmetros multidimensional, encontrar as distribuies marginais para cada um deles, tambm um problema de integrao
numrica difcil.

9.3 Simulaoes Estocsticas


Se no podemos determinar de forma exata, analtica ou numericamente, as distribuies posteriores geradas pelo teoremas de Bayes,
s nos resta tentar simular amostras destas distribuies e estudlas.

Esta abordagem denominada mtodo de Monte Carlo, em

homenagem ao famoso cassino de Mnaco.

Integrao Monte Carlo


2

Suponhamos que precisemos resolver a seguinte integral :

2 Para

humanizar um pouco esta equao, imagine que

a probabilidade condicional de y dado x, e que


probabilidade de x.

g(x)

f (y | x)

representa

a funo de densidade de

CAPTULO 9. SIMULAES ESTOCSTICAS

206

Z
J(y) =
Se

g(x)

f (y | x)g(x)dx = E[f (y | x)] < +

uma densidade da qual podemos amostrar, podemos

aproximar nossa integral da seguinte forma:

X
= 1
J(y)
f (y | xi )
n i=1
onde

xi , . . . , xn g(x).

Pela lei dos grandes nmeros, esta

estimativa se aproximar assintoticamente de

J(y).

Vejamos um exemplo: gostaramos de encontrar a integral da

y = x no intervalo [0, 1]. Pela frmula da rea do trin(base altura)/2 o resultado exato 0.5. Na listagem 9.2,
nosso g(x) passa a ser uma distribuio uniforme entre 0 e 1, visto

funo
gulo,

que este o intervalo sobre qual desejamos integrar nossa funo.


Vemos que quanto maior o nmero de amostras de
estimativa se aproximar de

0.5

Listagem 9.2: Integrao Monte Carlo

1
2

from
from

numpy

import

import

numpy . random

3 # desejamos

rea

4 # dada

funo

5 # ou
6

pela

seja :

y=x

0.5

x = uniform ( 0 , 1 , 5 0 0 0 )

7 # Seja
8

embaixo

f (y | x) = x

J = 1 . / 5 0 0 0 sum ( x )

print

d e uma

reta

x,

mais nossa

9.4. AMOSTRAGEM POR REJEIO

207

9.4 Amostragem por Rejeio


Suponhamos que se deseje obter amostras de uma funo de densidade p(x), com suporte no
x [a, b]. Ento denimos:

intervalo

[a, b],

tal que

p(x) m,

X U [a, b)
e

Y U [0, m)
Geramos
um valor de

x e y a partir destas distribuies e aceitamos x como


p(x) se y < f (x), caso contrario, rejeitamos a amostra

e tentamos novamente. Este procedimento signica que denimos


uma funo constante

f (x) = m, que funciona como um envelope

para o nosso processo de amostragem.


Em suma, geramos um valor

X e
f (x)/m, caso contrrio

a partir do suporte de

aceitamos este valor com uma probabilidade


rejeitamos e tentamos novamente.

A ecincia deste mtodo depende da proporo de pontos


amostrados que so aceitos.

A probabilidade de aceitao para

este mtodo :

P (aceitar) = P ((X, Y ) A)
Z

P ((X, Y ) A | X = x)

=
a

1
f (x)

dx
m
b

a
a
Z b
1
=
f (x) dx
m(b a) a

1
m(b a)

1
dx
ba

CAPTULO 9. SIMULAES ESTOCSTICAS

208

Se a probabilidade de aceitao for muito baixa, devemos buscar um outro mtodo mais eciente. Especialmente para distribuies com suporte innito, a escolha de uma funo envelope mais
adequada, pode ajudar a aumentar a ecincia da amostragem.

Mtodo do Envelope
Suponhamos que desejemos simular
babilidade (PDF)

f ()

com uma densidade de pro-

e que podemos obter amostras de

X ), cuja PDF
constante a tal que:

possui o mesmo suporte de


ainda que exista uma

g().

(que

Suponhamos

f (x) ag(x), x
ou seja,

Aceitamos

f (x)/g(x).
g(), e U = u U [0, ag(y)].
de X se u < f (y)); caso contr-

um limite superior para

Ento, amostramos

Y = y

de

como uma amostra

rio, rejeitamos e tentamos novamente. Este mtodo funciona pois


distribui pontos uniformemente sobre a regio que envolve

f (x),

aceita apenas os pontos que cumprem o requisito de pertencer


regio delimitada por

f (x).

Qual a probabilidade de aceitao?

P (U < f (Y ) | Y = y)g(y) dy

P (U < f (Y )) =

f (y)
g(y) dy
ag(y)

f (y)
dy
a
1
a

9.4. AMOSTRAGEM POR REJEIO


Naturalmente, devemos escolher

209

g(x)

de forma que

seja o

menor possvel.
Vamos ver como podemos representar estas idias em Python.

Listagem 9.3:

Amostragem por rejeio utilizando o mtodo do

envelope

1 # Disponivel
2
3
4
5
6

from
from
from
def

no

pacote

de

import

numpy

import

pylab

amostra ( n ) :
"""
Esta

um v e t o r

funcao

amostra

mais

de

curto

"""

11

x=u n i f o r m ( 0 , 1 , n )

12

y=u n i f o r m ( 0 , 1 , n )

1.5

13

f x =6 x (1 x ) # x

tem

14

#r e t o r n a

so

seguinte

15

os

que

10

retorna

n.

distribuicao

valores

que

beta

satifazem

condicao :

s=c o m p r e s s ( y<f x , x )

return

16
18

como :

import

numpy . random

17

programas

e n v e l o p e . py

def

e f i c i e n c i a ( vector , n) :

19

"""

20

Testa

21

retorna

22

"""

23

24

prob =

25

diff

eficiencia
a

= len ( vector )
l / f l o a t (n)

= n l

da

amostragem .

probabilidade

de

aceitacao .

CAPTULO 9. SIMULAES ESTOCSTICAS

210

26

#n

necessario

para

obter

as

amostras

que

faltam

27

n2 = i n t ( d i f f / p r o b )

28

v e c 2 = a m o s t r a ( n2 )

29

s = concatenate ( ( vector , vec2 ) )

30

#g e r a

31

nb ,

histograma

bins ,

patches =

hist (s ,

b i n s =50 ,

normed =0)

32

x l a b e l ( ' Amostra ' )

33

ylabel ( ' Probabilidade ' )

34

t i t l e ( ' Histograma

35

s a v e f i g ( ' e n v e l o p e . png ' ,

36

show ( )

return

37
38
39

def

40

de

testRS ( ) :
Esta
"""

43

n =100000

44

s a m p l e=a m o s t r a ( n )

45

e f i c i e n c i a ( sample , n )

48

d p i =400)

"""

42

47

n=%s '% n )

41

46

s:

if

funcao

__name__ ==

testa

modulo

'__main__ ' :

testRS ( )

Aplicando ao Teorema de Bayes


Podemos aplicar o conceito de amostragem por rejeio a problemas de inferncia Bayesiana. Frequentemente, em inferncia Bayesiana, conhecemos bem a distribuio

a priori,

a ponto de poder

amostr-la e, tambm, possuimos dados com os quais podemos


construir a funo de verossimilhana.

9.4. AMOSTRAGEM POR REJEIO

211

Figura 9.3: Resultado da amostragem por envelope de uma distribuio beta(1,1)

De posse destes elementos podemos invocar a tcnica de amostragem por rejeio para nos ajudar a amostrar da distribuio
posterior. Dado que:

() = p()L(; x)
temos que, sendo

LM ax

o valor mximo da nossa funo de

verossimilhana,

() p()LM ax
,

()
p()L(; x)
L(; x)
=
=
LM ax p()
LM ax p()
LM ax

CAPTULO 9. SIMULAES ESTOCSTICAS

212

.
Assim sendo, podemos utilizar o mtodo do envelope, amos-

a priori

trando da distribuio
babilidade igual a

e aceitando as amostras com pro-

L(;x)
LM ax .

Listagem 9.4: Amostragem da Posterior Bayesiana por rejeio.

1 # Disponivel
2
3
4
5
6

from
from
from
def

no

pacote

de

programas

como :

p o s t r e j . py
numpy

import

import

numpy . random
pylab

import

L i k e l i ( data ,

limits ,

nl ) :

n = l e n ( d a t a ) # Numero

data = array ( data )

( l l , ul ) =

de

l i m i t s #l i m i t e s

amostras
do

espaco

de

params .
s t e p = ( ul l l ) / f l o a t ( n l )

10
11

res =

12

s d = s t d ( d a t a ) #DP d o s

[]

#l i s t a

resultados
dados

for

mu

15

lik

= a r r a y ( r e s ) /max ( a r r a y ( r e s ) ) #

16

return

13
14

in

de

arange ( l l , ul , s t e p ) :

r e s . append ( e x p ( 0 . 5 sum ( ( ( d a t a mu) /


sd )

2) ) )

Verossimilhanca

17
18
19

def

lik

amostra ( n ,

d a t a , p l o t t e d =0) :

x=u n i f o r m ( 0 , 1 , n ) #s u p o r t e

20

limits

21

L= L i k e l i ( d a t a ,

22

f x =6 x (1 x ) # p r i o r i , b e t a ( 2 , 2 )

23

s=c o m p r e s s ( L [ : l e n ( x ) ] < f x , x ) #R e j e i c a o

24

i f not

= 0 ,1

plotted :

limits ,

n)

9.4. AMOSTRAGEM POR REJEIO


25

p1 =

26

p2 = p l o t ( s o r t ( x ) , L )

27

l e g e n d ( [ p1 , p2 ] , [ ' P r i o r i ' ,

return

28
29
30

def

213

scatter (x , fx )
'

Verossimilhanca ' ] )
s

e f i c i e n c i a ( vector , n ,

data ) :

31

32

prob =

33

diff

34

n2 = i n t ( d i f f / p r o b )

35

v e c 2 = a m o s t r a ( n2 , d a t a , p l o t t e d =1)

36

39

l / f l o a t (n)

= n l

s = concatenate ( ( vector , vec2 ) )

return

37
38

= len ( vector )

def

40

s , prob

main ( ) :
n =90000

41

data = uniform ( 0 , 1 , 3 )

42

s a m p l e=a m o s t r a ( n ,

43

s , prob =

44

f i g u r e ( 2 ) #g e r a

data )

e f i c i e n c i a ( sample , n ,

data )

histograma

45

hist (s ,

46

xlabel ( 'x ' )

47

t e x t ( 0 . 8 , 1 . 2 , ' E f i c i e n c i a :% s '%r o u n d ( pro b

48

ylabel ( ' frequencia ' )

b i n s =50 , normed =1)

,2) )

49

t i t l e ( ' Posterior :

50

s a v e f i g ( ' r e j e i c a o . png ' , d p i =400)

51

show ( )

return

52
53
54
55

if

__name__ ==
main ( )

n=%s '% n )

'__main__ ' :

214

CAPTULO 9. SIMULAES ESTOCSTICAS

Figura 9.4: Amostragem por rejeio da posterior Bayesiana.

Na linha 22 da listagem 9.4, vemos a rejeio de acordo com a


verossimilhana. Note que a verossimilhana calculada a partir de
um modelo normal enquanto que a distribuio

a priori

apresenta

uma distribuio beta(2,2).


A gura 9.4 mostra o resultado da amostragem da posterior,
junto com a ecincia do processo(canto superior direito).

9.5 Cadeias de Markov


Cadeias de Markov so um tipo particular de processo estocstico
no qual o estado atual do sistema depende apenas do estado imediatamente anterior. Um exemplo muito conhecido de um processo

9.5. CADEIAS DE MARKOV

215

de markov o modelo auto-regressivo de primeira ordem:

Zt = Zt1 + t ,

t N (0, 2 )

O processo apresentado acima, medida em que o nmero de


iteraes cresce, converge para uma distribuio

(z).

Esta distri-

buio denominada distribuio estacionria da cadeia.

Entre-

tanto, a cadeia necessita de um determinado nmero de iteraes


para alcanar

(z).

Se desejamos fazer inferncias sobre

cisamos descartar os resultados iniciais da cadeia.

(z),

pre-

Este perodo

necessrio para a convergncia, denominado de burn-in.


Listagem 9.5: Cadeia de Markov com kernel de transio exponencial

1 # c o d i n g : l a t i n

2 # Disponivel

pacote

no

de

programas

como :

markov . py

3 #g e r a n d o uma c a d e i a
4
5
6

de

markov

from numpy . random import


import random a s r n
from p y l a b import

7
8 n =10000
9
10
11
12

a l p h a =0.99
x=z e r o s ( 1 0 0 0 0 ,

for

in

Float )

xrange ( 1 , n ) :

x [ i ]= a l p h a x [ i

1]

+ exponential (1 ,1) [ 0 ]

13 # p l o t t i n g
14

subplot (211)

15

t i t l e ( ' Processo

16

plot (x)

17

xlabel (u ' Iteraes ' )

18

ylabel ( 'x ' )

19

subplot (212)

de

Markov ' )

CAPTULO 9. SIMULAES ESTOCSTICAS

216

20

h i s t ( x , b i n s =50)

21

xlabel ( 'x ' )

22

ylabel (u ' frequncia ' )

23

s a v e f i g ( ' markov . png ' , d p i =400)

24

show ( )
Executando o cdigo apresentado na listagem 9.5 obtm-se a

gura 9.5.

Note o perodo at a convergncia.

Como exerccio,

refaa o histograma eliminando os valores do perodo burn-in, e


compare com o apresentado na gura 9.5.

Figura 9.5: Cadeia de Markov com kernel de transio exponencial.

9.6. MCMC (MARKOV CHAIN MONTE CARLO)

217

9.6 MCMC (Markov Chain Monte Carlo)


Ns j discutimos algumas ferramentas bsicas da simulao estocstica, como o mtodo de Monte Carlo e as cadeias de Markov.
Agora vamos ver como estes dois mtodos podem ser combinados
para dar origem ao famoso mtodo MCMC.
As tcnicas aqui apresentadas, so de grande utilidade na estatstica, particularmente na inferncia Bayesiana.
O MCMC uma classe de algoritmos que tem como objetivo
contruir cadeias de Markov cuja distribuio estacionria seja idntica a de uma distribuio alvo. Aps alcanarem esta distribuio
estacionria, as cadeias podem ser usadas para se obter amostras
da distribuio alvo.
As cadeias de Markov utilizadas na maioria dos algoritmos
de MCMC, percorrem o espao amostral utilizando-se de alguma
forma de passeio aleatrio.

Portanto, podem levar muito tempo

para cobrir o espao desejado. Isto se deve ao fato de que a cadeia


pode voltar atrs percorrendo partes do espao j percorridas. A
seguir descreveremos e implementaremos dois dos mais utilizados
mtodos de MCMC: os amostradores de Metropolis-Hastings e de
Gibbs.

O Amostrador de Metropolis-Hastings
Este amostrador consiste em gerar amostras sequenciais de forma a
aproximar uma distribuio da qual no temos meios de amostrar
diretamente. Este algoritmo pode amostrar de qualquer distribuio de probabilidade

p(x),

desde que a densidade em

possa ser

calculada.
Como qualquer cadeia de markov, o amostrador comea em um
dado valor arbitrrio para a varivel

e prossegue em um passeio

aleatrio, onde cada deslocamento amostrado de uma distribuio

de Propostas. Cada proposta(x ) avaliada de acordo com a seguinte regra:

u amostrado de uma distribuio uniforme, U (0, 1).

CAPTULO 9. SIMULAES ESTOCSTICAS

218

Se

u<
x0

se torna

xt+1 ,

caso contrrio

p(x0 )
p(xt )
xt+1 = xt .

Listagem 9.6: Amostrador de Metropolis-Hastings

1 # e n c o d i n g : l a t i n
2 # Disponivel
3
4
5
6
7

from
from

. py
numpy

no

pacote

import

scipy . stats

programas

como : MH

import

class A m o s t r a d o r :
def __init__ ( s e l f

de

alvo ,

proposta ) :

"""

Incializa

amostrador

10

alvo :

11

proposta :

12

"""

13

s e l f . a l v o = kde . g a u s s i a n _ k d e ( a l v o )

14

s e l f . prop = p r o p o s t a

dados

definindo

objeto

densidade

gerador

alvo

de

propostas .

15
16

def

Run ( s e l f , n , b u r n i n =100) :

17

' ' '

18

Roda

19

' ' '

20

amostra = z e r o s ( n , f l o a t )

21

alvo =

22

23
24

amostrador

por

passos

s e l f . alvo

= 0

while

i < n 1:

x = amostra [ i ]

25

inova =

26

can = x + i n o v a

s e l f . prop . r v s ( ) [ 0 ]

9.6. MCMC (MARKOV CHAIN MONTE CARLO)

219

27

a p r o b = min ( [ 1 , a l v o . e v a l u a t e ( c a n

28

u = uniform . rvs ( ) [ 0 ]

) / alvo . evaluate (x) ] )

if

29

u < aprob :

30

a m o s t r a [ i +1] = x = c a n

31

return

32
33

if

34

i += 1
amostra [ burnin : ]

__name__=="__main__" :

35

import

36

d a d o s = c o n c a t e n a t e ( ( norm . r v s ( s i z e =500) ,

37

a = A m o s t r a d o r ( d a d o s , norm ( 0 , 1 ) )

pylab

as P

norm . r v s ( 4 , 1 , s i z e =500) ) )

38

r e s = a . Run ( 1 0 0 0 0 )

39

P. p l o t ( arange (
( arange (

5 ,10 ,.01) , a . alvo . evaluate


5 , 1 0 , . 0 1 ) ) , ' r ' , lw =2)

40

P . h i s t ( r e s , normed =1 , a l p h a = 0 . 5 )

41

P . l e g e n d ( [ ' A l v o ' , ' Amostra ' ] )

42

P . s a v e f i g ( 'MH. png ' , d p i =400)

43

P . show ( )

Normalmente, utiliza-se um amostrador como este para amostrar de distribuies das quais toda a informao que se tem provm de uma amostra.

Portanto, a Listagem 9.6, aceita um con-

junto de dados como alvo.

A partir desta amostra, uma funo

de densidade de probabilidade (PDF) estimada por meio da funo

gaussian_kde do Scipy.

Esta funo ser utilizada como alvo

para o amostrador.
Note que a distribuio de propostas passada para o objeto

Amostrador

uma das classes geradoras de nmeros aleatrios

oferecidos por

scipy.stats3 .

A Figura 9.6, mostra o resultado

3 Estas classes podem ser chamadas diretamente com seus parmetros como
mostrado na linha 36 da listagem 9.6, retornando um objeto frozen com os

220

CAPTULO 9. SIMULAES ESTOCSTICAS

do amostrador aps a remoo de um nmero de amostras do incio da cadeia determinado pelo parmetro

burnin.

Esta remoo

importante, pois a cadeia leva algum tempo para convergir para


a rea sob a curva alvo.

Figura 9.6: Amostrador de Metropolis-Hastings(n=10000).

O Amostrador de Gibbs
O amostrador de Gibbs foi desenvolvido para permitir a gerao de
amostras a partir de distribuies conjuntas de duas ou mais variveis. O amostrador de Gibbs um caso especial do amostrador
de Metropolis-Hastings. Na listagem 9.7, vemos uma implementamesmos mtodos mas com os parmetros xos

9.6. MCMC (MARKOV CHAIN MONTE CARLO)

221

o do amostrador de Gibbs, que envolve a denio de uma classe


amostradora.
Listagem 9.7: Amostrador de Gibbs aplicado uma distribuio
tri-variada

1 # Disponivel

no

pacote

de

programas

como :

g i b b s . py

2 # e n c o d i n g : l a t i n
3
4
5
6
7

from
from

import

numpy

numpy . random

zeros ,

class Amostra :
def __init__ ( s e l f
cormat ,

' ' '

10

n , v a r l i s t , loc , scale ,

da

loc

scale

gerador

listas

em

varlist

geradores
normal ,

14

logistic ,

15

' ' '

16

self .n = n

17

s e l f . vars =

18

s e l f . loc = loc

19

self . scale

20

s e l f . r o = cormat

23

def

funes

sao

13

22

de

do numpy

12

21

amostra

lista

geradoras

11

para

cada

testados :

beta ,

gamma ,

lognormal ,

gumbel
wald ,

laplace

varlist
scale

s e l f . burnin = burnin
Run ( s e l f ) :
results

= zeros (( len ( s e l f . vars ) , s e l f

. n) , f l o a t )

24

array

b u r n i n =1000) :

tamanho

varlist

sqrt ,

import

dp = s q r t (1 s e l f . r o

2)

CAPTULO 9. SIMULAES ESTOCSTICAS

222

25

ms =

26

dps =

27

ro =

for

28
29

s e l f . loc
self . scale
s e l f . ro

i in x r a n g e ( 1 , s e l f . n ) :
for n , j in e n u m e r a t e ( s e l f . v a r s ) :

30

results [n, i ]

= j ( ms [ n ]+ r o [ n ,

n 1 ] ( r e s u l t s [ n 1 , i

1]

ms [ n ] ) / d p s [ n 1 ] , d p s [ n ]

return

31
32
33

if

dp [ n , n 1 ] )
r e s u l t s [ : , s e l f . burnin : ]

__name__=="__main__" :

34

import

35

n = 10000

pylab

36

varlist

37

loc =

as P

= ( b e t a , gamma , n o r m a l )

(2. ,9. ,5 ,)

38

scale

39

cormat = z e r o s ( ( 3 , 3 ) , f l o a t )

40

#c o r m a t = a r r a y

(2 ,.5 ,1.)

([[1 ,0.6 ,0.7] ,[0.6 ,1 ,0.8] ,[0.7 ,0.8 ,1]])

41

s = Amostra ( n , v a r l i s t , l o c , s c a l e , c o r m a t )

42

r e s = s . Run ( )

43

s 1=P . p l o t ( r e s [ 0 ] , r e s [ 2 ] , ' . ' )#m a r k e r = 'p ' ,

44

s 2=P . p l o t ( r e s [ 1 ] , r e s [ 2 ] , '+ ' )#m a r k e r = ' v ' ,

45

P . l e g e n d ( [ ' Beta

c = ' y ' , mec= ' k ' , l w =0)


c = ' y ' , mec= ' k ' , l w =0)
x

Normal ' , 'Gamma x

Normal ' ] )

46

P . s a v e f i g ( ' g i b b s . png ' , d p i =400)

47

P . show ( )
O amostrador de Gibbs pode ser aplicado quando no se co-

nhece a distribuio conjunta, mas a distribuio condicional de

9.7. MTODOS MONTE CARLO SEQUENCIAIS

223

cada varivel conhecida. No amostrador de Gibbs convencional,


cada nova amostra

xit+1

calculada de forma condicional ao valor

de todas outras variveis no tempo t. No exemplo mostrado na listagem 9.7, uma variante deste mtodo implementado, na qual as
variveis so calculadas a partir de uma estrutura de dependncia
circular(Figura 9.7).

Figura 9.7: Estrutura de dependncia circular utilizada na listagem


9.7.

9.7 Mtodos Monte Carlo Sequenciais


Estes mtodos, tambm chamados de ltros de partculas, visam
determinar a distribuio de um processo markoviano pela anlise
seqencial de observaes. Seja

xk

uma sequncia de parmetros

desconhecidos (por exemplo o valor esperado de um sistema dinmico) onde

k = 0, 1, 2, 3, . . .
X (Figura

observaes sobre

yk [y0 , y1 , . . . , yk ]

o conjunto de

9.9).

Os mtodos sequenciais procuram estimar

xk

a partir da distri-

buio posterior

p(xk | y0 , y1 , . . . , yk )
ao passo que os mtodos MCMC, modelam a posterior completa:

p(x + 0, x1 , . . . , xk | y0 , y1 , . . . , yk )

CAPTULO 9. SIMULAES ESTOCSTICAS

224

Figura 9.8: Amostrador de Gibbs aplicado a uma distribuio trivariada.

Sampling Importance Resampling  SIR


O algoritmo de amostragem e re-amostragem por importncia um
dos mtodos Monte Carlo sequenciais mais utilizados. Ele procura
aproximar

p(xk | y0 , y1 , . . . , yk )

por meio de valores de

pondera-

dos por uma funo de importncia,W que uma aproximao da


distribuio posterior de

A descrio de um passo do SIR, a seguinte:

1. Retiramos P amostras (x
) da distribuio
o de

X , p(xk | xk1 );

a priori

de transi-

9.7. MTODOS MONTE CARLO SEQUENCIAIS

225

Figura 9.9: Processo markoviano e suas observaes.

2. Calculamos a

p(yk | xk )

(verossimilhana, no caso da distri-

buio alvo ser a posterior Bayesiana);


3. Calculamos

W = p(xk | xk1 )p(yk | xk );

4. Normalizamos W;
5. Re-amostramos P valores de

x
com probabilidades dadas por

W;
A re-amostra (distribuio posterior de

xk )passa

a ser a

a priori

de transio para a o prximo passo.


Listagem 9.8: Filtro de partculas usando algoritmo SIR

1 # e n c o d i n g : l a t i n
2 # Disponivel
s i r . py

no

pacote

de

programas

como :

CAPTULO 9. SIMULAES ESTOCSTICAS

226

3
4
5
6
7
8
9

from numpy import


import l i k e
import p y l a b a s P
from s c i p y . s t a t s import
class

SMC:

"""

10

Monte

11

"""

12

def

Carlo

Sequencial

__init__ ( s e l f ,

usando

SIR

p r i o r t y p e , pars ,

range

, r e s o l u t i o n =512) :

13

' ' '

14

Inicializa

15

priortype

Filtro .
deve

ser

um RNG d e

scipy .

stats

16

pars

17

' ' '

18

self . priori

19

s e l f . pars = pars

20

s e l f . range = range

21

s e l f . r e s = ( range [1] range [ 0 ] )

so

os

parmetros

da

priori .

= priortype

1./

resolution

22

self . likelihood

23

s e l f . p o s t e r i o r=a r r a y ( [ ] )

24
25
26

def

= None

__call__ ( s e l f , datum ) :
sc =

s e l f . pars [ 1 ]

27

m =

s e l f . range [ 0 ]

28

M =

s e l f . range [ 1 ]

29

step =

30

s u p = a r a n g e (m,M, s t e p )

31

lik

32

self . likelihood

s e l f . res

= e x p ( a r r a y ( [ l i k e . Normal ( datum , i
, sc )

for

in
=

sup ] ) )
l i k /sum ( l i k )

9.7. MTODOS MONTE CARLO SEQUENCIAIS


33

post =

return

34
35
36
37

def

c a l c P o s t e r i o r (1000)

post

calcPosterior ( self ,

n) :

"""

38

Calcula

39

"""

40

self .

227

if

41

distribuio

posterior

s e l f . p o s t e r i o r . any ( ) :
s =

s e l f . p r i o r i . r v s ( s i z e =n , l o c=
s e l f . pars [ 0 ] ,

s c a l e= s e l f .

pars [ 1 ] )

42

#p d e n s= k d e . g a u s s i a n _ k d e ( s e l f .

43

#s= p d e n s . r e s a m p l e ( n )

posterior )

44

else :

45

s =

s e l f . p r i o r i . r v s ( s i z e =n ,
l o c= s e l f . p a r s [ 0 ] ,

s c a l e=

s e l f . pars [ 1 ] )

46

m = array ( [ s e l f . range [ 0 ] ] )

47

M = array ( [ s e l f . range [ 1 ] ] )

48

step =

49

s u p p = a r a n g e (m,M, s t e p )

50

s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &

51

d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 , s i z e =s

52

if

s e l f . res

g r e a t e r ( s . r a v e l ( ) ,m) , s )

53
54
55

. size )
s e l f . p o s t e r i o r . any ( ) :
w=

else :
w =

s e l f . p r i o r i . p d f ( supp ) s e l f .
likelihood
s e l f . p r i o r i . p d f ( supp , l o c=
s e l f . p a r s [ 0 ] , s c a l e= s e l f . p a r s
[1])

56

w = w/sum (w)

self

. likelihood

CAPTULO 9. SIMULAES ESTOCSTICAS

228

57

s x = s e a r c h s o r t e d ( supp , s )

58

w = w [ s x 1]

59

w = w. r a v e l ( )

60

p o s t = c o m p r e s s ( d<w , s )

61

post = post . ravel ()

62

s e l f . p o s t e r i o r = post

return

63
64
65

if

post

__name__=="__main__" :

66

p f = SMC( norm , ( 3 , 3 ) , r a n g e =( 10 ,15) )

67

d a t a = 2 s i n ( a r a n g e ( 0 , 7 , . 2 ) ) +2#o n e s ( 1 0 )

68

sup = a r a n g e (

69

priori

70

P. ion ()

71

lin ,

72

pt ,

73

P. grid ()

74

10 ,15 ,25/512.)

= norm . p d f ( sup , l o c =3 , s c a l e =1)

for

= P . p l o t ( sup , p r i o r i )
= P . p l o t ( [ data [ 0 ] ] , [ 0 . 0 5 ] , ' o ' )
i

in

data :

75

est = pf ( [ i ] )

76

l i n . s e t _ y d a t a ( kde . g a u s s i a n _ k d e ( e s t ) .

77

pt . set_xdata ( [ i ] )

78

P . draw ( )

e v a l u a t e ( sup ) )

print

79

i , c o m p r e s s ( p f . l i k e l i h o o d==max (

pf . l i k e l i h o o d ) ,

s u p ) , median ( e s t )

Na Listagem 9.8, vemos uma implementao de um ltro de


partculas utilizando o algoritmo SIR. O ltro denido como uma
classe. Nesta classe denimos o mtodo
de funes.

__call__,

caracterstico

Desta forma, uma vez criado o objeto (instncia da

classe SMC), ele poder ser chamado diretamente pelo nome. Se o


objeto no possusse tal mtodo, teramos que nos utilizar de um
de seus mtodos para acionar sua maquinaria.
Parametrizamos o objeto SMC com uma distribuio

a priori

9.8. FUNES DE VEROSSIMILHANA

229

norm do mdulo scipy.stats com mdia = 3 e


= 3. Tambm precisamos especicar os limites de
algoritmo, o que feito atravs do argumento range pas-

dada pela classe


desvio padro
busca do

sado durante a inicializao. Neste exemplo as funes de clculo


das verossimilhanas foram implementadas de um mdulo separado chamado

like.py.

Este mdulo est no pacote de programas

disponvel no website deste livro.


A convergncia dos mtodos sequenciais, depende fortemente
da qualidade do algoritmo de amostragem da

priori,

uma vez que

estas amostras formam a matria-prima do algoritmo SIR.

9.8 Funes de Verossimilhana


Ser capaz de calcular funes de verossimilhana essencial quando
se deseja utilizar a inferncia Bayesiana.

A verossimilhana o

termo da frmula de Bayes que representa a evidncia contida em


um conjunto de dados, e que utilizada para atualizar nosso conhecimento

a priori

do problema, de forma a gerar uma nova des-

crio para suas varivieis, denominada de distribuio posterior


conjunta.

Denio da funo de verossimilhana

Varivel Discreta
Seja

um espao de parmetros. Seja

{p ; }

uma famla pa-

rametrizada de modelos probabilsticos para um vetor de variveis

X = (X1 , . . . , Xn ).
(x1 , . . . , xn ) dada por:

discretas

A funo de verossimilhana para

L( | x1 , . . . , xn ) , p (x1 , . . . , xn )
e uma funo de

A funo de verossimilhana nos d a probabilidade de que

(X1 , . . . , Xn ) = (x1 , . . . , xn ),

ou seja um determinado conjunto de

CAPTULO 9. SIMULAES ESTOCSTICAS

230

dados ser amostrado em uma realizao do processo gerador, para


cada valor possvel de

Matematicamente, a funo de verossimi-

lhana apenas uma notao diferente para a funo de probabilidade. Contudo, conceitualmente existe uma distino importante:
Quando se estuda a funo de probabilidade, xa-se o parmetro e
obtm-se a variao da probabilidade em funo do valor da vari-

x. Quando estudamos a verossimilhana, consideramos o valor


x xo e variamos o parmetro, obtendo a verossimilhana de

vel,
de

cada valor. Para uma nica observao de uma varivel discreta,


a verossimilhana igual probabilidade de se observar aquele
valor. Por exemplo: Seja
metro

p, 0 < p < 1.

Pp

uma distribuio Bernoulli com par-

Uma varivel aleatria com uma distribuio

Bernoulli, s pode assumir dois valores,


Para

1.

x = 0,
L(p | 0) = 1 p

Para

x = 1,
L(p | 1) = p

Um pouco de lgebra, nos permite combinar ambas as frmulas


acima escrevendo:

L(p | x) = px (1 p)1x ,

x {0, 1}

Podemos visualizar a forma da verossimilhana com quatro linhas de cdigo:


Listagem 9.9: Funo de verossimilhana para

1 >>>

from

import
in a r a n g e ( 0 , 1 , . 0 1 ) ]

pylab

2 >>> L=[1 p

for

igual a

0.

3 >>> p l o t ( a r a n g e ( 0 , 1 , . 0 1 ) , L )
4 >>> show ( )
Para mltiplas observaes independentes, a funo de verossimilhana caria assim:

L(p | x1 , . . . , xn )

[px1 (1 p)1x1 ][px2 (1 p)1x2 ] . . . [pxn (1 p)1xn ]

= p

Pn
i

xi

Pn

(1 p)n

xi

(9.1)

9.8. FUNES DE VEROSSIMILHANA

231

Isto dito, vamos a um exemplo cientco mais concreto:

um

pesquisador deseja comparar duas sequncias de DNA, buscando


quanticar a homologia entre elas, ou seja, em quantas posies
possuem nucleotdeos idnticos. Sejam as duas sequncias:

AT T AGCCCT T GGGAACAT CCC


AT GAGCT CT T GGT T AAGACCC

loci,

Assumindo independncia entre os

podemos representar

esta comparao como uma varivel Bernoulli (Xi )que assume valor

para

loci

com letras iguais e

para

loci

com letras distintas.

Vamos resolver este problema aplicando a equao 9.1.


Listagem 9.10:

Calculando a verossimilhana da comparao de

duas sequncias de DNA

1 # c o d i n g : l a t i n

2 # Disponivel

pacote

no

de

programas

como :

l i k 1 . py

from

a ="ATTAGCCCTTGGGAACATCCC"

pylab

import

5 b ="ATGAGCTCTTGGTTAAGACCC"
6 n = len (a)
7 # Comparando

as

sequncias :

8 comp = [ i n t ( a [ i ]==b [ i ] )

for

in

range ( len ( a

)) ]

9 # Contando nmero d e
10

correspondncias

soma = sum ( a r r a y ( comp ) )

11 # C a l c u l a n d o L
12 L = [ p soma (1 p ) ( nsoma )
(0 ,1 ,.01) ]

13

p l o t ( arange ( 0 , 1 , . 0 1 ) ,

14

s a v e f i g ( ' l i k 1 . png ' , d p i =400)

15

show ( )

L)

for

in

arange

CAPTULO 9. SIMULAES ESTOCSTICAS

232

A gura 9.10 mostra a funo de verossimilhana gerada pela


listagem 9.10.

Mais adiante usaremos este resultado em outro

exemplo.
Analisando o cdigo da listagem 9.10, utilizamos a tcnica de

list comprehension

para comparar as duas sequncias

locus

retornando 1 quando fossem iguais e 0, caso contrrio.

locus

Como a

comparao retorna verdadeiro (True) ou falso (False), aplicamos

int

1 e 0, respectiva9, convertemos a lista de resultados da comparao


em vetor para poder somar os seus elementos com sum. Na linha
11, usamos tcnica similar da linha 7 para calcular a funo de
a funo

para transformar estas sadas em

mente. Na linha

verossimilhana.

Figura 9.10:

Funo de verossimilhana para a comparao de

sequncias de DNA.

9.8. FUNES DE VEROSSIMILHANA

233

Varivel Contnua
A funo de verossimilhana para variveis aleatrias contnuas
similar ao caso discreto apresentado acima. Para uma varivel contnua, substitumos a funo de probabilidade da denio discreta
pela funo de densidade de probabilidade. Se

g (x1 , . . . , xn ),

representa uma famlia de funes de densidade de probabili-

dade conjuntas para

(X1 , . . . , Xn ),

ento

L( | x1 , . . . , xn ) =

n
Y

f (xi )

i=1

X1 , . . . , X n

se

forem independentes e identicamente distribu-

das.
A ttulo de exemplo, vamos escrever a funo de verossimilhana

X com
. Dado

para uma varivel aleatria normal


Neste caso,

o nosso parmetro

(2)1/2 e(x)

/2

mdia

e varincia 1.

Xi

que a densidade de

, para n=3 temos

L( | x1 , x2 , x3 ) = (2)3/2 e1/2

P3

1 (xi )

(9.2)

Como podemos ver pelas equaes 9.2 e 9.1, a verossimilhana


uma famlia de funes que difere por um fator que no depende
de

Portanto, apenas seu valor relativo (forma) nos interessa.

Log-verossimilhana
Na funo de verossimilhana, o termo que no depende de

de-

pende de n (o tamanho amostral), com isso o valor da verossimi-

lhana facilmente torna-se extremo . Devido a esta caracterstica


da funo de verossimilhana, frequentemente utiliza-se o seu logaritmo. Vamos plotar a log-verossimilhana calculada na listagem

9.10.

4 Se

isto no bvio para voc, utilize seus conhecimentos de Python para

investigar numericamente este fato.

5 Modique

a listagem anterior incluindo estas linhas

CAPTULO 9. SIMULAES ESTOCSTICAS

234

Listagem 9.11: Log-verossimilhana

1 L [ 0 ] = L [ 1 ] #removendo o

zero

do

incio

da

lista

p l o t ( arange ( 0 , 1 , . 0 1 ) ,

show ( )

l o g ( array (L) ) )

?? e 9.11).

Compare agora os dois grcos(

Preste ateno aos va-

lores do eixo y. A funo mudou de forma, porm preservou uma


coisa muito importante: o seu mximo continua com a mesma abscissa. Isto nos leva a uma aplicao muito importante da funo
verossimilhana: a estimao de parmetros por mxima verossimilhana.

Figura 9.11: Log-verossimilhana da funo descrita anteriormente.

9.9. INFERNCIA BAYESIANA COM OBJETOS.

235

Vimos na listagem 9.10 que, quando calculamos a funo de


verossimilhana sobre dados obtidos experimentalmente, ela representa a probabilidade de cada valor de parmetro no eixo x ter
gerado aquele conjunto de dados. Logo, se desejamos estimar este
parmetro a partir dos dados, devemos escolher o valor que maximiza a funo de verossimilhana. Felizmente, este valor o mesmo
para a log-verossimilhana.
Voltando ao problema da comparao de duas sequncias de
DNA, vamos maximizar a funo de verossimilhana para estimar

(ver listagem 9.12).


Listagem 9.12: Maximizando a verossimilhana

1 MLE = c o m p r e s s ( e q u a l ( L , max ( L ) ) , a r a n g e
(0 ,1 ,.01) )

print

MLE

0.67]

1 da listagem 9.12, utiliza-se uma funo proveniente


numpy6 . Esta funo (compress) nos retorna os elementos do segundo argumento arange(0,1,.01), nas posies em que
o vetor de condies, equal(L,max(L)), for verdadeiro. Trocando
em midos: nos retorna o valor do parmetro p para o qual o valor
da verossimilhana mximo. As funes max e equal tambm so
provenientes do mdulo numpy.
Na linha

do mdulo

9.9 Inferncia Bayesiana com Objetos.


Na viso Bayesiana de mundo, nosso conhecimento sobre o mundo
representado por nossas crenas que, por sua vez, so representadas por variveis aleatrias com suas distribuies de probabilidade
(PDFs). Como nosso conhecimento do mundo no perfeito, estas distribuies no tm preciso innita, ou seja, no podem ser

6 Importado,

neste exemplo, pelo mdulo

pylab.

CAPTULO 9. SIMULAES ESTOCSTICAS

236

representadas por um simples nmero. Por exemplo, minha altura


no

1, 73m mas uma distribuio de valores em torno deste, visto

que depende de vrios fatores tais como postura, quantidade de


cabelo, etc.
Naturalmente, nossas crenas podem ser modicadas. A cada
vez que ns nos expomos a novas evidncias(dados) a respeito de
um fato, podemos reforar nossa crena original (aumentando sua
preciso). Ou podemos car mais confusos, se os dados no concordam com nossa crena original, e esta ltima perder preciso.
O objetivo desta seo, construir um objeto que emule as caractersticas de varivel aleatria Bayesiana, facilitando-nos a realizao das operaes mencionadas acima.
Em computao se desejarmos representar uma distribuio

p(x),

teremos que faz-lo por meio de uma funo (se esta fun-

o for conhecida e computvel) que recebe

como argumento e

na sua probabilidade, ou por alguma outra estrutura de dados que


combine todos valores de

x e suas respectivas probabilidades, como

por exemplo um dicionrio. Naturalmente esta ltima representao se presta apenas a uma gama bastante limitada de variveis.

1 >>> # D i s t r i b u i o
dado

de

probabilidades

d e um

cbico

2 >>> dado =
{1:1/6. ,2:1/6. ,3:1/6. ,4:1/6. ,5:1/6. ,6:1/6.}

Listagem 9.13: Classe Varivel Aleatria Bayesiana  Requisitos.

3 # copyright
4 # Licensed
5
6

2007

Flavio

Codeco

Coelho

u n d e r GPL v3

from numpy import


import l i k e , s y s

Como toda varivel Bayesiana, nossa classe deve possuir uma


distribuio

a priori, neste exemplo denida de forma paramtrica.

9.9. INFERNCIA BAYESIANA COM OBJETOS.

237

Deve tambm conter dados referentes a ela, e uma distribuio


posterior. Naturalmente deve possuir os mtodos para atualizar a
sua distribuio

a priori, transformando-a em posterior.

Listagem 9.14: Classe Varivel Aleatria Bayesiana  Inicializao.

8
9
10
11

from
class

BayesVar :

"""

12

Bayesian

13

"""

14

import

scipy . stats

def

random

variate .

__init__ ( s e l f ,

p r i o r t y p e , pars ,

range

, r e s o l u t i o n =512) :

15

' ' '

16

Inicializa

17

Adquire

varivel

mtodos

da

aleatria .
classe

priortype

18

priortype

deve

ser

um RNG d e

scipy .

stats

19

pars

20

' ' '

21

s e l f . p r i o r n = p r i o r t y p e . name

22

s e l f . _ f l a v o r i z e ( p r i o r t y p e ( pars ) ,

23

s e l f . pars = pars

24

s e l f . range = range

25

s e l f . r e s = ( range [1] range [ 0 ] )

so

os

parmetros

da

priori .

priortype )

1./

resolution

26

self . likefun

s e l f . _Likelihood ( s e l f

. priorn )

27

self . likelihood

= None

Esta classe deve solicitar estas informaes na sua inicializao(Listagem 9.14). O pacote

scipy.stats

j possui classes cor-

CAPTULO 9. SIMULAES ESTOCSTICAS

238

respondendo a vrias famlias paramtricas. Portanto nossa classe


requer que o argumento

priortype

quer tambm os parmetros da

seja uma destas classes. Re-

a priori, a extenso do suporte para

a varivel,e a resoluo da representao das distribuies(nmero


de pontos em se subdividir o suporte).
Durante a inicializao da classe, importamos os mtodos da
distribuio

a priori

para se juntar aos mtodos de nossa classe.

Esta absoro de funcionalidade no poderia ser conseguida atravs


de herana comum, pois no se sabe de antemo de qual classe
desejamos herd-los. Felizmente, a natureza dinmica do Python
nos ajudou neste ponto, permitindo uma herana dinmica. Esta
herana feita no mtodo

_flavorize

(Listagem 9.15).

Listagem 9.15: Classe Varivel Aleatria Bayesiana  Herana dinmica de mtodos.

29

s e l f . p o s t e r i o r=a r r a y ( [ ] )

30

def

31

_ f l a v o r i z e ( s e l f , pt ,

32

' ' '

33

add

34

' ' '

35

s e l f . c d f = pt . c d f

36

methods

self . isf

if

37
38
40

else :

41

distribution

type

= pt . i s f

i s i n s t a n c e ( ptbase , rv_continuous ) :

elif

39

from

ptbase ) :

s e l f . pdf = pt . pdf
i s i n s t a n c e ( ptbase , r v _ d i s c r e t e ) :
s e l f . p d f = p t . pmf
sys . exit ( ' Invalid

distribution

object ' )
De acordo com o tipo de distribuio

a priori,

o mtodo Like-

lihood escolhe e retorna a funo de verossimilhana adequada(Listagem


9.16).

9.9. INFERNCIA BAYESIANA COM OBJETOS.

239

Listagem 9.16: Classe Varivel Aleatria Bayesiana  Herana dinmica de mtodos.

return

100
101
102

def

[]

_ Li k e li h oo d ( s e l f , typ ) :

103

' ' '

104

Define

familia

paramtrica

da

verossimilhana .

105

Retorna

106

typ

107

funo

deve

ser

de

uma

verossimilhana .
string .

' ' '

if

108

t y p ==

109

elif

110
111

' norm ' :

return lambda ( x ) : l i k e . Normal ( x


[0] ,x[1] ,1./x[2])
t y p ==

' expon ' :

return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size

e x p ( ( 1 . / x [ 2 ] ) sum (

x[0]) )
Durante a inicializao da varivel, uma lista vazia de dados
criada. Esta lista conter todos os conjuntos de dados independentes que forem atribudos varivel.

Isto importante pois a

teoria Bayesiana opera por atualizaes sucessivas da distribuio


posterior a cada novo conjunto de evidncias. Uma vez gerada, a
distribuio posterior ca guardada no atributo

posterior.
addData,

Nossa classe possui ainda um mtodo chamado

cuja

funo a de armazenar os dados, e recalcular a funo de verossimilhana chamando o mtodo

_update(Listagem

9.17).

Listagem 9.17: Classe Varivel Aleatria Bayesiana  Adio de


dados e clculo da Verossimilhana.

42
43
44

s e l f . ppf = pt . ppf

def

s e l f . r v s = pt . r v s
_update ( s e l f ) :

CAPTULO 9. SIMULAES ESTOCSTICAS

240

45

"""

46

Calculate

47

"""

if

48

likelihood

function

s e l f . data :
s e l f . data [ 1]

49

d =

50

sc =

s e l f . pars [ 1 ]

51

m =

s e l f . range [ 0 ]

52

M =

s e l f . range [ 1 ]

53

step =

54

s e l f . res

#s e l f . l i k e f u n

log

returns

likelihood

55

lik

= exp ( a r r a y ( [ s e l f . l i k e f u n ( ( d

for

, i , sc ) )

in

a r a n g e (m,M,

step ) ] ) )

56

self . likelihood

57

def

58

addData ( s e l f ,

59

"""

60

Adds

dataset

data =
to

l i k /sum ( l i k )
[]) :

variable ' s

data

store

61

"""
Os mtodos

getPriorSample

tras e a PDF da distribuio

getPriorDist

a priori,

retornam amos-

respectivamente(Listagem

9.18).
Listagem 9.18: Classe Varivel Aleatria Bayesiana  Amostras e
PDF da

a priori.

63
64
65

s e l f . _update ( )

def

getPriorSample ( s e l f , n) :

66

' ' '

67

Returns

sample

distribution

from

the

prior

9.9. INFERNCIA BAYESIANA COM OBJETOS.


68

241

' ' '

return

69
70

def

71

s e l f . r v s ( s i z e =n )

getPriorDist ( s e l f ) :

72

"""

73

Returns

the

prior

PDF .

Por m temos o mtodo mais complexo:

getPosteriorSample

(Listagem 9.19). Este mtodo responsvel por atualizar a distribuio posterior da varivel sempre que se solicitar uma amostra.
Utiliza um mtodo de amostragem por importncia no qual se reamostra a distribuio

a priori

com um probabilidade proporcional

ao produto da verossimilhana e da distribuio a

priori.

Vale no-

tar, que se existir alguma posterior j calculada, esta utilizada


como

a priori.

Como deve ser.

Listagem 9.19: Classe Varivel Aleatria Bayesiana  Gerando a


posterior.

74

"""

75

return

s e l f . pdf ( arange ( s e l f . range

[ 0 ] , s e l f . range [ 1 ] , s e l f . r e s ) )

76

def

getPosteriorSample ( s e l f ,

77

"""

78

Return

sample

of

the

n) :

posterior

distribution .

79

"""

80

if

s e l f . p o s t e r i o r . any ( ) :#
posterior

as

Use

last

prior

81

k= k d e . g a u s i a n _ k d e ( s e l f .

82

s= k . r e s a m p l e ( n )

posterior )

83

else :

84
85

s =
if

s e l f . getPriorSample (n)

s e l f . data :

CAPTULO 9. SIMULAES ESTOCSTICAS

242

86

m =

s e l f . range [ 0 ]

87

M =

s e l f . range [ 1 ]

88

step =

89

s u p p = a r a n g e (m,M, s t e p )#s u p p o r t

90

s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &

s e l f . res

g r e a t e r ( s . r a v e l ( ) ,m) , s )#
removing

o u t o f r a n g e

samples

91

d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
0 1

s i z e =l e n ( s ) )#U n i f o r m
samples
s e l f . p d f ( supp ) s e l f .

92

w =

93

w = w/sum (w) #n o r m a l i z i n g

94

s x = s e a r c h s o r t e d ( supp , s )

95

w = w [ s x 1]# s e a r c h

likelihood
weights

returns

96

sorted

1 b a s e d

binlist

p o s t = c o m p r e s s ( d<w , s )

97

s e l f . p o s t e r i o r = post

98

return

post

O cdigo completo deste programa(Listagem 9.21) inclui, ainda,


algumas linhas para testar a classe (Listagem 9.20).

Este teste

consiste em inicializar a varivel com uma distribuio a priori


Normal com mdia

= 3

e desvio padro

= 1.

Um pequeno

conjunto de observaes, escolhido de forma a no concordar com


a distribuio

a priori,

utilizado para demonstrar a atualizao

da varivel(Figura 9.12).
Listagem 9.20: Classe Varivel Aleatria Bayesiana  Cdigo de
teste.

113

return lambda ( x ) : l i k e . B e t a ( x
[0] ,x[1] ,x[2])

9.9. INFERNCIA BAYESIANA COM OBJETOS.


114
115
116

if

243

__name__=="__main__" :
bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )

117

data = ones ( 2 0 )

118

bv . addData ( d a t a )

119

p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )

120

P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,

121

P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,

122

P. hist (p ,

123

P. legend ( [ ' Likelihood ' , ' Prior ' ] )

bv . r e s ) , bv . l i k e l i h o o d ,

' ro ' ,

l w =2)

bv . r e s ) , bv . g e t P r i o r D i s t ( ) , ' g+ ' , l w =2)


normed =1)

Figura 9.12: Resultado da listagem 9.21.

CAPTULO 9. SIMULAES ESTOCSTICAS

244

Listagem 9.21:

Classe Varivel Aleatria Bayesiana  Listagem

completa

1 # e n c o d i n g : l a t i n
2 # Disponivel

no

pacote

de

programas

como :

B a y e s . py

3 # copyright
4 # Licensed
5
6
7
8
9
10
11

2007

Codeco

from numpy import


import l i k e , s y s
import p y l a b a s P
from s c i p y . s t a t s import
class

Coelho

BayesVar :

"""

12

Bayesian

13

"""

14

Flavio

u n d e r GPL v3

def

random

variate .

__init__ ( s e l f ,

p r i o r t y p e , pars ,

range

, r e s o l u t i o n =512) :

15

' ' '

16

Inicializa

17

Adquire

varivel

mtodos

da

aleatria .
classe

priortype

18

priortype

deve

ser

um RNG d e

scipy .

stats

19

pars

20

' ' '

21

s e l f . p r i o r n = p r i o r t y p e . name

22

s e l f . _ f l a v o r i z e ( p r i o r t y p e ( pars ) ,

23

s e l f . pars = pars

24

s e l f . range = range

25

s e l f . r e s = ( range [1] range [ 0 ] )

so

os

parmetros

da

priori .

priortype )

resolution

1./

9.9. INFERNCIA BAYESIANA COM OBJETOS.


26

self . likefun

245

s e l f . _Likelihood ( s e l f

. priorn )

27

self . likelihood

28

s e l f . data =

29

s e l f . p o s t e r i o r=a r r a y ( [ ] )

30
31

def

= None

[]

_ f l a v o r i z e ( s e l f , pt ,

32

' ' '

33

add

34

' ' '

35

s e l f . c d f = pt . c d f

36

methods

self . isf

if

37
38
40

type

= pt . i s f
s e l f . pdf = pt . pdf

i s i n s t a n c e ( ptbase , r v _ d i s c r e t e ) :

else :

41

distribution

i s i n s t a n c e ( ptbase , rv_continuous ) :

elif

39

from

ptbase ) :

s e l f . p d f = p t . pmf
sys . exit ( ' Invalid

distribution

object ' )

42
43
44
45

s e l f . ppf = pt . ppf

def

s e l f . r v s = pt . r v s
_update ( s e l f ) :
"""

46

Calculate

47

"""

48

if

likelihood

function

s e l f . data :
s e l f . data [ 1]

49

d =

50

sc =

s e l f . pars [ 1 ]

51

m =

s e l f . range [ 0 ]

52

M =

s e l f . range [ 1 ]

53
54

step =

s e l f . res

#s e l f . l i k e f u n

returns

log

likelihood

55

lik

= exp ( a r r a y ( [ s e l f . l i k e f u n ( ( d
, i , sc ) )

for

in

a r a n g e (m,M,

CAPTULO 9. SIMULAES ESTOCSTICAS

246

step ) ] ) )

56
57
58

self . likelihood

def

addData ( s e l f ,

59

"""

60

Adds

dataset

data =
to

l i k /sum ( l i k )
[]) :

variable ' s

data

store

61

"""

62

s e l f . d a t a . append ( a r r a y ( d a t a ) )

63

s e l f . _update ( )

64
65

def

getPriorSample ( s e l f , n) :

66

' ' '

67

Returns

sample

from

the

prior

distribution

68

' ' '

return

69
70
71

def

72

getPriorDist ( s e l f ) :
"""

73

Returns

74

"""

return

75
76

s e l f . r v s ( s i z e =n )

def

the

prior

PDF .

s e l f . pdf ( arange ( s e l f . range

[ 0 ] , s e l f . range [ 1 ] , s e l f . r e s ) )
getPosteriorSample ( s e l f ,

77

"""

78

Return

sample

of

the

n) :

posterior

distribution .

79
80

"""

if

s e l f . p o s t e r i o r . any ( ) :# Use
posterior

as

last

prior

81

k= k d e . g a u s i a n _ k d e ( s e l f .

82

s= k . r e s a m p l e ( n )

posterior )

9.9. INFERNCIA BAYESIANA COM OBJETOS.

247

else :

83
84

if

85

s =

s e l f . getPriorSample (n)

s e l f . data :

86

m =

s e l f . range [ 0 ]

87

M =

s e l f . range [ 1 ]

88

step =

89

s u p p = a r a n g e (m,M, s t e p )#s u p p o r t

90

s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &

s e l f . res

g r e a t e r ( s . r a v e l ( ) ,m) , s )#
o u t o f r a n g e

removing
samples

91

d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
s i z e =l e n ( s ) )#U n i f o r m

0 1

samples
s e l f . p d f ( supp ) s e l f .

92

w =

93

w = w/sum (w) #n o r m a l i z i n g

94

s x = s e a r c h s o r t e d ( supp , s )

95

w = w [ s x 1]#s e a r c h

likelihood
weights

96

s e l f . p o s t e r i o r = post

return

98

else :
return

99
100
102

binlist

p o s t = c o m p r e s s ( d<w , s )

97

101

sorted

1 b a s e d

returns

def

post
[]

_ Li k e li h oo d ( s e l f , typ ) :

103

' ' '

104

Define

familia

paramtrica

da

verossimilhana .

105

Retorna

106

typ

107

' ' '

deve

funo
ser

de

uma

verossimilhana .
string .

CAPTULO 9. SIMULAES ESTOCSTICAS

248

if

108

t y p ==

109

elif

110
111

' norm ' :

return lambda ( x ) : l i k e . Normal ( x


[0] ,x[1] ,1./x[2])
t y p ==

' expon ' :

return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size

elif

112

e x p ( ( 1 . / x [ 2 ] ) sum (

x[0]) )
t y p ==

' beta ' :

return lambda ( x ) : l i k e . B e t a ( x

113

[0] ,x[1] ,x[2])

114
115
116

if

__name__=="__main__" :
bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )

117

data = ones ( 2 0 )

118

bv . addData ( d a t a )

119

p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )

120

P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,

121

P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,

122

P. hist (p ,

123

P. legend ( [ ' Likelihood ' , ' Prior ' ] )

124

P. t i t l e ( ' Bayesian

125

P . s a v e f i g ( ' b a y e s v a r . png ' , d p i =400)

126

P . show ( )

bv . r e s ) , bv . l i k e l i h o o d ,

' ro ' ,

l w =2)

bv . r e s ) , bv . g e t P r i o r D i s t ( ) , ' g+ ' , l w =2)


normed =1)
inference ' )

9.10 Exerccios
1. Compare a acurcia do amostrador de Metropolis-Hastings

resample do objeto
gaussian kde. Teste com diferentes formas de
O mtodo resample uma mera amostragem

com o amostrador oferecido pelo mtodo


retornado por
distribuio.

com reposio.

9.10. EXERCCIOS

249

2. Verique a importncia do tamanho amostral na atualizao


da distribuio posterior de uma varivel, utilizando o programa da listagem 9.21
3. Experimente diferentes valores para a varincia da distribuio

a priori

do exemplo 9.8, e verique o efeito na conver-

gncia do algoritmo.
4. Utilize o mtodo do hipercubo latino ilustrado na listagem 9.1
para gerar amostras das distribuies

a priori

nos exemplos

9.8 e 9.21 e avalie o seu impacto na qualidade das estimativas.

Apndices

251

Introduo ao Console
Gnu/Linux
Guia de sobrevivncia no console do Gnu/Linux

console

Gnu/Linux um poderoso ambiente de trabalho, em

contraste com a interface limitada, oferecida pelo sistema ope-

racional DOS, ao qual comumente comparado. O console Gnu/Linux tem uma longa histria desde sua origem no Bourne shell,
distribuido com o Sistema operacional(SO) UNIX verso 7.
sua evoluo, deu origem a algumas variantes.

Em

A variante mais

amplamente utilizada e que ser objeto de utilizao e anlise neste


captulo o Bash ou Bourne Again Shell. Ao longo deste captulo o termo console e shell sero utilizados com o mesmo sentido,
ainda que, tecnicamente no sejam sinnimos. Isto se deve falta
de uma traduo mais adequada para a palavra inglesa shell".
Qual a relevncia de um tutorial sobre shell em um livro sobre
computao cientca?

Qualquer cientista com alguma experin-

cia em computao est plenamente consciente do fato de que a


maior parte do seu trabalho, se d atravs da combinao da funcionalidade de diversos aplicativos cientcos para a realizao de
tarefas cientcas de maior complexidade. Neste caso, o ambiente
de trabalho chave para agilizar esta articulao entre aplicativos. Este captulo se prope a demonstrar, atravs de exemplos,
que o GNU/Linux um ambiente muito superior para este tipo
de atividade, se comparado com Sistemas Operacionais voltados
253

Console Gnu/Linux
principalmente para usurios leigos.
Alm do Console e sua linguagem (bash), neste captulo vamos conhecer diversos aplicativos disponveis no sistema operacional Gnu/Linux, desenvolvidos para serem utilizados no console.

A linguagem BASH
A primeira coisa que se deve entender antes de comear a estudar
o shell do Linux, que este uma linguagem de programao bastante poderosa em si mesmo.

O termo Shell, cpsula, traduzido

literalmente, se refere sua funo como uma interface entre o


usurio e o sistema operacional. A shell nos oferece uma interface
textual para invocarmos aplicativos e lidarmos com suas entradas
e sadas. A segunda coisa que se deve entender que a shell no o
sistema operacional, mas um aplicativo que nos facilita a interao
com o SO.
O Shell no depende de interfaces grcas sosticadas, mas comumente utilizado atravs de uma janela, do conforto de uma
interface grca. Na gura 1, vemos um exemplo de uma sesso
do bash rodando em uma janela.

Alguns Comando teis

ls

pwd

Lista arquivos.

cp

Copia arquivos.

mv

completo).

Renomeia ou move arquivos.

rm

Apaga

arquivos

(de

dade!).

ln

Imprime o nome do diretrio corrente (caminho

ver-

mkdir

Cria um diretrio.

rmdir

Remove

Para
mente
de

Cria links para arquivos.

254

um

diretrio.

remover

recursiva-

toda

diretrios

rf(cuidado!).

uma
use

rvore
rm

A linguagem BASH

Figura 1: Konsole: janela contendo uma sesso bash (ou outra) no


KDE.

cat

Joga o arquivo inteiro na

tail

Visualiza

tela.

less

Visualiza

arquivo

com

nl

Visualiza

tao e busca dentro do


mesmo.

Visualiza o incio do arquivo.

nal

do

ar-

com

numerao

das linhas.

possibilidade de movimen-

head

quivo.

od

Visualiza

arquivo

binrio

em base octal.

xxd

Visualiza arquivo binrio


em base hexadecimal.
255

Console Gnu/Linux

gv

Visualiza

arquivos

Posts-

locate

cript/PDF.

xdvi

arquivos

DVI

Mostra atributos dos ar-

(executvel), fontes, e pgina man de um comando.

Conta

bytes/palavras/li-

nhas.

du

grep

Busca

em

texto

retor-

nando linhas.
Uso de espao em disco.

le

cut

Atualiza registro de l-

tima

atualizao

do

exista, criado.

chown

Altera

dono

do

ar-

quivo.

chgrp

Altera o grupo do ar-

quivo.

chmod

paste

Altera as permisses de

sort Ordena linhas.


uniq Localiza linhas idnticas.
gzip Compacta arquivos no formato GNU Zip.

compress Compacta arquivos.


bzip2 Compacta
arquivos(maior compactao do

um arquivo.

chattr

que o gzip,
Altera

atributos

avan-

ados de um arquivo.

lsattr

Lista

atributos

dos do arquivo.

nd

Anexa colunas de um ar-

quivo texto.

ar-

quivo. Caso o arquivo no

Extrai colunas de um arquivo.

Identica tipo do arquivo.

touch

256

por

which Localiza comandos.


whereis Localiza o binrio

quivos.

wc

arquivo

updatedb.
Visualiza

gerados pelo TEX.

stat

Localiza

meio de ndice criado com

Localiza arquivos.

avana-

porm mais

lento.

zip

Compacta arquivos no formato zip(Windows).

di

Compara arquivos linha a


linha.

Entradas e Sadas, redirecionamento e "Pipes".

comm

Compara arquivos orde-

uptime

nados.

cmp

Compara

Retorna tempo desde o

ltimo boot,
arquivos

byte

por byte.

e carga do

sistema.

top

Monitora processos em exe-

cuo.
md5sum Calcula checksums.
df Espao livre em todos os dis- free Mostra memria livre.
cos(pendrives e etc.) mon- kill Mata processos.
tados.

mount

Torna um disco acess-

vel.

fsck

Verica um disco procu-

nice

Ajusta a prioridade de um
processo.

renice

rando por erros.

Altera a prioridade de

um processo.

Executa programas a insync Esvazia caches de disco. watchtervalos


regulares.
ps Lista todos os processos.
crontab Agenda tarefas periw Lista os processos do usurio.
dicas.

Entradas e Sadas, redirecionamento e "Pipes".


O esquema padro de entradas e sadas dos SOs derivados do
UNIX, est baseado em duas idias muito simples: toda comunicaao formada por uma sequncia arbitrria de caracteres (Bytes),
e qualquer elemento do SO que produza ou aceite dados tratado
como um arquivo, desde dispositivos de hardware at programas.
Por conveno um programa UNIX apresenta trs canais de
comunicao com o mundo externo:

entrada padro ou STDIN,

sada padrao ou STDOUT e sada de erros padro ou STDERR.


O Bash(assim como praticamente todas as outras shells) torna
muito simples a utilizao destes canais padro. Normalmente, um
257

Console Gnu/Linux
usurio utiliza estes canais com a nalidade de redirecionar dados
atravs de uma sequncia de passos de processamento. Como este
processo se assemelha ao modo como canalizamos gua para lev-la
de um ponto ao outro, Estas construes receberam o apelido de
pipelines"ou tubulaes onde cada segmento chamado de pipe".
Devido a essa facilidade, muitos dos utilitrios disponveis na
shell do Gnu/Linux foram desenvolvidos para fazer uma nica coisa
bem, uma vez que funes mais complexas poderiam ser obtidas
combinando programas atravs de pipelines".

Redirecionamento
Para redirecionar algum dado para o STDIN de um programa, utili-

<.

zamos o caracter
chamado

nomes

Por exemplo, suponha que temos um arquivo

contendo uma lista de nomes, um por linha.

comando sort < nomes ir lanar na tela os nomes ordenados alfabeticamente. De maneira similar, podemos utilizar o caracter

>

para redirecionar a saida de um programa para um arquivo, por


exemplo.
Listagem 22: Redirecionando STDIN e STDOUT

s o r t < nomes > n o m e s _ o r d e n a d o s

O comando do exemplo 22, cria um novo arquivo com o contedo do arquivo

nomes,

ordenado.

Pipelines
Podemos tambm redirecionar sadas de comandos para outros comandos, ao invs de arquivos, como vimos anteriormente. O caractere que usamos para isto o

conhecido como pipe. Qualquer

linha de comando conectando dois ou mais comandos atravs de


pipes denominada de pipeline.

258

Prolas Cientcas do Console Gnu/Linux

Listagem 23: Lista ordenada dos usurios do sistema.

d : f 1

ajaxterm

cut

avahi

a v a h i a u t o i p d

backup

beagleindex

bin

boinc

...

< / e t c / passwd

| sort

O simples exemplo apresentado d uma idia do poder dos pipelines, alm da sua convenincia para realizar tarefas complexas,
sem a necessidade de armazenar dados intermedirios em arquivos,
antes de redirecion-los a outros programas.

Prolas Cientcas do Console Gnu/Linux


O console Gnu/Linux extrai a maior parte da sua extrema versati-

lidade de uma extensa coleo de aplicativos leves desenvolvidos

para serem utilizados diretamente do console. Nesta seo, vamos


ver alguns exemplos, uma vez que seria impossvel explorar todos
eles, neste simples apndice.

Gnu plotutils
O GNu Ploting Utilities uma suite de aplicativos grcos e
matemticos desenvolvidos para o console Gnu/Linux. So eles:

graph

L um ou mais conjuntos de dados a partir de arquivos ou

de STDIN e prepara um grco;

7 Desenvolvidos

principalmente pelo projeto Gnu

259

Console Gnu/Linux

plot

Converte Gnu metale para qualquer dos formatos listados


acima;

pic2plot

Converte diagramas criados na linguagem

pic para qual-

quer dos formatos acima;

tek2plot

Converte do formato Tektronix para qualquer dos for-

matos acima.
Estes aplicativos grcos podem criar e exportar grcos bi-

SVG, PNG, PNM, pseudo-GIF,


WebCGM, Illustrator, Postscript, PCL 5, HP-GL/2, Fig (editvel
com o editor de desenhos xfig), ReGIS, Tektronix ou GNU Metafile.

dimensionais em treze formatos diferentes:

Aplicativos Matemticos:
ode

Integra numericamente sistemas de equaes diferenciais ordinrias (EDO);

spline

Interpola curvas utilizando splines cbicas ou exponenci-

ais. Pode ser utilizado como ltro em tempo real.

graph
A cada vez que chamamos o programa

graph,

ele l um ou mais

conjuntos de dados a partir de arquivos especicados na linha de


comando, ou diretamente da

STDIN, e produz um grco.

O grco

pode ser mostrado em uma janela, ou salvo em um arquivo em


qualquer dos formatos suportados.
Listagem 24: Plotando dados em um arquivo.

graph

png < a r q u i v o _ d e _ d a d o s _ a s c i i >

p l o t . png
Se o

arquivo_de_dados_ascii contiver duas colunas de nmex e y, respectivamente. Os pares

ros, o programa as atribuir a


260

Prolas Cientcas do Console Gnu/Linux

ordenados que daro origem aos pontos do grco no precisam


estar em linhas diferentes. por exemplo:

echo

Listagem 25: Desenhando um quadrado.


.1

.1

.1

.9

C m

.9

.9

.9

.1

.1

.1

graph

0.3

A listagem 25 plotar um quadrado com vrtices em

(0.1,0.9), (0.9,0.9) e (0.9,0.1).

(0.1,0.1),

A repetio do primeiro vr-

tice garante que o polgono ser fechado. A opo

-m indica

o tipo

da linha utilizada: 1-linha slida, 2-pontilhada, 3-ponto e trao,


4-traos curtos e 5-traos longos.

A opo

-q

indica que o qua-

drado ser preenchido (densidade 30%) com a mesma cor da linha:


vermelho (-C indica grco colorido).

graph

O programa

aceita ainda muitas outras opes. Leia o

manual(man graph) para descobr-las.

spline
O programa funciona de forma similar ao
peito entradas e sadas.

graph

no que diz res-

Como todos os aplicativos de console,

benecia-se muito da interao com outros programas via pipes.

echo

Listagem 26: Uso do


0

spline

spline
|

graph

Spline no serve apenas para interpolar funes, tambm pode


ser usado para interpolar curvas em um espao d-dimensional utilizandose a opao

-d.

Listagem 27: Interpolando uma curva em um plano.

echo

graph

spline

a s

O comando da listagem 27 traar uma curva passando pelos


pontos

(0,0), (1,0), (1,1)

(0,1).

A opo

-d 2

indica que
261

Console Gnu/Linux

Figura 2: Usando

262

spline.

Prolas Cientcas do Console Gnu/Linux

Figura 3: Interpolando uma curva em um plano.

a varivel dependente bi-dimensional. A opo

-a

indica que a

varivel independente deve ser gerada automticamente e depois


removida da sada (opo

-s).

263

Console Gnu/Linux
ode
ode

O utilitrio

capaz de produzir uma soluo numrica de sis-

temas de equaes diferenciais ordinrias.


ser redirecionada para o utilitrio

graph,

A sada de

ode

pode

que j discutimos anteri-

ormente, de forma que as solues sejam plotadas diretamente,


medida em que so calculadas.
Vejamos um exemplo simples:

dy
= y(t)
dt

(3)

A soluo desta equao :

y(t) = et

(4)

Se ns resolvermos esta equao numericamente, a partir do


valor inicial

y(0) = 1,

at

t = 1

e
= 2.718282, com 7 algarismos

esperaramos obter o valor de

como ltimo valor da nossa curva (e

signicativos). Para isso digitamos no console:


Listagem 28: Resolvendo uma equao diferencial simples no console do Linux.

ode

2 y '= y
3

y=1

print

step

t ,y
0 ,1

Aps digitar a ultima linha do exemplo 28, duas colunas de


nmeros aparecero:

a primeira correspondendo ao valor de t e

a segunda ao valor de y; a ultima linha ser

1 2.718282.

Como

espervamos.
Para facilitar a re-utilizao dos modelos, podemos colocar os
comandos do exemplo 28 em um arquivo texto. Abra o seu editor
favorito, e digite o seguinte modelo:
264

Prolas Cientcas do Console Gnu/Linux

Listagem 29: Sistema de trs equaes diferenciais acopladas

1 # O modelo

de

Lorenz

, Um s i s t e m a

de

trs

EDOs a c o p l a d a s ,

2 # com um p a r m e t r o
3 x' =
4 y' =
5

z'

r.

3 (xy )
x z+r xy
x yz

6
7

r = 26

x = 0;

9
10

print
step

y = 1;
x,

0,

z = 0

y
200

Salve o arquivo com o nome

lorenz.

Agora digite no console a

seguinte linha de comandos:

ode <

20

lorenz

graph

C x 10

10

20

E eis que surgir a bela curva da gura 4.

265

Console Gnu/Linux

Figura 4: Atrator de Lorenz.

266

ndice Remissivo
arange, 46

EDO, 258

aranha, 190

elif, 28

array, 46

else, 28
Emacs, 81

.shape, 46

enumerate, 30
bancos de dados, 185

equaes de diferena, 145

break, 32

equaes diferenciais, 148


espao de nomes, 10

cadeias de Markov, 214

excees, 32

classe, 53

except, 32

atributos, 54
mtodos, 55

nally, 32

conjuntos, 27

for, 30

Console Python, 4

FORTRAN, 117

Controle de Verses, 86

funes, 34
lista de argumentos va-

Mercurial, 88

rivel, 36

Ctypes, 105

passando argumentos, 36
decoradores, 38

funoes

dicionrios, 24

argumentos opcionais, 35

mtodos, 25
geradores, 38
Editores, 80

Gibbs, 219

editores, 80

Gnu Nano, 81
267

ndice Remissivo
Grafos, 169

MCMC, 216

graph, 258

Mercurial, 88
Metropolis-Hastings, 217

Herana, 56
IDEs, 83
if, 28
import, 42
Inferncia Bayesiana, 203

modelagem matemtica, 135


modelos dinmicos, 145
modelos exponenciais, 142
modelos lineares, 137
monte carlo, 205

integrao numrica, 148

Nmeros complexos, 10

Ipython, 73

NetworkX, 172

Comandos mgicos, 75

numpy, 45

iterao, 29
objetos, 52
Java, 125

operadores aritmticos, 8

Jedit, 81
Jython, 126
lambda, 37
LHS, 200
listas, 13
mtodos, 16
mdulo
numpy.linalg, 46
scipy, 46
Mdulos

pacotes, 44
Palavras reservadas, 4
pickle, 186
print, 46
pydoc, 47
Pyrex, 106
R, xix
return, 37
scipy, 46

BeautifulSoup, 190

Scite, 81

email, 181

Shedskin, 111

mailbox, 182

sqlite, 187

threading, 178

SQLObject, 190

mdulos, 41
numpy, 45

strings, 22
formatando, 23

Mathematica, xix
Matlab, xix
268

try, 32

tuplas, 19
unidades, 155
unum, 159
urllib, 193
urllib2, 193
uso interativo, 5
verossimilhana, 228
weave, 100
web-spider, 190
while, 29
zip, 31

269

Colophon
Este livro foi formatado usando

AT X, criado por Leslie


L
E
Lamport e a classe memoir. O
corpo do texto utiliza fontes de
tamanho 10 Modern Roman,
criadas por Donald Knuth.
Outras fontes incluem Sans,
Smallcaps, Italic, Slanted and
Typewriter, todas da famlia
Computer Modern desenvolvida
por Knuth.

Você também pode gostar