Você está na página 1de 92

Computao Cientfica com Python

Verso 2.0-alpha

Flvio Codeo Coelho

22/02/2011

Contedo

Prefcio: Computao Cientfica


1.1 Apresentando o Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Usando este Livro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Fundamentos da Linguagem
2.1 Primeiras impresses . . . . . . . . . . . . . .
2.2 Uso Interativo vs. Execuo a Partir de Scripts
2.3 Operaes com Nmeros . . . . . . . . . . . .
2.4 Nomes, Objetos e Espaos de Nomes . . . . .
2.5 Estruturas de Dados . . . . . . . . . . . . . .
2.6 Controle de fluxo . . . . . . . . . . . . . . . .
2.7 Iterao . . . . . . . . . . . . . . . . . . . . .
2.8 Lidando com erros: Excees . . . . . . . . .
2.9 Funes . . . . . . . . . . . . . . . . . . . . .
2.10 Mdulos e Pacotes . . . . . . . . . . . . . . .
2.11 Documentando Programas . . . . . . . . . . .
2.12 Exerccios . . . . . . . . . . . . . . . . . . .

1
2
3

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

5
5
6
7
8
9
15
16
17
18
21
24
25

Programao Orientada a Objetos


3.1 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27
27

Introduo ao Matplotlib

31

Exemplos Avanados
5.1 Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35
35

Editores Genricos

39

Editores Especializados
7.1 Controle de Verses em Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41
41

Introduo

47

Integrao com a Linguagem C

49

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

10 Integrao com C++


10.1 Criando Applets em Jython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53
56

11 Exerccios

59

12 O interpretador Jython

61

13 Introduo

63

14 NetworkX
14.1 Construindo Grafos . . . . . . . . . . .
14.2 Manipulando Grafos . . . . . . . . . . .
14.3 Criando Grafos a Partir de Outros Grafos
14.4 Gerando um Grafo Dinamicamente . . .
14.5 Construindo um Grafo a Partir de Dados

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

65
65
65
66
66
67

15 Exerccios

69

16 O Mdulo Pickle

71

17 O Pacote SQLObject
17.1 Construindo um aranha digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73
73

18 Exerccios

75

19 Introduo ao Console Gnu/Linux


19.1 A linguagem BASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19.2 Entradas e Sadas, redirecionamento e Pipes. . . . . . . . . . . . . . . . . . . . . . . . . . . .

77
77
81

20 Indices and tables

85

ndice

87

ii

CAPTULO 1

Prefcio: Computao Cientfica

Da Computao Cientfica e sua definio pragmtica. Do porqu esta se diferencia, em metas e


ferramentas, da Cincia da Computao.
Computao cientfica no uma rea do conhecimento muito bem definida. A definio utilizada neste livro a
de uma rea de atividade/conhecimento que envolve a utilizao de ferramentas computacionais (software) para
a soluo de problemas cientficos em reas da cincia no necessariamente ligadas disciplina da cincia da
computao, ou seja, a computao para o restante da comunidade cientfica.
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 cientficas ou no. No entanto, a diversidade de
aplicaes cientficas da computao quase to vasta quanto o prprio conhecimento humano. Por isso, o cientista frequentemente se encontra com problemas para os quais as ferramentas computacionais adequadas no
existem.
No desenvolvimento de softwares cientficos, temos dois modos principais de produo de software: o desenvolvimento de softwares comerciais, feito por empresas de software que contratam programadores profissionais para o
desenvolvimento de produtos voltados para uma determinada aplicao cientfica, e o desenvolvimento feito por
cientistas (fsicos, matemticos, bilogos, etc., que no so programadores profissionais), geralmente de forma
colaborativa atravs do compartilhamento de cdigos fonte.
Algumas disciplinas cientficas, 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 cientficas carecem de massa crtica (em termos de nmero de profissionais) para estimular o desenvolvimento de softwares comerciais para a soluo dos seus problemas computacionais especficos. Como agravante, o desenvolvimento lento e centralizado de softwares comerciais, tem se mostrado incapaz de acompanhar
a demanda da comunidade cientfica, que precisa ter acesso a mtodos que evoluem a passo rpido. Alm disso,
esto se multiplicando as disciplinas cientficas 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 sofisticados e 2) Frequentemente
o cientista dispe de pouco tempo entre suas tarefas cientficas 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
profissionais com dezenas de milhares de linhas de cdigo. Devido a isso, o nmero de linhas de cdigo mnimo
para escrever um programa cientfico nestas linguagens muitas vezes maior do que o nmero de linhas de cdigo
associado com a resoluo do problema em questo.

Computao Cientfica com Python, Verso 2.0-alpha

Quando este problema foi percebido pelas empresas de software cientfico, surgiu uma nova classe de software,
voltado para a demanda de cientistas que precisavam implementar mtodos computacionais especficos e que no
podiam esperar por solues comerciais.
Esta nova classe de aplicativos cientficos, 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 profissional o que, exatamente, ele deseja. Exemplos destes produtos incluem MATLAB,
Mathematica, Maple, entre outros. 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 programa
(MATLAB, etc.) que custa milhares de dlares por 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 flexibilidade das linguagens de programao tradicionais. Programas cientficos
desenvolvidos inteiramente com ferramentas de cdigo aberto tem a vantagem adicional de serem plenamente
escrutinveis pelo sistema 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 cientfica, mantendo as vantagens de ser uma linguagem de programao completa e de alto nvel.

1.1 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, cientfica 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 desenvolvida ao final 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 linguagem, 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 2 , o Python atingiu a verso 1.6, que foi rpidamente seguida pela verso 2.0. A partir desta verso, o
Python passa a ser distribudo sob a Python License, compatvel com a GPL 3 , tornando-se oficialmente software
livre. A linguagem passa a pertencer oficialmente Python Software Foundation. Apesar da implementao original do Python ser desenvolvida na Linguagem C (CPython), Logo surgiram outras implementaes da Linguagem,
inicialmente em Java (Jython 4 ), e depois na prpria linguagem Python (PYPY 5 ){Pypy}, e na plataforma .NET
(IronPython 6 ){IronPython}.
Dentre as vrias caractersticas da linguagem que a tornam interessante para computao cientfica, destacam-se:
Multiplataforma: O Python pode ser instalado em qualquer plataforma computacional: Desde PDAs e celulares
at supercomputadores com processamento paralelo, passando por todas as plataformas de computao
pessoal.
1
2
3
4
5
6

www.python.org
Corporation for National Research Initiatives
GNU General Public License
www.jython.org
pypy.org
{www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython}

Captulo 1. Prefcio: Computao Cientfica

Computao Cientfica com Python, Verso 2.0-alpha

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 qualquer limitao distribuio gratuita ou venda de
programas.
Extensibilidade: O Python pode ser extendido atravs de mdulos,escritos em Python ou rotinas escritas em
outras linguagens, tais como C ou Fortran (Mais sobre isso no captulo capext).
Orientao a objeto: Tudo em Python um objeto: funes, variveis de todos os tipos e at mdulos (programas escritos em Python) so objetos.
Tipagem automtica: O tipo de uma varivel (string, inteiro, float, etc.) determinado durante a execuo do
cdigo; desta forma, voc no necessita perder tempo definindo 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 simplificada 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, cientficas 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 simplificada 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 de computao cientfica na linguagem Python. Mas para inspirar o trabalho tcnico, nada melhor do
que um poema:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly. Explicit is better than implicit.
Simple is better than complex. Complex is better than complicated.
Flat is better than nested. Sparse is better than dense.
Readability counts. Special cases arent special enough to break
the rules. Although practicality beats purity. Errors should never
pass silently. Unless explicitly silenced. In the face of
ambiguity, refuse the temptation to guess. There should be one- and
preferably only one -obvious way to do it. Although that way may
not be obvious at first unless youre Dutch. Now is better than
never. Although never is often better than \*right\* now. If the
implementation is hard to explain, its a bad idea. If the
implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea - lets do more of those!

1.2 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.2. Usando este Livro

Computao Cientfica com Python, Verso 2.0-alpha

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 cientfica. 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
cientficas 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 tpicos apresentados 7 . 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 Windows, instalem o Linux em uma mquina virtual
8
! A distribuio que recomendo para iniciantes o Ubuntu (www.ubuntu.com).
Enfim, 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 Rio de Janeiro, 2010

7
8

O cdigo fonte do exemplos est disponvel na seguinte URL: http://fccoelho.googlepages.com/CCP_code.zip


Recomendo o VirtualBox (www.virtualbox.org), software livre e fantstico!

Captulo 1. Prefcio: Computao Cientfica

CAPTULO 2

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 cap-obj. Pr-requisitos: Conhecimentos bsicos de programao em qualquer
linguagem.
Neste 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 especificamente para programao em Python.

2.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:
.. _ex-conspy
$ python
Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

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. Palavras reservadas no podem ser utilizadas como nomes de variveis:
>>> for=1
File "<stdin>", line 1
for=1
^
SyntaxError: invalid syntax

A linguagem Python em sua verso atual (2.5), possui 30 palavras reservadas. So elas: 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, 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 elementos do mdulo __builtins__ deve ser redefinidofootnote{Ateno,
os componentes de __builtins__, no geram erros de sintaxe ao ser redefinidos.

Computao Cientfica com Python, Verso 2.0-alpha

O console interativo do Python possui um sistema de ajuda integrado que pode ser usado para acessar a documentao de q
7.3 The for statement
The for statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other
iterable object: ...

2.2 Uso Interativo vs. Execuo a Partir de Scripts


Usurios familiarizados com ambientes de programao cientficos tais como Matlab, R e similares, ficaro 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 sofisticado como o Idle, que vem com a
distribuio padro do Python, ou o Ipython (ver sec_ipython).

Tanto no uso interativo, como na execuo a partir de scripts, o interpretador espera encontrar apenas uma expresso por li
>>> 1+1
2
>>>

No cabealho da shell do Python, acima (listagem ex-conspy), o interpretador identifica 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. No Windows basta um duplo
clique sobre arquivos com extenso .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:
#!/usr/bin/env python

Note que os caracteres \#! devem ser os dois primeiros caracteres do arquivo (como na listagem ex-exec):
#!/usr/bin/env python
print "Al Mundo!"

Depois, resta apenas ajustar as permisses do arquivo para que possamos execut-lo:
$ chmod +x script.py
$ ./script.py sys:1:
DeprecationWarning: Non-ASCII character 4 in file ./teste on line
3, but no encoding declared; see
http://www.python.org/peps/pep-0263.html for details Al Mundo!

Mas que lixo aquele antes do nosso Al mundo? Trata-se do interpretador reclamando do acento circunflexo
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.
Nota: Aqui assume-se que a codificao do seu editor de texto latin1. O importante e casar a codificao
do seu editor de texto com a especificada no incio do seu script.
No exemplo da listagem ex-exec, utilizamos o comando print para fazer com que nosso script produzisse uma
string como sada, ou seja, para escrever no stdout 1 . Como podemos receber informaes pelo stdin? O Python
nos oferece duas funes para isso: input(texto), que executa o que o usurio digitar, sendo portanto
perigoso, e raw_input(texto), que retorna uma string com a resposta do usurio.
1 Todos os processos no Linux e outros sistemas operacionais possuem vias de entrada e sada de dados denominados de stdin e stdout,
respectivamente.

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

Nas listagens que se seguem, alternaremos entre a utilizao de scripts e a utilizao do Python no modo interativo.
A presena do smbolo >>>, caracterstico da shell do Python ser suficiente para diferenciar os dois casos.
Exemplos de scripts viro dentro de caixas.

2.3 Operaes com Nmeros


Noventa e nove por cento das aplicaes cientficas envolvem algum tipo de processamento numrico. Vamos
iniciar nosso contato com o Python atravs dos nmeros:
>>> 2+2 #Comentrio ...
4
>>> 2*2
4
>>> 2**2
4
>>> (50-5*6)/4 #Diviso de inteiros retorna "floor": ...
5
>>> 7/3
2
>>> 7/-3
-3
>>> 7/3.
2.3333333333333335

2.3.1 Operadores aritmticos


Nosso primeiro exemplo numrico (Listagem ex-arit) 2 , 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 precisamos nos referenciar e que podem se modificar. Esta representao
de nmeros chama-se varivel.
O sinal de = utilizado para atribuir valores a variveis:
>>> largura = 20
>>> altura = 5*9
>>> largura * altura
900

Um valor pode ser atribudo a diversas variveis com uma nica operao de atribuio, ou mltiplos valores a
mltiplas variveis (Listagem ex-multatr). Note que no exemplo de atribuio de mltiplos valores a mltiplas
variveis (Listagem ex-multatr, linha 9) os valores poderiam estar em uma tupla:
>>>
>>>
0
>>>
0
>>>
0
>>>
>>>
1
>>>
2
>>>
3

x = y = z = 0
x
y
z
a,b,c=1,2,3
a
b
c

O Python tambm reconhece nmeros reais (ponto-flutuante) e complexos naturalmente. Em operaes entre
nmeros reais e inteiros o resultado ser sempre real. Da mesma forma, operaes entre nmeros reais e complexos
2

Repare como o Python trata a diviso de dois inteiros. Ela retorna o resultado arredondado para baixo

2.3. Operaes com Nmeros

Computao Cientfica com Python, Verso 2.0-alpha

resultam sempre em um nmero complexo. Nmeros complexos so sempre representados por dois nmeros
ponto-flutuante: a parte real e a parte imaginria. A parte imaginria representada com um sufixo j ou J:
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)\*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)

2.3.2 Nmeros complexos


Um Nmero complexo para o Python, um objeto 3 . Podemos extrair as partes componentes de um nmero
complexo c utilizando atributos do tipo complexo: c.real e c.imag. 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:
>>> a=3.0+3.0j
>>> a.real
3.0
>>> a.imag
3.0
>>> abs(a)
4.2426406871192848
>>> sqrt(a.real**2 + a.imag**2)
4.2426406871192848

2.4 Nomes, Objetos e Espaos de Nomes


{espao de nomes} Nomes em Python so identificadores 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 associados 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:
>>> a=3*2**7
>>> a,b = (laranja,banana)

As variveis criadas por atribuio ficam 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
eficincia. Espaos de nomes so dicionrios (ver ss:dict) 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() e globals(), respectivamente. Sempre que o interpretador Python
encontra uma palavra que no pertence ao 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:
3

Assim como os outros tipos de nmeros.

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

>>> maria
Traceback (most recent call last): File "stdin", line 1, in ?
NameError: name maria is not 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 refletir apenas as variveis definidas dentro daquela funo 4 . Ao sair da
funo, o dicionrio local torna-se igual ao global:
>>> a=1
>>> len(globals().items())
4
>>> len(locals().items())
4
>>> def fun():
... a=novo valor
... print len(locals().items())
... print a
...
>>> fun()
1
novo valor
>>> print a
1
>>> len(locals().items())
5
>>> locals()
builtins: module builtin (built-in), name: main, fun:
function fun at 0xb7c18ed4, doc: None, a: 1

Tambm importante lembrar que o espao de nomes local sempre inclui os __builtins__ como vemos
acima.

2.5 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 flexibilidade
em nossos programas.
No Python, uma grande nfase dada simplicidade e flexibilidade de forma a maximizar a produtividade do
programador. No tocante aos tipos e estruturas de dados, esta filosofia 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.

2.5.1 Listas
As listas formam o tipo de dados mais utilizado e verstil do Python. Listas so definidas como uma sequncia de
valores separados por vrgulas e delimitada por colchetes:
>>>
>>>
[1,
>>>
1
4

lista=[1, a, pe]
lista
a, pe]
lista[0]

Mais quaisquer variveis explicitamente definidas como globais

2.5. Estruturas de Dados

Computao Cientfica com Python, Verso 2.0-alpha

>>> lista[2]
pe
>>> lista[-1]
pe

Na listagem ex-lista1, 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 lista[0]. Todas as contagens em Python comeam em 0.
Uma lista tambm pode possuir elementos de tipos diferentes. Na listagem ex-lista1, o elemento 0 um inteiro
enquanto que os outros elementos so strings. Para verificar isso, digite o comando type(lista[0]).
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:
>>> lista=[a,pe, que, 1]
>>> lista[1:3]
[pe, que]
>>> lista[-1]
1
>>> lista[3]
1

O comando lista[1:3], delimita uma fatia que vai do elemento 1 (o segundo elemento) ao elemento imediatamente anterior ao elemento 3. Note que esta seleo inclui o elemento correspondente 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:
>>> lista[2:]
[que, 1]

Este comando significa todos os elementos a partir do elemento 2 (o terceiro), at o final da lista. Este comando
poderia ser utilizado para selecionar elementos do incio da lista: lista[:3], s que desta vez no incluindo o
elemento 3 (o quarto elemento).
Se os dois elementos forem deixados de fora, so selecionados todos os elementos da lista:
>>> lista[:]
[a, pe, que, 1]

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[:]:
>>> lista[:]
[a, pe, que, 1]
>>> lista.append(2) #adiciona 2 ao final
[a, pe, que, 1, 2]
>>> lista.insert(2,[a,b])
>>> lista
[a, pe, [a, b], que, 1, 2]

As listas so conjuntos mutveis, ao contrrio de tuplas e strings, portanto pode-se adicionar(listagem ex-adlista),
modificar ou remover (tabela tab:metlista) elementos de uma lista.
Note que as operaes in situ no alocam memria extra para a operao, ou seja, a inverso ou a ordenao
descritas na tabela :tab:metlista, 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.
10

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

