Aprenda Computacao Cientifica Com Python

92
Computação Científica com Python Versão 2.0-alpha Flávio Codeço Coelho 22/02/2011

description

Aprendendo a programar com Python

Transcript of Aprenda Computacao Cientifica Com Python

  • Computao Cientfica com PythonVerso 2.0-alpha

    Flvio Codeo Coelho

    22/02/2011

  • Contedo

    1 Prefcio: Computao Cientfica 11.1 Apresentando o Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Usando este Livro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2 Fundamentos da Linguagem 52.1 Primeiras impresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Uso Interativo vs. Execuo a Partir de Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Operaes com Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.4 Nomes, Objetos e Espaos de Nomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.5 Estruturas de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.6 Controle de fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.7 Iterao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.8 Lidando com erros: Excees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.9 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.10 Mdulos e Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.11 Documentando Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.12 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    3 Programao Orientada a Objetos 273.1 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    4 Introduo ao Matplotlib 31

    5 Exemplos Avanados 355.1 Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    6 Editores Genricos 39

    7 Editores Especializados 417.1 Controle de Verses em Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    8 Introduo 47

    9 Integrao com a Linguagem C 49

    10 Integrao com C++ 5310.1 Criando Applets em Jython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    11 Exerccios 59

    i

  • 12 O interpretador Jython 61

    13 Introduo 63

    14 NetworkX 6514.1 Construindo Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6514.2 Manipulando Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6514.3 Criando Grafos a Partir de Outros Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6614.4 Gerando um Grafo Dinamicamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6614.5 Construindo um Grafo a Partir de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    15 Exerccios 69

    16 O Mdulo Pickle 71

    17 O Pacote SQLObject 7317.1 Construindo um aranha digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    18 Exerccios 75

    19 Introduo ao Console Gnu/Linux 7719.1 A linguagem BASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7719.2 Entradas e Sadas, redirecionamento e Pipes. . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 eferramentas, da Cincia da Computao.

    Computao cientfica no uma rea do conhecimento muito bem definida. A definio utilizada neste livro ade uma rea de atividade/conhecimento que envolve a utilizao de ferramentas computacionais (software) paraa soluo de problemas cientficos em reas da cincia no necessariamente ligadas disciplina da cincia dacomputao, 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 quasetodos os segmentos da atividade humana. Em decorrncia, podemos encontrar produtos computacionais desen-volvidos para uma enorme variedade de aplicaes, sejam elas cientficas ou no. No entanto, a diversidade deaplicaes cientficas da computao quase to vasta quanto o prprio conhecimento humano. Por isso, o ci-entista frequentemente se encontra com problemas para os quais as ferramentas computacionais adequadas noexistem.

    No desenvolvimento de softwares cientficos, temos dois modos principais de produo de software: o desenvolvi-mento de softwares comerciais, feito por empresas de software que contratam programadores profissionais para odesenvolvimento de produtos voltados para uma determinada aplicao cientfica, e o desenvolvimento feito porcientistas (fsicos, matemticos, bilogos, etc., que no so programadores profissionais), geralmente de formacolaborativa atravs do compartilhamento de cdigos fonte.

    Algumas disciplinas cientficas, como a estatstica por exemplo, representam um grande mercado para o desen-volvimento de softwares comerciais genricos voltados para as suas principais aplicaes, enquanto que outrasdisciplinas cientficas carecem de massa crtica (em termos de nmero de profissionais) para estimular o desen-volvimento de softwares comerciais para a soluo dos seus problemas computacionais especficos. Como agra-vante, o desenvolvimento lento e centralizado de softwares comerciais, tem se mostrado incapaz de acompanhara 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 mtodoscomputacionais, como por exemplo a bio-informtica, a modelagem de sistemas complexos, dinmica moleculare etc.

    Cientistas que se vem na situao de terem de desenvolver softwares para poder viabilizar seus projetos depesquisa, geralmente tm de buscar uma formao improvisada em programao e produzem programas que temcomo caracterstica bsica serem minimalistas, ou seja, os programas contm o mnimo nmero de linhas decdigo possvel para resolver o problema em questo. Isto se deve conjugao de dois fatos: 1) O cientistararamente possui habilidades como programador para construir programas mais sofisticados e 2) Frequentementeo 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 foramprojetadas e desenvolvidas por programadores para programadores e voltadas ao desenvolvimento de softwaresprofissionais com dezenas de milhares de linhas de cdigo. Devido a isso, o nmero de linhas de cdigo mnimopara escrever um programa cientfico nestas linguagens muitas vezes maior do que o nmero de linhas de cdigoassociado com a resoluo do problema em questo.

    1

  • 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 nopodiam esperar por solues comerciais.

    Esta nova classe de aplicativos cientficos, geralmente inclui uma linguagem de programao de alto nvel, pormeio da qual os cientistas podem implementar seus prprios algoritmos, sem ter que perder tempo tentando ex-plicar 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 prprioaplicativo, no podendo ser executados fora dos mesmos. Estes ambientes, entretanto, no possuem vrias car-actersticas importantes das linguagens de programao: No so portteis, ou seja, no podem ser levados deuma 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 outraplataforma computacional para a qual no exista uma verso do aplicativo gerador. E, por ltimo e no menosimportante, o programa produzido pelo cientista no lhe pertence, pois, para ser executado, necessita de cdigoproprietrio do ambiente de desenvolvimento comercial.

    Este livro se prope a apresentar uma alternativa livre (baseada em Software Livre), que combina a facilidadede aprendizado e rapidez de desenvolvimento, caractersticas dos ambientes de desenvolvimento comerciais ap-resentados acima, com toda a flexibilidade das linguagens de programao tradicionais. Programas cientficosdesenvolvidos inteiramente com ferramentas de cdigo aberto tem a vantagem adicional de serem plenamenteescrutinveis pelo sistema de reviso por pares (peer review), mecanismo central da cincia para validao deresultados.

    A linguagem Python apresenta as mesmas solues propostas pelos ambientes de programao cientfica, man-tendo 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 desen-volvimento de qualquer tipo de aplicao, cientfica ou no. O Python oferece suporte integrao com outraslinguagens e ferramentas, e distribuido com uma vasta biblioteca padro. Alm disso, a linguagem possui umasintaxe simples e clara, podendo ser aprendida em poucos dias. O uso do Python frequentemente associado comgrandes 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 Guidovan Rossum. Guido foi o principal autor da linguagem e continua at hoje desempenhando um papel central nodirecionamento da evoluo. Guido reconhecido pela comunidade de usurios do Python como BenevolentDictator For Life (BDFL), ou ditador benevolente vitalcio da linguagem.

    A primeira verso pblica da linguagem (0.9.0) foi disponibilizada. Guido continou avanando o desenvolvimentoda linguagem, que alcanou a verso 1.0 em 1994. Em 1995, Guido emigrou para os EUA levando a responsabili-dade pelo desenvolvimento do Python, j na verso 1.2, consigo. Durante o perodo em que Guido trabalhou parao CNRI 2, o Python atingiu a verso 1.6, que foi rpidamente seguida pela verso 2.0. A partir desta verso, oPython passa a ser distribudo sob a Python License, compatvel com a GPL 3, tornando-se oficialmente softwarelivre. A linguagem passa a pertencer oficialmente Python Software Foundation. Apesar da implementao origi-nal 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 celularesat supercomputadores com processamento paralelo, passando por todas as plataformas de computaopessoal.

    1 www.python.org2 Corporation for National Research Initiatives3 GNU General Public License4 www.jython.org5 pypy.org6 {www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython}

    2 Captulo 1. Prefcio: Computao Cientfica

  • Computao Cientfica com Python, Verso 2.0-alpha

    Portabilidade: Aplicativos desenvolvidos em Python podem ser facilmente distribudos para vrias plataformasdiferentes 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 deprogramas.

    Extensibilidade: O Python pode ser extendido atravs de mdulos,escritos em Python ou rotinas escritas emoutras 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 (progra-mas escritos em Python) so objetos.

    Tipagem automtica: O tipo de uma varivel (string, inteiro, float, etc.) determinado durante a execuo docdigo; 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, vocno pode somar a string 123 com o inteiro 3. Isto reduz a chance de erros em seu programa. A variveispodem, 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 deindentao, 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 mdulospara interao com os protocolos mais comuns da Internet (FTP, HTTP, XMLRPC, etc.). A maior partedestes 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 ebinrio, muito simplificada no Python, facilitando a tarefa de muitos pesquisadores ao acessar dados emdiversos 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, ouusar o Python simplesmente como uma calculadora.

    etc: ...

    Entretanto, para melhor compreender todas estas vantagens apresentadas, nada melhor do que comear a explorarexemplos de computao cientfica na linguagem Python. Mas para inspirar o trabalho tcnico, nada melhor doque um poema:

    >>> import thisThe 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 breakthe rules. Although practicality beats purity. Errors should neverpass silently. Unless explicitly silenced. In the face ofambiguity, refuse the temptation to guess. There should be one- andpreferably only one -obvious way to do it. Although that way maynot be obvious at first unless youre Dutch. Now is better thannever. Although never is often better than \*right\* now. If theimplementation is hard to explain, its a bad idea. If theimplementation 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 3

  • 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 nicopr-requisito seria uma exposio prvia dos alunos a conceitos bsicos de programao (que poderia sercondensada em uma nica aula).

    2. Um curso combinado de Python e computao cientfica. O autor tem ministrado este tipo de curso comgrande sucesso. Este curso faria uso da maior parte do contedo do livro, o instrutor pode selecionarcaptulos 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 cadacaptulo encontram-se os pr-requisitos para se entender o seu contedo. Mas no se deixe inibir; as aplicaescientficas 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 com-preenso dos tpicos apresentados 7. Para os leitores sem sorte, que no dispem de um computador com osistema operacional GNU/Linux instalado, sugiro que o instalem, facilitar muito o acompanhamento dos exem-plos. Para os que ainda no esto prontos para abandonar o Windows, instalem o Linux em uma mquina virtual8! 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 sempreinteressados em aprender coisas novas!

    Bom Proveito!

    Flvio Codeo Coelho Rio de Janeiro, 2010

    7 O cdigo fonte do exemplos est disponvel na seguinte URL: http://fccoelho.googlepages.com/CCP_code.zip8 Recomendo o VirtualBox (www.virtualbox.org), software livre e fantstico!

    4 Captulo 1. Prefcio: Computao Cientfica

  • CAPTULO 2

    Fundamentos da Linguagem

    Breve introduo a conceitos bsicos de programao e linguagem Python. A maioria dos elementosbsicos da linguagem so abordados neste captulo, com exceo de classes, que so discutidas emdetalhe no captulo cap-obj. Pr-requisitos: Conhecimentos bsicos de programao em qualquerlinguagem.

    Neste Captulo, faremos uma breve introduo linguagem Python. Esta introduo servir de base para osexemplos dos captulos subseqentes. Para uma introduo mais completa linguagem, recomendamos ao leitora 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 interati-vamente, a partir do console Python. Vejamos como invoc-lo:

    .. _ex-conspy$ pythonPython 2.5.1 (r251:54863, May 2 2007, 16:56:35)[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2Type "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 podeser 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 utilizadaspara nomear variveis. Se o programador tentar utilizar uma das palavras reservadas como varivel, incorrer emum erro de sintaxe. Palavras reservadas no podem ser utilizadas como nomes de variveis:

    >>> for=1File "", line 1for=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 docomando dir(__builtins__). Nenhum dos elementos do mdulo __builtins__ deve ser redefinidofootnote{Ateno,os componentes de __builtins__, no geram erros de sintaxe ao ser redefinidos.

    5

  • 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 qualquer elemento da linguagem. O comando help(), inicia a ajuda interativa. A partir da, podemos por exemplo, digitar keywords para acessar a ajuda das palavras reservadas listadas acima. Se digitarmos for em seguida, obteremos a seguinte ajuda::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 otheriterable 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 satis-feitos em saber que o Python tambm pode ser utilizado de forma interativa. Para isso, basta invocar o interpretadorna linha de comando (Python shell, em Unix) ou invocar um shell mais sofisticado como o Idle, que vem com adistribuio 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 linha do programa. Caso se deseje inserir mais de uma expresso em uma linha, as expresses devem ser separadas por ;. Mas esta prtica deve ser evitada. Expresses podem continuar em outra linha se algum de seus parnteses, colchetes, chaves ou aspas ainda no tiver sido fechado. Alternativamente, linhas podem ser quebradas pela aposio do caractere \ ao final da linha::

    >>> 1+12>>>

    No cabealho da shell do Python, acima (listagem ex-conspy), o interpretador identifica a verso instalada, data ehora em que foi compilada, o compilador C utilizado, detalhes sobre o sistema operacional e uma linhazinha deajuda para situar o novato.

    Para executar um programa, a maneira usual (em Unix) digitar: python script.py. No Windows basta um duploclique sobre arquivos com extenso .py.

    No Linux e em vrios UNIXes, podemos criar scripts que so executveis diretamente, sem precisar invocar ointerpretador 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 line3, but no encoding declared; seehttp://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 circunflexoem Al. Para que o Python no reclame de acentos e outros caracteres da lngua portuguesa no contidos natabela ASCII, precisamos adicionar a seguinte linha ao script: # -*- coding: latin-1 -*-. Experi-mente 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 codificaodo 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 umastring como sada, ou seja, para escrever no stdout 1. Como podemos receber informaes pelo stdin? O Pythonnos oferece duas funes para isso: input(texto), que executa o que o usurio digitar, sendo portantoperigoso, 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.

    6 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. Vamosiniciar nosso contato com o Python atravs dos nmeros:

    >>> 2+2 #Comentrio ...4>>> 2*24>>> 2**24>>> (50-5*6)/4 #Diviso de inteiros retorna "floor": ...5>>> 7/32>>> 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: comoconstantes. desta forma que utilizamos uma calculadora comum. Em programao mais comum termosnmeros associados a quantidades, a que precisamos nos referenciar e que podem se modificar. Esta representaode nmeros chama-se varivel.

    O sinal de = utilizado para atribuir valores a variveis:

    >>> largura = 20>>> altura = 5*9>>> largura * altura900

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

    >>> x = y = z = 0>>> x0>>> y0>>> z0>>> a,b,c=1,2,3>>> a1>>> b2>>> c3

    O Python tambm reconhece nmeros reais (ponto-flutuante) e complexos naturalmente. Em operaes entrenmeros 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 7

  • Computao Cientfica com Python, Verso 2.0-alpha

    resultam sempre em um nmero complexo. Nmeros complexos so sempre representados por dois nmerosponto-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 nmerocomplexo c utilizando atributos do tipo complexo: c.real e c.imag. A funo abs, que retorna o mdulode um numero inteiro ou real, retorna o comprimento do vetor no plano complexo, quando aplicada a um nmerocomplexo. O mdulo de um nmero complexo tambm denominado magnitude:

    >>> a=3.0+3.0j>>> a.real3.0>>> a.imag3.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. Nomesdevem ser iniciados por letras maisculas ou minsculas e podem conter algarismos, desde que no sejam oprimeiro 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 operaodamos 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 totalda memria, assim que um objeto deixa de ser referenciado por um nome (deixa de existir no espao de nomescorrente), ele imediatamente apagado da memria pelo interpretador.

    O conceito de espao de nomes uma caracterstica da linguagem Python que contribui para sua robustez eeficincia. Espaos de nomes so dicionrios (ver ss:dict) contendo as variveis, objetos e funes disponveisdurante a execuo de um programa. A um dado ponto da execuo de um programa, existem sempre doisdicionrios disponveis para a resoluo de nomes: um local e um global. Estes dicionrios podem ser acessadospara leitura atravs das funes locals() e globals(), respectivamente. Sempre que o interpretador Pythonencontra uma palavra que no pertence ao conjunto de palavras reservadas da linguagem, ele a procura, primeirono 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.

    8 Captulo 2. Fundamentos da Linguagem

  • Computao Cientfica com Python, Verso 2.0-alpha

    >>> mariaTraceback (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 umafuno, o espao de nomes local passa a refletir apenas as variveis definidas dentro daquela funo 4. Ao sair dafuno, 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()1novo valor>>> print a1>>> 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 vemosacima.

    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 vamosconhecer os tipos e estruturas de dados do Python para que possamos, mais adiante, utilizar toda a sua flexibilidadeem nossos programas.

    No Python, uma grande nfase dada simplicidade e flexibilidade de forma a maximizar a produtividade doprogramador. No tocante aos tipos e estruturas de dados, esta filosofia se apresenta na forma de uma tipagemdinmica, 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 dasvariveis 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 enormementea 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 devalores separados por vrgulas e delimitada por colchetes:

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

    4 Mais quaisquer variveis explicitamente definidas como globais

    2.5. Estruturas de Dados 9

  • 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, deforma que podemos selecionar elementos de uma lista por meio de sua posio. Note que o primeiro elemento dalista 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 inteiroenquanto 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, podemosassessar 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 umelemento:

    >>> 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 ime-diatamente anterior ao elemento 3. Note que esta seleo inclui o elemento correspondente ao limite inferior dointervalo, mas no o limite superior. Isto pode gerar alguma confuso, mas tem suas utilidades. ndices negativostambm podem ser utilizados nestas expresses.

    Para retirar uma fatia que inclua o ltimo elemento, temos que usar uma variao deste comando seletor deintervalos:

    >>> lista[2:][que, 1]

    Este comando significa todos os elementos a partir do elemento 2 (o terceiro), at o final da lista. Este comandopoderia ser utilizado para selecionar elementos do incio da lista: lista[:3], s que desta vez no incluindo oelemento 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 maneirade 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 ordenaodescritas na tabela :tab:metlista, so realizadas no mesmo espao de memria da lista original. Operaes insitu 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, queo objeto em questo era uma lista, e o mtodo insert no a fundiu com a lista original. Este exemplo nos mostramais 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 valordado. Se o valor no existir, o interpretador retorna um ValueError. Para testar se um elemento est presenteem uma lista, pode-se utilizar o comando in 5 como ilustrado na listagem ex-buslista. Caso o elemento faa parteda 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 elementoda 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, +, concatenaduas 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, es-pecialmente para grandes listas. O operador de multiplicao, *, um repetidor/concatenador de listas conformemostrado 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.6 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 enquantoque as demais so verdadeiras.

    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 o comando range (exemplo ex-range). O comando range aceita 1, 2 ou trs argumentos: incio, fim e passo, respectivamente::

    >>> range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> range(2,20,2) #nmeros pares[2, 4, 6, 8, 10, 12, 14, 16, 18]>>> range(1,20,2) #nmeros mpares[1, 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 elementosque 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 feitoem 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 umatupla. No podemos fazer busca em tuplas, visto que no dispomos do mtodo index. No entanto, podemos usarin 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>>> w1>>> x2>>> y3>>> z4

    Conforme exemplificado em ex-criatupla2, uma tupla vazia, definida pela expresso (), j no caso de umatupla unitria, isto , com apenas um elemento, fazemos a atribuio com uma vrgula aps o elemento, casocontrrio (tu=(casa) ), o interpretador no poder distinguir se os parnteses esto sendo utilizados comodelimitadores normais ou delimitadores de tupla. O comando tu=(casa,) equivalente ao apresentado naquarta linha do exemplo acima, apenas mais longo.

    Na stima linha da listagem ex-criatupla2, temos uma extenso do conceito apresentado na linha anterior: adefinio de uma tupla sem a necessidade de parnteses. A este processo, se d o nome de empacotamento desequncia. 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 precisarde uma sequnca de elementos para servir apenas de referncia, sem a necessidade de edio, deve-se utilizar umatupla. 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 tam-bm podem ser convertidas em tuplas, com a funo tuple(lista), assim como tuplas podem ser convertidasem listas atravs da funo list(tupla).

    Uma outra aplicao interessante para tuplas, mostrada na listagem ex-criatupla2, a atribuio mltipla, em queuma tupla de valores, atribuda a uma lista de nomes de variveis armazenados em uma tupla. Neste caso, asduas 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 aspassimples, 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 serdefinidas com trs aspas (duplas ou simples). Esta ltima forma utilizada para definir strings contendo quebrasde linha:

    >>> st=123 de oliveira4>>> len(st)16>>> min(st) >>> max(st)v>>> texto ="""primeira linhasegunda linhaterceira linha""">>> print textoprimeira linhasegunda linhaterceira 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 funesmin() e max() retornam o valor mnimo e o mximo de uma sequncia, respectivamente. Neste caso, como asequncia uma string, os valores so os cdigos ASCII de cada caracter. Estes comandos tambm so vlidospara listas e tuplas.

    O tipo String possui 33 mtodos distintos (na verso 2.2.1 do Python). Seria por demais enfadonho listar edescrever cada um destes mtodos neste captulo. Nesta seo vamos ver alguns mtodos de strings em ao nocontexto 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, ainsero 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 destrings. O operador % (mdulo), indica que os elementos da tupla (ou dicionrio) seguinte sero mapeados, emsequncia, 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 + gramasTraceback (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 mduloe os marcadores {\%s}, faz mais do que apenas concatenar strings, tambm converte a varivel peso (inteiro) emuma string.

    2.5.4 Dicionrios

    O dicionrio um tipo de dado muito interessante do Python: uma estrutura que funciona como um banco dedados em miniatura, no sentido de que seus elementos consistem de pares chave : valor, armazenados semordenao. Isto significa que no existem ndices para os elementos de um dicionrio, a informao acessadaatravs 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 podemosacessar, 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 outrosdicionrios. Tambm no h qualquer restrio para o armazenamento de diferentes tipos de dados em um mesmodicionrio.

    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 umachave que j existe, o novo tem substituir o antigo.

    Os mtodos D.iteritems(), D.iterkeys() e D.itervalues() criam iteradores. Iteradores permitemiterar atravs dos tens, chaves ou valores de um dicionrio:

    >>> Z.items()[(Na, 40), (C, 12), (H, 1), (O, 16), (N, 12)]>>> i=Z.iteritems()>>> idictionary-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 conceitomatemtico de conjunto foi introduzida na linguagem Python. Um conjunto no Python uma coleo de elementossem ordenao e sem repeties. O objeto conjunto em Python aceita operaes matemticas de conjuntos taiscomo unio, interseo, diferena e diferena simtrica:

    >>> a = set(pirapora)>>> b = set(paranapanema)>>> a #letras em aset([i, p, r, a, o])>>> a - b #Letras em a mas no em bset([i, o])>>> a | b #letras em a ou bset([a, e, i, m, o, n, p, r])>>> a & b #letras em a e bset([a, p, r])>>> a ^ b #letras em a ou b mas no em ambosset([i, m, e, o, n])

    No exemplo ex-conjuntos pode-se observar as seguintes correspondncias entre a notao do Python e a notaomatemtica convencional:

    a - b: AB 7a | b: A Ba & b: A Ba ^ 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 casoso linhas pertencentes definio de funo e classe, que so executadas apenas quando a respectiva funo ouclasse chamada. Entretanto algumas palavras reservadas tem o poder de alterar a direo do fluxo de execuodas linhas de um programa. {Condies} Toda linguagem de programao possui estruturas condicionais quenos permitem representar decises: se isso, faa isso, caso contrrio faa aquilo. Estas estruturas tambm soconhecidas por ramificaes. O Python nos disponibiliza trs palavras reservadas para este fim: if , elif eelse. O seu uso melhor demonstrado atravs de um exemplo:

    if a == 1: #este bloco executado se a for 1pass

    elif a == 2: #este bloco executado se a for 2pass

    else: #este bloco executado se se nenhum anteriores tiver sido executadopass

    No exemplo acima, vemos tambm emprego da palavra reservada pass, que apesar de no fazer nada muitotil 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 nocontempla 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 de-sejamos ter que escrever os mesmos comandos em sequncia, pois alm de ser uma tarefa tediosa, iria transformarnosso 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 nmeroarbitrrio 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 consisteem um ou mais comandos indentados em relao ao comando que inicia o lao. O fim da indentao indica o fimdo bloco de instrues que deve ser executado pelo lao:

    while True: #repete indefinidamentepass

    i=0while i < 10:

    i +=1print 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, sequen-cialmente, 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 dacomplexidade do cdigo. No exemplo ex-iterdic ns vimos que dicionrios possuem mtodos especficos paraiterar 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 forchama 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 dasmltiplas 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 semalterar 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 algumacondio se concretiza. Podemos tambm saltar para a prxima iterao (sem completar todas as instrues dobloco) por meio da palavra reservada continue. A palavra reservada else tambm pode ser aplicada aofinal de um bloco iterativo. Neste caso o bloco definido por else s ser executado se a iterao se completarnormalmente, 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, utilizadono dia a dia do trabalho cientfico. No contexto de um programa, muitas vezes somos forados a lidar compossibilidades de erros e precisamos de ferramentas para lidar com eles.

    Muitas vezes queremos apenas continuar nossa anlise, mesmo quando certos erros de menor importncia ocor-rem; outras vezes, o erro justamente o que nos interessa, pois nos permite examinar casos particulares ondenossa lgica no se aplica.

    Como de costume o Python nos oferece ferramentas bastante intuitivas para interao com erros 8:

    >>> 1/0Traceback (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 dadosfornecidos ao programa, o denominador torna-se zero. Como a diviso por zero no possvel, o seu programapara, retornando uma mensagem similar a da listagem ex-exception. Caso voc queira continuar com a execuodo 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.00.50.3333333333330.25

    A construo try: ... except: nos permite verificar a ocorrncia de erros em partes de nossos progra-mas e responder adequadamente a ele. o Python reconhece um grande nmero de tipos de excees, chamadasbuilt-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 tu-pla 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 difer-ente 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 sempreque o erro esperado no ocorrer, ou seja, caso ocorra um erro imprevisto a clusula else ser executada (aocontrrio de linhas adicionais dentro da clusula try).

    Finalmente, try permite uma outra clusula opcional, finally, que sempre executada (quer haja erros querno). Ela util para tarefas que precisam ser executadas de qualquer forma, como fechar arquivos ou conexes derede.

    2.9 Funes

    No Python, uma funo um bloco de cdigo definido por um cabealho especfico e um conjunto de linhasindentadas, 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 outrosobjetos 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. Porexemplo: func(). Estes parnteses podem ou no conter argumentos. Continue lendo para uma explicao doque so argumentos.

    Funes tambm possuem seu prprio espao de nomes, ou seja, todas as variveis definidas no escopo de umafuno 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 deveseguir as regras de formao de qualquer nome em Python. Entre parnteses vem, opcionalmente, uma listade argumentos que sero ser passados para a funo quando ela for chamada. Argumentos podem ter valoresdefault se listados da forma a=1. Argumentos com valores default devem vir necessariamente aps todos osargumentos 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 emuma 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.10 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.

    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 valordefault, devem ser passados primeiro. Argumentos opcionais podem ser passados fora de ordem, desde queaps os argumentos obrigatrios, que sero atribudos sequencialmente aos primeiros nomes da lista definida nocabealho da funo.

    Muitas vezes conveniente desempacotar os argumentos passados para uma funo a partir de uma tupla oudicionrio:

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

    Argumentos passados dentro de um dicionrio podem ser utilizados simultneamente para argumentos de pas-sagem obrigatria (declarados no cabealho da funo sem valor default) e para argumentos opcionais, declara-dos ou no:

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

    Note que no exemplo ex-passdic, os valores cujas chaves correspondem a argumentos declarados, so atribudosa 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 conter uma nica expresso::

    >>> 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 podemosmodificar o funcionamento de uma funo durante a execuo do programa: a funo raiz retorna uma funo raizde 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 conve-nientes 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 Lgato

    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 fa-cilitar a modificao de funes (sem alter-las), adicionando funcionalidade. Nesta seo va-mos 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,kwargsreturn 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 umdecorador. Decoradores esperam um nico argumento: uma funo. A listagem abaixo, nos mostra como utilizaro decorador:

    >>> @faznadadef 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 funodecorada possua o mesmo nome, docstring, etc. que a funao original. No entanto, esta passagem de atributospolui o cdigo da funo decoradora. Podemos evitar a poluio e o trabalho extra utilizando a funcionalidadedo mdulo functools:

    from functools import wrapsdef 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 aorganizar o cdigo e reduzir a necessidade de duplicao. Aplicaes cientficas de decoradores so raras, masa 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 denominadasstrings 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 documentaoautomtica de um programa. A funo help(nome_da_funo) tambm retorna a docstring. Portanto aincluso 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 umexemplo. Incluir um exemplo de uso da funo cortado e colado diretamente do console Python (incluindo oresultado), 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 cdigoPython pode ser escrito em um arquivo de texto, salvo com a terminao .py, facilitando a re-utilizao daquelecdigo. Arquivos com cdigo Python construdos para serem importados, so denominados mdulo. Existemalgumas variaes na forma de se importar mdulos. O comando import meumodulo cria no espao de nomesum objeto com o mesmo nome do mdulo importado. Funes, classes (ver captulo cap:obj) e variveis definidasno mdulo so acessveis como atributos deste objeto. O comando from modulo import * importa todas asfunes e classes definidas pelo mdulo diretamente para o espao de nomes global 11 do nosso script. Deve serutilizado com cuidado pois nomes iguais pr-existentes no espao de nomes global sero redefinidos. Para evitareste risco, podemos substituir o * por uma sequncia de nomes correspondente aos objetos que desejamos impor-tar: from modulo import nome1, nome2. Podemos ainda renomear um objeto ao import-lo: importnumpy as N ou ainda from numpy import det as D.

    1 # Disponvel no pacote de programas como: fibo.py2 #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 def fib(n):5 a, b = 0, 16 while b < n:7 print b,8 a, b = b, a+b9

    10 if __name__=="__main__":11 import sys12 print __name__13 print sys.argv14 fib(int(sys.argv[1]))

    Seja um pequeno mdulo como o do exemplo ex-modfib. Podemos importar este mdulo em uma sesso dointerpretador 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 impor-tados 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 impor-tao, __name__ igual ao nome do mdulo (sem a terminao .py). Se foi executado diretamente (pythonmodulo.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 decdigo? Mdulos podem ser executados diretamente pelo interpretador, sem serem importados primeiro. Vejamosisso no exemplo ex-runmod. Podemos ver que agora o __name__ do mdulo __main__ e, portanto, as linhasde cdigo dentro do bloco if so executadas. Note que neste caso importamos o mdulo sys, cujo atributo argvnos retorna uma lista com os argumentos passados para o mdulo a partir da posio 1. A posio 0 sempre onome 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. Mdulospodem 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 bibliotecapadro 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 nadamais do que um diretrio contendo um arquivo denominado __init__.py (este arquivo no precisa conternada). Portanto, pode-se criar um pacote simplesmente criando um diretrio chamado, por exemplo, pacotecontendo os seguintes mdulos: modulo1.py e modulo2.py 12. Um pacote pode conter um nmero arbitrriode mdulos, assim como outros pacotes.

    Como tudo o mais em Python, um pacote tambm um objeto. Portanto, ao importar o pacote pacote em umasesso Python, modulo1 e modulo2 aparecero como seus atributos:

    >>> import pacote>>> dir(pacote)[modulo1,modulo2]

    12 Alm de __init__.py, naturalmente.

    22 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 computaocientfica, o numpy. Este pacote contm uma grande variedade de mdulos voltados para resoluo de problemasnumricos de forma eficiente.

    Exemplos de objetos e funes pertencentes ao pacote numpy aparecero regularmente na maioria dos exemp-los 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, quevisa representar o conceito matemtico de matriz. Operaes matriciais derivadas da algebra linear, so aindaoferecidas 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 equiva-lente ao range para criar listas, s que retorna um vetor (matriz unidimensional). Note que este vetor compostode nmeros inteiros sucessivos comeando em zero. Todas as enumeraes em Python comeam em zero. Comoem uma lista, a[0] o primeiro elemento do vetor a. O objeto que criamos, do tipo array, definido nomdulo 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 natela o valor de uma varivel.

    Como tudo em Python um objeto, o objeto array apresenta diversos mtodos e atributos. O atributo chamadoshape contm o formato da matriz como uma tupla, que pode ser multi-dimensional ou no. Portanto, paraconverter vetor a em uma matriz 3 x 3, basta atribuir o valor (3,3) a shape. Conforme j vimos, atributos emtodos 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 nossamatriz. 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 donumpy e prov uma grande coleo de rotinas numricas voltadas para aplicaes em matemtica, engenharia eestatstica.

    Diversos exemplos da segunda parte deste livro se utilizaro do scipy, portanto, no nos extenderemos em exem-plos 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 pelaprpria linguagem.

    A principal maneira de documentar programas em Python atravs da adio de strings de documentao (doc-strings) a funes e classes ao redigir o cdigo. Mdulos tambm podem possuir docstrings contendo umasinopse da sua funcionalidade. Estas strings servem no somente como referncia para o prprio programadordurante o desenvolvimento, como tambm como material para ferramentas de documentao automtica. A prin-cipal ferramenta de documentao disponvel para desenvolvedores o pydoc, que vem junto com a distribuioda linguagem.

    2.11.1 Pydoc

    O pydoc uma ferramenta que extrai e formata a documentao de programas Python. Ela pode ser utilizada dedentro 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 fazero 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 mquinalocal.

    -g til para sistemas sem fcil acesso ao console, inicia um servidor HTTP eabre uma pequena janela para busca.

    -w nome Escreve a documentao requisitada em formato HTML, no arquivo.html, onde pode ser um mdulo instalado na bibliotecalocal do Python ou um mdulo ou pacote em outra parte do sistema de ar-quivos. Muito til para gerar documentao para programas que criamos.

    Alm do pydoc, outras ferramentas mais sofisticadas, desenvolvidas por terceiros, esto disponveis para autom-atizar 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 provera funcionalidade j demontrada para o pydoc, oferece outras facilidades como a gerao da documentao emformato 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 maisnumerosas:

    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 pginaman 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 paraoutros formatos. A opo --url, nos permite adicionar um link para o website de nosso projeto ao cabealhoda 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 mduloou pacote. A opo --graph pode gerar trs tipos de grficos sobre nosso programa, incluindo um diagramaUML(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 ob-serve 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. Pr-requisitos: Ter lido o captulo cap_fundamentos.

    Programao orientada a objetos um tema vasto na literatura computacional. Neste captulo introduziremos osrecursos presentes na linguagem Python para criar objetos e, atravs de exemplos, nos familiarizaremos com oparadigma da programao orientada a objetos.

    Historicamente, a elaborao de programas de computador passou por diversos paradigmas. Programas de com-putador comearam como uma simples lista de instrues a serem executadas, em sequncia, pela CPU. Esteparadigma de programao foi mais tarde denominado de programao no-estruturada. Sua principal caracters-tica 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 es-truturadas, 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 fun-cional, na qual a computao vista como a avaliao sequencial de funes matemticas, e cujos principaisexemplos atuais so as linguagens Lisp e Haskell.

    A programao estruturada atingiu seu pico em versatilidade e popularidade com o paradigma da programaoorientada a objetos. Na programao orientada a objetos, o programa dividido em unidades (objetos) contendodados (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 mquinaindependente 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 permitereplicar a arquitetura do sistema natural em nossos programas, representando componentes de sistemas naturaiscomo objetos computacionais.

    A orientao a objeto pode ser compreendida em analogia ao conceito gramatical de objeto. Os componentesprincipais de uma frase so: sujeito, verbo e objeto. Na programao orientada a objeto, a ao est sempreassociada 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 prviaem 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 ob-jeto. Alm de acomodar as preferncias de cada usurio, permite acomodar as convenincias do problema a serresolvido pelo programa.

    Neste captulo, introduziremos as tcnicas bsicas de programao orientada a objetos em Python. Em exemplosde 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 certograu 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 vizinhosem 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, podemosconstruir 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 Ob-jeto, inteiramente em branco. Como uma classe completamente vazia no possvel em Python, adicionamos ocomando pass que no tem qualquer efeito.

    Para criar uma classe mais til de objetos, precisamos definir alguns de seus atributos. Como exemplo vamoscriar 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 objetopessoa e estas instncias herdaro estes atributos:

    >>> maria = pessoa()>>> maria.peso70>>> maria.sexomasculino>>> mariamain.pessoa instance at 0x402f196c

    Entretanto, os atributos definidos para o objeto pessoa (listagem acima), so atributos que no se espera quepermaneam os mesmos para todas as possveis instncias (pessoas). O mais comum que os atributos especficosdas instncias sejam fornecidos no momento da sua criao. Para isso, podemos definir quais as informaesnecessrias para criar uma instncia do objeto pessoa:

    class pessoa:def __init__(self,idade,altura,sexo,peso):

    self.idade=idadeself.altura=alturaself.sexo=sexoself.peso=peso

    Agora podemos testar a nova classe:

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

    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 padrode classes (tambm conhecida como construtora da classe), que executada automaticamente, sempre queuma 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 novaverso da classe pessoa.

    3.1.2 Adicionando Funcionalidade a Objetos

    Continuando com a analogia com objetos reais, os objetos computacionais tambm podem possuir funcionali-dades, alm de atributos. Estas funcionalidades so denominadas mtodos de objeto. {classe!mtodos} Mto-dos so definidos como funes pertencentes ao objeto. A funo {\_\_init\_\_} que vimos h pouco um mtodopresente 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 (vejalinha 11 da listagem ex:classe4). O argumento self tambm deve ser o primeiro argumento a ser declarado nalista de argumentos de um mtodo.

    3.1.3 Herana

    {Herana} Para simplificar a definio de classes complexas, classes podem herdar atributos e mtodos de outrasclasses. Por exemplo, uma classe Felino, poderia herdar de uma classe mamfero, que por sua vez herdaria deoutra classe, vertebrados. Esta cadeia de herana pode ser extendida, conforme necessrio (Listagem ex:her).

    class Vertebrado: vertebra = True class Mamifero(Vertebrado): mamas = True class Carniv-oro(Mamifero): longoscaninos = True bicho = Carnivoro() dir(bicho) [doc, module, longoscani-nos, mamas, vertebra] issubclass(Carnivoro,Vertebrado) True bicho.class class main.Carnivoro at0xb7a1d17c isinstance(bicho,Mamifero) True

    Na listagem ex:her, vemos um exemplo de criao de um objeto, instncia da classe Carnivoro, herdando osatributos 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 relaesparentais 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 tiposde dados. Tal construto seria equivalente ao tipo struct da linguagem C. Para exemplificar, vamos definir umaclasse vazia:

    class Cachorro: pass rex=Cachorro() rex.dono = Pedro rex.raca = Pastor rex.peso=25 rex.donoPedro 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 asuas instncias, sem alterar a estrutura da classe. {Exerccios}

    1. Utilizando os conceitos de herana e os exemplos de classes apresentados, construa uma classe Cachorroque 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 pacotematplotlib. \textbf{Pr-requisitos:} Captulo \ref{cap:intro}.}

    {E} {xiste} um nmero crescente de mdulos para a criao de grficos cientficos com Python. Entretanto, at omomento 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 listagemex:fil): simplicidade, elegncia, versatilidade, etc. poca, a aplicao destes critrios nos deixou apenas umaopo: o mdulo matplotlib 1.

    1 http://matplotlib.sourceforge.net

    30 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 parautilizao tanto interativa quanto em scripts, aplicaes web ou integrada a interfaces grficas (GUIs) de vriostipos.

    A instalao do MPL tambm segue o padro de simplicidade do Python (listagem ex:instmat). Basta baixar opacote 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. Ouseja, o MPL exporta em formatos raster e vetoriais (svg) o que torna sua sada adequada para insero em diversostipos 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 dalistagem ref{ex:hist}} label{fig:hist}

    end{figure}

    Podemos tambm embutir a sada grfica do MPL em diversas GUIs: GTK, WX e TKinter. Naturalmente autilizao do MPL dentro de uma GUI requer que os mdulos adequados para o desenvolvimento com a GUI emquesto 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 comnossa escolha (Wx, GTK, Tk, etc).

    subsection{Configurando o MPL} O MPL possui valores textit{default} para propriedades genricas dosgrficos gerados. Estas configuraes ficam em um arquivo texto chamado textbf{matplotlibrc}, quedeve ser copiado da distribuio do MPL, editado conforme as preferncias do usurio e renomeado paratexttt{$: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 usamoso MPLfootnote{Para uma descrio completa das caractersticas de grficos que podem ser configuradas, veja oememplo de textbf{matplotlibrc} que fornecido com a distribuio do MPL.}.

    subsection{Comandos Bsicos} Os comandos relacionados diretamente gerao de grficos so bastante nu-merosos(tabela ref{tab:plot}); mas, alm destes, existe um outro conjunto ainda maior de comandos, voltadospara o ajuste fino de detalhes dos grficos (ver tabela ref{tab:lineprop}, para uma amostra), tais como tipos delinha, 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 \ hlinetexttt{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 coman-dos de plotagem do MPL}label{tab:plot} end{table} Uma explicao mais detalhada dos comandos apresentadosna 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 ver-stil, 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 listagemref{ex:linha}} label{fig:line}

    end{figure} Quando texttt{plot} recebe apenas uma sequncia de nmeros (lista, tupla ou array), ele gera umgrfico (listagem ref{ex:linha}) utilizando os valores recebidos como valores de textbf{y} enquanto que os valoresde 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 atribuidaa textbf{x} e a segunda a textbf{y}. Note que, neste exemplo, ilustra-se tambm a especificao do tipo de sadagrfica como uma sequncia de pontos. O parmtero texttt{ro} indica que o smbolo a ser usado um crculovermelho. begin{lstlisting}[frame=trBL, caption=Grfico de pontos com valores de textbf{x} e textbf{y} especifi-cados. ,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 par-tir 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 dequatro 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 stringrecebida. 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 dedeterminar as propriedades das linhas geradas pelo comando texttt{plot}. Uma das maneiras mais diretas atravsdos argumentos listados na tabela ref{tab:lineprop}. Nos diversos exemplos apresentados neste captulo, algunsoutros mtodos sero apresentados e explicadosfootnote{Para maiores detalhes consulte a documentao do MPL(http://matplotlib.sourceforge.net).}.

    Vale a pena ressaltar que o comando