O mtodo L.insert insere um objeto antes da posio indicada pelo ndice. Repare, na listagem ex-adlista, que
o objeto em questo era 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:
>>> lista2=[a,b]
>>> lista.extend(lista2)
>>> lista
[a, pe, [a, b], que, 1, 2, a, b]

J na listagem ex-extlista, os elementos da segunda lista so adicionados, individualmente, ao final da lista original:
>>> lista.index(que)
3
>>> lista.index(a)
0
>>> lista.index(z)
Traceback (most recent call last):
File "input", line 1, in ?
ValueError: list.index(x): x not in list z in lista 0

Conforme ilustrado na listagem ex-buslista, o mtodo L.index retorna o ndice da primeira ocorrncia do valor
dado. Se o valor no existir, o interpretador retorna um ValueError. Para testar se um elemento est presente
em uma lista, pode-se utilizar o comando in 5 como ilustrado na listagem ex-buslista. Caso o elemento faa parte
da lista, este comando retornar 1, caso contrrio retornar 0 6 .
Existem dois mtodos bsicos para remover elementos de uma lista: L.remove e L.pop listagem ex-remlista.
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:
>>> lista.remove("que")
>>> lista
[a, pe, [a, b], 1, 2, a, b]
>>> lista.pop(2)
[a, b]
>>> lista
[a, pe, 1, 2, a, b]

Operadores aritmticos tambm podem ser utilizados para operaes com listas. O operador de soma, +, concatena
duas listas. O operador += um atalho para o mtodo L.extend conforme mostrado abaixo:
>>> lista=[a, pe, 1, 2, a, b]
>>> lista = lista + [novo, elemento]
>>> lista
[a, pe, 1, 2, a, b, novo, elemento]
>>> lista += dois
>>> lista
[a, pe, 1, 2, a, b, d, o, i, s]
>>> lista += [dois]
>>> lista
[a, pe, 1, 2, a, b, d, o, i, s, dois]
>>> li=[1,2]
>>> li*3
[1, 2, 1, 2, 1, 2]

Note que a operao lista = lista + lista2 cria uma nova lista enquanto que o comando +=
aproveita a lista original e a extende. Esta diferena faz com que o operador += seja muito mais rpido, especialmente para grandes listas. O operador de multiplicao, *, um repetidor/concatenador de listas conforme
mostrado ao final da listagem ex-oplista. A operao de multiplicao in situ (*=) tambm vlida.
5

O inverso do operador in, o operador not in e tambm vlido para todas as sequncias.
Verdadeiro e falso: Em Python, quase qualquer coisa pode ser utilizada em um contexto booleano, ou seja, como verdadeiro ou falso.
Por exemplo 0 falso enquanto que todos os outros nmeros so verdadeiros.Uma string, lista, dicionrio ou tupla vazias so falsas enquanto
que as demais so verdadeiras.
6

2.5. Estruturas de Dados

11

Computao Cientfica com Python, Verso 2.0-alpha

Um tipo de lista muito til em aplicaes cientficas, lista numrica sequencial. Para construir estas listas podemos utilizar
>>>
[0,
>>>
[2,
>>>
[1,

range(10)
1, 2, 3, 4, 5, 6, 7, 8, 9]
range(2,20,2) #nmeros pares
4, 6, 8, 10, 12, 14, 16, 18]
range(1,20,2) #nmeros mpares
3, 5, 7, 9, 11, 13, 15, 17, 19]

2.5.2 Tuplas
Uma tupla, uma lista imutvel, ou seja, ao contrrio de uma lista, aps a sua criao, ela no pode ser alterada.
Uma tupla definida de maneira similar a uma lista, com exceo dos delimitadores do conjunto de elementos
que no caso de uma tupla so parnteses:
>>> tu = (Genero, especie, peso, estagio)
>>> tu[0]
Genero
>>> tu[1:3]
(especie, peso)

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. Isto se deve ao fato de as tuplas serem imutveis. Os mtodos append, extend,
e pop naturalmente 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 index. No entanto, podemos usar
in para determinar se um elemento existe em uma tupla, como se faz em listas:
>>> tu=()
>>> tu
()
>>> tu=casa, # Repare na vrgula ao final!
>>> tu
(casa,)
>>> tu=1,2,3,4
>>> tu
(1, 2, 3, 4)
>>> var = w,x,y,z
>>> var
(w,x,y,z)
>>> var = tu
>>> w
1
>>> x
2
>>> y
3
>>> z
4

Conforme exemplificado em ex-criatupla2, uma tupla vazia, definida pela expresso (), j no caso de uma
tupla unitria, isto , com apenas um elemento, fazemos a atribuio com uma vrgula aps o elemento, 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 do exemplo acima, apenas mais longo.
Na stima linha da listagem ex-criatupla2, temos uma extenso do conceito apresentado na linha anterior: a
definio de uma tupla sem a necessidade de parnteses. A este processo, se d o nome de empacotamento de
sequncia. O empacotamento de vrios elementos sempre gera uma tupla.

12

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

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 formatao de strings como veremos mais adiante.
Apesar das tuplas serem imutveis, pode-se contornar esta limitao fatiando e concatenando tuplas. Listas tambm podem ser convertidas em tuplas, com a funo tuple(lista), assim como tuplas podem ser convertidas
em listas atravs da funo list(tupla).
Uma outra aplicao interessante para tuplas, mostrada na listagem ex-criatupla2, 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.

2.5.3 Strings
Strings so um terceiro tipo de sequncias em Python. Strings so sequncias de caracteres delimitados por aspas
simples, string345 ou duplas "string". Todos os operadores discutidos at agora para outras sequncias,
tais como +, *, in, not in, s[i] e s[i:j], tambm so vlidos para strings. Strings tambm podem ser
definidas com trs aspas (duplas ou simples). Esta ltima forma utilizada para definir strings contendo quebras
de linha:
>>> st=123 de oliveira4
>>> len(st)
16
>>> min(st)

>>> max(st)
v
>>> texto ="""primeira linha
segunda linha
terceira linha"""
>>> print texto
primeira linha
segunda linha
terceira linha

Conforme ilustrado na listagem ex-string, uma string uma sequncia de quaisquer caracteres alfanumricos,
incluindos espaos. A funo len(), retorna o comprimento da string, ou de uma lista ou tupla. As funes
min() e 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:
>>> animal=Hamster 1
>>> peso=98 >>>
%s: %s gramas%(animal,peso)
Hamster 1: 98 gramas

Na listagem ex-formstring, temos uma expresso de sintaxe no to bvia mas de grande valor na gerao de
strings. O operador % (mdulo), indica que os elementos da tupla (ou dicionrio) 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. Mas no
. Vejamos porqu:
>>> animal=Hamster 1; peso=98
>>> %s: %s gramas%(animal,peso)

2.5. Estruturas de Dados

13

Computao Cientfica com Python, Verso 2.0-alpha

Hamster 1: 98 gramas
>>> animal + : + peso + gramas
Traceback (most recent call last):
File "input", line 1, in ?
TypeError: cannot concatenate str and int objects

Pelo erro apresentado na listagem ex-concstring, 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.

2.5.4 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 chave : valor, armazenados sem
ordenao. Isto significa que no existem ndices para os elementos de um dicionrio, a informao acessada
atravs das chaves:
>>> Z={C:12, O:16, N:12, Na:40}
>>> Z[O]
16
>>> Z[H]=1
>>> Z Na: 40,
C: 12, H: 1, O: 16, N: 12 Z.keys() [Na, C, H, O,
N] Z.haskey(N) 1

As chaves podem ser de qualquer tipo imutvel: nmeros, strings, tuplas (que contenham apenas tipos imutveis).
Dicionrios possuem os mtodos listados na tabela tab:metdic.
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 exemplificado em ex-criadic, 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() e D.itervalues() criam iteradores. Iteradores permitem
iterar atravs dos tens, chaves ou valores de um dicionrio:
>>> Z.items()
[(Na, 40), (C, 12), (H, 1), (O, 16), (N, 12)]
>>> i=Z.iteritems()
>>> i
dictionary-iterator object at 0x8985d00
>>> i.next()
(Na, 40)
>>> i.next() # e assim por diante...
(C, 12)
>>> k=Z.iterkeys()
>>> k.next()
Na
>>> k.next()
C
>>> k.next()
H
>>> k.next()
O
>>> k.next()
N

14

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

>>> k.next()
Traceback (most recent call last):
File "input", line 1, in ? StopIteration

O uso de iteradores interessante quando se precisa acessar o contedo de um dicionrio, elemento-a-elemento,


sem repetio. Ao final da iterao, o iterador retorna um aviso: StopIteration.

2.5.5 Conjuntos
Reafirmando sua vocao cientfica, 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. O objeto conjunto em Python aceita operaes matemticas de conjuntos tais
como unio, interseo, diferena e diferena simtrica:
>>> a = set(pirapora)
>>> b = set(paranapanema)
>>> a #letras em a
set([i, p, r, a, o])
>>> a - b #Letras em a mas no em b
set([i, o])
>>> a | b #letras em a ou b
set([a, e, i, m, o, n, p, r])
>>> a & b #letras em a e b
set([a, p, r])
>>> a ^ b #letras em a ou b mas no em ambos
set([i, m, e, o, n])

No exemplo ex-conjuntos pode-se observar as seguintes correspondncias entre a notao do Python e a notao
matemtica convencional:
a - b: A B

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

2.6 Controle de fluxo


Em condies normais o interpretador executa as linhas de um programa uma a uma. As excees a este caso
so linhas pertencentes definio 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 fluxo 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 ramificaes. O Python nos disponibiliza trs palavras reservadas para este fim: if , elif e
else. O seu uso melhor demonstrado atravs de um exemplo:
if a == 1: #este bloco executado se a for 1
pass
elif a == 2: #este bloco executado se a for 2
pass
else: #este bloco executado se se nenhum anteriores tiver sido executado
pass

No exemplo acima, 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.
7

Por conveno representa-se conjuntos por letras maisculas.

2.6. Controle de fluxo

15

Computao Cientfica com Python, Verso 2.0-alpha

Uma outra forma elegante e compacta de implementar uma ramificao condicional da execuo de um programa
atravs de dicionrios. As condies so as chaves de um dicionrio cujos valores so funes. Esta soluo no
contempla o else, porm:
desfechos = {1:fun1,2:fun2}
desfechos[1] #executa fun1

2.7 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.

2.7.1 O lao while:


O lao while repete uma tarefa enquanto uma condio for verdadeira (Listagem ex-loops). Esta tarefa consiste
em um ou mais comandos indentados em relao ao comando que inicia o lao. O fim da indentao indica o fim
do bloco de instrues que deve ser executado pelo lao:
while True: #repete indefinidamente
pass
i=0
while i < 10:
i +=1
print i #saida omitida

2.7.2 O lao for:


O lao for nos permite iterar sobre uma sequncia atribuindo os elementos da mesma a uma varivel, sequencialmente, medida que prossegue. Este lao se interrompe automaticamente ao final da sequncia.

2.7.3 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 ex-iterdic ns vimos que dicionrios possuem mtodos especficos para
iterar sobre seus componentes. Agora suponhamos que desejssemos iterar sobre uma lista e seu ndice:
for n,e in enumerate([a,b,c,d,e]):
print "%s: %s"%(n,e)

A funo enumerate (exemplo acima) gera um iterador similar ao visto no exemplo ex-iterdic. O lao for
chama o mtodo next deste iterador repetidas vezes, at que receba a mensagem StopIteration.
O comando zip nos permite iterar sobre um conjunto de seqencias pareando sequencialmente os elementos das
mltiplas listas:
perguntas = [nome,cargo,partido]
respostas = [Lula,Presidente,PT]
for p,r in zip(perguntas,respostas):
print "qual o seu %s? %s"

Podemos ainda desejar iterar sobre uma sequncia em ordem reversa, ou iterar sobre uma sequncia ordenada sem
alterar a sequncia original. Note que no exemplo ex-itsort, a lista original foi convertida em um conjunto (set)
para eliminar as repeties:

16

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

for i in reversed(range(5)):
print i
l=[laranja, leite, manga, ovos, uva, leite, ovos]
for i in sorted(set(l)):
print i

Iteraes podem ser interrompidas por meio da palavra reservada 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
final de um bloco iterativo. Neste caso o bloco definido por else s ser executado se a iterao se completar
normalmente, isto , sem a ocorrncia de break.

2.8 Lidando com erros: Excees


O mtodo da tentativa e erro no exatamente aceito na ortodoxia cientfica mas, frequentemente, utilizado
no dia a dia do trabalho cientfico. 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 8 :
>>> 1/0
Traceback (most recent call last): File "stdin", line 1, in ?
ZeroDivisionError: integer division or modulo by 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 ex-exception. Caso voc queira continuar com a execuo
do programa apesar do erro, poderamos solucionar o problema conforme o exposto abaixo:
>>> for i in range(5):
... try:
...
q=1./i
...
print q
... except ZeroDivisionError:
...
print "Diviso por zero!"
Diviso por zero!
1.0
0.5
0.333333333333
0.25

A construo try: ... except: nos permite verificar a ocorrncia 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,
ou simplesmente no passar nada: except: pass. Pode acontecer ainda que queiramos lidar de forma diferente com cada tipo de erro:
try:
f = open(arq.txt)
s = f.readline()
i = int(s.strip())
8

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

2.8. Lidando com erros: Excees

17

Computao Cientfica com Python, Verso 2.0-alpha

except IOError, (errno, strerror):


print "Erro de I/O: %s: %s"%(errno, strerror)
except ValueError:
print "No foi possvel converter o dado em Inteiro."
except:
print "Erro 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.

2.9 Funes
No Python, uma funo um bloco de cdigo definido por um cabealho especfico e um conjunto de linhas
indentadas, abaixo deste. Funes, uma vez definidas, podem ser chamadas de qualquer ponto do programa
(desde que pertenam ao espao de nomes). Na verdade, uma diferena fundamental entre uma funo e outros
objetos o fato de ser chamvel. Isto decorre do fato de todas as funes possuirem um mtodo 9 chamado
__call__. Todos os objetos que possuam este mtodo podero ser chamados 10 .
O ato de chamar um objeto, em Python, caracterizado pela aposio de parnteses ao nome do objeto. Por
exemplo: func(). Estes parnteses podem ou no conter argumentos. Continue lendo para uma explicao do
que so argumentos.
Funes tambm possuem seu prprio espao de nomes, ou seja, todas as variveis definidas no escopo de uma
funo s existem dentro desta. Funes so definidas pelo seguinte cabealho:
def nome(par1, par2, par3=valordefault, *args, **kwargs):

A palavra reservada def indica a definio 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. Argumentos podem ter valores
default se listados da forma a=1. Argumentos com valores default devem vir necessariamente aps todos os
argumentos sem valores default:
>>> def fun(a,b=1):
...
print a,b
...
>>> fun(2)
2 1
>>> fun(2,3)
2 3
>>> fun(b=5,2)
SyntaxError: non-keyword arg after keyword arg

Por fim, um nmero varivel de argumentos adicionais pode ser previsto atravs de argumentos precedidos por *
ou **. No exemplo abaixo, 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:
>>> def fun(*t, **d):
...
print t, d
>>> fun(1,2,c=2,d=4)
(1,2) {c:3,d:4}
9

Veja o captulo 2 para uma explicao do que so mtodos.


O leitor, neste ponto deve estar imaginando todo tipo de coisas interessantes que podem advir de se adicionar um mtodo {\_\_call\_\_}
a objetos normalmente no chamveis.
10

18

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

Funes so chamadas conforme ilustrado na linha 3 da listagem ex-kwargs. 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 definida no
cabealho da funo.
Muitas vezes conveniente desempacotar os argumentos passados para uma funo a partir de uma tupla ou
dicionrio:
>>>
...
>>>
>>>
1 2

def fun(a,b,c,d):
print a,b,c,d
t=(1,2);di = {d: 3, c: 4}
fun(*t,**di)
4 3

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:
>>>
...
...
>>>
>>>
1 2

def fun2(a, b=1,**outros):


print a, b, outros
dic = {a:1,b:2,c:3,d:4}
fun2(**dic)
{c: 3, d: 4}

Note que no exemplo ex-passdic, os valores cujas chaves correspondem a argumentos declarados, so atribudos
a estes e retirados do dicionrio, que fica apenas com os tens restantes.
Funes podem retornar valores por meio da palavra reservada return:
>>> def soma(a,b):
...
return a+b
...
print "ignorado!"
>>> soma(3,4)
7

A palavra return indica sada imediata do bloco da funo levando consigo o resultado da expresso sua direita.
Nota: Funes sempre retornam algo. Na ausncia de uma linha return, dentro dela, a funo retorna None.

2.9.1 Funes lambda

Funes lambda so pequenas funes annimas que podem ser definidas em apenas uma linha. Por definio, podem conte
>>> def raiz(n):#definindo uma raiz de ordem n
...
return lambda(x):x\*\*(1./n)
>>> r4 = raiz(4) # r4 calcula a raiz de ordem 4
>>> r4(16)
2

Observe no exemplo (ex-lamb), que lambda lembra a definio 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
modificar 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.

2.9.2 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 next():

2.9. Funes

19

Computao Cientfica com Python, Verso 2.0-alpha

>>> def letras(palavra):


for i in palavra:
yield i
>>> for L in letras(gato): print L
g
a
t
o

Como vemos acima, um gerador uma funo sobre a qual podemos iterar.

2.9.3 Decoradores
Decoradores so uma alterao da sintaxe do Python, introduzida a partir da verso 2.4, para facilitar a modificao de funes (sem alter-las), adicionando funcionalidade.
Nesta seo vamos ilustrar o uso bsico de decoradores.
Usos mais avanados podem ser encontrados nesta url:
url{http://wiki.python.org/moin/PythonDecoratorLibrary}:
def faznada(f):
def novaf(*args,**kwargs):
print "chamando...",args,kwargs
return f(*args,**kwargs)
novaf.__name__ = f.__name__
novaf.__doc__ = f.__doc__
novaf.__dict__.update(f.__dict__)
return novaf

Acima, 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 abaixo, nos mostra como utilizar
o decorador:
>>> @faznada
def soma(a,b):
return a+b
>>> soma(1,2)
chamando... (1, 2)
3

O decorador da listagem acima, na verdade adiciona uma linha de cdigo funo que decora: print
"chamando...",args,kwargs.
Repare que ele passa alguns atributos bsicos da funo original para a nova funo, de forma que a funo
decorada possua o mesmo nome, docstring, etc. que a funao original. 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:
from functools import wraps
def meuDecorador(f):
@wraps(f)
def novaf(*args, **kwds):
print Chamando funcao decorada
return f(*args, **kwds)
return novaf

Podemos testar o novo decorador:


>>> @meuDecorador
... def exemplo():
...
"""Docstring"""
...
print funcao exemplo executada!
>>> exemplo()
Chamando funcao decorada

20

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

funcao exemplo executada!


>>> exemplo.__name__
exemplo
>>> exemplo.__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 de duplicao. Aplicaes cientficas 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.

2.9.4 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 retorna a docstring. Portanto a
incluso de docstrings auxilia tanto o programador quanto o usurio:
>>> def soma(a,b):
...
""" Esta funcao soma dois numeros:
...
>>> soma(2,3)
...
5
...
"""
...
return a+b
>>> help(soma)
Help on function soma in module main:
soma(a, b)
Esta funcao soma dois numeros:
>>> soma(2,3)
5

No exemplo acima, adicionamos uma docstring explicando a finalidade 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.

2.10 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 .py, facilitando a re-utilizao daquele
cdigo. Arquivos com cdigo Python construdos 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 cap:obj) e variveis definidas
no mdulo so acessveis como atributos deste objeto. O comando from modulo import * importa todas as
funes e classes definidas pelo mdulo diretamente para o espao de nomes global 11 do nosso script. Deve ser
utilizado com cuidado pois nomes iguais pr-existentes no espao de nomes global sero redefinidos. Para evitar
este risco, podemos substituir o * por uma sequncia de nomes correspondente aos objetos que desejamos importar: from modulo import nome1, nome2. Podemos ainda renomear um objeto ao import-lo: import
numpy as N ou ainda from numpy import det as D.
1
2

# Disponvel no pacote de programas como: fibo.py


#modulo para calcular a serie de fibonacci ate o numero n.
11

Dicionrio de nomes de variveis e funes vlidos durante a execuo de um script

2.10. Mdulos e Pacotes

21

Computao Cientfica com Python, Verso 2.0-alpha

3
4
5
6
7
8

def fib(n):
a, b = 0, 1
while b < n:
print b,
a, b = b, a+b

9
10
11
12
13
14

if __name__=="__main__":
import sys
print __name__
print sys.argv
fib(int(sys.argv[1]))

Seja um pequeno mdulo como o do exemplo ex-modfib. Podemos importar este mdulo em uma sesso do
interpretador iniciada no mesmo diretrio que contm o mdulo:
>>> import fibo
>>> fibo.fib(50)
1 1 2 3 5 8 13 21 34
>>> fibo.__name__
fibo

Note que a funo declarada em fibo.py chamada como um mtodo de fibo. 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, __name__ igual ao nome do mdulo (sem a terminao .py). Se foi executado diretamente (python
modulo.py), __name__ igual a __main__.
Durante a importao de um mdulo, todo o cdigo contido no mesmo executado, entretanto como o __name__
de fibo fibo e no __main__, as linhas abaixo do if no so executadas. Qual ento a funo destas linhas de
cdigo? Mdulos podem ser executados diretamente pelo interpretador, sem serem importados primeiro. Vejamos
isso no exemplo ex-runmod. Podemos ver que agora o __name__ do mdulo __main__ e, portanto, as linhas
de cdigo dentro do bloco if so executadas. Note que neste caso importamos o mdulo sys, cujo atributo argv
nos retorna uma lista com os argumentos passados para o mdulo a partir da posio 1. A posio 0 sempre o
nome do mdulo:
$ python fibo.py 60
__main__
[fibo.py, 60]
1 1 2 3 5 8 13 21 34 55

Qualquer arquivo com terminao *.py} considerado um mdulo 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 arquivo no precisa conter
nada). Portanto, pode-se criar um pacote simplesmente criando um diretrio chamado, por exemplo, pacote
contendo os seguintes mdulos: modulo1.py e modulo2.py 12 . Um 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:
>>> import pacote
>>> dir(pacote)
[modulo1,modulo2]
12

22

Alm de __init__.py, naturalmente.

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

2.10.1 Pacotes teis para Computao Cientfica


Numpy
Um dos pacotes mais importantes, seno o mais importante para quem deseja utilizar o Python em computao
cientfica, o numpy. Este pacote contm uma grande variedade de mdulos voltados para resoluo de problemas
numricos de forma eficiente.
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:
http://www.scipy.org/Numpy_Example_List
Na listagem abaixo, 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:
>>> from numpy import arange
>>> a = arange(9)
>>> print a
[0 1 2 3 4 5 6 7 8]
>>> a.shape =(3,3)
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> from numpy.linalg import det
>>> det(a)
0.0

Na primeira linha do exemplo acima, importamos todas a funo arange definida no mdulo numpy.
Na segunda linha, usamos a funo arange(9) para criar um vetor a 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 em zero. Como
em uma lista, a[0] o primeiro elemento do vetor a. O objeto que criamos, do tipo array, definido 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 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 a em uma matriz 3 x 3, basta atribuir o valor (3,3) a shape. Conforme j vimos, atributos e
mtodos de objetos so referenciados usando-se esta notao de ponto 13 .
Na quinta linha, usamos o comando print para mostrar a alterao na forma da varivel a.
Na sexta linha importamos a funo det do mdulo numpy.linalg para calcular o determinante da nossa
matriz. A funo det(a) nos informa, ento, que o determinante da matriz a $0.0$.
Scipy
Outro mdulo muito til para quem faz computao numrica com Python, o scipy. O 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.
13

nome_da_varivel.atributo.

2.10. Mdulos e Pacotes

23

Computao Cientfica com Python, Verso 2.0-alpha

Uma lista extensa de exemplos de utilizao do scipy pode ser encontrada no seguinte endereo:
http://www.scipy.org/Documentation.

2.11 Documentando Programas


Parte importante de um bom estilo de trabalho em computao cientfica 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 para ferramentas de documentao automtica. A principal ferramenta de documentao disponvel para desenvolvedores o pydoc, que vem junto com a distribuio
da linguagem.

2.11.1 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 para examinar a documentao do prprio mdulo pydoc. Podemos fazer
o mesmo para acessar qualquer mdulo disponvel no PYTHONPATH.
O pydoc 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 especificada 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 sofisticadas, desenvolvidas por terceiros, esto disponveis para automatizar a documentao de programas Python. Exploraremos uma alternativa a seguir.

2.11.2 Epydoc
O Epydoc uma ferramenta consideravelmente mais sofisticada do que o mdulos 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 docstrings.
O uso do Epydoc similar ao do pydoc. Entretanto, devido sua maior versatilidade, suas opes so bem mais
numerosas:
epydoc -h

24

Captulo 2. Fundamentos da Linguagem

Computao Cientfica com Python, Verso 2.0-alpha

No vamos discutir em detalhes as vrias opes do Epydoc pois estas encontram-se bem descritas na pgina
man do programa. Ainda assim, vamos comentar algumas funcionalidades interessantes.
A capacidade de gerar a documentao em , facilita a 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 verifica o quo bem nosso programa ou pacote encontra-se 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 grficos sobre nosso programa, incluindo um diagrama
UML(Figura Verso html da documentao gerada pelo Epydoc).

Figura 2.1: Verso html da documentao gerada pelo Epydoc


Dada toda esta funcionalidade, vale a pena conferir o Epydoc 14 .

2.12 Exerccios
1. Execute manualmente, no console Python, algumas iteraes de um objeto gerado por enumerate e observe o seu resultado.
2. Adicione a funcionalidade else listagem ex-brdict utilizando excees.
3. Escreva um exemplo de iterao empregando break, continue e else(ao final).

14

http://epydoc.sourceforge.net

2.12. Exerccios

25

Computao Cientfica com Python, Verso 2.0-alpha

26

Captulo 2. Fundamentos da Linguagem

CAPTULO 3

Programao Orientada a Objetos

Introduo programao orientada a objetos e sua implementao na linguagem Python. Prrequisitos: Ter lido o captulo cap_fundamentos.
Programao orientada a objetos um tema vasto na literatura computacional. Neste captulo introduziremos os
recursos 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 especficos do programa (goto, jump, etc.)
Exemplos 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 popularidade, e linguagens at ento no estruturadas (Basic, Fortran,
etc.) ganham verses estruturadas. Outros exemplos de linguagens 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 especfico.

3.1 Objetos
Um tema frequente em computao cientfica, 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 de programao, que a linguagem no impe nenhum estilo de programao ao usurio.

27

Computao Cientfica com Python, Verso 2.0-alpha

Em Python pode-se programar de forma no estruturada, estruturada, procedural, funcional ou orientada a objeto. Alm de acomodar as preferncias de cada usurio, permite 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, justificados pelo tipo de aplicao a que se prope.

3.1.1 Definindo 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 definio de classes em Python pode ser feita de forma mais ou menos genrica. partir das classes, podemos
construir instncias ajustadas para representar exemplares especficos de objetos representados pela classe:
class Objeto: pass

Na listagem acima, temos uma definio mnima de uma classe de objetos. Criamos uma classe chamada 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 definir alguns de seus atributos. Como exemplo vamos
criar uma classe que represente pessoas:
class pessoa: idade=20 altura=170 sexo=masculino peso=70

Na listagem acima, definimos alguns atributos para a classe pessoa. Agora, podemos criar instncias do objeto
pessoa e estas instncias herdaro estes atributos:
>>> maria = pessoa()
>>> maria.peso
70
>>> maria.sexo
masculino
>>> maria
main.pessoa instance at 0x402f196c

Entretanto, os atributos definidos para o objeto pessoa (listagem acima), so atributos que no se espera que
permaneam os mesmos para todas as possveis instncias (pessoas). O mais comum que os atributos especficos
das instncias sejam fornecidos no momento da sua criao. Para isso, podemos definir quais as informaes
necessrias para criar uma instncia do objeto pessoa:
class pessoa:
def __init__(self,idade,altura,sexo,peso):
self.idade=idade
self.altura=altura
self.sexo=sexo
self.peso=peso

Agora podemos testar a nova classe:


>>> maria = pessoa()
Traceback (most recent call last):
File "stdin", line 1, in ? TypeError: init() takes exactly 5
arguments (1 given)
>>> maria=pessoa(35,155,feminino,50)
>>> maria.sexo
feminino

28

Captulo 3. Programao Orientada a Objetos

Computao Cientfica com Python, Verso 2.0-alpha

A funo __init__ que definimos na nova verso da classe pessoa (listagem ex:classe4), uma funo padro
de classes (tambm conhecida como construtora da classe), que executada automaticamente, sempre que
uma nova instncia criada. Assim, se no passarmos as informaes requeridas como argumentos pela funo
__init__, recebemos uma mensagem de erro. Na linha 11 da listagem ex:classe4 vemos como instanciar a nova
verso da classe pessoa.

3.1.2 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. {classe!mtodos} Mtodos so definidos como funes pertencentes ao objeto. A funo {\_\_init\_\_} que vimos h pouco um mtodo
presente em todos os objetos, ainda que no seja definida pelo programador. Mtodos so sempre definidos 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 ex:classe4). O argumento self tambm deve ser o primeiro argumento a ser declarado na
lista de argumentos de um mtodo.

3.1.3 Herana
{Herana} Para simplificar a definio 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 ex:her).
class Vertebrado: vertebra = True class Mamifero(Vertebrado): mamas = True class Carnivoro(Mamifero): longoscaninos = True bicho = Carnivoro() dir(bicho) [doc, module, longoscaninos, mamas, vertebra] issubclass(Carnivoro,Vertebrado) True bicho.class class main.Carnivoro at
0xb7a1d17c isinstance(bicho,Mamifero) True
Na listagem ex:her, 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 isinstance. A funo issubclass, de forma anloga, nos permite verificar as relaes
parentais de duas classes.

3.1.4 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 exemplificar, vamos definir uma
classe vazia:
class Cachorro: pass rex=Cachorro() rex.dono = Pedro rex.raca = Pastor rex.peso=25 rex.dono
Pedro laika = Cachorro() laika.dono AttributeError: Cachorro instance has no attribute dono
No exemplo ex:classbag, a classe Cachorro criada vazia, mas ainda assim, atributos podem ser atribuidos a
suas instncias, sem alterar a estrutura da classe. {Exerccios}
1. Utilizando os conceitos de herana e os exemplos de classes apresentados, construa uma classe Cachorro
que herde atributos das classes Carnivoro e Mamfero e crie instncias que possuam donos, raas, etc.
2. No Python, o que define um objeto como chamvel (funes, por exemplo) a presena do mtodo
{\_\_call\_\_}. Crie uma classe, cujas instncias podem ser chamadas, por possurem o mtodo
{\_\_call\_\_}.
{Criando Grficos em Python}(ch:plot) {Introduo produo de figuras de alta qualidade utilizando o pacote
matplotlib. \textbf{Pr-requisitos:} Captulo \ref{cap:intro}.}
{E} {xiste} um nmero crescente de mdulos para a criao de grficos cientficos com Python. Entretanto, at o
momento da publicao deste livro, nenhum deles fazia parte da distribuio oficial do Python.
Para manter este livro prtico e conciso, foi necessrio escolher apenas um dos mdulos de grficos disponveis,
para apresentao neste captulo.

3.1. Objetos

29

Computao Cientfica com Python, Verso 2.0-alpha

O critrio de escolha levou em considerao os principais valores da filosofia da linguagem Python (ver listagem
ex:fil): simplicidade, elegncia, versatilidade, etc. poca, a aplicao destes critrios nos deixou apenas uma
opo: o mdulo matplotlib 1 .

30

http://matplotlib.sourceforge.net

Captulo 3. Programao Orientada a Objetos

CAPTULO 4

Introduo ao Matplotlib

O mdulo matplotlib (MPL) voltado para a gerao de grficos bi-dimensionais de vrios tipos, e se presta para
utilizao tanto interativa quanto em scripts, aplicaes web ou integrada a interfaces grficas (GUIs) de vrios
tipos.
A instalao do MPL tambm segue o padro de simplicidade do Python (listagem ex:instmat). Basta baixar o
pacote tar.gz do stio, descompactar e executar o comando de instalao.
{lstlisting} [ caption=Instalando o matplotlib ,label=ex:instmat] :math:$ python setup.py install end{lstlisting}
O MPL procura tornar simples tarefas de plotagem, simples e tarefas complexas, possveis (listagemref{ex:hist},
figura ref{fig:hist}). Os grficos 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. begin{lstlisting}[caption=Criando um histograma no modo interativo ,label=ex:hist] >>>
from pylab import * >>> from numpy.random import * >>> x=normal(0,1,1000) >>> hist(x,30) ... >>> show()
end{lstlisting}
begin{figure} centering includegraphics[width=10cm]{hist.png} caption{Histograma simples a partir da
listagem ref{ex:hist}} label{fig:hist}
end{figure}
Podemos tambm embutir a sada grfica 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 instaladosfootnote{Veja no sitio do MPL os pr-requisitos para cada uma das GUIs}.
Para gerar os grficos e se integrar a interfaces grficas, o MPL se utiliza de diferentes backends de acordo com
nossa escolha (Wx, GTK, Tk, etc).
subsection{Configurando o MPL} O MPL possui valores textit{default} para propriedades genricas dos
grficos gerados. Estas configuraes ficam em um arquivo texto chamado textbf{matplotlibrc}, que
deve ser copiado da distribuio do MPL, editado conforme as preferncias do usurio e renomeado para
texttt{$:math:$/.matplotlibrc}, ou seja, deve ser colocado como um arquivo oculto no diretrio textbf{home}
do usurio.
A utilizao de configuraes padro a partir do textbf{matplotlibrc} mais til na utilizao interativa do MPL,
pois evita a necessidade de configurar cada figura de acordo com as nossas preferncias, a cada vez que usamos
o MPLfootnote{Para uma descrio completa das caractersticas de grficos que podem ser configuradas, veja o
ememplo de textbf{matplotlibrc} que fornecido com a distribuio do MPL.}.
subsection{Comandos Bsicos} Os comandos relacionados diretamente gerao de grficos so bastante numerosos(tabela ref{tab:plot}); mas, alm destes, existe um outro conjunto ainda maior de comandos, voltados
para o ajuste fino de detalhes dos grficos (ver tabela ref{tab:lineprop}, para uma amostra), tais como tipos de
linha, smbolos, cores, etc. begin{table} centering begin{tabular}{l|l} hline texttt{bar} & Grfico de barras \
hline texttt{cohere} & Grfico da funo de coerncia \ hline texttt{csd} & Densidade espectral cruzada \ hline
texttt{errorbar} & Grfico com barras de erro \ hline texttt{hist} & Histograma \ hline texttt{imshow} & Plota

31

Computao Cientfica com Python, Verso 2.0-alpha

imagens \ hline texttt{pcolor} & Grfico de pseudocores \ hline texttt{plot} & Grfico de linha \ hline texttt{psd}
& Densidade espectral de potncia \ hline texttt{scatter} & Diagrama de espalhamento \ hline texttt{specgram} &
Espectrograma \ hline texttt{stem} & Pontos com linhas verticais \ hline end{tabular} caption{Principais comandos de plotagem do MPL}label{tab:plot} end{table} Uma explicao mais detalhada dos comandos apresentados
na tabela ref{tab:plot}, ser dada nas prximas sees no contexto de exemplos.
section{Exemplos Simples} subsection{O comando texttt{plot}} O comando plot um comando muito verstil, pode receber um nmero varivel de argumentos, com diferentes sadas. begin{lstlisting}[frame=trBL,
caption=Grfico de linha ,label=ex:linha] from pylab import * plot([1,2,3,4]) show() end{lstlisting} begin{figure}
centering includegraphics[width=10cm]{line.png} caption{Reta simples a partir da listagem
ref{ex:linha}} label{fig:line}
end{figure} Quando texttt{plot} recebe apenas uma sequncia de nmeros (lista, tupla ou array), ele gera um
grfico (listagem ref{ex:linha}) utilizando os valores recebidos como valores de textbf{y} enquanto que os valores
de textbf{x} so as posies destes valores na sequncia.
Caso duas sequncias de valores sejam passadas para texttt{plot} (listagem ref{ex:ponto}), a primeira atribuida
a textbf{x} e a segunda a textbf{y}. Note que, neste exemplo, ilustra-se tambm a especificao do tipo de sada
grfica como uma sequncia de pontos. O parmtero texttt{ro} indica que o smbolo a ser usado um crculo
vermelho. begin{lstlisting}[frame=trBL, caption=Grfico de pontos com valores de textbf{x} e textbf{y} especificados. ,label=ex:ponto] from pylab import * plot([1,2,3,4], [1,4,9,16], ro) axis([0, 6, 0, 20]) savefig(ponto.png)
show() end{lstlisting} begin{figure}
centering includegraphics[width=10cm]{ponto.png} caption{Grfico com smbolos circulares a partir da listagem ref{ex:ponto}} label{fig:ponto}
end{figure} Na linha 3 da listagem ref{ex:ponto} especifica-se tambm os limites dos eixos como uma lista de
quatro elementos: os valores mnimo e mximo dos eixos textbf{x} e textbf{y}, respectivamente. Na linha 4,
vemos o comando texttt{savefig} que nos permite salvar a figura 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 grfico. Existe mais de uma maneira de
determinar as propriedades das linhas geradas pelo comando texttt{plot}. Uma das maneiras mais diretas atravs
dos argumentos listados na tabela ref{tab:lineprop}. Nos diversos exemplos apresentados neste captulo, alguns
outros mtodos sero apresentados e explicadosfootnote{Para maiores detalhes consulte a documentao do MPL
(http://matplotlib.sourceforge.net).}.
Vale a pena ressaltar que o comando texttt{plot} aceita, tanto listas, quanto arrays dos mdulos texttt{Numpy},
texttt{Numeric} ou texttt{numarray}. Na verdade todas a sequncias de nmeros passadas para o comando
texttt{plot} so convertidas internamente para texttt{arrays}. begin{table} centering caption{Argumentos que
podem ser passados juntamente com a funo plot para controlar propriedades de linhas.}label{tab:lineprop} begin{tabular}{l|l} Propriedade & Valores \ hline texttt{alpha} & transparncia (0-1) \ texttt{antialiased} & true |
false \ texttt{color} & Cor: b,g,r,c,m,y,k,w \ texttt{label} & legenda \
texttt{linestyle} & verb| : -. -| \
texttt{linewidth} & Espessura da linha (pontos) \ texttt{marker} & verb|+ o .
s v x > < ^|\
texttt{markeredgewidth} & Espessura da margem do smbolo \ texttt{markeredgecolor} & Cor da margem
do smbolo \ texttt{markerfacecolor} & Cor do smbolo \ texttt{markersize} & Tamanho do smbolo (pontos) \ hline end{tabular} end{table} subsection{O Comando texttt{subplot}} O MPL trabalha com o conceito de textit{figura} independente do de textit{eixos}. O comando texttt{gcf()} retorna a figura atual, e
o comando texttt{gca()} retorna os eixos atuais. Este detalhe nos permite posicionar os eixos de um grfico em posies arbitrrias dentro da figura. Todos os comandos de plotagem so realizados nos eixos atuais. Mas, para a maioria dos usurios, estes detalhes so transparentes, ou seja, o usrio no precisa tomar
conhecimento deles. A listagem ref{ex:subplot} apresenta uma figura com dois eixos feita de maneira bastante simples. lstinputlisting[frame=trBL, caption=Figura com dois grficos utilizando o comando subplot.
,label=ex:subplot]{code/subplot.py} %begin{lstlisting}[float,frame=trBL, caption=Figura com dois grficos utilizando o comando subplot. ,label=ex:subplot]
%end{lstlisting} begin{figure}
centering includegraphics[width=10cm]{subplot.png} caption{Figura com dois grficos utilizando o
comando subplot, a partir da listagem ref{ex:subplot}} label{fig:subplot}

32

Captulo 4. Introduo ao Matplotlib

Computao Cientfica com Python, Verso 2.0-alpha

end{figure}
O comando texttt{figure(1)}, na linha 11 da listagem ref{ex:subplot}, opcional, mas pode vir a ser importante
quando se deseja criar mltiplas figuras, antes de dar o comando texttt{show()}. Note pelo primeiro comando
texttt{plot} da listagem ref{ex:subplot}, que o comando texttt{plot} aceita mais de um par textbf{(x,y)}, cada qual
com seu tipo de linha especificado independentemente. subsection{Adicionando Texto a Grficos} O MPL nos
oferece quatro comandos para a adio de texto a figuras: texttt{title}, texttt{xlabel}, texttt{ylabel}, e texttt{text}.
O trs primeiros adicionam ttulo e nomes para os eixos textbf{x} e textbf{y}, respectivamente.
Todos os comandos de insero de texto aceitam argumentos (tabela ref{tab:texto}) adicionais para formatao
do texto. begin{table} caption{Argumentos opcionais dos comandos de insero de texto.}label{tab:texto} begin{tabular}{l|l} textbf{Propriedades} & textbf{Valores} \ hline 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 \ hline end{tabular} end{table} O MPL tambm nos permite utilizar um subconjunto
da linguagem TeX para formatar expresses matemticas (Listagem ref{ex:mathtext} e figura ref{fig:mathtext}.
Para inserir expresses em TeX, necessrio que as strings contendo as expresses matemticas sejam raw
stringsfootnote{exemplo: rraw string}, e delimitadas por cifres($). [frame=trBL, caption=Formatando texto
e expresses matemticas ,label=ex:mathtext] {code/mathtext.py}

33

Computao Cientfica com Python, Verso 2.0-alpha

34

Captulo 4. Introduo ao Matplotlib

CAPTULO 5

Exemplos Avanados

O MPL capaz produzir uma grande variedade grficos mais sofisticados do que os apresentados at agora.
Explorar todas as possibilidades do MPL, foge ao escopo deste texto, mas diversos exemplos de outros tipos de
grficos sero apresentados junto com os exemplos da segunda parte deste livro.

5.1 Mapas
O matplotlib pode ser extendido para plotar mapas. Para isso precisamos instalar o Basemap toolkit. Se voc j
instalou o matplotlib, 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 ex:mapa).
[frame=trBL, caption=Plotando o globo terrestre,label=ex:mapa] {code/mapa.py}
Na listagem fig:mapa, criamos um objeto map, que uma instncia, da classe Basemap (linha 4). A classe
Basemap possui diversos atributos, mas neste exemplo estamos definindo apenas alguns como a projeo (Robinson), coordenadas do centro do mapa, {lat\_0} e {lon\_0}, resoluo dos contornos, ajustada para baixa, e tamanho
mnimo de detalhes a serem desenhados, {area\_thresh}, definido como 1000km2 .
{Ferramentas de Desenvolvimento} {Exposio de ferramentas voltadas para o aumento da produtividade em um
ambiente de trabalho em computao cientfica. \textbf{Pr-requisitos:} Captulos \ref{cap:intro} e \ref{cap:obj}}
{C}omo em todo ambiente de trabalho, para aumentar a nossa produtividade em Computao Cientfica, existem
vrias ferramentas alm da linguagem de programao. Neste captulo falaremos das ferramentas mais importantes, na opinio do autor. {Ipython}{Ipython} (sec:ipython) A utilizao interativa do Python de extrema
valia. Outros ambientes voltados para computao cientfica, tais como Matlab, R, Mathematica dentre outros,
usam o modo interativo como seu principal modo de operao. Os que desejam fazer o mesmo com o Python,
podem se beneficiar imensamente do Ipython.
O Ipython uma verso muito sofisticada da shell do Python voltada para tornar mais eficiente a utilizao interativa da linguagem Python. {Primeiros Passos} Para iniciar o Ipython, digitamos o seguinte comando:
{lstlisting} [language=csh, caption= ,label=] :math:$ ipython [opes] arquivos end{lstlisting} Muita das opes
que controlam o funcionamento do Ipython no so passadas na linha de comando, esto especificadas no arquivo
texttt{ipythonrc} dentro do diretrio texttt{~/.ipython}.
Quatro opes do Ipython so consideradas especiais e devem aparecer em primeiro lugar, antes de qualquer outra
opo: texttt{-gthread, -qthread, -wthread, -pylab}. As trs primeiras opes so voltadas para o uso interativo de
mdulos na construo de GUIs (interfaces grficas), respectivamente texttt{GTK}, texttt{Qt}, texttt{WxPython}.
Estas opes iniciam o Ipython em um thread separado, de forma a permitir o controle interativo de elementos
grficos. A opo texttt{-pylab} permite o uso interativo do pacote matplotlib (Ver captulo ref{ch:plot}). Esta

35

Computao Cientfica com Python, Verso 2.0-alpha

opo executar lstinline{from pylab import *} ao iniciar, e permite que grficos sejam exibidos sem necessidade
de invocar o comando texttt{show()}, mas executar scripts que contm texttt{show()} ao final, corretamente.
Aps uma das quatro opes acima terem sido especificadas, 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 especificao de opes.
Todas as opes podem ser prefixadas por no para serem desligadas (no caso de serem ativas por default).
Devido ao grande nmero de opes existentes, no iremos list-las 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. subsection{Comandos Mgicos}index{Ipython!Comandos mgicos} Uma
das caractersticas mais teis do Ipython o conceito de comandos mgicos. No console do Ipython, qualquer linha comeada pelo caractere %, considerada uma chamada a um comando mgico. Por exemplo,
texttt{%autoindent} liga a indentao automtica dentro do Ipython.
Existe uma opo que vem ativada por default no texttt{ipythonrc}, denomidada texttt{automagic}. Com esta
funo, os comandos mgicos podem ser chamados sem o %, ou seja texttt{autoindent} entendido como
texttt{%autoindent}. Variveis definidas pelo usurio podem mascarar comandos mgicos. Portanto, se eu definir
uma varivel lstinline{autoindent = 1}, a palavra texttt{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. Veja a documentao do
Ipython sobre como fazer isso.
O comando mgico texttt{%magic} retorna um explicao dos comandos mgicos existentes.
begin{description} item[texttt{%Exit}] Sai do console Ipython.
item [texttt{%Pprint}] Liga/desliga formatao do texto. item [texttt{%Quit}] Sai do Ipython sem pedir confirmao. item [texttt{%alias}] Define um sinnimo para um comando.
end{description}
Voc pode usar texttt{%1} para representar a linha em que o comando texttt{alias foi chamado}, por exemplo:
begin{lstlisting}[caption= ,label=] In [2]: alias all echo Entrada entre parnteses: (%l) In [3]: all Ola mundo
Entrada entre parnteses: (Ola mundo) end{lstlisting}
begin{description} item[texttt{%autocall}] Liga/desliga modo que permite chamar funes sem os parnteses.
Por exemplo: texttt{fun 1} vira fun(1).
item [texttt{%autoindent}] Liga/desliga auto-indentao. item [texttt{%automagic}] Liga/desliga auto-mgica.
item [texttt{%bg}] Executa um comando em segundo plano, em um thread separado. Por exemplo: texttt{%bg
func(x,y,z=1)}. Assim que a execuo 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 texttt{jobs.results[5]}
end{description}
O Ipython possui um gerenciador de tarefas acessvel atravs do objeto texttt{jobs}. Para maiores informaes
sobre este objeto digite texttt{jobs?}. O Ipython permite completar automaticamente um comando digitado parcialmente. Para ver todos os mtodos do objeto texttt{jobs} experimente digitar texttt{jobs.}seguido da tecla
<TAB>.
begin{description} item[texttt{%bookmark}]Gerencia o sistema de marcadores do Ipython. Para saber mais
sobre marcadores digite texttt{%bookmark?}.
item [texttt{%cd}] Muda de diretrio.
item [texttt{%colors}]Troca o esquema de cores.
item
[texttt{%cpaste}]Cola e executa um bloco pr-formatado da rea de transferncia (clipboard). O bloco tem que
ser terminado por uma linha contendo lstinline{}. item [texttt{%dhist}]Imprime o histrico de diretrios. item
[texttt{%ed}]Sinnimo para texttt{%edit} item [texttt{%edit}] Abre um editor e executa o cdigo editado ao sair.
Este comando aceita diversas opes, veja a documentao. end{description}
O editor a ser aberto pelo comando texttt{%edit} o que estiver definido na varivel de ambiente
texttt{$EDITOR. Se esta varivel no estiver definida, o Ipython abrir o vi. Se no for especificado o nome de
um arquivo, o Ipython abrir um arquivo temporrio para a edio.
36

Captulo 5. Exemplos Avanados

Computao Cientfica com Python, Verso 2.0-alpha

O comando {\%edit} apresenta algumas convenincias. Por exemplo: se definirmos uma funco fun em uma
sesso de edio ao sair e executar o cdigo, esta funo permanecer definida no espao de nomes corrente.
Ento podemos digitar apenas {\%edit fun} e o Ipython abrir o arquivo que a contm, posicionando o cursor,
automaticamente, na linha que a define. Ao sair desta sesso de edio, a funo editada ser atualizada.
In [6]:
IPython will make a temporary file named: /tmp/ipythoneditGuUWr.py done. Executing edited
code... Out[6]:def fun(): print fun funa(): print funa
In [7]:fun() fun
In [8]:funa() funa
In [9]:
done. Executing edited code...
{\%hist} Sinnimo para {\%history}.
[{\%history}]Imprime o histrico de comandos. Comandos anteriores tambm podem ser acessados atravs
da varivel {\_i<n>}, que o n-simo comando do histrico.
In [1]:
1: ip.magic(
In [2]:
1: ip.magic(
2: ip.magic(
O Ipython possui um sofisticado sistema de registro das sesses. Este sistema controlado pelos seguintes comandos mgicos: {\%logon, \%logoff, \%logstart e \%logstate}. Para maiores informaes consulte a documentao.
{\%lsmagic} Lista os comandos mgicos disponveis.
[{\%macro}]Define um conjunto de linhas de comando como uma macro para uso posterior: {\%macro
teste 1 2} ou {\%macro macro2 44-47 49}.
[{\%p}]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 definido.
[{\%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}]Mostra um guia de referncia rpida
[{\%quit}]Sai do Ipython.
[{\%r}] Repete o comando anterior.
[{\%rehash}]Atualiza a tabela de sinnimos com todas as entradas em {\$PATH}. Este comando no verifica permisses de execuo e se as entradas so mesmo arquivos. {\%rehashx} faz isso, mas mais lento.
[{\%rehashdir}]Adiciona os executveis dos diretrios especificados tabela de sinnimos.
[{\%rehashx}]Atualiza a tabela de sinnimos com todos os arquivos executveis em {\$PATH}.
[{\%reset}]Re-inicializa o espao de nomes removendo todos os nomes definidos pelo usurio.
[{\%run}] Executa o arquivo especificado dentro do Ipython como um programa.

5.1. Mapas

37

Computao Cientfica com Python, Verso 2.0-alpha

[{\%runlog}] Executa arquivos como logs.


[{\%save}]Salva um conjunto de linhas em um arquivo.
[{\%sx}] 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 utilizando o mdulo timeit.
[{\%unalias}]Remove um sinnimo.
[{\%upgrade}]Atualiza a instalao do Ipython.
[{\%who}]Imprime todas as variveis interativas com um mnimo de formatao.
[{\%who\_ls}]Retorna uma lista de todas as variveis interativas.
[{\%whos}]Similar ao {\%who}, com mais informao sobre cada varivel.
Para finalizar, o Ipython um excelente ambiente de trabalho interativo para computao cientfica, especialmente
quando invocado coma opo -pylab. O modo pylab alm de grficos, tambm oferece uma srie de comandos
de compatibilidade com o MATLAB (veja captulo ch:plot). O pacote principal do numpy tambm fica exposto
no modo pylab. Subpacotes do numpy precisam ser importados manualmente. {Editores de Cdigo}{editores}
Na edio de programas em Python, um bom editor de cdigo pode fazer uma grande diferena em produtividade. Devido a significncia 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 indentao 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.

38

Captulo 5. Exemplos Avanados

CAPTULO 6

Editores Genricos

{Editores}
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 alguns que se destacam na
minha preferncia, quanto a usabilidade e versatilidade.
Emacs: Editor incrivelmente completo e verstil, funciona como ambiente integrado de desenvolvimento (figura
fig:emacs). Precisa ter python-modeinstalado. Para quem no tem experincia prvia com o Emacs,
recomendo que o pacote Easymacs 1 seja tambm instalado. este pacote facilita muito a interface do
Emacs, principalmente para adio de atalhos de teclado padro CUA. Pode-se ainda utilizar o Ipython
dentro do Emacs. {Emacs}
[Scite:]Editor leve e eficiente, suporta bem o Python (executa o script com F5) assim como diversas outras
linguagens. Permite configurar comando de compilao de C e Fortran, o que facilita o desenvolvimento de
extenses. Completamente configurvel (figura fig:scite).{Scite}
[Gnu Nano:]Levssimo editor para ambientes de console, possui suporte a auto indentao e colorizao em
diversas linguagens, incluindo o Python (figura fig:nano). Ideal para utilizar em conjuno com o Ipython
(comando {\%edit}).{Gnu Nano}
[Jedit:] Inclu o Jedit nesta lista, pois oferece suporte ao desenvolvimento em Jython (ver Seo
sec:jython). Afora isso, um editor bastante poderoso para java e no to pesado quanto o Eclipse (figura
fig:jedit).{Jedit}
[Kate/Gedit] Editores padro do KDE e Gnome respectivamente. Bons para uso casual, o Kate tem a
vantagem de um console embutido.

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

39

Computao Cientfica com Python, Verso 2.0-alpha

40

Captulo 6. Editores Genricos

CAPTULO 7

Editores Especializados

{IDEs} 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 grfica. Neste aspecto ele muito bom, permitindo construo 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 Pyrex ou C(figura fig:boa).
[Eric:]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 desenvolvimento de interfaces grficas
com esta ferramenta. Tambm dispe de timo depurador. Alm disso o Eric oferece muitas outras funes,
tais como integrao com sistemas de controle de verso, geradores de documentao, etc.(Figura fig:eric).
[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 fig:pydev). Em termos
de funcionalidade, equipara-se ao Eric e ao Boa-constructor.

7.1 Controle de Verses em Software


{Controle de Verses} 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 desafio do desenvolvimento de produtos cientficos (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 para a equipe em reunies regulares. O que fazer quando modificaes 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 em Python: Mercurial 1 . 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
1

http://www.selenic.com/mercurial

41

Computao Cientfica com Python, Verso 2.0-alpha

operaes. Alm do mais, o uso dirio de sistema de controle de verses envolve apenas dois ou trs comandos.
{Entendendo o Mercurial} {Mercurial} {Controle de Verses!Mercurial} O Mercurial um sistema de controle
de verses descentralizado, ou seja, no h nenhuma noo de um servidor central onde fica depositado o cdigo.
Repositrios de cdigos so diretrios que podem ser clonados de uma mquina para outra.
Ento, em que consiste um repositrio? A figura fig:mercrep uma representao diagramtica de um repositrio.
Para simplificar 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 figura fig:mercrep, um repositrio composto por um Arquivo 2 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.
Ao final de cada ciclo de trabalho, o pesquisador envia suas modificaes para o arquivo numa operao denominada commit(figura fig:commit) 3 .
Aps um commit, como as fontes do diretrio de trabalho no correspondiam ltima reviso do projeto, o
Mercurial automaticamente cria uma ramificao 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.
O Mercurial agrupa as mudanas enviadas por um usurio (via commit), em um conjunto de mudanas
atmico, que constitui uma reviso. Estas revises recebem uma numerao sequencial (figura fig:commit). 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 identificador global, consistindo de um nmero hexadecimal de quarenta dgitos.
Alm de ramificaes, fuses (merge) entre ramos podem ocorrer a qualquer momento. Sempre que houver mais
de um ramo em desenvolvimento, o 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 repositrio.
{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
figura fig:ana1.
Nosso segundo desenvolvedor, Bruno, acabou de se juntar ao time e clona o repositrio Ana 4 .
:math:$ hg clone ssh://maquinadana/projeto meuprojeto
requesting all changes adding changesets adding manifests adding file changes added 4 changesets with 4
changes to 2 files end{lstlisting} begin{leftbar} textbf{URLs vlidas:}\file://\ http://\ https://\ ssh://\ static-http://
end{leftbar}
Aps o comando acima, Bruno receber uma cpia completa do arquivo de Ana, mas seu diretrio de trabalho,
texttt{meu projeto}, permanecer independente. Bruno est ansioso para comear a trabalhar e logo faz dois
texttt{commits} (figura ref{fig:bruno1}). begin{figure}
centering includegraphics[width=10cm]{bruno1.png} % bruno1.png:
14.46x2.12 cm, bb=0 0 410 60 caption{Modificaes de Bruno.}

410x60 pixel, 72dpi,

label{fig:bruno1} end{figure}
Enquanto isso, em paralelo, Ana tambm faz suas modificaes (figura ref{fig:ana2}). begin{figure}
centering includegraphics[width=10cm]{ana2.png} % ana2.png: 340x60 pixel, 72dpi, 11.99x2.12
cm, bb=0 0 340 60 caption{Modificaes de Ana.}
label{fig:ana2} end{figure}
2

Doravante grafado com A maisculo para diferenciar de arquivos comuns(files).


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 Assumimos aqui que a mquina da ana est executando um servidor ssh
3

42

Captulo 7. Editores Especializados

Computao Cientfica com Python, Verso 2.0-alpha

Bruno ento decide puxar o repositrio de Ana para sincroniz-lo com o seu. begin{lstlisting}[language=csh,
caption= ,label=] $
hg pull pulling from ssh://maquinadaana/projeto searching for changes adding changesets adding
manifests adding file changes added 1 changesets with 1 changes to 1 files (run hg heads to see
heads, hg merge to merge)
O comando hg pull, se no especificada 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 fica como mostrado na figura fig:bruno2. 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 modificaes feitas por Ana. Normalmente, aps puxar modificaes, executamos hg update para sincronizar nosso
diretrio de trabalho com o Arquivo recm atualizado. Ento Bruno faz isso.
:math:$ hg update
this update spans a branch affecting the following files: hello.py (resolve)
aborting update spanning branches! (use hg merge to merge across branches or hg update -C to lose changes)
end{lstlisting}
Devido ramificao no Arquivo de Bruno, o comando texttt{update} no sabe a que ramo fundir as modificaes
existentes no diretrio de trabalho de Bruno. Para resolver isto, Bruno precisar fundir os dois ramos. Felizmente
esta uma tarefa trivial. begin{lstlisting}[language=csh, caption= ,label=] $
hg merge tip merging hello.py
No comando merge, se nenhuma reviso especificada, o diretrio de trabalho cabea de um ramo e existe
apenas uma outra cabea, as duas cabeas sero fundidas. Caso contrrio uma reviso deve ser especificada.
Pronto! agora o repositrio de Bruno ficou como a figura fig:bruno3.
Agora, se Ana puxar de Bruno, receber todas as moficaes de Bruno e seus repositrios estaro plenamente
sincronizados, como a figura fig:bruno3. {Criando um Repositrio}
Para criar um repositrio do zero, preciso apenas um comando:
hg init
Quando o diretrio criado, um diretrio chamado .hg criado dentro do diretrio de trabalho. O Mercurial
ir armazenar todas as informaes sobre o repositrio no diretrio .hg. O contedo deste diretrio no deve ser
alterado pelo usurio.

7.1.1 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 referncia rpida, use o comando
hg help -v <comando> com qualquer comando da lista abaixo.
[add] Adiciona o(s) arquivo(s) especificado(s) no prximo commit.
[addremove] Adiciona todos os arquivos novos, removendo os faltantes.
[annotate] Mostra informao sobre modificaes por linha de arquivo.
[archive] Cria um arquivo (compactado) no versionado, de uma reviso especificada.
[backout] Reverte os efeitos de uma modificao anterior.
[branch] Altera ou mostra o nome do ramo atual.
[branches] Lista todas os ramos do repositrio.
[bundle] Cria um arquivo compactado contendo todas as modificaes no presentes em um outro
repositrio.

7.1. Controle de Verses em Software

43

Computao Cientfica com Python, Verso 2.0-alpha

[cat] Retorna o arquivo especificado, na forma em que ele era em dada reviso.
[clone] Replica um repositrio.
[commit] Arquiva todas as modificaes ou os arquivos especificados.
[copy] Copia os arquivos especificados, para outro diretrio no prximo commit.
[diff] Mostra diferenas entre revises ou entre os arquivos especificados.
[export] Imprime o cabealho e as diferenas para um ou mais conjuntos de modificaes.
[grep] Busca por palavras em arquivos e revises especficas.
[heads] Mostra cabeas atuais.
[help] Mostra ajuda para um comando, extenso ou lista de comandos.
[identify] Imprime informaes sobre a cpia de trabalho atual.
[import] Importa um conjunto ordenado de atualizaes (patches). Este comando a contrapartida
de Export.
[incoming] Mostra novos conjuntos de modificaes existentes em um dado repositrio.
[init] Cria um novo repositrio no diretrio especificado. Se o diretrio no existir, ele ser criado.
[locate] Localiza arquivos.
[log] 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.
[outgoing] Mostra conjunto de modificaes no presentes no repositrio de destino.
[parents] Mostra os pais do diretrio de trabalho ou reviso.
[paths] Mostra definio de nomes simblicos de caminho.
[pull] Puxa atualizaes da fonte especificada.
[push] Envia modificaes para o repositrio destino especificado. a contra-partida de pull.
[recover] Desfaz uma transao interrompida.
[remove] Remove os arquivos especificados no prximo commit.
[rename] Renomeia arquivos; Equivalente a copy + remove.
[revert] Reverte arquivos ao estado em que estavam em uma dada reviso.
[rollback] Desfaz a ltima transao neste repositrio.
[root] Imprime a raiz do diretrio de trabalho corrente.
[serve] Exporta o diretrio via HTTP.
[showconfig] Mostra a configurao combinada de todos os arquivos hgrc.
[status] Mostra arquivos modificados no diretrio de trabalho.
[tag] Adiciona um marcador para a reviso corrente ou outra.
[tags] Lista marcadores do repositrio.
[tip] Mostra a reviso ponta.
[unbundle] Aplica um arquivo de modificaes.
[update] Atualiza ou funde o diretrio de trabalho.
[verify] Verifica a integridade do repositrio.
[version] Retorna verso e informao de copyright.

44

Captulo 7. Editores Especializados

Computao Cientfica com Python, Verso 2.0-alpha

{Interagindo com Outras Linguagens}(ch:capext) {Introduo a vrios mtodos de integrao do Python com
outras linguagens. \textbf{Pr-requisitos:} Captulos \ref{cap:intro} e \ref{cap:obj}.}

7.1. Controle de Verses em Software

45

Computao Cientfica com Python, Verso 2.0-alpha

46

Captulo 7. Editores Especializados

CAPTULO 8

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 necessidade 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 objetivos descritos no pargrafo acima. Neste captulo, vamos explorar apenas os mais prticos e
eficientes, do ponto de vista do tempo de implementao.

47

Computao Cientfica com Python, Verso 2.0-alpha

48

Captulo 8. Introduo

CAPTULO 9

Integrao com a Linguagem C

A linguagem C uma das linguagens mais utilizadas no desenvolvimento de softwares que requerem alta performance. Um bom exemplo o Linux (kernel) e a prpria linguagem Python. Este fato torna o C um candidato
natural para melhorar a performance de programas em Python.
Vrios pacotes cientficos para Python como o Numpy e Scipy, por exemplo, tem uma grande poro do seu
cdigo escrito em C para mxima performance. Coincidentemente, o primeiro mtodo que vamos explorar para
incorporar cdigo C em programas Python, oferecido como parte do pacote Scipy. {Weave}{weave} O weave
um mdulo do pacote scipy, que permite inserir trechos de cdigo escrito em C ou C++ dentro de programas em
Python. Existem vrias formas de se utilizar o weave dependendo do tipo de aplicao que se tem. Nesta seo,
vamos explorar apenas a aplicao do mdulo inline do weave, por ser mais simples e cobrir uma ampla gama
de aplicaes. Alm disso, utilizaes mais avanadas do weave, exigem um conhecimento mais profundo da
linguagem C, o que est fora do escopo deste livro. Caso os exemplos includos no satisfaam os anseios do
leitor, existe uma farta documentao no site www.scipy.org.
Vamos comear a explorar o weave com um exemplo trivial (computacionalmente) um simples loop com uma
nica operao (exemplo ex:weaveloop).
[frame=trBL, caption=Otimizao de loops com o \texttt{weave}, label=ex:weaveloop] {code/weaveloop.py}
No exemplo ex:weaveloop podemos ver como funciona o weave. Uma string contm o cdigo C a ser compilado.
A funo inline compila 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 uma performance inferior de um programa em C equivalente, executado fora do Python.
Mas a sua simplicidade de utilizao, compensa sempre que se puder obter um ganho de performance sobre o
Python puro.
[frame=trBL, caption=Calculando iterativamente a srie de
\texttt{C}(\texttt{weave.inline}), label=ex:weavefib] {code/weavefib.py}

Fibonacci

em

Python

em

No exemplo ex:weavefib, o ganho de performance do weave.inline j no to acentuado.


:math:$ python weavefib.py
Tempo mdio no python: 1.69277e-05 segundos Tempo mdio no weave: 1.3113e-05 segundos Acelerao mdia:
1.49554 +- 0.764275 end{lstlisting}
subsection{Ctypes}index{Ctypes} O pacote texttt{ctypes}, parte integrante do Python a partir da verso 2.5, um
mdulo que nos permite invocar funes de bibliotecas em texttt{C} 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
texttt{C}.

49

Computao Cientfica com Python, Verso 2.0-alpha

Apenas alguns objetos do python podem ser passados para funes atravs do ctypes: texttt{None, inteiros, inteiros longos, strings, e strings unicode}. Outros tipos de dados devem ser convertidos, utilizando tipos fornecidos
pelo texttt{ctypes}, compatveis com texttt{C}.
Dado seu estgio atual de desenvolvimento, o texttt{ctypes} no a ferramenta mais indicada ao cientista que
deseja fazer uso das convenincias do texttt{C} em seus programas Python. Portanto, vamos apenas dar dois
exemplos bsicos para que o leitor tenha uma ideia de como funciona o texttt{ctypes}. Para maiores informaes
recomendamos o tutorial do ctypes (url{ http://python.net/crew/theller/ctypes/tutorial.html})
Nos exemplos abaixo assumimos que o leitor est utilizando Linux pois o uso do texttt{ctypes} no Windows no
idntico.
begin{lstlisting}[frame=trBL, caption=Carregando bibliotecas em texttt{C}, label=ex:ctypes1] >>> from ctypes
import * >>> libc = cdll.LoadLibrary(libc.so.6) >>> libc <CDLL libc.so.6, handle ... at ...> end{lstlisting}
Uma vez importada uma biblioteca (listagem ref{ex:ctypes1}), podemos chamar funes como atributos das
mesmas. begin{lstlisting}[frame=trBL, caption=Chamando fues em bibliotecas importadas com o ctypes, label=ex:ctypes2] >>> libc.printf <_FuncPtr object at 0x...> >>> print libc.time(None) 1150640792 >>> printf =
libc.printf >>> printf(Ola, %sn, Mundo!) Ola, Mundo! end{lstlisting}
subsection{Pyrex}index{Pyrex} O Pyrex uma linguagem muito similar ao Python feita para gerar mdulos em
texttt{C} 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 modificaes.
O Pyrex no inclui todas as possibilidades da linguagem Python. As principais modificaes so as que se seguem:
begin{itemize}
item No permitido definir funes dentro de outras funes;
item definies de classe devem ocorrer apenas no espao de nomes global do mdulo, nunca dentro de funes
ou de outras classes; item No permitido texttt{import *}. As outras formas de texttt{import} so permitidas;
item Geradores no podem ser definidos em Pyrex; item As funes texttt{globals()} e texttt{locals()} no podem
ser utilizadas. end{itemize}
Alm das limitaes acima, existe um outro conjunto de limitaes que considerado temporrio pelos desenvolvedores do Pyrex. So as seguintes: begin{itemize}
item Definies de classes e funes no podem ocorrer dentro de estruturas de controle (if, elif, etc.);
item Operadores textit{in situ} (+=, *=, etc.) no so suportados pelo Pyrex; item List comprehensions no so
suportadas; item No h suporte a Unicode. end{itemize}
Para exemplificar o uso do Pyrex, vamos implementar uma funo geradora de nmeros primos em Pyrex (listagem
ref{ex:pyrex}).
lstinputlisting[frame=trBL, caption=Calculando nmeros primos em Pyrex, label=ex:pyrex]{code/primes.pyx}
Vamos analisar o cdigo Pyrex, nas linhas onde ele difere do que seria escrito em Python. Na linha 2 encontramos
a primeira peculiaridade: o argumento de entrada kmax definido como inteiro por meio da expresso texttt{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 definida 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 de texttt{C}, mais eficiente ser o cdigo
texttt{C} gerado pelo Pyrex. A varivel texttt{result}(linha 5) no declarada como uma lista de inteiros, pois
no sabemos ainda qual ser seu tamanho. O restante do cdigo equivalente ao Python. Devemos apenas notar a
preferncia do lao texttt{while} ao invs de um lao do tipo texttt{for i in range(x)}. Este ultimo seria mais lento
devido a incluir a funo texttt{range} do Python.
O prximo passo gerar a verso em texttt{C} da listagem ref{ex:pyrex}, compilar e link-lo, transformando-o
em um mdulo Python. begin{lstlisting}[language=csh,frame=trBL, caption=Gerando Compilando e linkando,
label=ex:pyrexc] $
pyrexc primes.pyx :math:$ gcc -c -fPIC -I/usr/include/python2.4/ primes.c
$ gcc -shared primes.o -o primes.so

50

Captulo 9. Integrao com a Linguagem C

Computao Cientfica com Python, Verso 2.0-alpha

Agora vamos comparar a performance da nossa funo com uma funo em Python razovelmente bem implementada (Listagem ex:pyrex2). Afinal temos que dar uma chance ao Python, no?
[frame=trBL, caption=Calculando nmeros primos em Python, label=ex:pyrex2] {code/primes2.py}
Comparemos agora a performance das duas funes para encontrar todos os nmeros primos menores que 100000.
Para esta comparao utilizaremos o ipython que nos facilita esta tarefa atravs da funo mgica {\%timeit}.
In [1]:from primes import primes In [2]:from primes2 import primes as primesp In [3]:%timeit
primes(100000) 10 loops, best of 3: 19.6 ms per loop In [4]:%timeit primesp(100000) 10 loops,
best of 3: 512 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 ex:setupix. Uma vez criado o script (batizado, por exemplo, de
setupyx.py), para compilar a nossa extenso, basta executar o seguinte comando: python setupix.py
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 estiver incluida na distribuio do programa, o setuptools passa ento para a etapa de
compilao e linkagem do cdigo C.
[frame=trBL, caption=Automatizando a compilao de extenses em \texttt{Pyrex} por meio do setuptools, label=ex:setupix] {code/setupyx.py}
import setuptools from setuptools.extension import Extension

51

Computao Cientfica com Python, Verso 2.0-alpha

52

Captulo 9. Integrao com a Linguagem C

CAPTULO 10

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 C++. uma ferramenta original. O ShedSkin. {Shedskin}{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 C++, permitindo assim grandes ganhos de velocidade. 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 definida 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(figura fig:trapezio.
Matemticamente, podemos expressar a regra trapezoidal da seguinte frmula.
:math:$int_a^b f(x);dx approx frac{h}{2}(f(a)+f(b))+hsum_{i=1}^{n-1}f(a+ih),;;;h=frac{b-a}{n}
$
(eq:trapezio)
Na listagem ex:trapintloop podemos ver uma implementao simples da regra trapezoidal.
[frame=trBL, caption=implementao da regra trapezoidal(utilizando lao for) conforme especificada na equao
\ref{eq:trapezio}, label=ex:trapintloop] {code/trapintloop.py}
Executando o script da Listagem ex:trapintloop (trapintloop.py) observamos o tempo de execuo da integrao
das duas funes.
:math:$ python trapintloop.py
resultado: 16 Tempo: 11.68 seg resultado: 49029 Tempo: 26.96 seg end{lstlisting}
Para converter o script ref{ex:trapintloop} em texttt{C++} tudo o que precisamos fazer :
gin{lstlisting}[language=csh,frame=trBL, caption=Verificando o tempo de execuo em texttt{C++} ] $

be-

ss trapintloop.py *** SHED SKIN Python-to-C++ Compiler 0.0.15 *** Copyright 2005, 2006 Mark
Dufour; License GNU GPL version 2 or later (See LICENSE) (If your program does not compile,
please mail me at mark.dufour@gmail.com!!)

53

Computao Cientfica com Python, Verso 2.0-alpha

*WARNING* trapintloop:13: xrange, enumerate and reversed return lists for now [iterative type
analysis..] ** iterations: 2 templates: 55 [generating c++ code..] :math:$ make run
g++ -O3 -I ... ./trapintloop resultado: 16 Tempo: 0.06 seg resultado: 49029 Tempo: 1.57 seg end{lstlisting}
Com estes dois comandos, geramos, compilamos e executamos uma verso texttt{C++} do programa listado em ref{ex:trapintloop}. O cdigo texttt{C++} gerado pelo Shed-Skin pode ser conferido na listagem
ref{ex:trapintloop_C}
Como pudemos verificar, 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.
lstinputlisting[language=c++,frame=trBL, caption=Cdigo texttt{C++} gerado pelo Shed-skin a partir do
script trapintloopy.py,label=ex:trapintloop_C]{code/trapintloop.cpp} section{Integrao com a Linguagem
texttt{Fortran}}index{FORTRAN} A linguagem texttt{Fortran} uma das mais antigas linguagens de programao ainda em uso. Desenvolvida nos anos 50 pela IBM, foi projetada especificamente para aplicaes cientficas. A sigla texttt{Fortran} deriva de IBM mathematical FORmula TRANslation system. Dada a sua
longa existncia, existe uma grande quantidade de cdigo cientfico escrito em texttt{Fortran} disponvel para
uso. Felizmente, a integrao do texttt{Fortran} com o Python pode ser feita de forma extremamente simples,
atravs da ferramenta texttt{f2py}, que demonstraremos a seguir. subsection{texttt{f2py}} Esta ferramenta est
disponvel como parte do Pacote numpy (url{www.scipy.org}). Para ilustrar o uso do texttt{f2py}, vamos voltar
ao problema da integrao pela regra trapezoidal (equao ref{eq:trapezio}). Como vimos, a implementao deste
algoritmo em Python, utilizando um lao texttt{for}, ineficiente. Para linguagens compiladas como texttt{C++}
ou texttt{Fortran}, laos so executados com grande eficincia. Vejamos a performance de uma implementao
em texttt{Fortran} da regra trapezoidal (listagem ref{ex:trapintf}).
lstinputlisting[language=fortran,frame=trBL, caption=implementao em texttt{Fortran} da regra trapezoidal. label=ex:trapintf]{code/trapint.f}
A listagem ref{ex:compfor} nos mostra como compilar e executar o cdigo da listagem ref{ex:trapintf}.
Este comando de compilao pressupe que voc possua o texttt{GCC} (Gnu Compiler Collection) verso 4.0 ou superior. No caso de verses mais antigas deve-se substituir texttt{gfortran} por texttt{g77} ou
texttt{f77}. begin{lstlisting}[language=csh,frame=trBL, caption= Compilando e executando o programa da
listagem ref{ex:trapintf},label=ex:compfor] $
gfortran -o trapint trapint.f :math:$ time ./trapint
Resultado: 16.01428 Resultado: 48941.40
real 0m2.028s user 0m1.712s sys 0m0.013s end{lstlisting}
Como em texttt{Fortran} no temos a convenincia de uma funo para cronometrar nossa funo, utilizamos
o comando texttt{time} do Unix. Podemos constatar que o tempo de execuo similar ao obtido com a verso
em texttt{C++} (listagem ref{ex:trapintloop_C}).
Ainda que no seja estritamente necessrio, recomendvel que o cdigo texttt{Fortran} seja preparado com
comentrios especiais (texttt{Cf2py}), antes de ser processado e compilado pelo texttt{f2py}. A listagem
ref{ex:trapintf} j inclui estes comentrios, para facilitar a nossa exposio. Estes comentrios nos permitem
informar ao texttt{f2py} as variveis de entrada e sada de cada funo e algumas outras coisas. No exemplo
ref{ex:trapintf}, os principais parametros passados ao texttt{f2py}, atravs das linhas de comentrio texttt{Cf2py
intent()}, so texttt{in, out, hide e cache}. As duas primeiras identificam as variveis de entrada e sada da funo
ou procedure. O parmetro texttt{hide} faz com que a varivel de sada texttt{res}, obrigatoriamente declarada
no cabealho da procedure em texttt{Fortran} fique oculta ao ser importada no Python. O parmetro cache reduz
o custo da realocao de memria em variveis que so redefinidas dentro de um lao em texttt{Fortran}.
Antes que possamos importar nossas funes em texttt{Fortran} para uso em um programa em Python,
precisamos compilar nossos fontes em texttt{Fortran} com o texttt{f2py}. A listagem ref{ex:compf2py}
nos mostra como fazer isso.
begin{lstlisting}[language=csh,frame=trBL, caption= Compilando com
texttt{f2py},label=ex:compf2py] $
f2py -m trapintf -c trapint.f
Uma vez compilados os fontes em Fortran com o f2py, podemos ento escrever uma variao do
script trapintloop.py (listagem ex:trapintloop) para verificar os ganhos de performance. A listagem

54

Captulo 10. Integrao com C++

Computao Cientfica com Python, Verso 2.0-alpha

ex:trapintloopcomp contm nosso script de teste. [frame=trBL, caption=Script para comparao entre Python
e \texttt{Fortran} via \texttt{f2py},label=ex:trapintloopcomp] {code/trapintloopcomp.py}
A listagem ex:trapintloopcomp contem uma verso da regra trapezoidal em Python puro e importa a funo tint
do nosso programa em Fortran. A funo em Fortran chamado de duas formas: uma para integrar funes
implementadas em Python (na forma funes lambda) e outra substituindo as funes lambda pelos seus equivalentes em Fortran.
Executando trapintloopcomp.py, podemos avaliar os ganhos em performance (listagem ex:comp). Em
ambas as formas de utilizao da funo ftint, existem chamadas para objetos Python dentro do lao DO. Vem
da a degradao da performance, em relao execuo do programa em Fortran, puramente.
:math:$ python trapintloopcomp.py
resultado: 16 Tempo: 13.29 seg resultado: 49029 Tempo: 29.14 seg tempo do Fortran com funcoes em Python
resultado: 16 Tempo: 7.31 seg resultado: 48941 Tempo: 24.95 seg tempo do Fortran com funcoes em Fortran
resultado: 16 Tempo: 4.85 seg resultado: 48941 Tempo: 6.42 seg end{lstlisting}
Neste ponto, devemos parar e fazer uma reflexo. Ser justo comparar a pior implementao possvel em Python
(utilizando laos texttt{for}), com cdigos compilados em texttt{C++} e texttt{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 ref{ex:trapintvect}.
lstinputlisting[frame=trBL,
caption=Implementao
zoidal,label=ex:trapintvect]{code/trapintvect.py}

vetorizada

da

regra

trape-

Executando a listagem ref{ex:trapintvect}, vemos que a implementao vetorizada em Python ganha (0.28 e 2.57
segundos)de nossas solues utilizando texttt{f2py}.
Da mesma forma que com o texttt{Pyrex}, podemos distribuir programas escritos em Python com extenses escritas em texttt{Fortran}, com a ajuda do pacote setuptools. Na listagem ref{ex:setupf2py} vemos o exemplo
de como escrever um setup.py para este fim. Neste exemplo, temos um texttt{setup.py} extrememente limitado,
contendo apenas os parmetros necessarios para a compilao de uma extenso denominada texttt{flib}, a partir
de uma programa em texttt{Fortran}, localizado no arquivo texttt{flib.f}, dentro do pacote texttt{meupacote}.
Observe, que ao definir mdulos de extenso atravs da funo Extension, podemos passar tambm outros argumentos, tais como outras bibliotecas das quais nosso cdigo dependa. begin{lstlisting}[frame=trBL, caption=texttt{setup.py} para distribuir programas com extenses em texttt{Fortran} ,label=ex:setupf2py] import
ez_setup ez_setup.use_setuptools() import setuptools from numpy.distutils.core import setup, Extension flib =
Extension(name=meupacote.flib,
libraries=[], library_dirs=[], f2py_options=[], sources=[meupacote/flib.f] )
setup(name = mypackage,
version = 0.3.5, packages = [meupacote], ext_modules = [flib]
)
end{lstlisting}
section{A Pton que sabia Javans Integrao com Java}index{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 fins: o texttt{Java}.
A linguagem texttt{Java} tem, todavia, contra si uma srie de fatores: A complexidade de sua sintaxe rivaliza
com a do texttt{C++}, e no eficiente, como esperaramos que o fosse, uma linguagem compilada, com tipagem
esttica. Mas todos estes aspectos negativos no so suficientes para anular as vantagens do vasto nmero de
bibliotecas disponveis e da sua portabilidade.
Como poderamos capturar o que o texttt{Java} tem de bom, sem levar como brinde seus aspectos negativos?
aqui que entra o texttt{Jython}.
O texttt{Jython} uma implementao completa do Python 2.2footnote{O desenvolvimento do texttt{Jython
continua, mas no se sabe ainda quando alcanar o CPython (implementao em texttt{C} do Python).}} em
texttt{Java}. Com o texttt{Jython} programadores texttt{Java} podem embutir o Python em seus aplicativos e
55

Computao Cientfica com Python, Verso 2.0-alpha

applets e ns, programadores Python, podemos utilizar, livremente, toda (ou quase toda) a biblioteca padro do
Python com classes em texttt{Java}. Alm destas vantagens, O texttt{Jython} tambm uma linguagem Open
Source, ou seja de cdigo aberto.
subsection{O interpretador Jython}label{sec:jython} index{Jython}
Para iniciar nossa aventura com o texttt{Jython}, precisaremos instal-lo, e ter instalada uma mquina virtual
texttt{Java} (ou JVM) verso 1.4 ou mais recente.
Vamos tentar us-lo como usaramos o interpretador Python e ver se notamos alguma diferena.
gin{lstlisting}[frame=trBL, caption=Usando o interpretador texttt{Jython} ,label=lst:int-jython] $

be-

jython Jython 2.1 on java1.4.2-01 (JIT: null) Type copyright, credits or license for more information. print hello world hello world import math() dir(math) [acos, asin, atan, atan2,
ceil, classDictInit, cos, cosh, e, exp, fabs, floor, fmod, frexp, hypot, ldexp, log,
log10, modf, pi, pow, sin, sinh, sqrt, tan, tanh] math.pi 3.141592653589793
At agora, tudo parece funcionar muito bem. Vamos tentar um exemplo um pouco mais avanado e ver de que
forma o Jython pode simplificar um programa em Java.
import javax.swing.JOptionPane; class testDialog public static void main ( String[] args )
javax.swing.JOptionPane.showMessageDialog ( null, Isto e um teste. );
A verso apresentada na listagem lst:Swingjava est escrita em Java. Vamos ver como ficaria a verso em
Jython.
import javax.swing.JOptionPane javax.swing.JOptionPane.showMessageDialog(None,Isto e um
teste.)
Podemos observar, na listagem lst:Swingjython, que eliminamos a verborragia caracterstica do Java, e que o
programa em Jython ficou 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 Java. S isto j uma
grande vantagem do Jython. Em suma, utilizado-se o Jython ao invs do Java, ganha-se em produtividade
duas vezes: Uma, ao escrever menos linhas de cdigo e outra, ao no ter que recompilar o programa a cada vez
que se introduz uma pequena modificao.
Para no deixar os leitores curiosos acerca da finalidade do cdigo apresentado na listagem lst:Swingjython, seu
resultado encontra-se na figura fig:Swing-jython.

10.1 Criando Applets em Jython


Para os conhecedores de Java, o 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 applet(listagem lst:appletjython).
import java.applet.Applet; class appletp ( java.applet.Applet ): def paint ( self, g ): g.drawString ( Eu
sou um Applet Jython!, 5, 5 )
Para quem no conhece Java, 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 lst:applet-jython para que a mquina virtual Java possa execut-lo. Para
isso, salvamos o cdigo e utilizamos o compilador do Jython, o jythonc.
jythonc -deep -core -j appletp.jar appletp.py processing appletp
Required packages: java.applet
Creating adapters:
Creating .java files: appletp module appletp extends java.applet.Applet
Compiling .java to .class...
Compiling with args: [/opt/blackdown-jdk-1.4.2.01/bin/javac,
-classpath,
/usr/share/jython/lib/jython-2.1.jar:/usr/share/libreadline-java/lib/libreadlinejava.jar:.:./jpywork::/usr/share/jython/tools/jythonc:/home/fccoelho/Documents/LivroPython/.:/usr/share/jython/Lib,

56

Captulo 10. Integrao com C++

Computao Cientfica com Python, Verso 2.0-alpha

./jpywork/appletp.java] 0 Note: ./jpywork/appletp.java uses or overrides a deprecated API. Note:


Recompile with -deprecation for details.
Building archive: appletp.jar Tracking java dependencies:
Uma vez compilado nosso applet, precisamos embuti-lo em um documento HTML (listagem lst:htmlapp. Ento,
basta apontar nosso navegador para este documento e veremos o applet ser executado.
html head meta content=text/html; charset=ISO-8859-1 http-equiv=content-type titlejython applet/title /head body Este eacute; o seu applet em Jython:br br br center applet code=appletp
archive=appletp.jar name=Applet em Jython alt=This browser doesnt support JDK 1.1 applets.
align=bottom height=50 width=160 PARAM NAME=codebase VALUE=. h3Algo saiu errado ao carregar este applet./h3 /applet /center br br /body /html
Na compilao, o cdigo em Jython convertido completamente em cdigo Java e ento compilado atravs
do compilador Java padro.

10.1. Criando Applets em Jython

57

Computao Cientfica com Python, Verso 2.0-alpha

58

Captulo 10. Integrao com C++

CAPTULO 11

Exerccios

1. Compile a listagem ex:weaveloop 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 ex:pyrex), determine o tamanho da lista de nmeros primos menor
do que 1000. Em seguida modifique o cdigo Pyrex, declarando a varivel results como uma lista de
inteiros, e eliminando a funo append do lao while. Compare a performance desta nova verso com a
da verso original.
{Jython: A python que sabia Javans} {P} {eo} 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 fins: o Java.
A linguagem Java tem contra si uma srie de fatores: A complexidade de sua sintaxe rivaliza com a do C++, uma
linguagem proprietria, e no eficiente como esperaramos que uma linguagem compilada, com tipagem esttica
fosse. Mas todos estes aspectos negativos no so suficientes para anular as vantagens da sua grande biblioteca e
da sua portabilidade.
Como poderamos capturar o que o java tem de bom sem levar como brinde seus aspectos negativos? aqui
que entra o Jython.
O Jython uma implementao completa do Python 2.1 1 em Java. Com o Jython programadores Java podem
embutir o python em seus aplicativos e applets e ns, programadores Python podemos utilizar misturar livremente
toda (ou quase toda) a biblioteca padro do Python com classes em Java. Alm destas vantagens, O Jython tambm
uma linguagem Open Source.

Ao final de 2005 est prometida compatibilidade com o Python 2.3

59

Computao Cientfica com Python, Verso 2.0-alpha

60

Captulo 11. Exerccios

CAPTULO 12

O interpretador Jython

Para iniciar nossa aventura com o Jython, precisaremos instal-lo, e precisamos ter instalada uma mquina virtual
Java (ou JVM) verso 1.4 ou mais recente.
Vamos tentar us-lo como usaramos o interpretador python e ver se notamos alguma diferena.
:math:$ jython
Jython 2.1 on java1.4.2-01 (JIT: null) Type copyright, credits or license for more information. >>> print
hello world hello world >>> import math() >>> dir(math) [acos, asin, atan, atan2, ceil, classDictInit,
cos, cosh, e, exp, fabs, floor, fmod, frexp, hypot, ldexp, log, log10, modf, pi, pow, sin,
sinh, sqrt, tan, tanh] >>> math.pi 3.141592653589793 end{lstlisting}
At agora tudo parece funcionar muito bem. Vamos tentar um exemplo um pouco mais avanado e ver de que
forma o Jython pode simplificar um programa em java. begin{lstlisting}[language=Java,frame=trBL, caption=Um
programa simples em Java usando a classe Swing. ,label=lst:Swing-java] import javax.swing.JOptionPane; class
testDialog {
public static void main ( String[] args ) { javax.swing.JOptionPane.showMessageDialog ( null,
Isto e um teste. );
}
} end{lstlisting}
A verso apresentada na listagem ref{lst:Swing-java} est escrita em Java.
Vamo ver como ficaria a verso em Jython.
begin{lstlisting}[frame=trBL, caption=O mesmo programa da listagem
ref{lst:Swing-java} em Jython.,label=lst:Swing-jython] >>> import javax.swing.JOptionPane >>>
javax.swing.JOptionPane.showMessageDialog(None,Isto e um teste.) end{lstlisting}
Podemos observar na listagem ref{lst:Swing-jython} que eliminamos a verborragia caracterstica do Java, e o
programa em Jython ficou bem mais pitnico. Outro detalhe que vale a pena comentar, que no precisamos
compilar o cdigo em Jython, com seria necessrio com o Java. S isto j uma grande vantagem do Jython. Em
suma, utilizado-se o Jython ao invs do Java ganha-se em produtividade duas vezes: Uma ao escrever menos linhas
de cdigo e outra, ao no ter que recompilar o programa a cada vez que se introduz uma pequena modificao.
Para no deixar os leitores curiosos acerca da finalidade do cdigo apresentado na listagem ref{lst:Swing-jython},
Seu resultado encontra-se na figura ref{fig:Swing-jython}.
begin{figure} centering includegraphics[bb=0 0 269 127]{jyswing.eps}
% jyswing.jpg: 72dpi, width=9.49cm, height=4.48cm, bb=0 0 269 127 caption{Sada
ref{lst:Swing-jython}.} label{fig:Swing-jython}

da

listagem

end{figure}
section{Criando Applets em Jython} Para os conhecedores de Java, o Jython pode ser utilizado para criar
servlets, beans e applets com a mesma facilidade com que criamos um aplicativo em Jython. Vamos

61

Computao Cientfica com Python, Verso 2.0-alpha

ver um exemplo de applet(listagem ref{lst:applet-jython}). begin{lstlisting}[frame=trBL, caption=Criando um


applet em Jython ,label=lst:applet-jython] import java.applet.Applet; class appletp ( java.applet.Applet ):
def paint ( self, g ): g.drawString ( Eu sou um Applet Jython!, 5, 5 )
end{lstlisting}
Para quem no conhece Java, 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 ref{lst:applet-jython} para que a mquina virtual Java possa execut-lo.
Para isso, salvamos o cdigo utilizaremos o compilador do Jython, texttt{jythonc}. begin{lstlisting}[language=
Ksh,frame=trBL, caption= Compilando appletp.py ,label=lst:jythonc] $
jythonc -deep -core -j appletp.jar appletp.py processing appletp
Required packages: java.applet
Creating adapters:
Creating .java files: appletp module appletp extends java.applet.Applet
Compiling .java to .class...
Compiling with args: [/opt/blackdown-jdk-1.4.2.01/bin/javac,
-classpath,
/usr/share/jython/lib/jython-2.1.jar:/usr/share/libreadline-java/lib/libreadlinejava.jar:.:./jpywork::/usr/share/jython/tools/jythonc:/home/fccoelho/Documents/LivroPython/.:/usr/share/jython/Lib,
./jpywork/appletp.java] 0 Note: ./jpywork/appletp.java uses or overrides a deprecated API. Note:
Recompile with -deprecation for details.
Building archive: appletp.jar Tracking java dependencies:
Uma vez compilado nosso applet, precisamos precisamos embuti-lo em um documento HTML (listagem
lst:htmlapp. Ento basta apontar nosso navegador para este documento e veremos o applet ser executado.
html head meta content=text/html; charset=ISO-8859-1 http-equiv=content-type titlejython applet/title /head body Este eacute; o seu applet em Jython:br br br center applet code=appletp
archive=appletp.jar name=Applet em Jython alt=This browser doesnt support JDK 1.1 applets.
align=bottom height=50 width=160 PARAM NAME=codebase VALUE=. h3Algo saiu errado ao carregar este applet./h3 /applet /center br br /body /html
Na compilao, o cdigo em Jython convertido completamente em cdigo Java e ento compilado atravs do
compilador Java padro.
{Teoria de Grafos} {Grafos} {Breve introduo a teoria de grafos e sua representao computacional. Introduo ao Pacote \texttt{NetworkX}, voltado para a manipulao de grafos. \textbf{Pr-requisitos:} Programao
orientada a objetos.}

62

Captulo 12. O interpretador Jython

CAPTULO 13

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 definido por um conjunto finito 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 definido 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 ou no;
A ordem de um grafo corresponde ao seu nmero de vrtices;
O tamanho de um grafo corresponde ao seu nmero de arestas;
Vrtices, conectados por uma aresta, so ditos vizinhos ou adjacentes;
A ordem de um vrtice corresponde ao seu nmero de vizinhos;
Um caminho uma lista de arestas que conectam dois vrtices;
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 suficiente 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 ex:grafdict mostra um dicionrio representando o grafo da figura fig:g1. 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 ex:vlist).
g = a:[c,d,e],b:[d,e],c:[a,d],d:[b,c,a],e:[a,b]
Podemos utilizar o mtodo keys para obter uma lista dos vrtices de nosso grafo.
g.keys() [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 especficas.
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 utilizar do pacote NetworkX 1 que
j implementa uma representao bastante completa de grafos e redes em Python.

https://networkx.lanl.gov/

63

Computao Cientfica com Python, Verso 2.0-alpha

64

Captulo 13. Introduo

CAPTULO 14

NetworkX

{NetworkX} O pacote NetworkX 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 arestas, A, muito simples. Seja um grafo G com vrtices
V = {W, X, Y, Z}:
G : A = (W, Z), (Z, Y ), (Y, X), (X, Z) : math :
[frame=trBL,caption=Definindo um grafo atravs de seus vrtices,label=ex:graph1] {code/graph1.py} 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 )] : math :
Ao lidar com grafos, conveniente represent-los graficamente. Vejamos como obter o diagrama do grafo da
listagem ex:graph1: [frame=trBL,caption=Diagrama de um grafo,label=ex:graph2] {code/graph2.py}
A funcionalidade do pacote NetworkX bastante ampla. A seguir exploraremos um pouco desta funcionalidade.

14.1 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)] Cria um novo grafo vazio do mesmo tipo que H.

14.2 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 fim:

65

Computao Cientfica com Python, Verso 2.0-alpha

G.add_node(n) Adiciona um nico vrtice a G.


[G.add_nodes_from(lista)] Adiciona uma lista de vrtices a G.
[G.delete_node(n)]Remove o vrtice n de G.
[G.delete_nodes_from(lista)] Remove uma lista de vrtices de G.
[G.add_edge(u,v)]Adiciona a aresta (u,v) a G. Se G for um grafo direcionado, adiciona uma aresta direcionada u v. Equivalente a {G.add\_edge((u,v))}.
[G.add_edges_from(lista)]Adiciona uma lista de arestas a G.
[G.delete_edge(u,v)]Remove a aresta (u,v).
[G.delete_edges_from(lista)]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. 1
[G.subgraph(listadevertices)]Retorna subgrafo correspondente lista de vrtices.

14.3 Criando Grafos a Partir de Outros Grafos


subgraph(G, listadevertices) Retorna subgrafo de G correspondente lista de vrtices.
[union(G1,G2)]Unio de grafos.
[disjoint_union(G1,G2)]Unio disjunta, ou seja, assumindo que todos os vrtices so diferentes.
[cartesian_product(G1,G2)]Produto cartesiano de dois grafos (Figura fig:gpcc).
[compose(G1,G2)]Combina grafos, identificando vrtices com mesmo nome.
[complement(G)]Retorna o complemento do grafo(Figura fig:gpcc).
[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.

14.4 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 final, a estrutura produzida pelo contgio. [frame=trBL,caption=Construindo um grafo dinamicamente,label=ex:cont] {code/grafodin.py}
{Mdulo threading:} Permite executar mais de uma parte do programa em paralelo, em um fio de
execuo independente. Este fios, compartilham todas as variveis globais e qualquer alterao nestas
imediatamente visvel a todos os outros fios.
1 Uma cpia rasa significa 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 reflete no novo grafo.

66

Captulo 14. NetworkX

Computao Cientfica com Python, Verso 2.0-alpha

{Mdulos!threading}
O objeto grafo do NetworkX aceita qualquer objeto como um vrtice. Na listagem ex:cont, nos valemos deste
fato para colocar instncias da classe 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 vrtice,
aps declarar-se doente e incrementar o contador de doentes a nvel do grafo, chama o mtodo transmite().
O mtodo transmite assume que durante seu perodo infeccioso, 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 contraiu em um thread separado. Isto significa 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 suficiente para infectar a todos no seu grupo, ou no. Depois que o processo
se desenrola, temos a estrutura do grafo como resultado (Figura fig:cont)

14.5 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. [frame=trBL,caption=Construindo uma rede
social a partir de e-mails,label=ex:mnet] {code/mnet.py}
Na Listagem ex:mnet, usamos dois mdulos interessantes da biblioteca padro do Python: O mdulo email e o
mdulo mailbox. mailbox.
{Mdulo email:} Mdulo para decodificar, manusear, e compor emails.
{Mdulos!email}
{Mdulo mailbox:} Conjuto de classes para lidar com caixas de correio no formato Unix, MMDF e
MH.
{Mdulos!mailbox}
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, retornar mensagens decodificadas pela funo msgfactory, definida por ns. Esta funo se utiliza do mdulo email para decodificar 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
fig:mnet).

14.5. Construindo um Grafo a Partir de Dados

67

Computao Cientfica com Python, Verso 2.0-alpha

68

Captulo 14. NetworkX

CAPTULO 15

Exerccios

1. Determine o conjunto de arestas A que maximiza o tamanho do grafo cujos vrtices so dados por V =
{a, b, c, d, e}.
2. No exemplo do contgio, verifique se existe alguma relao entre o tamanho da amostra de cada vrtice e a
densidade final 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.
4. Insira um print no lao for do exemplo ex:mnet para ver o formato de sada do iterador mbox.
5. Modifique o programa ex:mnet para associar apenas mensagens que contm uma palavra em comum.
{Interao com Bancos de Dados}{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. \textbf{Pr-requisitos:} Conhecimentos
bsicos de bancos de dados e SQL.}
{O} gerenciamento de dados no se constitui numa disciplina cientfica per se. Entretanto, cada vez mais, permeia
as atividades bsicas de trabalho cientfico. 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 fins de anlise, visualizaco ou simplesmente consulta.
A linguagem Python dispe de solues simples para resolver esta necessidade em seus mais distintos nveis
de sofisticao. Seguindo a filosofia de baterias includas do Python, a sua biblioteca padro nos apresenta o
mdulo Pickle e cPickle e, a partir da verso 2.5, o banco de dados relacional sqlite3.

69

Computao Cientfica com Python, Verso 2.0-alpha

70

Captulo 15. Exerccios

CAPTULO 16

O Mdulo Pickle

{pickle} O mdulo pickle e seu primo mais veloz cPickle, implementam algoritmos que permitem armazenar, em um arquivo, objetos implementados em Python.
In [1]:import pickle In [2]:class oi: .2.: def digaoi(self): .2.: print oi In [3]:a= oi() In
[4]:f = open(picteste,w) In [5]:pickle.dump(a,f) In [6]:f.close() In [7]:f = open(picteste,r) In
[8]:b=pickle.load(f) In [9]:b.digaoi() oi
Como vemos na listagem ex:pickle, com o mdulo pickle podemos armazenar objetos em um arquivo, e recuperlo sem problemas para uso posterior. Contudo, uma caracterstica importante deste mdulo no fica evidente no
exemplo ex:pickle. Quando um objeto armazenado por meio do mdulo pickle, nem o cdigo da classe, nem
seus dados, so incluidos, apenas os dados da instncia.
In [10]:class oi: .10.: def digaoi(self,nome=flavio): .10.: print oi
In [11]:f = open(picteste,r) In [12]:b=pickle.load(f) In [13]:b.digaoi() oi flavio!
Desta forma, podemos modificar a classe, e a instncia armazenada reconhecer o novo cdigo ao ser restaurada a
partir do arquivo, como podemos ver acima. Esta caracterstica significa que os pickles no se tornam obsoletos
quando o cdigo em que foram baseados atualizado (naturalmente isto vale apenas para modificaes que no
removam atributos j includos nos pickles).
O mdulo pickle 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. {O mdulo
Sqlite3}{sqlite} 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 SQL 1 .
O Sqlite nasceu de uma biblioteca em C que disponibilizava um banco de dados extremamente leve e que dispensa
o conceito servidor-cliente. No sqlite, o banco de dados um arquivo manipulado atravs da biblioteca
sqlite.
Para utilizar o sqlite em um programa Python, precisamos importar o mdulo sqlite3.
In [1]:import sqlite3
O prximo passo a criao de um objeto conexo, atravs do qual podemos executar comandos SQL.
In [2]:c = sqlite3.connect(/tmp/exemplo)
Agora dispomos de um banco de dados vazio, consistindo no arquivo exemplo, localizado no diretrio /tmp.
O sqlite tambm permite a criao de bancos de dados em RAM; para isso basta substituir o nome do arquivo
pela string :memory:. Para podermos inserir dados neste banco, precisamos primeiro criar uma tabela.
1 SQL significa Structured Query Language. o SQL um padro internacional na interao com bancos de dados relacionais. Para saber
mais, consulte http://pt.wikipedia.org/wiki/SQL

71

Computao Cientfica com Python, Verso 2.0-alpha

In [3]:c.execute(create table especimes(nome text, altura real, peso real)) Out[3]:sqlite3.Cursor


object at 0x83fed10
Note que os comandos SQL so enviados como strings atravs do objeto Connection, mtodo execute. O
comando create table 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 especificada corresponder a uma coluna da tabela. Cada registro,
inserido subsequentemente, formar uma linha da tabela.
In [4]:c.execute(insert into especimes values(tom,12.5,2.3)
O comando insert mais um comando SQL til para inserir registros em uma tabela.
Apesar dos comandos SQL 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(select * from especimes where nome=?,t) In [7]:c.fetchall()
[(tom, 12.5, 2.2999999999999998)]
No exemplo acima utilizamos o mtodo fetchall para recuperar o resultado da operao. Caso desejssemos
obter um nico registro, usaramos fetchone.
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 = ((jerry,5.1,0.2),(butch,42.4,10.3)) In [9]:for i in t: .9.: c.execute(insert into especimes
values(?,?,?),i)
O objeto cursor tambm pode ser utilizado como um iterador para obter o resultado de uma consulta.
In [10]:c.execute(select * from especimes by peso) In [11]: for reg in c: print reg (jerry,5.1,0.2)
(tom, 12.5, 2.2999999999999998) (butch,42.4,10.3)
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.

72

Captulo 16. O Mdulo Pickle

CAPTULO 17

O Pacote SQLObject

{SQLObject} O pacote SQLObject 1 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 exemplificar o sqlobject, continuaremos utilizando o sqlite devido sua praticidade.

17.1 Construindo um aranha digital


{aranha}{web-spider} {Mdulos!BeautifulSoup} Neste exemplo, teremos a oportunidade de construir uma aranha
digital que recolher informaes da web (Wikipedia 2 ) 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 decodificar as pginas obtidas. [linerange={1-6},frame=trBL, caption=Mdulos necessrios, label=ex:arimp]
{code/aranha.py}
O pacote BeautifulSoup 3 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 capaz
de lidar com pginas defeituosas, retornando uma estrutura de dados com mtodos que permitem uma rpida
e simples extrao da informao que se deseja. Alm disso, se a pgina foi criada com outra codificao, o
BeautifulSoup, retorna todo o contedo em Unicode, automaticamente, sem necessidade de interveno do
usurio.
Da biblioteca padro, vamos nos servir dos mdulos sys, os, urllib, urllib2 e re. A utilidade de
cada um ficar clara medida que avanarmos no exemplo.
O primeiro passo especificar o banco de dados. O sqlobject nos permite escolher entre MySQL, PostgreSQL,
sqlite, Firebird, MAXDB, Sybase, MSSQL, ou ADODBAPI. Entretanto, conforme j explicamos, nos restringiremos ao uso do banco sqlite. [linerange={8-11},frame=trBL, caption=Especificando o banco de dados.,
label=ex:arbdset] {code/aranha.py}
Na listagem ex:arbdset, criamos o diretrio(os.mkdir) onde o banco de dados residir (se necessrio) e definimos a conexo com o banco. Utilizamos os.path.exists para verificar se o diretrio existe. Como desejamos
que o diretrio fique na pasta do usurio, e no temos como saber, de antemo, qual este diretrio, utilizamos
os.path.expanduser para substituir o {\~} por /home/usuario como aconteceria no console unix normalmente.
1
2
3

http://www.sqlobject.org/
http://pt.wikipedia.org
http://www.crummy.com/software/BeautifulSoup/

73

Computao Cientfica com Python, Verso 2.0-alpha

Na linha 11 da listagem ex:arbdset, vemos o comando que cria a conexo a ser utilizada por todos os objetos
criados neste mdulo.
Em seguida, passamos a especificar a tabela do nosso banco de dados como se fora uma classe, na qual seus
atributos so as colunas da tabela. [linerange={16-20},frame=trBL, caption=Especificando a tabela \texttt{ideia}
do banco de dados., label=ex:arsql] {code/aranha.py}
A classe que representa nossa tabela herdeira da classe SQLObject. Nesta classe, a cada atributo (coluna
da tabela) deve ser atribuido um objeto que define o tipo de dados a ser armazenado. Neste exemplo, vemos
quatro tipos distintos, mas existem vrios outros. UnicodeCol representa textos codificados como Unicode,
ou seja, podendo conter caracteres de qualquer lngua. IntCol corresponde a nmeros inteiros. PickleCol
um tipo muito interessante pois permite armazenar qualquer tipo de objeto Python. O mais interessante 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, de acordo com a operao. Por fim, temos
StringCol que uma verso mais simples de UnicodeCol, aceitando apenas strings de caracteres ascii.
Em SQL comum termos que especificar diferentes 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 StringCol quanto em UnicodeCol
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.{urllib2}{urllib}
A pginas so ento analisadas pelo mtodo verResp, no qual o BeautifulSoup tem a chance de fazer o
seu trabalho. Usando a funo SoupStrainer, podemos filtrar o resto do documento, que no nos interessa,
analizando apenas os links (tags a) cujo destino so urls comeadas pela string {/wiki/}. Todos os artigos
da wikipedia, comeam desta forma. 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 ex:arresto que fazemos
toda esta filtragem sofisticada em duas linhas de cdigo(55 e 56), graas ao BeautifulSoup. [linerange={15107},frame=trBL, caption=Restante do cdigo da aranha., label=ex:arresto] {code/aranha.py}
A listagem ex:arresto mostra o restante do cdigo da aranha e o leitor 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 modificado facilmente de forma a reter todo
o contedo dos artigos.

74

Captulo 17. O Pacote SQLObject

CAPTULO 18

Exerccios

1. Modifique a aranha apresentada neste captulo, para guardar os documentos varridos.


2. Crie uma classe capaz de conter os vrios aspectos (links, figuras, 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 simplificar a persistncia, armazene o objeto artigo como um Pickle, no banco de dados.

75

Computao Cientfica com Python, Verso 2.0-alpha

76

Captulo 18. Exerccios

CAPTULO 19

Introduo ao Console Gnu/Linux

Guia de sobrevivncia no console do Gnu/Linux


O console Gnu/Linux um poderoso ambiente de trabalho, em contraste com a interface limitada, oferecida pelo
sistema operacional 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. Em sua evoluo,
deu origem a algumas variantes. 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 cientfica? Qualquer cientista com
alguma experincia 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 cientficos para a realizao de tarefas cientficas
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 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.

19.1 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 grficas sofisticadas, mas comumente utilizado atravs de uma janela, do
conforto de uma interface grfica. Na figura fig:shell, vemos um exemplo de uma sesso do bash rodando em uma
janela.

19.1.1 Alguns Comando teis


ls Lista arquivos.
cp
Copia arquivos.
mv

77

Computao Cientfica com Python, Verso 2.0-alpha

Renomeia ou move arquivos.


rm
Apaga arquivos (de verdade!).
ln
Cria links para arquivos.
pwd
Imprime o nome do diretrio corrente (caminho completo).
mkdir
Cria um diretrio.
rmdir
Remove um diretrio. Para remover recursivamente toda uma rvore de diretrios use rm rf(cuidado!).
cat
Joga o arquivo inteiro na tela.
less
Visualiza o arquivo com possibilidade de movimentao e busca dentro do mesmo.
head
Visualiza o incio do arquivo.
tail
Visualiza o final do arquivo.
nl
Visualiza com numerao das linhas.
od
Visualiza arquivo binrio em base octal.
xxd
Visualiza arquivo binrio em base hexadecimal.
gv
Visualiza arquivos Postscript/PDF.
xdvi
Visualiza arquivos DVI gerados pelo .
stat
Mostra atributos dos arquivos.
wc
Conta bytes/palavras/linhas.
du
Uso de espao em disco.
file
Identifica tipo do arquivo.
touch

78

Captulo 19. Introduo ao Console Gnu/Linux

Computao Cientfica com Python, Verso 2.0-alpha

Atualiza registro de ltima atualizao do arquivo. Caso o arquivo no exista, criado.


chown
Altera o dono do arquivo.
chgrp
Altera o grupo do arquivo.
chmod
Altera as permisses de um arquivo.
chattr
Altera atributos avanados de um arquivo.
lsattr
Lista atributos avanados do arquivo.
find
Localiza arquivos.
locate
Localiza arquivo por meio de ndice criado com updatedb.
which
Localiza comandos.
whereis
Localiza o binrio (executvel), fontes, e pgina man de um comando.
grep
Busca em texto retornando linhas.
cut
Extrai colunas de um arquivo.
paste
Anexa colunas de um arquivo texto.
sort
Ordena linhas.
uniq
Localiza linhas idnticas.
gzip
Compacta arquivos no formato GNU Zip.
compress
Compacta arquivos.
bzip2
Compacta arquivos(maior compactao do que o gzip, porm mais lento.
zip
Compacta arquivos no formato zip(Windows).
diff
Compara arquivos linha a linha.

19.1. A linguagem BASH

79

Computao Cientfica com Python, Verso 2.0-alpha

comm
Compara arquivos ordenados.
cmp
Compara arquivos byte por byte.
md5sum
Calcula checksums.
df
Espao livre em todos os discos(pendrives e etc.) montados.
mount
Torna um disco acessvel.
fsck
Verifica um disco procurando por erros.
sync
Esvazia caches de disco.
ps
Lista todos os processos.
w
Lista os processos do usurio.
uptime
Retorna tempo desde o ltimo boot, e carga do sistema.
top
Monitora processos em execuo.
free
Mostra memria livre.
kill
Mata processos.
nice
Ajusta a prioridade de um processo.
renice
Altera a prioridade de um processo.
watch
Executa programas a intervalos regulares.
crontab
Agenda tarefas peridicas.

80

Captulo 19. Introduo ao Console Gnu/Linux

Computao Cientfica com Python, Verso 2.0-alpha

19.2 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 usurio utiliza estes canais com a finalidade 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.

19.2.1 Redirecionamento
Para redirecionar algum dado para o STDIN de um programa, utilizamos o caracter <. Por exemplo, suponha
que temos um arquivo chamado nomes contendo uma lista de nomes, um por linha. O 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.
:math:$ sort < nomes > nomes_ordenados
end{lstlisting}
O comando do exemplo ref{ex:redir}, cria um novo arquivo com o contedo do arquivo texttt{nomes}, ordenado.
subsection{Pipelines} Podemos tambm redirecionar sadas de comandos para outros comandos, ao invs de
arquivos, como vimos anteriormente. O caractere que usamos para isto o texttt{$:math:$} conhecido como
pipe. Qualquer linha de comando conectando dois ou mais comandos atravs de pipes denominada de
pipeline. begin{lstlisting}* language=csh, caption=Lista ordenada dos usurios do sistema. ,label=ex:pipe
$ cut -d: -f1 /etc/passwd sort ajaxterm avahi avahi-autoipd backup beagleindex bin boinc ...
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 Cientficas do Console Gnu/Linux} O console Gnu/Linux extrai a maior parte da sua
extrema versatilidade de uma extensa coleo de aplicativos leves desenvolvidos * 1
_ para serem
utilizados diretamente do console. Nesta seo, vamos ver alguns exemplos, uma vez que seria impossvel explorar
todos eles, neste simples apndice.

19.2.2 Gnu plotutils


O GNu Ploting Utilities uma suite de aplicativos grficos 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 grfico;
plot Converte Gnu metafile para qualquer dos formatos listados
acima;
pic2plot Converte diagramas criados na linguagem pic para
qualquer dos formatos acima;

19.2. Entradas e Sadas, redirecionamento e Pipes.

81

Computao Cientfica com Python, Verso 2.0-alpha

tek2plot Converte do formato Tektronix para qualquer dos formatos


acima.
Estes aplicativos grficos podem criar e exportar grficos bi-dimensionais em treze formatos diferentes: 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.
{Aplicativos Matemticos:}
{EDO}
ode Integra numericamente sistemas de equaes diferenciais ordinrias (EDO);
spline Interpola curvas utilizando splines cbicas ou
exponenciais. Pode ser utilizado como filtro em tempo real.
graph
{graph} A cada vez que chamamos o programa graph, ele l um ou mais conjuntos de dados a partir de arquivos
especificados na linha de comando, ou diretamente da STDIN, e produz um grfico. O grfico pode ser mostrado
em uma janela, ou salvo em um arquivo em qualquer dos formatos suportados.
:math:$ graph -T png < arquivo_de_dados_ascii > plot.png
end{lstlisting}
Se o texttt{arquivo_de_dados_ascii} contiver duas colunas de nmeros, o programa as atribuir a texttt{x} e
texttt{y}, respectivamente. Os pares ordenados que daro origem aos pontos do grfico no precisam estar
em linhas diferentes. por exemplo: begin{lstlisting}* language=csh, caption=Desenhando um quadrado. ,label=ex:graphq
$ echo .1 .1 .1 .9 .9 .9 .9 .1 .1 .1 graph -T X -C -m 1 -q 0.3
A listagem ex:graphq plotar um quadrado com vrtices em (0.1,0.1), (0.1,0.9), (0.9,0.9) e
(0.9,0.1). A repetio do primeiro vrtice 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 quadrado ser preenchido (densidade 30%) com a mesma cor da linha: vermelho (-C indica grfico
colorido).
O programa graph aceita ainda muitas outras opes. Leia o manual({man graph}) para descobr-las.
spline
O programa funciona de forma similar ao graph no que diz respeito entradas e sadas. Como todos os aplicativos de console, beneficia-se muito da interao com outros programas via pipes.
:math:$ echo 0 0 1 1 2 0 | spline | graph -T X
end{lstlisting} begin{figure}
centering includegraphics* width=10cm
{spline.png}
% spline.png: 578x594 pixel, 72dpi, 20.39x20.95 cm, bb=0 0 578 594 caption{Usando
texttt{spline}.} label{fig:spline}
end{figure}
Spline no serve apenas para interpolar funes, tambm pode ser usado para interpolar curvas em um espao
d-dimensional utilizando-se a opao texttt{-d}. begin{lstlisting}* language=csh, caption=Interpolando uma curva
em um plano. ,label=ex:splinec
echo 0 0 1 0 1 1 0 1 | spline -d 2 -a -s | graph -T X end{lstlisting}

82

Captulo 19. Introduo ao Console Gnu/Linux

Computao Cientfica com Python, Verso 2.0-alpha

O comando da listagem ref{ex:splinec} traar uma curva passando pelos pontos texttt{(0,0)}, texttt{(1,0)},
texttt{(1,1)} e texttt{(0,1)}. A opo texttt{-d 2} indica que a varivel dependente bi-dimensional. A opo
texttt{-a} indica que a varivel independente deve ser gerada automticamente e depois removida da sada (opo
texttt{-s}). begin{figure}
centering includegraphics* width=10cm
{splinec.png}
% splinec.png: 578x594 pixel, 72dpi, 20.39x20.95 cm, bb=0 0 578 594 caption{Interpolando uma
curva em um plano.} label{fig:splinec}
end{figure}
subsubsection{texttt{ode}}
O utilitrio texttt{ode} capaz de produzir uma soluo numrica de sistemas de equaes diferenciais ordinrias.
A sada de texttt{ode} pode ser redirecionada para o utilitrio texttt{graph}, que j discutimos anteriormente, de
forma que as solues sejam plotadas diretamente, medida em que so calculadas.
Vejamos um exemplo simples: begin{equation}
dfrac{dy}{dt}=y(t)
end{equation}
A soluo desta equao :
begin{equation} y(t)=e^t
end{equation}
Se ns resolvermos esta equao numericamente, a partir do valor inicial $y(0)=1:math:$, at $t=1:math:$
esperaramos obter o valor de $e:math:$ como ltimo valor da nossa curva ($e1=2.718282:math:$, com 7
algarismos significativos). Para isso digitamos no console: begin{lstlisting}* language=csh, caption= Resolvendo
uma equao diferencial simples no console do Linux. ,label=ex:ode1
$ ode y=y y=1 print t,y step 0,1
Aps digitar a ultima linha do exemplo ex:ode1, 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 ex:ode1 em um arquivo
texto. Abra o seu editor favorito, e digite o seguinte modelo: * language=csh,frame=trBL, caption=Sistema de
trs equaes diferenciais acopladas ,label=ex:lorenz
{code/lorenz}
Salve o arquivo com o nome lorenz. Agora digite no console a seguinte linha de comandos:
ode lorenz graph -T X -C -x -10 10 -y -20 20
E eis que surgir a bela curva da figura fig:lorenz.

19.2. Entradas e Sadas, redirecionamento e Pipes.

83

Computao Cientfica com Python, Verso 2.0-alpha

84

Captulo 19. Introduo ao Console Gnu/Linux

CAPTULO 20

Indices and tables

genindex
modindex
search

85

Computao Cientfica com Python, Verso 2.0-alpha

86

Captulo 20. Indices and tables

ndice

array, 23

if, 15
import, 21
iterao, 16

B
break, 17

classe, 28
atributos, 28
mtodos, 29
conjunto, 15
controle de fluxo, 15

lambda, 19
linalg;
mdulos numpy, 23
lista, 9
listas, 9
mtodos, 10

decoradores, 20
def, 18
dicionrio
mtodos, 14
dict
dicionrio, 14

mdulos, 21
numpy, 23
numpy linalg;, 23
scipy, 23
Mathematica, 2
Matlab, 2

E
elif, 15
else, 15
enumerate, 16
Epydoc, 24
excees, 17
except, 17

N
numpy, 23
arange, 23
array, 23
shape, 23
linalg;, mdulos, 23

finally, 17
for, 16
funo, 18
funes, 18
lista de argumentos varivel, 19
passando argumentos, 19
funes annimas, 19
funoes
argumentos opcionais, 18

objetos, 27

G
geradores, 19

P
pacotes, 21, 22
Palavras reservadas, 5
print, 23
pydoc, 24

R
R, 2
return, 19
reversed, 17
87

Computao Cientfica com Python, Verso 2.0-alpha

S
scipy, 23
mdulos, 23
sorted, 17
strings
formatando, 13
Strings de documentao, 21

T
try, 17
tuplas, 12

U
Uso interativo, 6

W
while, 16

Z
zip, 16

88

ndice