Você está na página 1de 94

Python

18 de abril de 2007

Sumrio
I Sobre essa Apostila 2 4 9
10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 11 11 11 11 12 13 13 14 14 14 15 17 17 18 18 19 19 19 19 20 21 22

II Informaes Bsicas III Programao Python


1 O que Programao Python 2 Plano de ensino 2.1 Objetivo . . . 2.2 Pblico Alvo . 2.3 Pr-requisitos 2.4 Descrio . . 2.5 Metodologia . 2.6 Cronograma 2.7 Programa . . 2.8 Avaliao . . 2.9 Bibliograa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Viso Geral 3.1 O que ? . . . . . . . . . . . . . . . . . . . . 3.2 Por que Python? . . . . . . . . . . . . . . . . 3.3 Caractersticas da Linguagem . . . . . . . . . 3.4 Plataformas Disponveis . . . . . . . . . . . . 3.5 Filosoa da Linguagem . . . . . . . . . . . . 3.6 Histrico . . . . . . . . . . . . . . . . . . . . . 3.7 Organizao . . . . . . . . . . . . . . . . . . 3.8 Licena . . . . . . . . . . . . . . . . . . . . . 3.9 Documentao . . . . . . . . . . . . . . . . . 3.10 Comparao de Linguagens de Programao 3.11 Adquirindo o Python . . . . . . . . . . . . . . 3.12 Instalando o Python . . . . . . . . . . . . . . 3.13 Testando o Python . . . . . . . . . . . . . . . 3.14 Interpretador . . . . . . . . . . . . . . . . . .

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF 23 23 24 25 27 28 31 33 35 37 38 38 38 39 40 40 42 42 42 43 45 45 47 47 48 50 50 51 51 53 53 53 54 57 57 57 58 59 59 60 60 61 61 61 62

4 Introduo Linguagem 4.1 Identao . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Comentando o cdigo . . . . . . . . . . . . . . . . . 4.3 Entrada de dados . . . . . . . . . . . . . . . . . . . 4.4 Sada de dados . . . . . . . . . . . . . . . . . . . . . 4.5 Tipos - Nmeros . . . . . . . . . . . . . . . . . . . . 4.6 Tipos - Strings . . . . . . . . . . . . . . . . . . . . . 4.7 Operaes sobre Strings . . . . . . . . . . . . . . . 4.8 Substituio em strings: o operador de porcentagem 4.9 Mais sobre Strings . . . . . . . . . . . . . . . . . . . 5 Operadores 5.1 Operadores de Atribuio 5.2 Operadores Aritmticos . 5.3 Operadores Relacionais . 5.4 Operadores Lgicos . . . 5.5 Operadores Bit a Bit . . . 6 Estruturas de Controle 6.1 Introduo . . . . . 6.2 if, else e elif . . . . 6.3 for . . . . . . . . . 6.4 while . . . . . . . 6.5 break e continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7 Estrutura de Dados 7.1 Listas . . . . . . . . . . . . . 7.2 Outros mtodos de Listas . . 7.3 Mais sobre listas . . . . . . . 7.4 Tuplas . . . . . . . . . . . . . 7.5 Sets . . . . . . . . . . . . . . 7.6 Dicionrio . . . . . . . . . . . 7.7 Mais sobre dicionrios . . . . 7.8 Utilizando Listas como Pilhas 7.9 Utilizando Listas como Fila . 7.10 Trabalhando com arquivos . .

8 Funes 8.1 Introduo . . . . . . . . . . . . . . 8.2 Criando e chamando uma Funo 8.3 Variveis locais x globais . . . . . 8.4 Argumentos padres . . . . . . . . 8.5 Argumentos chaves . . . . . . . . 8.6 Retorno . . . . . . . . . . . . . . . 8.7 DocStrings . . . . . . . . . . . . . 8.8 Mdulos . . . . . . . . . . . . . . . 8.9 Introduo . . . . . . . . . . . . . . 8.10 Criando um mdulo . . . . . . . . 8.11 Mais sobre mdulos . . . . . . . .

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

8.12 Mdulos Padres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 8.13 Mdulos independentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 9 Erros e excees 9.1 Introduo . . . . . . . . . . . . . . . . . . 9.2 Erros de sintaxe . . . . . . . . . . . . . . 9.3 Excees . . . . . . . . . . . . . . . . . . 9.4 Tratamento e disparo(raise) de excees 9.5 Aes de limpeza(clean-up) . . . . . . . . 10 Python Orientado a Objetos 10.1 Introduo . . . . . . . . . . . 10.2 Conceitos OO . . . . . . . . . 10.3 Classes . . . . . . . . . . . . 10.4 Objetos . . . . . . . . . . . . 10.5 Instncia . . . . . . . . . . . 10.6 Atributos . . . . . . . . . . . . 10.7 Mtodos . . . . . . . . . . . . 10.8 Variveis de classe vs objeto 10.9 Variveis privadas . . . . . . 10.10 O mtodo init . . . . . . . . . 10.11 O argumento self . . . . . . . 10.12 Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 66 66 67 67 68 70 70 71 71 72 73 73 73 74 75 75 76 76 78 78 78 81 83 84 86 86 87 89 90

11 Expresses Regulares 11.1 Denindo expresses regulares 11.2 Sintaxe . . . . . . . . . . . . . 11.3 Utilizando RE . . . . . . . . . 11.4 Extraindo contedo . . . . . . . 11.5 Substituindo textos com RE . . 12 Bibliotecas Grcas 12.1 TKinter para TK . . . . . . . 12.2 PyGTK para GTK . . . . . . 12.3 PyQT para QT . . . . . . . 12.4 wxPython para wxWidgets . . . . . . . . .

Parte I

Sobre essa Apostila

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Contedo
O contedo dessa apostila fruto da compilao de diversos materiais livres publicados na internet, disponveis em diversos sites ou originalmente produzido no CDTC em http://www.cdtc.org.br. O formato original deste material bem como sua atualizao est disponvel dentro da licena GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seo de mesmo nome, tendo inclusive uma verso traduzida (no ocial). A reviso e alterao vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro de 2006. Crticas e sugestes construtivas so bem-vindas a qualquer tempo.

Autores
A autoria deste de responsabilidade de Equipe CDTC. O texto original faz parte do projeto Centro de Difuso de Tecnologia e Conhecimento, que vem sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informao) em conjunto com outros parceiros institucionais, atuando em conjunto com as universidades federais brasileiras que tem produzido e utilizado Software Livre, apoiando inclusive a comunidade Free Software junto a outras entidades no pas. Informaes adicionais podem ser obtidas atravs do email ouvidoria@cdtc.org.br, ou da home page da entidade, atravs da URL http://www.cdtc.org.br.

Garantias
O material contido nesta apostila isento de garantias e o seu uso de inteira responsabilidade do usurio/leitor. Os autores, bem como o ITI e seus parceiros, no se responsabilizam direta ou indiretamente por qualquer prejuzo oriundo da utilizao do material aqui contido.

Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br) . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOSTILA. A copy of the license is included in the section entitled GNU Free Documentation License.

Parte II

Informaes Bsicas

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Sobre o CDTC
Objetivo Geral O Projeto CDTC visa a promoo e o desenvolvimento de aes que incentivem a disseminao de solues que utilizem padres abertos e no proprietrios de tecnologia, em proveito do desenvolvimento social, cultural, poltico, tecnolgico e econmico da sociedade brasileira. Objetivo Especco Auxiliar o Governo Federal na implantao do plano nacional de software no-proprietrio e de cdigo fonte aberto, identicando e mobilizando grupos de formadores de opinio dentre os servidores pblicos e agentes polticos da Unio Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negcio da tecnologia da informao e de novos negcios de comunicao com base em software no-proprietrio e de cdigo fonte aberto, oferecendo treinamento especco para tcnicos, prossionais de suporte e funcionrios pblicos usurios, criando grupos de funcionrios pblicos que iro treinar outros funcionrios pblicos e atuar como incentivadores e defensores de produtos de software no proprietrios e cdigo fonte aberto, oferecendo contedo tcnico on-line para servios de suporte, ferramentas para desenvolvimento de produtos de software no proprietrios e de seu cdigo fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educao, pesquisa, desenvolvimento e teste de produtos de software livre.

Guia do aluno
Neste guia, voc ter reunidas uma srie de informaes importantes para que voc comece seu curso. So elas: Licenas para cpia de material disponvel Os 10 mandamentos do aluno de Educao a Distncia Como participar dos foruns e da wikipdia Primeiros passos muito importante que voc entre em contato com TODAS estas informaes, seguindo o roteiro acima.

Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br). 7

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

dada permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU, Verso 1.1 ou qualquer verso posterior pblicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA APOSTILA. Uma cpia da licena est inclusa na seo entitulada "Licena de Documentao Livre GNU".

Os 10 mandamentos do aluno de educao online

1. Acesso Internet: ter endereo eletrnico, um provedor e um equipamento adequado pr-requisito para a participao nos cursos a distncia. 2. Habilidade e disposio para operar programas: ter conhecimentos bsicos de Informtica necessrio para poder executar as tarefas. 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distncia conta muitos pontos, pois ir colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores. 4. Comportamentos compatveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e fazendo ser respeitado pelo mesmo. 5. Organizao pessoal: planejar e organizar tudo fundamental para facilitar a sua reviso e a sua recuperao de materiais. 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigaes e realiz-las em tempo real. 7. Curiosidade e abertura para inovaes: aceitar novas idias e inovar sempre. 8. Flexibilidade e adaptao: requisitos necessrio mudana tecnolgica, aprendizagens e descobertas. 9. Objetividade em sua comunicao: comunicar-se de forma clara, breve e transparente ponto - chave na comunicao pela Internet. 10. Responsabilidade: ser responsvel por seu prprio aprendizado. O ambiente virtual no controla a sua dedicao, mas reete os resultados do seu esforo e da sua colaborao.

Como participar dos fruns e Wikipdia


Voc tem um problema e precisa de ajuda? Podemos te ajudar de 2 formas: A primeira o uso dos fruns de notcias e de dvidas gerais que se distinguem pelo uso: . O frum de notcias tem por objetivo disponibilizar um meio de acesso rpido a informaes que sejam pertinentes ao curso (avisos, notcias). As mensagens postadas nele so enviadas a 8

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

todos participantes. Assim, se o monitor ou algum outro participante tiver uma informao que interesse ao grupo, favor post-la aqui. Porm, se o que voc deseja resolver alguma dvida ou discutir algum tpico especco do curso. recomendado que voc faa uso do Forum de dvidas gerais que lhe d recursos mais efetivos para esta prtica. . O frum de dvidas gerais tem por objetivo disponibilizar um meio fcil, rpido e interativo para solucionar suas dvidas e trocar experincias. As mensagens postadas nele so enviadas a todos participantes do curso. Assim, ca muito mais fcil obter respostas, j que todos podem ajudar. Se voc receber uma mensagem com algum tpico que saiba responder, no se preocupe com a formalizao ou a gramtica. Responda! E no se esquea de que antes de abrir um novo tpico recomendvel ver se a sua pergunta j foi feita por outro participante. A segunda forma se d pelas Wikis: . Uma wiki uma pgina web que pode ser editada colaborativamente, ou seja, qualquer participante pode inserir, editar, apagar textos. As verses antigas vo sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um timo suporte a processos de aprendizagem colaborativa. A maior wiki na web o site "Wikipdia", uma experincia grandiosa de construo de uma enciclopdia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em portugus pelos links: Pgina principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaborao com a aprendizagem do grupo!

Primeiros Passos
Para uma melhor aprendizagem recomendvel que voc siga os seguintes passos: Ler o Plano de Ensino e entender a que seu curso se dispe a ensinar; Ler a Ambientao do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas bsicas do mesmo; Entrar nas lies seguindo a seqncia descrita no Plano de Ensino; Qualquer dvida, reporte ao Frum de Dvidas Gerais.

Perl do Tutor
Segue-se uma descrio do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal um modelo de excelncia: consistente, justo e prossional nos respectivos valores e atitudes, incentiva mas honesto, imparcial, amvel, positivo, respeitador, aceita as idias dos estudantes, paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 9

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

A classicao por um tutor desta natureza proporciona o melhor feedback possvel, crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem. Este tutor ou instrutor: fornece explicaes claras acerca do que ele espera, e do estilo de classicao que ir utilizar; gosta que lhe faam perguntas adicionais; identica as nossas falhas, mas corrige-as amavelmente, diz um estudante, e explica porque motivo a classicao foi ou no foi atribuda; tece comentrios completos e construtivos, mas de forma agradvel (em contraste com um reparo de um estudante: os comentrios deixam-nos com uma sensao de crtica, de ameaa e de nervossismo) d uma ajuda complementar para encorajar um estudante em diculdade; esclarece pontos que no foram entendidos, ou corretamente aprendidos anteriormente; ajuda o estudante a alcanar os seus objetivos; exvel quando necessrio; mostra um interesse genuno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); escreve todas as correes de forma legvel e com um nvel de pormenorizao adequado; acima de tudo, devolve os trabalhos rapidamente;

10

Parte III

Programao Python

11

Captulo 1

O que Programao Python


Python uma descomplicada e robusta linguagem de programao orientada a objetos que possui caractersticas poderosas que a tornam uma linguagem muito simples e eciente. Sua abstrao sobre a orientao a objetos permite a criao rpida de softwares, bem como, a sua integrao outras linguagens de programao como C/C++, JAVA e .NET, permitindo grande exbilidade. Python j uma realidade no mundo do Software Livre e vem conquistando tambm a cada dia o mundo do Software Proprietrio, principalmente na rea de jogos para computadores. O curso, com base na distribuio Debian possui tres semanas, comea na Segunda-Feira da primeira semana e termina no Domingo da ultima semana. Todo o contedo do curso estar visvel somente a partir da data de incio. Para comear o curso voc deve ler o Guia do aluno a seguir.

12

Captulo 2

Plano de ensino
2.1 Objetivo
Capacitar o usurio a reconhecer a linguagem de programao Python.

2.2 Pblico Alvo


Qualquer pessoa que utilize um computador.

2.3 Pr-requisitos
Os usurios devero ser, necessariamente, funcionrios pblicos e ter conhecimentos bsicos para operar um computador, alm de conhecimeto em Linux.

2.4 Descrio
O curso ser realizado na modalidade Educao a Distncia e utilizar a Plataforma Moodle como ferramenta de aprendizagem. O curso tem durao de uma semana e possui um conjunto de atividades (lies, fruns, glossrios, questionrios e outros) que devero ser executadas de acordo com as instrues fornecidas. O material didtico est disponvel on-line de acordo com as datas pr-estabelecidas em cada tpico.

2.5 Metodologia
O curso est dividido da seguinte maneira:

2.6 Cronograma
Descrio das atividades Semana 1

13

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Viso Geral Introduo Linguagem Operadores Estruturas de Controle Semana 2 Estrutura de Dados Funes Mdulos Erros e Excees Semana 3 Python Orientado a Objetos Expresses Regulares Bibliotecas Grcas Como mostrado na tabela acima, a cada semana ser disponibilizado um conjunto de mdulos. recomendvel que o participante siga as datas estabelecidas. As lies, disponveis em cada mdulo, contm o contudo principal. Elas podero ser acessadas quantas vezes forem necessrias, desde que esteja dentro da semana programada. Ao nal de uma lio, voc receber uma nota de acordo com o seu desempenho. Caso sua nota numa determinada lio for menor do que 6.0, sugerimos que voc faa novamente esta lio. Ao nal do curso sero disponibilizadas as avaliaes referentes aos mdulos estudados anteriormente. Somente as notas das avaliaes sero consideradas para a nota nal. Todos os mdulos caro visveis para que possam ser consultados durante a avaliao nal. Para conhecer as demais atividades de cada mdulo leia o tpico seguinte: "Ambientao do Moodle". Os instrutores estaro a sua disposio ao longo de todo curso. Qualquer dvida deve ser enviada ao frum correspondente. Diariamente os monitores daro respostas e esclarecimentos.

2.7 Programa
O curso oferecer o seguinte contedo: Introduo linguagem Python Conceitos bsicos Conceitos avanados

14

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

2.8 Avaliao
Toda a avaliao ser feita on-line. Aspectos a serem considerados na avaliao: Iniciativa e autonomia no processo de aprendizagem e de produo de conhecimento; Capacidade de pesquisa e abordagem criativa na soluo dos problemas apresentados. Instrumentos de avaliao: Participao ativa nas atividades programadas. Avaliao ao nal do curso. O participante far vrias avaliaes referente ao contedo do curso. Para a aprovao e obteno do certicado o participante dever obter nota nal maior ou igual a 6.0 de acordo com a frmula abaixo: Nota Final = ((ML x 7) + (AF x 3)) / 10 = Mdia aritmtica das lies AF = Avaliaes

2.9 Bibliograa
Site ocial: http://www.python.org Guia em Portugus: http://www.pythonbrasil.com.br Python na Prtica: Um curso objetivo de programao em Python: http://www.async.com.br/projects/python/pnp/ Artigos de Fbio Rizzo: http://www.linhadecodigo.com.br/desenvolvimento/python.asp

15

Captulo 3

Viso Geral
Conhea os benefcios desta poderosa linguagem de programao.

3.1 O que ?
Python uma fcil e robusta linguagem de programao orientada a objetos. Ela possui caractersticas poderosas que a tornam uma linguagem muito simples e eciente. Sua abstrao sobre a orientao a objetos a torna poderosa para criar softwares rapidamente e a sua integrao a outras linguagens de programao como C/C++ e JAVA (e agora tambm .NET), a permite ser extremamente exvel. Python j uma realidade no mundo do Software Livre e vem conquistando tambm a cada dia o Software Proprietrio (jogos de computador so um exemplo forte). Para vocs terem uma idia, enquanto ASSEMBLY uma linguagem de baixo nvel, C uma linguagem de nvel intermedirio e JAVA uma linguagem de alto nvel, Python uma linguagem de altssimo-nvel. Antes que algum pergunte, Python uma linguagem livre e voc pode utiliza-la para desenvolver seus softwares sem medo de patentes com relao ao Python. A outra coisa que a torna extremamente interessante o fato dela ser interpretada(independe da arquitetura do computador) e multiplataforma, ou seja, um programa feito no GNU/Linux facilmente executada no Windows, MacOSX e at mesmo em portteis como alguns celulares.

3.2 Por que Python?


Dado que existe uma grande diversidade de linguagens diferentes, por que aprender Python interessante ou mesmo importante? A linguagem combina um conjunto nico de vantagens: Os conceitos fundamentais da linguagem so simples de entender. A sintaxe da linguagem clara e fcil de aprender; o cdigo produzido normalmente curto e legvel. Os tipos pr-denidos includos em Python so poderosos, e ainda assim simples de usar. 16

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

A linguagem possui um interpretador de comandos interativo que permite aprender e testar rapidamente trechos de cdigo. Python expressivo, com abstraes de alto nvel. Na grande maioria dos casos, um programa em Python ser muito mais curto que seu correspondente escrito em outra linguagem. Isto tambm faz com o ciclo de desenvolvimento seja rpido e apresente potencial de defeitos reduzido - menos cdigo, menos oportunidade para errar. Existe suporte para uma diversidade grande de bibliotecas externas. Ou seja, pode-se fazer em Python qualquer tipo de programa, mesmo que utilize grcos, funes matemticas complexas, ou uma determinada base de dados SQL. possvel escrever extenses a Python em C e C++ quando necessrio desempenho mximo, ou quando for desejvel fazer interface com alguma ferramenta que possua biblioteca apenas nestas linguagens. Python permite que o programa execute inalterado em mltiplas plataformas; em outras palavras, a sua aplicao feita para Linux normalmente funcionar sem problemas em Windows e em outros sistemas onde existir um interpretador Python. Python pouco punitivo: em geral, tudo podee h poucas restries arbitrrias. Esta propriedade acaba por tornar prazeroso o aprendizado e uso da linguagem. Python livre: alm do interpretador ser distribudo como software livre (e portanto, gratuitamente), pode ser usado para criar qualquer tipo de software proprietrio ou livre. O projeto e implementao da linguagem discutido aberta e diariamente em uma lista de correio eletrnico, e qualquer um bem-vindo para propor alteraes por meio de um processo simples e pouco burocrtico.

3.3 Caractersticas da Linguagem


Vamos ver alguns atributos que tornam a linguagem de programao Python to atraente: Fcil de aprender Por possuir uma sintxe simples, Python considerada uma linguagem fcil de aprender, ideal(mas no exclusivamente) para pessoas que esto aprendendo a programar. Altssimo Nvel O Python uma linguagem de programao relativamente nova na industria de software .Podemos utilizar o Python em muitos projetos, em muitas situaes como gerenciamento de contedo, documentos eletrnicos, servidores de aplicaes, integrao com o sistema legado, CORBA, Telefonia Mvel. Sua arquitetura de simples e de fcil compreenso para o desenvolvimento de software, sem a preocupao do programador com o controle de ponteiros por exemplo. O Python herda nuances do FORTRAN, C, C++, ABC. Podemos compara-lo com ao C++ e ao Java quando falamos de orientao a objetos.

17

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Orientada a objetos Python suporta tanto programao procedural quanto orientada a objetos. Na programao procedural, o programa composto de procedimentos e funes. Na orientao a objetos, os programas so compostos de objetos que combinam dados e funcionalidades. Python possui uma maneira simples de lidar com orientao a objetos, especialmente quando comparado com as grandes linguagens como C++ e Java. Escalavel A clareza do cdigo encoraja a consistncia, exibilidade e rpido desenvolvimento necessrio para projetos em expanso. Extensivel Se voc deseja que uma parte do seu cdigo seja escrito em outra linguagem, suponha C++, voc pode utilizar esse trecho de cdigo apartir do seu programa Python. Portvel Python esta acessvel em uma variedades de plataformas, contribuindo para que engenheiros e arquitetos de software escreverem seus cdigos apenas uma vez e possam rodar o programa em qualquer plataforma que suporte Python. Robusta No h melhor poder para um engenheiro de software do que reconhecer condies de erro e prover mecanismo dinmicos de tratamentos de excesses e erros de "runtime"(tempo de execuo) numa aplicacao. Gerenciador de Memoria O Python tira a responsabilidade do programador de lidar com o gernciamento de memria, como feito atravs dos ponteiros em C/C++. Com isso, a chance de ocorrer erros crticos, comuns quando manipulamos a memria diretamente, se tornam menores, alm de facilitar a vida do programador. Interpretada Uma linguagem como C/C++ por exemplo, classicada como compilada, pois o cdigo fonte compilado diretamente para cdigo de mquina (0s e 1s). O Python pode ser classicado como uma linguagem interpretada, o que signifca que o cdigo fonte no convertido diretamente para a linguagem da mquina. Para esta transio, existe um meio termo, o interpretador. Isso faz com que programas em linguagem interpretadas sejam bem mais portveis, pois idependem da arquitetura do computador, bastanto para isso, que possuam suporte ao interpretador da linguagem.

18

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

3.4 Plataformas Disponveis


Est disponvel para as mais diversas plataformas, desde Unix (Linux, FreeBSD, Solaris, MacOS X etc.), Windows, verses antigas de MacOS at consoles de videogames ou mesmo alguns celulares, como a srie 60 da Nokia e palmtops. O cdigo fonte traduzido pelo interpretador para o formato bytecode, que multiplataforma e pode ser executado e distribudo sem fonte original.

3.5 Filosoa da Linguagem


> 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 rst 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! Traduo The Zen of Python, por Tim Peters Bonito melhor que feio. Explcito melhor que implcito. Simples melhor que complexo. Complexo melhor que complicado. Plano melhor que aglomerado. Esparso melhor que denso. Legibilidade faz diferena. Casos especiais no so especiais o bastante para quebrar as regras. Embora a praticidade vena a pureza. 19

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Erros nunca devem passar silenciosamente. A menos que sejam explicitamente silenciados. Diante da ambigidade, recuse a tentao de adivinhar. Deve haver um e preferencialmente s um modo bvio para fazer algo. Embora esse modo possa no ser bvio primeira vista a menos que voc seja holands. Agora melhor que nunca. Embora nunca freqentemente seja melhor que *exatamente* agora. Se a implementao difcil de explicar, uma m idia. Se a implementao fcil de explicar, pode ser uma boa idia. Namespaces so uma grande idia vamos fazer mais dessas!

3.6 Histrico
O trabalho com o Python tem sido organizado desde 1989 por Guido Van Rossum, ento trabalhando na poca para CWI na Holanda e em meados de 1991 publicou uma verso para distribuio pblica. Suas principais motivaes foram a possibilidade de inovao no mundo das linguagens de programao, falta de ferramenta similar e pesquisas. Nesta poca Guido, era pesquisador de diversas linguagens e teve a experincia de desenhar para a CWI tambm a linguagem-interpretada ABC, contudo, foi a sua aproximao com o sistema operacional Amoeba que lhe deu experincia, e foi justamente com suas pesquisas junto a especicao da linguagem Amoeba, que alguns anos depois em 1989 lanou-se a primeira verso do Python.

3.7 Organizao
Python uma marca mantida pela Python Software Foundation. A PSF uma instituio sem ns lucrativos que responsvel por proteger a plataforma Python. ela quem determina se uma implementao de linguagem pode ser chamada de Python ou no. A PSF formada por vrios desenvolvedores e liderada por Guido van Rossum que o criador da linguagem. No universo pythonista existe um ditador benevolente (BDFL - Benevolent Dictator for Life) que o prprio GvR. Alguns podem dizer que isso uma desvantagem do Python, mas na verdade isso que protege o Python e O GvR est nessa posio por mrito. A democracia nem sempre muito boa, principalmente quando envolve muito dinheiro pode ser corrompida e tomar rumos inesperados. O processo de proposio de mudanas na plataforma Python ocorre seguindo mais ou menos a seguinte seqncia: 1. Alguma discusso surge na lista python-dev com alguma proposta. 2. Se a proposta j apresenta alguns bons argumentos sugerido ento que se crie uma PEP (Python Enhancement Proposals) ([WWW] http://python.org/peps/) que deve seguir algumas regras bsicas. Neste documento a proposta descrita em detalhes e algumas das sugestes j coletadas na lista so anotadas. 3. A PEP ento colocada em Draft e discutida na lista de discusses e modicaes / melhorias so feitas. 20

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

4. Terminada essa etapa pode-se pedir a implementao da funcionalidade proposta quando isso se aplica. 5. Submete-se ento essa PEP uma votao informal (onde as pessoas votam com +1 / 0 / -1) na prpria lista de discusses. Essa votao serve para fundamentar o prximo passo. 6. Terminado tudo isso o BDFL (GvR) se pronuncia sobre a aprovao, a reprovao ou aprovao com mudanas da PEP. A linguagem Python e a PSF oferecem uma implementao padro da linguagem que costumeiramente chamada de CPython (por ser implementada em C) que conhecida como o padro *de fato* da linguagem. Texto extraido do artigo Defesa do Python

3.8 Licena
Python possui uma licena Open Source certicada pela OSI compatvel com a GPL, porm menos restritiva. Sua licena prev (entre outras coisas) que binrios da linguagem sejam distribudos sem a necessidade de se haver o cdigo-fonte junto. Para maiores detalhes, visite http://www.python.org/2.4.1/license.html.

3.9 Documentao
A documentao do Python na sua ltima verso, a 2.4, pode ser encontrada na URL: http://www.python.org/doc/ Temos tambm um site nacional muito indicado para os ns brasileiros: http://www.pythonbrasil.com.br/

3.10 Comparao de Linguagens de Programao


Existe um site da comunidade Debian que compara diversas linguagens de programao e dentre elas est o python. Segue o link: http://shootout.alioth.debian.org/ Neste local existem benchmarks de diversas linguagens de programao.

3.11 Adquirindo o Python


Esta linguagem de programao esta disponvel para vrias plataformas, que seguem abaixo : Unix Sun Solaris 21

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

FreeBSD OpenBSD IBM-AIX HP/UX IRIX MS-Windows (NT/2000/2003/CE) Macintosh IBM-OS/2 DOS PalmOS BeOS Amiga VMS/OpenVMS QNX VxWorks Para obter o Python acesse o endereo eletrnico : http://www.python.org e procure por downloads.

3.12 Instalando o Python


Para usurios das mais diversas distribuies de GNU/Linux que possuem o APT, como o Debian, basta apenas um: $ apt-get install python Voc tambm pode acessar o site http://www.python.org e baixar a verso mais recente do Python. Quando este curso foi escrito, estavamos na verso 2.4.2. No h problemas em baixar uma verso mais nova caso ela exista. Entre na pasta onde foi baixado o arquivo, faa o logon como root e siga as instrues: Digite tar xzvf Python-2.4.2.tgz Acesse o diretrio e execute ./congure

22

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Execute make Neste momento, o Python j esta operacional, porm no est instalado em /usr/local no system. Faa o seguinte: Para instalar execute: make install O Python normalmente instalado em locais padro como em mquinas Unix e GNU/Linux no /usr/bin quando que suas bibliotecas(lib) estao em /usr/lib/python2.x , j no caso do DOS ou MS-Windows o Python instalado em C:\Python.

3.13 Testando o Python


Abra o terminal e digite o comando Python. Se tudo der certo, ser aberto o interpretador do Python. Ele permite que voc execute todos os comandos da linguagem, sem que para isso precise criar um arquivo com o cdigo. Para sair do interpretador, aperte Ctrl + D. Caso voc queira jogar tudo em um arquivo, para depois executar, faa o seguinte: Crie um arquivo com a extenso .py, por exemplo, primeiro.py Adicione a seguinte linha no incio do arquivo: #!/usr/bin/env python No caso da primeira linha temos algo comum em ambientes Unix, que so os comentrios funcionais. Se na primeira linha de um arquivo existir #! seguido de um caminho para um executvel, este executvel ser chamado e o nome do arquivo ser passado como argumento. No nosso caso, o arquivo primeiro.py e o Unix vai identicar a primeira linha como sendo um comentrio funcional e executar da seguinte forma: /usr/bin/env python primeiro.py Pronto, agora s adicionar as outras linhas do programa, por exemplo: print primeiro programa... O arquivo completo caria da seguinte maneira: #!/usr/bin/env python print primeiro programa... Mande salvar o arquivo e rode no terminal da seguinte maneira: python primeiro.py Em todos os exemplos deste curso, estaremos utilizando o interpretador Python.

23

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

3.14 Interpretador
Existem duas maneiras de iniciar o Python. A mais simples iniciar o interpretador interativamente, adicionando linhas a serem executados em tempo de execuo. A outra maneira e inicializando um script Python. O primeiro modo pode ser feito no shell (terminal do GNU/Linux) ou no DOS com o comando: $ python Python 2.3.5 (#2, Sep 4 2005, 22:01:42) [GCC 3.3.5(Debian1 : 3.3.5 13)] on linux2 Type "help", "copyright", "credits"or "license"for more information. Algo como a sada acima deve aparecer para voc, e um cursor esperando suas entradas devem car piscando aps os >. Agora a outra forma passando um script j previamente criado diretamente para o interpretrador, veja: $ python exemplo.py Observao : Todos os cdigos fontes em Python tem extenso .py Para sistemas Unix-like, temos mais uma outra forma especca de invocar o Python. Isso s pode ser feito em scripts feitos em Python, veja um exemplo: #!/usr/bin/env python #-*- coding: iso8859-1 -*print "Ola mundo!" No caso, o script deve possuir em seu cabealho as duas primeiras linhas deste exemplo. A primeira invoca o ambiente python e a segunda dene a codicao a ser utilizada, quando dizemos codicao, queremos dizer os caracteres que so conhecidos, ou seja, acentuao e caracteres especcos de cada lngua. A codicao iso8859-1 a codicao utilizada no Brasil, neste caso tambm poderamos ter utilizado a codicao universal utf8. Todos os exemplos deste curso, se forem utilizados em um arquivo (script), devem possuir o cabealho acima para que possam rodar corretamente.

24

Captulo 4

Introduo Linguagem
Aprendendo os primeiros passos

4.1 Identao
Quando colocamos espaos em branco no incio da linha de um cdigo, estamos identando-o. A identao serve para organizar melhor o cdigo para que ele que visualmente mais agradvel e intuitivo. No Python estes espaos so bem importantes, pois os blocos de instrues devem estar em um mesmo nvel de identao, caso contrrio, erros podem ocorrer. Exemplo: for x in range(1,10): print x File stdin>", line 2 print x ^ IndentationError: expected an indented block Exemplo: for x in range(1,10): print x 1 2 3 4 5 6 7 8 9 As identaes podem ser feitas com espaos em brancos ou com tabulaes. Recomenda-se utilizar a tabulao em todos os casos. A obrigatoriedade da identao no Python bem interessante, pois "fora"o programador a escrever um programa visualmente bem estruturado.

25

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

4.2 Comentando o cdigo


Este um item muito importante que as vezes ignorado por muitos programadores. A importncia de comentar o cdigo enorme e isso deve ser feito sempre que possvel. Existem duas formas de comentrio dentro do python, o comentrio passivo e o comentrio ativo. Vejamos como podemos denir cada um deles: passivo - o comentrio feito utilizando o smbolo "#", conhecido tambm como tralha, hash ou pound. Este comentrio apenas aparece dentro do cdigo onde foi escrito e bom quando temos diversos programadores desenvolvendo em cima de um mesmo cdigo fonte, isto ajuda na leitura do trecho de cdigo em questo. ativo - so comentrio feitos de uma forma especca dentro de funes e classes, estes comentrios geram uma documentao automaticamente e que pode ser acessada atravs da funo help(). Vamos dar uma olhada como funcionam estes dois tipos de comentrios: > #Este e um comentario passivo e nao faz nada ... Onde aparecerem as reticncias poderia ser adicionado algum cdigo ou mais comentrio, no nosso caso apenas apertamos enter para sair do comentrio. Um comentrio passivo tambm pode ser feito aps uma linha de cdigo normalmente, veja: > print Ola! #o print vai retornar um Ola! Ola1 Agora, os comentrios ativos so um tanto quanto mais interessantes. No se preocupem se no entenderem muito bem o cdigo abaixo, prestem ateno apenas no cdigo em negrito e vejam a sada gerada pela funo help(). > def funcao(): ... Esta e uma funcao que nao faz nada ... Acabamos de criar uma funo que no faz nada, mas contm o nosso precioso comentrio, veja o que a funo help() nos retorna(: > help(funcao) Help on function funcao in module __main__: funcao() Esta e uma funcao que nao faz nada *Para sair, aperte a tecla q.

26

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

A funo que acabamos de criar ganha no seu help() o comentrio que foi feito. Um detalhe importante que este tipo de comentrio feito atravs das aspas triplas. Nas classes a sada muito mais interessante, veja: > class teste: ... Esta e uma classe de teste ... def __init__(self): ... O construtor ... pass ... def pinta(self): ... Metodo que pinta ... pass ...

Com nossa classe de teste criada vamos chamar o help() com o nome da classe como parmetro: > help(teste) Help on class teste in module __main__: class teste | Esta e uma classe de teste | | Methods dened here: | | __init__(self) | O construtor | | pinta(self) | Metodo que pinta Como podemos ver, a classe ganhou o comentrio e cada mtodo da classe tambm recebeu o comentrio que zemos.

4.3 Entrada de dados


Nossos programas com certeza precisaram em algum momento de alguma interao com o usurio. J vimos como funcionam as impresses atravs da sada padro do sistema, e agora veremos como podemos realizar entradas de informaes para nossos programas em Python. Podemos dizer que existem duas grandes formas de realizar entradas de dados em Python, uma pela entrada padro utilizando o teclado, scanner ou algum outro tipo de dispostivo de entrada de dados no computador, ou atravs de arquivos, tpico que ser visto mais tarde. Vamos nos ater agora a entrada de dados pela entrada padro, no caso, nosso teclado. Em Python existe uma funo chamada input() e outra chamada raw_input(). Veja abaixo uma pe27

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

quena denio de cada uma: input() - equivalente a eval(raw_input()). Entenda isso como: voc deve denir o que a entrada manualmente pela entrada padro. No se preocupe, vamos exemplicar mais abaixo. raw_input() - l um objeto do tipo string da entrada padro. Ou seja, qualquer tipo que for lido com o raw_input() ser automaticamente convertido em um objeto do tipo string (lembram-se do str()?). Para no carmos apenas na teoria vejamos os exemplos a seguir: > user = raw_input("Entre com seu login: ") Entre com seu login: root > user root > numero = raw_input("Digite um numero: ") Digite um numero: 10 > numero 10 Veja no exemplo do nmero que o integer (inteiro) dez agora um objeto do tipo string na varivel nmero. Isso um fato importante, pois sendo ele uma string no podemos simplesmente, por exemplo, adicionar mais 2 ao nmero, veja o que acontece se tentarmos isso: > numero + 2 Traceback (most recent call last): File stdin>", line 1, in ? TypeError: cannot concatenate str and int objects Viram? no podemos concatenar objetos de tipos diferentes. Para realizar tal operao teremos mais uma vez utilizar uma funo built-in para realizar a operao, veja: > int(numero) + 2 12 Neste caso, adicionamos o valor da sada gerada pela funo int() com o nmero 2, como neste caso, ambos os objetos so do tipo integer, ento, a soma efetuada sem erros. importante dizer que no existem apenas as funes str() e int(), existem outras que tambm so denidas pela linguagem, vamos utiliza-las aos poucos para que o seu uso se torne natural. Vamos mostrar agora a outra funo de entrada padro, o input(). Apenas para exemplicar o que citamos, veja como realizaramos o mesmo login feito acima: > user = input("Entre com seu login: ") Entre com seu login: root Traceback (most recent call last): File stdin>", line 1, in ? 28

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

File string>", line 0, in ? NameError: name root is not dened Estranho no? o python esta dizendo que a varivel root no foi denida! Lembra do que foi falado sobre denir manualmente o tipo? veja agora o exemplo corrigido: > user = input("Entre com seu login: ") Entre com seu login: root > user root Note que foi necessrio informar que a entrada era um objeto do tipo string, podemos conrmar que user realmente uma string perguntando ao interpretador o tipo da varivel com a funo type(). > type(user) <type str> E agora com o exemplo da entrada de um nmero: > numero = input("Digite um numero: ") Digite um numero: 10 > numero 10 > type(numero) <type int> Viu? essa a grande diferena destas duas funes que so utilizadas para entrada padro no Python. Lembrem-se que possvel altera o tipo do objeto atravs daquelas funes built-in.

4.4 Sada de dados


Dando o pontap inicial que todas as linguagens sempre tem, o nosso querido "Ol Mundo!", agora com Python! > print Ola Mundo Python! Como podemos notar abaixo, a entrada da funo print direcionada para a sada padro do sistema, no caso a tela. Em diversas situaes voc precisar saber o contedo que est em uma varivel, sendo assim, voc poder utilizar a funo print para esta tarefa. Alm desta possibilidade de usar o print, dentro do interpretador do Python no necessrio o seu uso, pois caso seja utilizado somente o nome da varivel, o Python automaticamente entender que voc deseja mostrar o seu contedo e teremos a mesma sada de quando usamos o print. Veja: 29

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> myString = Ola Mundo Python! > print myString Ola Mundo Python! > myString Ola Mundo Python! Ola Mundo Python! A utilizao da funo print no est restrita apenas ao objeto do tipo string, mas tambm a outros objetos, veja: > print ?\%s is number \%d!? \% (?Python?,1) Python is number 1! Na realidade, a funo print possui uma abstrao no campo dos objetos, ou seja, no importa o tipo que for passado, ele ser colocado na sada padro, desde que uma regra seja respeitada, todos os objetos devem ser do mesmo tipo. Por exemplo: > print 20 20 > print 10+39 49 > print "python"+ "= cobra" python = cobra Agora veja o que acontece se tentamos misturar objetos de tipos diferentes: > print "Python "+ 1938 Traceback (most recent call last): File stdin>", line 1, in ? TypeError: cannot concatenate str and int objects Ou seja, um erro na tentativa de concatenar objetos do tipo string e integer. Para corrigirmos o erro deste exemplo bastava transformarmos o 1938 em um objeto do tipo string: > print "Python "+ str(1938) Python 1938 Preste ateno na funo built-in str(), ela converte um objeto de entrada em um objeto string de sada.

4.5 Tipos - Nmeros


Python, assim como qualquer outra linguagem de programao tem tipos pr-denidos e vamos apresent-los agora mesmo as vocs: numrico strings 30

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

listas e tuplas dicionrios Vamos analisar cada um destes tipos separadamente a seguir. Vamos comear com os tipos numricos: Os tipos numricos em Python esto divididos em: integer (inteiros) long (inteiros longos) oat (nmeros reais, ou ponto utuante) complex (nmeros complexos) Os inteiros so conhecidos na maioria das linguagens de programao e so a representao numrica dos nmeros inteiros N. O inteiro em Python um pouco maior que o inteiro do C/C++. Vejamos um pequeno exemplo de uso de inteiros em uma varivel. > numero = 10 > print numero 10 > type(numero) <type int> Como vocs devem estar lembrados de aulas anteriores, o type() retorna o tipo de uma varivel. O uso de um inteiro tem a sua utilidade e importante saber, mas no vamos nos aprofundar em algo to simples, vamos ver os outros tipos. A existncia do tipo long se deve principalmente pelo limite que o int possui, ento quando seu programa for utilizar um nmero muito maior que o limite de 2 mil casas, utilize ento um inteiro do tipo long, veja nosso exemplo apenas para saber como denir uma varivel com um longo: > numero = 10L > type(numero) <type long> Tudo o que precisamos fazer colocar um L aps o inteiro e isso j denir que o nosso valor um inteiro longo. Agora vamos adentrar no mundo dos nmeros reais e suas representaes com casas decimais. Em Python os nmeros reais so representados como nmeros em ponto utuante. Mas o que isso quer dizer? quer dizer que o . que representa o incio das casas decimais utua dentro do nmero. A representao para este tipo numrico o que chamamos de oat e para denir que uma varivel contm um tipo oat apenas devemos colocar o . (ponto) seguido de alguma quantidade de posies decimais, vejamos: > numero = 10.0 31

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> type(numero) <type oat> > numero = 10.23 > type(numero) <type oat> Apenas para que a brincadeira que mais divertida note (se no notaram) que a varivel numero esta tendo o seu tipo alterado toda hora, e isso que torna Python uma linguagem mais dinmica que outras, mas vamos voltar ao assunto. Veja que agora temos um nmero em oat e com esse tipo podemos alcanar muito mais nmero que com um int ou long. Alm de podermos trabalhar com casas decimais. Agora vale um aviso que vocs vo notar, existe um pequeno erro de preciso que utilizado para manter a coerncia principalmente por causa do alto nvel de abstrao da linguagem, ento no se assustem se virem algo como isso: > 0.1 0.10000000000000001 Isso porque a impresso automtica do Python converte automaticamente a sada do interpretador padro em string usando a funo str() j conhecida. Mas no precisa car preocupado, isso no realmente um problema. Para ser considerado um oat, o nmero deve possuir um ponto e uma casa decimal, mesmo que seja zero. O fato de ser considerado um oat importante para a operao diviso, pois dependendo do tipo dos operandos, a diviso inteira ou em ponto utuante. > 5 / 2 # diviso inteira, resultado inteiro 2 > 5 / 2.0 # diviso em ponto utuante 2.5 > 5 * 2.13 10.649999999999999 Finalmente vamos ver os nmeros complexos. Acredito nunca ter visto outra linguagem de programao que tivesse este tipo nativamente sem alguma adio de biblioteca ou componente, e Python faz isso. O tipo complex representa o conjunto dos nmeros complexos da matemtica que conhecemos e facilmente representado em Python, veja: > numero = 10 + 3j > type(numero) <type complex> Ao denir uma varivel como complexa ela passa a ter principalmente 2 atributos muito importantes, o imag e o real, veja:

32

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> numero.real 10.0 > numero.imag 3.0 Com eles podemos acessar a parte real e imaginria do nmero complexo. Note uma coisa importante, a parte imaginria denida pela letra j. Bem, at a prxima aula, onde veremos o que podemos fazer com uma string.

4.6 Tipos - Strings


Vamos comear este mdulo dizendo o que uma string. Em C/C++ temos dois conceitos importantes que podem ser encaixados neste momento, o conceito de caractere e de conjunto de caracteres. A diferena explcita nesse caso o fato do segundo ser um agrupamento do primeiro. Em Python, todo tipo de conjunto, inclundo o unitrio, de caracteres dito como uma string, e o que isso quer dizer?? a priori que tanto faz declararmos um conjunto de caracteres com apenas aspas simples como usando aspas duplas. Exemplo: variavel = Ola mundo! print variavel Ola mundo! E da mesma forma: variavel = "Ola mundo!" print variavel Ola mundo! com certeza voc deve estar rindo dos desenvolvedores do Python, se perguntando o porque de duas representaes para uma mesma coisa, mas ai que voc se engana meu caro leitor, e se a nossa string contivesse uma aspas simples para dar enfase a uma palavra por exemplo, vejamos: variavel = Estamos estudando Python File stdin>", line 1 variavel = Estamos estudando Python ^ SyntaxError: invalid syntax Viu? o fato de colocar duas vezes as aspas um problema, mas como soluciona-lo? Bem, ai esta a funo das aspas duplas. Veja como caria o exemplo acima: variavel = "Estamos estudando Python" print variavel Estamos estudando Python e no teramos mais a confuso das aspas simples duplicadas. Bem, para efeito de conhecimento existe outra forma de solucionar este problema, que proteger as aspas do Python com 33

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

barras invertidas \, no entendeu? veja: variavel = Estamos estudando \Python\ print variavel Estamos estudando Python contudo esta forma um tanto quanto confusa dependendo do que voc esta atribuindo a sua varivel. A limpeza de cdigo uma arte muito desejvel em qualquer programador. Assim como em C/C++, podemos usar os caracteres especiais de controle para que nossa sada tenha a forma que quisermos. Por exemplo, poderamos querer tabular ou adicionar uma linha em branco a mais em uma sada e podemos faze-lo apenas adicionando estes caracteres. Abaixo temos uma tabela com os caracteres de controle mais utilizados: Caracter \a \b \n \t \f \ Funo Emite um sinal sonoro Equivalente a um backspace Nova linha Uma tabulao Avana uma linha de texto Imprime a

Temos outras, mas que no so to importantes para ns agora. Chegamos ento a uma implementao especca de Python para as strings, as aspas triplas. Quando um texto esta entre aspas triplas, Python entende como uma entrada de texto que no deve ser formatada, o que quero dizer com isso? Que todo texto entre este tipo de aspas vai ser impresso da forma como for digitada. Exemplo: var = Programa Exemplo: Para usar este programa: exemplo.py <entrada> <saida> [opcional] Onde: entrada um arquivo de entrada do programa saida um arquivo de sada do programa opcional um valor 0 ou 1 dependendo do objetivo GNU/GPL print var Programa Exemplo: Para usar este programa: exemplo.py <enrtada> <saida> [opcional]

34

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Onde: entrada um arquivo de entrada do programa saida um arquivo de sada do programa opcional um valor 0 ou 1 dependendo do objetivo GNU/GPL Como podemos ver, todos os espaos, tabulaes, tudo foi impresso da forma como digitamos dentro das aspas triplas na varivel var. E no s isso, vamos brincar com o que as strings tem de melhor, as operaes sobre strings.

4.7 Operaes sobre Strings


Existem algumas operaes que so suportadas quando trabalhamos com as strings, e duas so muito interessantes, a soma e a multiplicao de strings. Quando uma varivel uma string, um objeto do tipo string atribudo ento a esta varivel. Isso quer dizer que temos mtodos neste objeto que podemos utilizar para manipular nossa string. Vamos ver como funciona a concatenao (soma) de strings: >"Curso"+ "de "+ "Python" Curso de Python Esta operao uma sobrecarga sobre a operao de soma, que em chamadas de mtodos caria assim: >"Curso".__add__("de ".__add__("Python")) Curso de Python Como vimos, a operao de soma uma sobrecarga sobre o mtodo __add__(). Mas no s isso, o objeto string tem diversos outros mtodos, e alguns so muito conhecidos dos programadores em C/C++ contidos na biblioteca string.h. Antes que ns mostremos uma tabela com alguns objetos interessantes, vamos ver mais alguns operaes. Como comentamos acima, a multiplicao tambm uma operao muito divertida! Vejamos como podemos utiliza-la: >print < + Python * 3 + > <PythonPythonPython> O fato de multiplicarmos uma string por um nmero faz com que __mul__() seja sobrecarregado gerando uma nova string que n vezes a string original. Mas no s isso, uma das operaes sobre strings que mais gosto o split(), este mtodo quebra a string original nas palavras que a string contm, veja: 35

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

>"Curso de Python".split() [ Curso , de , P ython ] Viu? nossa string foi quebrada em trs palavras (que tambm so strings) em uma lista. Poderiamos estar usando uma string como argumento dentro do mtodo split, por exemplo: > "banana".split("a") [b, n, n, ] Agora a operao nal, aquela que vai acabar de vez com suas dvidas, aquela que vai fazer voc amar Python! A operao de SLICE. Variveis que contm objetos do tipo string podem ter os seus textos cortados da forma que o programador quiser, o que quero dizer quando falo em cortar? vejamos: > "Curso de Python"[1 : 6] urso > "Curso de Python"[9 :] Python > "Curso de Python"[: 9] Curso de Isso muito legal, podemos ter nossa string quebrada ou cortada aonde quisermos, como isso funciona? Entenda da seguinte forma: Uma string pode ser cortada usando do seguinte princpio: STRING [incio : f im] Onde incio o nmero da posio do caractere onde o corte comea e m o nmero da posio do ltimo caractere. Apenas um detalhe, o caractere da posio m suprimido. Quando um dos valores incio ou m desconsiderado, o m ou o incio da string ser o valor adotado por padro. Ou seja STRING[0 : len(ST RIN G)]. No tinhamos visto esse len() antes, bem, ele retorna a quantidade de caracteres em uma string ou a quantidade de objetos em uma lista. Vamos nalmente a uma tabela com todos os mtodos que podem ser utilizados sobre as strings, para isso dentro do interpretador do Python, digite: > help(str)

36

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

4.8 Substituio em strings: o operador de porcentagem


Uma operao muito til para processamento de texto a substituio de smbolos em strings. particularmente adequada para gerarmos strings formatadas contendo algum valor varivel, como o clssico formulrio: "Nome: Idade: anos". 1. Escreve-se a string normalmente, usando um smbolo especial no lugar da lacuna: \%d: para substituir inteiros \%f: para substituir oats \%s: para substituir outra string > a = "Total de itens: \%d" > b = "Custo: \%f" 2. Para efetuar a substituio, aplica-se um operador \% sobre a string contendo o smbolo de formatao, seguido do valor ou varivel a substituir: > print a \% 10 Total de itens: 10 Como pode ser visto, o smbolo substitudo pelo valor fornecido. Podem ser utilizados tanto valores explcitos quanto variveis para a substituio: > custo = 5.50 > print b \% custo Custo: 5.500000 Caso sejam mltiplos valores a substituir, use uma tupla: > print "Cliente: \%s, Valor \%f"\% ("hungry.com", 40.30) Fornecedor: hungry.com, Custo 40.300000 Este operador permite ainda utilizar um nmero junto ao smbolo porcentagem para reservar um tamanho total string: > a = "Quantidade: \%4d" > print a \% 3 > print a \% 53 > print a \% 120 Quantidade: 3 Quantidade: 53 Quantidade: 120

possvel controlar a formatao de tipos numricos de maneira especial atravs de modicadores nos smbolos no formato m.n. Como acima, m indica o total de caracteres reservados. 37

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Para oats, n indica o nmero de casas decimais; para inteiros, indica o tamanho total do nmero, preenchido com zeros esquerda. Ambos os modicadores podem ser omitidos. > e = 2.7313 > p = 3.1415 > sete = 7 > print "Euler: \%.7f"\% e # 7 casas decimais Euler: 2.7313000 > print "Pi: \%10.3f"\% p # 10 espaos, 3 casas Pi: 3.142 > print "Sete: \%10.3d"\% sete # 10 espaos, 3 dgitos Sete: 007 # ( um inteiro)

38

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

4.9 Mais sobre Strings


Podemos utilizar alguns mtodos sobre strings como os abaixo: x.capitalize() x.count() x.startswith() x.endswith() x.isalnum() x.isalpha() x.islower() x.isupper() x.lower() x.upper() x.swapcase() x.title() ? ?.join() x.split() x.split(?;?) x.ljust(tamanho) x.rjust(tamanho) x.center(tamanho) x.lstrip() x.rstrip() x.strip() x.nd(parmetro) Deixa a primeira inicial maiscula. Procura quantas ocorrncias da busca existem na String. Verica se a String inicia com determinado caractere, retornando verdadeiro ou falso. Verica se a String termina com determinado caractere, retornando verdadeiro ou falso. Verica se a String tem contedo alfa-numrico Verica se a String tem o contedo apenas alfabtico Verica se a String tem o contedo minsculo. Verica se a String tem o contedo em maisculo Converte o contedo da String para minsculo. Converte o contedo da String para maisculo. Inverte a situao da String. Converte para maiscula todos os primeiros caracteres da String. Une duas ou mais strings utilizando um delimitador. Corta a String em uma lista, utilizando o espao como delimitador. Corta a String em uma lista, utilizando o ponto-e-vrgula como delimitador. Ajusta a String para a esquerda utilizando um tamanho determinado. Ajusta a String para a direita utilizando um tamanho determinado. Ajusta a String para o centro utilizando um tamanho determinado. Remove os espaos em branco do lado esquerdo de uma String. Remove os espaos em branco do lado direito de uma String. Remove todos os espaos em branco de uma String Procura por uma ocorrncia de determinado caractere em um String, e retorna o seu endereo dentro da String. Retornando -1 indica que no existe tal caractere na String. Procura por um caractere e substitui por outro.

x.replace(busca,substitui)

No se esquea que voc pode estar utilizando mais de um mtodo por vez, por exemplo: > "EXEMPLO".lower().capitalize() Exemplo

39

Captulo 5

Operadores
Faa atribuies, operaes lgicas e aritmticas, entre outras.

5.1 Operadores de Atribuio


Python uma linguagem como qualquer outra neste ponto. Toda linguagem tem que possuir operadores pois isto , de certa forma, o corao da programao. Temos cinco tipos principais de operadores, os aritmticos, os lgicos, os relacionais, o de atribuio e os bit-a-bit. Os aritmticos so os utilizados para realizar operaes matemticas com objetos numricos, os lgicos se utilizam destes objetos para conseguir relaes que possam ser conectadas e os relacionais referem-se forma como os valores podem se relacionar. O operador de Atribuio no requer grandes comentrios, ele apenas atribui o valor mais a direita de uma expresso para a varivel ou variveis a esquerda da expressao. Exemplo: > numero = 10 > print numero 10

5.2 Operadores Aritmticos


Na tabela abaixo veremos como a precedncia matemtica respeitada no python: Operador + * / % ** Ao Subtrao Adio Multiplicao Diviso Mdulo da diviso Exponenciao

Estes so os principais operadores e so utilizados na mesma forma que o so na matemtica. Vamos ver alguns exemplos:

40

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> 1 + 3 4 > 4 - -2 6 > soma = 1 + 1 > soma + 7 9 > soma / 2 1 > soma \% 2 0 > soma += 1 > soma \% 2 1 > 2**3 8 Estes exemplos demonstram bem o uso dos operadores aritmticos.

5.3 Operadores Relacionais


Agora vamos aos Operadores Relacionais. Vamos ver ento a tabela dos operadores relacionais reconhecidos pelo python: Operador > >= < <= == <> != Ao Maior que Maior que ou igual Menor que Menor que ou igual Igual Diferente Diferente

Para facilitar a migrao das mais diferentes linguagens, python aceita duas formas para o operador de diferena. Podemos realizar alguns teste dentro do interpretador que retornar False quando a operao for false ou True quando for verdadeira, veja: > 1 > 2 False > 2 >= 2 True > 3 == 4 False > 3 != 4 True > 3 <> 4 True 41

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> 3 > 2 > 1 True

As expresses so testadas em tempo real, sendo avaliadas da direita para a esquerda, e um objeto do tipo boolean retornado pelo interpretador.

5.4 Operadores Lgicos


Faltam nos apenas dois tipos de operadores, os lgicos e os bit-a-bit. Vejamos os lgicos. Operaes lgicas envolvem lgica matemtica e tem 3 operadores importantes, veja na tabelas quais so: Operador and or not Ao E lgico OU lgico NO lgico

Estes operadores so geralmente utilizados em expresses lgicas de testes de expresso, vamos ver alguns exemplos: > a = 10 > b = 20 > c = 30 > if a < b and c >= a: ... print "\%d menor que \%d e \%d maior ou igual a \%d"\% (a,b,c,a) ... 10 menor que 20 e 30 maior ou igual a 10 > if a > b or c >= a: ... print "entrei por que uma relacao ou outra foi verdadeira" ... entrei por que uma relacao ou outra foi verdadeira No se preocupe com a sintaxe do if, veremos isso com mais calma, mais para frente. Veja que as operaes lgicas so muito importantes.

5.5 Operadores Bit a Bit


Finalmente as Operaes Bit-a-Bit. Operao bit-a-bit so utilizadas para, principalmente dois ns: programao de hardware (interface software-hardware) ou para otimizao do cdigo em operaes mais rpidas. Vejamos ento a tabela dos operadores para este tipo de operao:

42

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Operador & ~ ^

Ao AND OR OR exclusivo (XOR) Complemento de um Deslocamento esquerda Deslocamento direita

Lembrando que para operar com estes operadores devemos estar cientes que as operaes sero realizadas em cada bit dos nmeros em questo. Vamos ver alguns exemplos: # cada bit deslocado para direita equivale dividir por 2 > 4 1 2 # cada bit deslocado esquerda equivale multiplicar por 2 > 4 1 8 > 4 & 1 0 > 4 | 1 5 > 4 ^1 5 > ~4 -5 Como vemos nos exemplos, o deslocamento esquerda signica diviso por 2n, onde n o valor que deve ser deslocado, ou seja, se queremos dividir por 2, devemos deslocar 1, se queremos dividir por 4, devemos deslocar 2, pois 4 22, o mesmo vale para o deslocamento direita, que equivale a uma multiplicao por 2n pelo mesmo motivo do deslocamento esquerda. Vamos ento ver o porque dos outros resultados do exemplo, lembrando que o 4 em binrio 100, quando realizamos a operao de &: 100 001 & =000 Temos como resposta 0. Agora para o | e para o ^, que possuem a mesma resposta neste caso, temos o seguinte: 100 001 | =101 Que igual a 5. Viu como operaes bit-a-bit podem ser interessantes?

43

Captulo 6

Estruturas de Controle
Controle o uxo dos dados

6.1 Introduo
Estruturas de controle permitem diferentes tipos de uxo durante a execuo do seu programa. Por exemplo, voc pode desejar que seu programa imprima uma mensagem de "Bom dia"ou "Boa noite"de acordo com o horrio do dia. Pode querer tambm que o usurio digite uma palavra secreta para utilizar seu programa, caso contrrio redirecionado para uma seo de erro.

6.2 if, else e elif


A instruo if a mais bsica estrutura de controle de uxo quando se esta programando. Em Python caria: if condicao: faa algo O bloco faa algo pode conter qualquer instruo ou bloco de instruo vlido no Python. A parte de condio pode incluir um operador de comparao. Vamos iniciar mostrando o mais bsico dos operadores, o de igualdade: ==. Um uso comum desse operador testar se uma varivel tem um determinado valor, como no exemplo: if i == 1: faa algo Podemos testar se uma determinada varivel menor ou maior que um nmero, utilizando os operadores > ou < if i > 5: faa algo Podemos ter um controle maior da estrutura, utilizando opcionalmente as instrues elif e else

44

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

if condio : faa algo elif condio : faa algo elif condio : faa algo ... else : faa algo Exemplo: x = int(raw_input("Entre com um inteiro:")) if x < 0: x=0 print Negativo mudado para zero elif x == 0: print Zero elif x == 1: print Um else: print Mais Neste caso, a instruo que satisfazer a condio ser executada. Em ltimo caso, se nenhuma das instrues anteriores for executada, a instruo else sempre ser executada. Observao: No Python no existe o comando switch como nas linguagens Java e C/C++. Neste caso, podemos ter o mesmo comportamento utilizando os comandos if, else e elif.

6.3 for
A estrutura for..in uma estrutura de looping que itera sobre cada sequncia de objeto, ou seja, percorre cada item em sequncia. Exemplo: for cadaNumero in [0, 1, 2, 3, 4, 5, 6, 7]: print cadaNumero 0 1 2 3 4 5 6 7 Exemplo: print Eu gosto de utilizar a internet para : 45

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Eu gosto de utilizar a internet para : for item in [ e mail , net surf ing , chat ]: print item email net-surng chat O Python tem um funcao built-in que gera uma lista, a funcao range(). Exemplo: for i in range(1,5): print i else: print Fim do looping... 1 2 3 4 Fim do looping... A funo range() Esta funo muito importante quando queremos gerar uma lista de nmeros. Sua sintaxe : range(ni,nf,i) onde ni = nmero inicial, nf = nmero nal e i = incremento. Exemplo: > range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] > range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] > range(1,10,2) [1, 3, 5, 7, 9] Podemos utilizar o range dentro de um for da seguinte maneira: Exemplo: for numero in range(1,10): print numero*2 2 4 6 8 10 12 14 16 18

46

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

6.4 while
A estrutura while permite executar um bloco de comandos enquanto a condio for verdadeira. O padrao da instrucao de condicao while, pode-se considerar similar ao if. while expressao: instruo Exemplo: counter = 0 while counter < 5: print loop #\%d \% (counter) counter = counter + 1 loop #0 loop #1 loop #2 loop #3 loop #4 Opcionalmente, podemos ter uma condio else no looping while Exemplo: x=0 while x < 5: x=x+1 print "Valor de x = ", x else: print "Saindo do looping..." Valor de x = 1 Valor de x = 2 Valor de x = 3 Valor de x = 4 Valor de x = 5 Saindo do looping...

6.5 break e continue


O break quebra o lao mais interno de um for ou while. Exemplo: ss = 1 while True: print ss, if (ss == 9): break print ",", ss = ss + 1 1,2,3,4,5,6,7,8,9

47

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

O continue continua o prximo passo do lao mais interno. Exemplo: for x in range(8): if x%2 == 0: continue print x 1 3 5 7

48

Captulo 7

Estrutura de Dados
7.1 Listas
Lista uma seqencia de valores que utilizamos no Python. Listas so dinmicas, o que possibilita adicionarmos ou removermos valores uma vez que a lista for criada. Uma lista possibilita conter valores inteiros(int), strings, oat ou qualquer outro tipo de objeto. Podemos utilizar o mesmo mtodo de mapeamento de endereos que utilizamos nas strings. > lista = [1, 2, 3] > lista [1, 2, 3] > lista[0] 1 > lista[1] 3 Onde o endereo 0 (lista[0])da lista 1. Podemos tambm pegar vrios valores de uma lista e concatena-los. Ex: > lista[0]+lista[1] Nesse caso, somamos o valor do endereo 0 de lista para o valor do endereo 1 de lista. Se adicionarmos um valor diretamente a lista, retornaremos um erro, pois no possvel adicionar valores diretamente a lista, sendo necessrio utilizarmos outro mtodo. > lista+22 Traceback (most recent call last): File pyshell#134>", line 1, in -toplevellista+22 TypeError: can only concatenate list (not "int") to list Porm se zermos lista+[22] adicionaremos o valor a lista. > lista = lista+[22]

49

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

[1, 2, 3, 22] Vamos ver os valores da lista: > lista [1, 2, 3, 22] Tambm podemos utilizar o endereamento da lista ou o mtodo append. Por exemplo, modicar o endereo 0 que contm o valor 1 para fbio: > lista[0] = "Fabio" > lista [ F abio , 2, 3] Se tentarmos adicionar outro endereo utilizando endereamento, teremos um erro, pois deveremos utilizar o append para adionar itens a lista. > lista[3] = "Rizzo" Traceback (most recent call last): File pyshell#138>", line 1, in -toplevellista[3] = "Fabio" IndexError: list assignment index out of range Agora utilizando o mtodo append: > lista.append("Matos") > lista [ F abio , 2, 3, M atos ]

7.2 Outros mtodos de Listas


Existem outros mtodos de adicionar valores a listas. Veja abaixo: > lista [ F abio , 2, 3, M atos ] > lista.insert(1,"Rizzo") > lista [ F abio , Rizzo , 2, 3, M atos ] Utilizando a forma acima, podemos denir em qual endereo queremos adicionar o valor desejado. No caso acima, inserimos Rizzo no endereo 1 da lista. Outro mtodo utilizado o extend, que utilizado para adicionarmos mais que 1 valor, ou principalmente para adicionarmos uma lista inteira a outra lista. Veja: > lista = [F abio, Rizzo, M atos] > lista2 = [Azul, P reto] 50

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> lista.extend(lista2) > lista [ F abio , Rizzo , M atos , Azul , P reto ] Se ns tivssemos utilizado o mtodo append nesse caso teriamos uma lista contendo outra lista. Veja: > lista = [F abio, Rizzo, M atos] > lista.append(lista2) > lista [ F abio , Rizzo , M atos ,[Azul, Preto]] E quando chamasse-mos o valor 3 lista, teriamos uma lista como resposta e no somente Azul: > lista[3] [ Azul , P reto ] > len(lista) 4 Mais com o mtodo extend, teriamos o azul como resposta. > lista[3] Azul > len(lista) 5 Veja que o len nos mostrou valores diferentes, pois com o append a lista2 apenas um valor dentro de uma lista diferente do extend que adiciona a lista2 como vrios valores. Para removermos algum valor da lista temos alguns mtodos. Veja: > lista [ F abio , Rizzo , M atos , Azul , P reto ] > lista.remove("Preto") > lista [ F abio , Rizzo , M atos , Azul ] > lista.pop() Azul Dessa forma removeremos um valor que existe em nossa lista. E o mtodo lista.pop() por default remove o ultimo valor, porm possvel adicionar um endereo a ser removido: > lista [ F abio , Rizzo , M atos ] > lista.pop(1) Rizzo > lista [ F abio , M atos ] 51

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Se tentarmos remover um valor que no est na lista, teremos o seguinte retorno: > lista.remove("Amarelo") Traceback (most recent call last): File pyshell#168>", line 1, in -toplevellista.remove("Amarelo") ValueError: list.remove(x): x not in list Para saber se tal valor existe dentro de uma seqencia, basta fazer o seguinte: > "Amarelo"in lista False Se o valor retornar True signica que temos o valor na lista, caso contrrio teremos o valor False como acima. Lembre-se que diferenciado letras maisculas de minsculas, de modo que se voc procurar por "Amarelo"ser diferente que procurar por "amarelo". Agora para achar o endereo do valor dentro da lista utilizamos o mtodo index: > lista [ F abio , Rizzo , M atos , Azul ] > lista.index("Azul")

7.3 Mais sobre listas


Temos alguns outros mtodos que tambm podem ser usados em listas: Mtodo lista.reverse() lista.count(valor) lista.sort() x in lista len(lista) Para que serve Reverte a ordem dos valores de uma lista. Conta a quantidade de vezes que determinado valor esta dentro da lista. Coloca em ordem uma lista que esteja com seus valores bagunados. Verica se o valor x esta dentro de lista. Retorna True se estiver e False caso no. Conta a quantidade de valores de uma lista.

7.4 Tuplas
Tuplas so listas imutveis, ou seja, no possvel modic-la sem antes ter de criar uma nova. Um exemplo de tupla: > tupla = ("fabio","rizzo","matos") > tupla (fabio, rizzo, matos) Tuplas so mais rpidas que listas, e se voc pretende ter apenas uma sequncia de valores 52

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

imutveis, utilize tuplas ao invs de listas. Tuplas no tem mtodos atribudos a ela, por isso no possvel utilizar nenhum dos mtodos de listas em tuplas.

7.5 Sets
Um set uma coleo no-ordenada e que no contm duplicaes de elementos. O uso bsico reside em eliminar entradas duplicadas e possibilitar operaes matemticas como unio, interseo e diferena. > frutas = [ banana , maca , laranja , banana , pera , laranja ] > resultado = set(frutas) > resultado set([ pera , laranja , banana , maca ]) > laranja in resultado True Podemos tambm eliminar duplicatas em uma palavra: > a = set(asdadasdad) > a #letras nicas em a set([ a , s , d ]) > b = set(abcbcdyyx) > b #letras nicas em b set([ a , c , b , d , y , x ]) > b - a #letras em b que no esto em a set([ y , x , c , b ]) > b | a #letras em b ou em a set([ a , c , b , d , y , x , s ]) > b & a #letras em b e em a set([ a , d ]) > b ^a #letras em a ou em b, mas no nos dois set([ y , x , s , b , c ])

7.6 Dicionrio
Dicionrio um tipo de dado que permite criar uma relao entre chaves e valores. O sistema de localizao dos valores ca atribuido as chaves, e por ela que devemos procurar os valores. > cadastro=Nome:Fabio Rizzo,idade:22 > cadastro idade: 22, Nome: Fabio Rizzo

53

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

No exemplo acima denimos a chave nome o valor Fabio Rizzo e a chave idade o valor 22. > cadastro[ idade ] 22 > cadastro[ N ome ] Fabio Rizzo Vimos acima como ver os valores da chave idade e da chave Nome. Para adicionarmos uma nova chave e um novo valor fazemos assim: > cadastro[ Signo ]="Leo" > cadastro {idade: 22, Signo: Le\xe3o, Nome: Fabio Rizzo} Dessa forma adicionamos uma nova chave e valor ao dicionrio cadastro. E para alterarmos um valor de uma determinada chave: > cadastro {idade: 22, Signo: Le\xe3o, Nome: Fabio Rizzo} > cadastro[ N ome ]="Fabio Rizzo Matos" > cadastro {idade: 22, Signo: Le\xe3o, Nome: Fabio Rizzo Matos} Atento ao detalhe que os dicionrios so case-sensitive, ou seja, temos que perguntar exatamente pela sua chave, seno teremos um erro. Ex: > cadastro[ nome ] Traceback (most recent call last): File pyshell#14>", line 1, in -toplevelcadastro[ nome ] KeyError: nome Tivemos esse erro porque no existe chave nome e sim Nome. Para removermos uma determinada chave devemos utilizar o mtodo del. Veja: > cadastro {idade: 22, Signo: Le\xe3o, Nome: Fabio Rizzo Matos} > del cadastro[ Signo ] > cadastro {idade: 22, Nome: Fabio Rizzo Matos} Ou utilizar o mtodo clear(), que elimina todas as chaves e valores de um dicionrio. > cadastro {idade: 22, Nome: Fabio Rizzo Matos} > cadastro.clear() > cadastro 54

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

{}

7.7 Mais sobre dicionrios


Existem outros mtodos que podem ser usados em dicionrios. Veja abaixo: Mtodo dicionario.keys() dicionario.has_key(chave) dicionario.itens() Para que serve Mostra quais chave o dicionrio tem. Verica se o dicionrio tem a chave procurada. Retorna uma lista de tuplas contendo chave e valor.

7.8 Utilizando Listas como Pilhas


Os mtodos de lista tornam muito fcil utilizar listas como pilhas, onde o item adicionado por ltimo o primeiro a ser recuperado (LIFO: last-in, rst-out -> ultimo a entrar, primeiro a sair). Para adicionar um item ao topo da pilha, use append(). Para recuperar um item do topo da pilha use pop() sem nenhum ndice. Por exemplo: > stack = [3, 4, 5] > stack.append(6) > stack.append(7) > stack [3, 4, 5, 6, 7] > stack.pop() 7 > stack [3, 4, 5, 6] > stack.pop() 6 > stack.pop() 5 > stack [3, 4]

7.9 Utilizando Listas como Fila


Voc pode tambm utilizar uma lista como uma la, onde o primeiro item adicionado o primeiro a ser recuperado (FIFO: rst-in, rst-out -> primeiro a entrar, primeiro a sair). Para adicionar um elemento ao m da la utiliza append(). Para recuperar um elemento do incio da la use pop() com 0 no ndice. Por exemplo: > queue = [Eric, John, M ichael] > queue.append("Terry") # Adicionando Terry > queue.append("Graham") # Adicionando Graham > queue.pop(0) 55

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Eric > queue.pop(0) John > queue [ M ichael , T erry , Graham ]

7.10 Trabalhando com arquivos


Manter dados gravados em arquivos uma das formas de persistncia de dados. Python consegue lidar com arquivos de uma forma bem simples e sem complicaes. Como abrir um arquivo f = open(le_name, access_mode) > f=open(/tmp/workle, w) > print f <open le /tmp/workle, mode w at 80a0960> le_name e uma variavel que contem uma string do nome do arquivo que desejar abrir, e access_mode o modo com que o arquivo ser aberto. access_mode w w+ r a a+ Para que serve abre arquivo para escrita (cria um novo arquivo caso no exista) abre arquivo para escrita e leitura (cria um novo arquivo caso no exista) abre um arquivo para leitura ( o padro, portanto no precisamos especicar obrigatoriamente) abre um aquivo para escrita com o cursor no nal do arquivo (serve para concatenar conteudo) abre um aquivo para escrita e leitura com o cursor no nal do arquivo (serve para concatenar conteudo)

Para ler o contedo de um arquivo, chame a funo read(tamanho), que le uma quantidade de dados e retorna como uma string. tamanho um argumento numrico opcional. Quando o argumento tamanho omitido ou negativo, retornado o contedo inteiro do arquivo. Se o nal do arquivo for atingido, a funo read() retorna uma string varia . Exemplo: > f.read() Arquivo inteiro.\012 > f.read() " readline() le uma linha de um arquivo e retorna uma string com o caractre \n no nal. Caso seja a ltima linha do arquivo, a string retornada vazia, sem o \n no nal. Exemplo: > f.readline() Primeira linha do arquivo.\012 56

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> f.readline() Segunda linha do arquivo\012 > f.readline() readlines() utiliza readline() repetidamente, e retorna uma lista contendo o dado de cada todas as linhas do arquivo. > f.readlines() [P rimeiralinhadoarquivo.\012 , Segundalinhadoarquivo\012 ] write(string) escreve o conteudo de uma string no arquivo. > f.write(Este e um teste\n) Quando voc terminar de manipular o arquivo, utilize a funo close() para fechar o arquivo e liberar os recursos que foram utilizados ao se abrir o arquivo. Lembre-se que uma vez fechado o arquivo, qualquer tentativa de us-lo novamente ir falhar. Exemplo: > f.close() > f.read() Traceback (innermost last): File stdin>", line 1, in ? ValueError: I/O operation on closed le Agora vamos ver alguns exemplos completos: Exemplo: lename = raw_input(Entre com o nome do arquivo: ) le = open(lename, r) allLines = le.readlines() le.close() for eachLine in allLines print eachLine Exemplo: # Copia o contedo de um arquivo para outro # Abre arquivos para leitura e escrita inp = open("entrada.txt","r") outp = open("saida.txt","w") # Le o arquivo e copia cada linha para o arquivo de sada for line in inp: outp.write(line) print "Arquivo copiado..." # Fecha os arquivos 57

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

inp.close() outp.close()

58

Captulo 8

Funes
Organizando o seu programa

8.1 Introduo
Funes so pedaos de programa reutilizveis. Elas permitem que voc de um nome para um conjunto de instrues, e que voc possa rodar este conjunto de instrues simplesmente chamando o nome dado.

8.2 Criando e chamando uma Funo


Como declarar uma Funo def nome_da_funcao([argumentos]): "documentao opcional para a funo" bloco_da_funcao Funes em Python so denidas utilizando se a palavra def, seguido do nome que ir identicar a funo, seguido de 0 ou mais argumentos que estaro entre chaves. Em seguida, temos o bloco da funo, que ir conter o cdigo que aquela funo executa. def addMe(x): "Aplicar a operacao com o argumento" return (x + x) Como chamar uma Funo > addMe(4.25) 8.5 > addMe(10) 20 59

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> addMe(Python) PythonPython > addMe([1, abc ]) [1, abc , 1, abc ]

8.3 Variveis locais x globais


Variveis locais Quando voc declara variveis dentro de uma funo, elas no esto relacionadas com outras variveis que tenham o mesmo nome mas estejam fora da funo. Ou seja, as variveis so locais funo. Isto tambm conhecido como escopo da varivel. Todas as variveis tem o escopo do bloco em que foi declarado, ou seja, s visvel para aquele trecho de cdigo. > def func(x): ... print "Valor de x = ", x ... x = 10 ... print "Valor de x local mudado para", x ... > x = 50 > func(x) Valor de x = 50 Valor de x local mudado para 10 > print "valor de x externo = ", x valor de x externo = 50 No exemplo acima, podemos ver que uma alterao da varivel x dentro da funo no teve reexos fora dela, pois o valor da varivel x fora da funo continuou o mesmo. Na verdade, a funo apenas utilizou o valor da varivel passada como parmetro, e nada mais. Qualquer alterao da varivel dentro da funo seria limitada para aquele escopo. Variveis globais Se voc quiser que uma varivel dentro da funo possa modicar uma varivel fora dela, voc deve dizer ao Python que esta varivel no local, mas sim, global. Isto feito atravs do comando global. impossvel modicar uma varivel fora da funo sem utilizar o comando global. > def func(): ... global x ... print "x = ", x ... x = 10 ... print "Valor de x global modicado para", x ... > x = 50 > func() x = 50 60

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Valor de x global modicado para 10 > print "Valor de x = ", x Valor de x = 10

8.4 Argumentos padres


Para algumas funes, voc pode querer que alguns dos parmetros se tornem opcionais e possuam um valor padro caso o usurio no entre com nenhum valor para este parmetro. Isto feito atravs dos argumentos padres, que nada mais so do que o nome do parmetro, seguido do sinal de =, seguido do valor do parmetro, que deve ser uma constante imutvel (seu valor no pode mudar dentro da funo)

> def msg(mensagem, numVezes = 2): ... print mensagem * numVezes ... > msg(ola) olaola > msg(mundo, 5) mundomundomundomundomundo

8.5 Argumentos chaves


Se voc possui uma funo com diversos parmetros e gostaria de especicar apenas alguns deles, ento voc pode dar valores a eles nomeando-os. Isto conhecido como argumento chave. Ns utilizamos o nome do argumento em vez de utilizar a posio dele. Ao utilizar os argumentos chaves, temos algumas vantagens: Utilizar a funo se torna mais fcil, j que no temos que nos preocupar com a ordem dos argumentos Apenas damos valor aos parmetros que achamos necessrios, pois os outros podem conter um valor padro > def func(a, b = 5, c = 10): ... print "a =", a, "b =", b, "c =", c ... > func(1,2) a = 1 b = 2 c = 10 > func(10, c = 15) a = 10 b = 5 c = 15 > func(b = 50, a = 10) a = 10 b = 50 c = 10

61

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

8.6 Retorno
O comando return utilizado para retornar um valor, mas pode ser utilizado simplesmente para sair dela sem retornar um valor. Na verdade, todas as funes que no retornam um valor explcitamente, retornam o valor None. > def testandoRetorno(): ... x = 0 ... while (True): ... if x > 5: ... return ... print "x = ", x ... x = x + 1 ... > > testandoRetorno() x=0 x=1 x=2 x=3 x=4 x=5 Neste caso, utilizamos o comando return para sair da funo imediatamente. Lembre-se que caso utilizassemos o comando break, ele apenas sairia do lao mais interno, no caso, o while. > def imprime(): ... print uma mensagem qualquer... ... > print imprime() uma mensagem qualquer... None No exemplo acima, quando imprimimos o nome da funo, aparece a mensagem None, indicando o retorno daquela funo.

8.7 DocStrings
Python possui um mecanismo interessante para documentar as funes. Alm de ser uma boa forma de documentao e organizao, tal documentao pode ser chamada em tempo de execuo atravs do nome da funo seguido de .__doc__. > def soma(a, b): ... "Funcao que soma dois numeros" ... return a+b ... 62

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> soma(5,3) 8 > print soma.__doc__ Funcao que soma dois numeros

8.8 Mdulos
Dividindo e conquistando.

8.9 Introduo
Vimos que as funes permitem uma grande reusabilidade do mesmo trecho de cdigo em diversos pontos do mesmo arquivo. A medida que seu programa cresce, desejavel separ-lo em diversos arquivos para facilitar a manuteno. Neste caso, como fariamos para utilizar uma funo em um arquivo B, uma funo denida no arquivo A? A resposta , utilizando-se mdulos. Um mdulo nada mais do que um arquivo Python contendo funes e variveis que podero ser importadas por outro arquivo que deseje utilizar suas funcionalidades.

8.10 Criando um mdulo


Vamos criar um mdulo que dena a funo de Fibonacci. Abra o seu editor de texto favorito e salve o cdigo a seguir em um arquivo chamado bo.py: #!/usr/bin/env python def b(n): # Imprime a sequencia de Fibonacci at n "Imprime a sequncia de Fibonacci at n" a, b = 0, 1 while b < n: print b, a, b = b, a + b Agora, entre no interpretador Python e digite: > import bo Isso faz com que o mdulo bo seja importado, mas no as suas funes. Portanto, para utilizarmos a funo denida no mdulo, devemos proceder da seguinte maneira: > bo.b(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 63

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> bo.__name__ bo Repare que o nome do mdulo esta disponvel ao utilizarmos como valor da varivel global __name__ Se voc pretende usar a funo regularmente, pode fazer o seguinte: > bAux = bo.b > bAux(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Neste caso, estamos atribuindo a varivel bAux o valor de bo.b, que uma funo.

8.11 Mais sobre mdulos


Um mdulo pode conter segmento executveis e denies de funes. Essas unidades servem para inicializar o mdulo, e so executadas apenas na primeira vez em que o mdulo importado algum lugar. Mdulos podem importar outros mdulos. Por conveno, geralmente importamos os Mdulos no incio do arquivo, mas no obrigatrio. Temos algumas variaes na maneira com que podemos importar mdulos. Por exemplo, podemos especcar diretamente as funes que iremos importar, isentando assim, a necessidade de se botar o prexo do nome do mdulo para utiliz-las. > from bo import b > b(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Neste caso, estamos apenas importanto uma funo (b) do mdulo bo > from bo import * > b(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Agora, importamos todos os nomes que o mdulo dene.

8.12 Mdulos Padres


O Python vem com uma srie de mdulos na sua biblioteca padro, vamos mostrar alguns deles. H um grande conjunto de mdulos que se instalam juntamente com o interpretador Python;

64

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

so descritos nesta seo alguns dos mais interessantes. sys: oferece vrias operaes referentes ao prprio interpretador. Inclui: path, uma lista dos diretrios de busca de mdulos do python, argv, a lista de parmetros passados na linha de comando e exit(), uma funo que termina o programa. time: oferece funes para manipular valores de tempo. Inclui: time(), uma funo que retorna o timestamp14 atual; sleep(n), que pausa a execuo por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido. os: oferece funes relacionadas ao ambiente de execuo do sistema. Inclui: mkdir(), que cria diretrios; rename(), que altera nomes e caminhos de arquivos; e system, que executa comandos do sistema. os.path: oferece funes de manipulao do caminho independente de plataforma. Inclui: isdir(p), que testa se d um diretrio; exists(p), que testa se p existe; join(p,m), que retorna uma string com os dois caminhos p e m concatenados. string: oferece funes de manipulao de string (que tambm esto disponveis como mtodos da string). Inclui: split(c, s, p), que divide a string c em at p parties separadas pelo smbolo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em minsculas; e strip(c), que retorna c removendo espaos e quebras de linha do seu incio e m. math: funes matemticas gerais. Inclui funes como cos(x), que retorna o cosseno de x; hypot(x, y); que retorna a distncia euclidiana entre x e y; e exp(x); que retorna o exponencial de x. > import math > math.sqrt(6) 2.4494897427831779 > math.exp(6) 403.42879349273511 > math.cos(0) 1.0 > math.pi 3.1415926535897931 > math.e 2.7182818284590451 > math.sqrt(4) 2.0 random: gerao de nmeros randmicos. Inclui: random(), que retorna um nmero randmico entre 0 e 1; randrange(m,n), que retorna um randmico entre m e n; choice(s), que retorna um elemento randmico de uma seqncia s. > import random > random.random() 0.50173099332233129 > random.random() 65

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

0.79255214694297194 > random.random() 0.99826060442548059 getopt: processamento de argumentos de comando de linha; ou seja, os parmetros que passamos para o interpretador na linha de execuo. Inclui: getopt(), que retorna duas listas, uma com argumentos e outra com opes da linha de comando. Tkinter: um mdulo que permite a criao de programas com interface grca, incluindo janelas, botes e campos texto. urllib2: proporciona uma interface de conexo e tratamento de URLs > import urllib2 > for line in urllib2.urlopen(http://www.google.com.br): ... print line ... <html><head><meta http-equiv="content-type"content="text/html; charset=ISO-8859-1<title>Google</title><style><! # resto do cdigo omitido

A documentao do Python inclui uma descrio detalhada (e muito boa) de cada um destes mdulos e de seus membros. Visite tambm http://docs.python.org/lib/lib.html

8.13 Mdulos independentes


Alm dos mdulos distribudos com o Python, existem vrios mdulos auxiliares. Justamente por serem numerosos e independentemente fornecidos, no possvel descrev-los na sua totalidade; vou apenas cit-los; podem ser obtidas maiores informaes nos links providos. win32pipe: permite, na plataforma Windows, executar programas win32 e capturar sua sada em uma string para manipulao posterior. Acompanha a distrubuio Activestate Python: http://www.activestate.com/Products/ActivePython/ PIL: Python Imaging Library, que oferece funes para processamento, manipulao e exibio de imagens. http://www.pythonware.com/products/pil/ NumPy: prov mecanismos simples e de alto desempenho para manipular matrizes multi-dimensionais; ideal para operaes numricas de alto volume que necessitem de velocidade. http://numpy.sourceforge.net/ HTMLgen: uma biblioteca de classes que gera documentos HTML conforme padres pr-denidos. Oferece classes para manipular tabelas, listas, e outros elementos de formatao. http://starship.python.net/crew/friedrich/HTMLgen/html/ DB-API: Database Application Programming Interface; na realidade, um conjunto de mdulos

66

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

que acessam bases de dados de uma forma padronizada. A API especica uma forma homognea de se fazer consultas e operaes em bases de dados relacionais (SQL); diversos mdulos implementam esta API para bases de dados especcas. http://www.python.org/topics/database/ mx: oferece uma srie de extenses linguagem, incluindo operaes complexas de data e hora, funes nativas estendidas, e ferramentas para processamento de texto. http://www.egenix.com/les/python/ PyGTK: outro pacote que permite construir aplicaes grcas com o Python; pode ser usado em conjunto com o Glade, um construtor visual de interfaces. http://www.pygtk.org/ wxPython: uma biblioteca de classes que permite construir aplicaes grcas multi-plataforma usando Python. H um construtor visual de interfaces disponvel, o Boa Constructor. http://www.wxpython.org/ Todos os mdulos citados se comportam como mdulos Python normais; so utilizados por meio da instruo import, e boa parte possui documentao e smbolos internos listveis. Esta no uma lista exaustiva, e h muitos outros mdulos teis; h boas referncias que listam mdulos externos, incluindo o ndice de pacotes ocial PyPI: http://www.python.org/pypi

67

Captulo 9

Erros e excees
Mantendo o seu programa robusto

9.1 Introduo
Erros e excees podem acontecer a qualquer momento no seu programa. Por exemplo, o que aconteceria se seu programa lesse um arquivo mas ele no existisse, ou se voc tivesse excludo ele acidentalmente no meio do programa? Neste captulo, veremos como o Python lida com tais situaes, dando chances para que voc possa contornar os seus problemas.

9.2 Erros de sintaxe


Tambm so conhecidos como erros de parsing, e provavelmente so os erros mais frequntes que voc ira encontrar enquanto estiver aprendendo a linguagem. > while 1 print Ola Mundo File stdin>", line 1 while 1 print Ola Mundo ^ SyntaxError: invalid syntax O erro causado pela instruo que esta imediatamente antes da seta. No exemplo acima, o erro detectado na palavra chave print, pois no temos os dois pontos : imediatamente antes da instruo. > Print ola mundo File stdin>", line 1 Print ola mundo ^ SyntaxError: invalid syntax Neste caso, o erro esta no comando Print, que deveria ser print. No se esquea que o Python diferencia maisculas de minsculas (case sensitive).

68

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

9.3 Excees
Erros que so detectados em tempo de execuo so chamados de excees. Com as excees, programadores podem rapidamente debugar suas aplicacoes como uma boa pratica de melhorar o aplicativo desenvolvido, podendo antecipar e simular erros que poderao acontecer. A maioria das excees no so tratadas, resultando em mensagens de erros como no exemplo a seguir: # Diviso por 0 > 10 * (1/0) Traceback (innermost last): File stdin>", line 1 ZeroDivisionError: integer division or modulo # Tentativa de somar string com inteiro > 2 + 2 Traceback (innermost last): File stdin>", line 1 TypeError: illegal argument type for built-in operation A ultima linha da mensagem de erro indica o que ocorreu. Excees podem ser de diferentes tipos (ZeroDivisionError e TypeError para os nossos exemplos). Vemos que logo aps o tipo do erro, temos uma mensagem indicando o que houve com maiores detalhes.

9.4 Tratamento e disparo(raise) de excees


Podemos tratar as excees utilizando as clusulas try..except. Botamos nosso cdigo na clusula try, e os comandos de tratamento de erro na clusula except. A sintaxe bsica para o tratamento de excees a seguinte: try: cdigo que pode lanar uma exceo except someError: uxo a ser executado caso uma exceo ocorra

> numeros = [0.3333, 2.5, 0, 10] > for x in numeros: ... print x, ... try: ... print 1.0 / x ... except ZeroDivisionError: ... print *** trata exceo *** 69

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

... 0.3333 3.00030003 2.5 0.4 0 *** trata exceo *** 10 0.1 A instruo try funciona da seguinte maneira: Primeiramente, o bloco contido dentro da clusula try (at antes da clusula except) executado. Se nenhuma exceo ocorrer, a clusula except no executada. Se alguma exceo ocorrer durante a execuo da clusula try, o resto do cdigo na clusula try ignorado. Caso a exceo ocorrida seja uma das declaradas na clusula except, o cdigo desta clusula executado. Se uma exceo ocorrer mas nenhuma clusula except contiver o nome do erro ocorrido, ser considerado uma exceo no tratada, e a execuo do programa ir parar. A instruo try pode ter mais de uma clusula except, para poder lidar com diferentes tipos de excees. Disparando uma exceo (raise) Permite ao programador forar(lanar) a ocorrncia de uma determinada exceo. Por exemplo: > raise NameError, Descricao Traceback (innermost last): File stdin>", line 1 NameError: Descricao O primeiro argumento o nome da exceo a ser lanada. O segundo argumento, opcional e especica o argumento da exceo.

9.5 Aes de limpeza(clean-up)


A instruo try tem uma outra clusula opcional o qual dene aes de limpeza que devem ser executados em qualquer circunstncias. A clusula nally executada com ou sem a ocorrncia de uma exceo no bloco try. Quando uma exceo ocorre, ela re-lanada aps a execuo da clusula nally. O cdigo na clusula nally til para liberar recursos, como por exemplo, fechar arquivos ou conexo com banco de dados. Por exemplo: > try: ... raise KeyboardInterrupt ... nally: 70

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

... print Goodbye, world! ... Goodbye, world! Traceback (most recent call last): File stdin>", line 2, in ? KeyboardInterrupt A clusula try pode ter uma ou mais clusulas except ou uma clusula nally, mas nunca ambas juntas.

71

Captulo 10

Python Orientado a Objetos


Conhecendo um dos paradigmas de programao mais utilizados atualmente

10.1 Introduo
Todos os algoritmos que mostramos at agora, continham funes ou blocos de comandos. Isto conhecido como como programao procedural. Existe outro meio de organizar seu programa que combinar dados e funcionalidades no que chamamos de objetos. Isto conhecido como programao orientada a objetos. Muitas vezes a programao procedural atende perfeitamente s nossas necessidades. Mas a medida que o programa cresce, aconselhvel utilizar um paradigma orientado a objetos. Vantagens:

Desenvolvimento mais rpido; Fcil manuteno; e Reuso.

* Tais vantagens dependem da qualidade em que projetamos um software. Objetos permitem:

Criar modelos do mundo real em computador; e Usar esses modelos para simular o mundo real.

Possibilita ao desenvolvedor:

72

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Minimizar a lacuna existente entre o sistema real e sua representao em um sistema computacional; Pensar, ao longo do processo de desenvolvimento, no domnio da aplicao e no em uma linguagem de programao especca.

10.2 Conceitos OO
Nesta seo, vamos conhecer alguns dos conceitos bsicos de OO, dando alguns exemplos de como isto aplicado para a linguagem Python.

10.3 Classes
Classes so agrupamentos de objetos (computacionais) que tm propriedades em comum e podem realizar as mesmas aes. A classe pode ser vista como um molde para um objeto, ou seja, ela no tem existncia prpria durante a execuo do programa. Durante a execuo so manipulados os objetos instanciados a partir das classes. Classes correspondem a abstraes de entidades do mundo real e que guardam alguma similaridade entre si. Por exemplo, podemos abstrair das entidades do mundo real Joo, Jos e Maria propriedades comuns, formando a classe Pessoa que agrega os dados (por exemplo, nome, endereo) e as operaes que se pode realizar sobre objetos da classe Pessoa. Uma classe composta por: Atributos (caractersticas do objeto); e Mtodos (operaes que podem ser realizadas esses atributos). Atributos e Mtodos so chamados membros da classe. > class Funcionario: ... pass # o comando pass nao faz nada ... > func = Funcionario() > print func <__main__.Funcionario instance at 0xb7e0216c> No exemplo acima, denimos uma classe chamada Funcionario que no contm nenhum servio. Logo em seguida, criamos uma instncia da classe e imprimimos seu contedo. Iremos aprender mais sobre instncia nas prximas sees. Repare que utilizamos a construo pass. Ela pode ser usada quando a sintaxe exige um comando mas a semntica do programa no requer nenhuma ao, ou seja, nenhum cdigo precisa ser executado. Por exemplo: def f(arg): pass # uma funo que no executa nada (ainda) 73

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

10.4 Objetos
Um objeto a materializao da classe em um elemento real. Um objeto representa um ?elemento? que pode ser identicado de maneira nica. Desta forma, elementos especcos como uma pessoa, organizao, carro, eventos e etc. podem ser considerados um objeto. um conceito, uma abstrao ou uma entidade, com limites e signicados bem denidos, em relao ao problema considerado. Um Objeto possui: estado interno (Atributos) identicao comportamento (operaes ou mtodos) Um objeto a instncia de uma classe, isto possui a estrutura da classe (mtodos e atributos), mas seu prprio estado (atributos possuem valores). Ao construir um objeto, a declarao da classe utilizada como um modelo informando como alocar o espao de dados necessrio para o objeto, como inicializar todos os atributos (dados) do objeto e outras aes de inicializao. Objetos comunicam-se atravs de mensagens. Exemplos: Classe GATO Objetos Tom, Gareld, Fi-, etc. Classe PESSOA Objetos Rosiane, Ana, Jos, etc. Classe DISCIPLINA Objetos Matemtica, Geograa, Portugus, etc.

> class Cachorro: ... def late(self): ... print "au au..." ... > rex = Cachorro() > rex.late() au au... No exemplo acima, denimos uma classe Cachorro que contm um nico mtodo, chamado late. Ele recebe como argumento, a palavra chave self. Entenderemos nas prximas sees do que se trata. O importante, lembrar que ao fazer rex = Cachorro() estamos criando um objeto da classe Cachorro e atribuindo a varivel rex.

74

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

10.5 Instncia
Instncia o mesmo que um objeto. Cada objeto uma nova ocorrncia ou uma instncia de alguma classe. > class Cachorro: ... def late(self): ... print "au au..." ... > rex = Cachorro() > rex.late() au au... Aproveitando o exemplo da seo anterior, ao fazermos rex = Cachorro() estamos criando uma instncia da classe Cachorro, ou seja, um objeto.

10.6 Atributos
Uma propriedade da classe que caracteriza um objeto atravs do seu valor (estado interno). So os valores ou dados escondidos por um objeto em uma classe, denindo as caractersticas especcas de um determinado objeto. Cada atributo possui um valor especco para cada instncia da classe. Exemplo: Classe Professor Nome CPF Curso Disciplina Classe Carro Cor Peso Ano Modelo

10.7 Mtodos
As funes aplicveis a objetos de uma classe so chamadas Funes-Membro ou Mtodos daquela classe. 75

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Mtodos so as operaes ou comportamentos realizados por um objeto. So as funes ou transformaes que podem ser aplicadas (em/ou por) um objeto de uma classe, em resposta aos estmulos do mundo externo e provocando possveis mudanas de estados. So funes associadas a objetos da classe em que elas foram declaradas. Exemplo: Classe Seguranca Autenticar Usuario Registrar Logon Criar Sesso Classe Matricula Pesquisar Matricula Adicionar Matricula Excluir Matricula

10.8 Variveis de classe vs objeto


Existem dois tipos de variveis que criadas dentro da classe so visveis para o "mundo exterior". So elas, as variveis de classe e as variveis de objetos. Vamos as denies: Varivel de classe: So aquelas que so compartilhadas por todas as instncias daquela classe. Em outras palavras, se criarmos 2 objetos da mesma classe, e um deles modicar o valor da varivel, isto ser reetido para o outro objeto. Uma analogia para quem programa em Java por exemplo, seria o modicar static, que desempenha a mesma funo. Em Python, utilizamos uma varivel de classe escrevendo: NomeDaClasse.varivel. > class Pessoa: ... def setIdade(self, valor): ... Pessoa.idade = valor ... def getIdade(self): ... return Pessoa.idade ... > joao = Pessoa() > paulo = Pessoa() > joao.getIdade() 0 > paulo.getIdade() 0 > joao = setIdade(21) > joao.getIdade() 76

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

21 > paulo.getIdade() 21 No exemplo acima, repare que ao mudarmos o valor da varivel de classe do objeto joao, mudamos tambm o valor da idade para o objeto paulo. Varivel de objeto: So aquelas variveis cujo escopo esta limitado ao objeto. Em outras palavras, se criarmos 2 objetos da mesma classe, e um deles modicar o valor da varivel, isto no ser reetido para o outro objeto. > class Pessoa: ... def setIdade(self, valor): ... self.idade = valor ... def getIdade(self): ... return self.idade ... > joao = Pessoa() > paulo = Pessoa() > joao.getIdade() 0 > paulo.getIdade() 0 > joao = setIdade(21) > joao.getIdade() 21 > paulo.getIdade() 0

10.9 Variveis privadas


Variveis privadas so aquelas que esto visveis apenas no escopo da classe em que foram declaradas, no podendo ser refernciadas por outra classe ou arquivo. > class Aluno: ... __nomePrivado = "Valor do nome" Em Python, uma varivel privada identicada por dois sublinhados __ seguido do nome da varivel. Isso permite que a visibilidade das variveis sejam facilmente diferenciadas apartir do nome delas.

10.10 O mtodo init


Quando denido dentro de uma classe, o mtodo __init__ chamado toda vez que uma nova instncia daquela classe criada. Isto permite que voc possa inicializar o objeto da maneira que deseja, antes dele utilizar os servios que a classe prov.

77

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> class Cachorro: ... def __init__(self, nome): ... self.nome = nome ... def late(self): ... print self.nome, "fazendo auau..." ... > rex = Cachorro("rex") > rex.late() rex fazendo auau...

10.11 O argumento self


Note que o mtodo __init__ (assim como outros exemplos da lio) possui um argumento extra, a palavra self. Note que ns no especicamos self quando chamamos o mtodo. Todos os mtodos de Python trabalham assim. Este argumento representa a instncia, e o Python esconde ele por trs dos panos. Voc precisa de self porque o nico jeito de acessar atributos de instncia (objetos) e outros mtodos. Dentro do mtodo, self.nome signica o atributo de instncia(objeto) nome, mas apenas nome signicaria a varivel local nome. E como voc sabe, variveis locais deixam de existir assim que o mtodo encerra.

10.12 Herana
Na POO existem relaes possveis de serem estabelecidas entre as classes de modo a permitir o compartilhamento de dados e de mtodos, originando uma hierarquia entre elas. Herana uma relao entre duas ou mais classes, onde aparecem classes bases (superclasse) e classes lhas (subclasse ou herdeira) especializadas e renadas. Podemos denir uma classe que herda informaes de uma outra classe. Veja: Superclasse (classe que ser herdada) > class Inicial: ... def __init__(self,nome): ... self.nome = nome ... def mostra(self): ... print Classe Inicial - Nome: \%s \% (self.nome) ... Subclasse (classe que herda a superclasse) > class Herdada(Inicial):

78

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

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

def __init__(self, nome, idade): Inicial.__init__(self,nome) self.upper = nome.upper() self.idade = idade def mostra(self): Inicial.mostra(self) print Classe Herdada - Nome Maiusculo: \%s \% (self.upper) if self.idade >= 18: print "maior de idade" else: print "menor de idade" def idade(self): return self.idade

> objInicial = Inicial("Fulano") > objInicial.mostra() Classe Inicial - Nome: Fulano > objHerdada = Herdada("Fulano", 20) > objHerdada.mostra() Classe Inicial - Nome: Fulano Classe Herdada - Nome Maiusculo: FULANO maior de idade

79

Captulo 11

Expresses Regulares
Procure por qualquer padro dentro de textos ou arquivos.

11.1 Denindo expresses regulares


O que expresso regular? Uma expresso regular (RE) uma sequncia de caracteres que denota um padro de texto. Dito de outra forma, uma expresso regular (RE) uma maneira de reconhecer e extrair padres de textos em certas strings de dados (textos ou palavras). A RE denida por um sequncia de caracteres (tambm chamados metacaracteres) com um signicado especial. Quando bem construdas, as RE nos permitem encontrar padres de textos em diferentes strings. Uma RE que reconhece um padro de texto chamada matched (compatvel).

11.2 Sintaxe
mais fcil entender a sintaxe de RE atravs de exemplos. Abaixo um pequeno programa que usa RE. Ele conta quantas linhas de um arquivo texto contm a palavra hello. A linha que contiver hello mais de uma vez, ser contada apenas uma vez. Exemplo: > import re > regexp = re.compile("hello") > count = 0 > le = open("textle", r) > for line in le.readlines(): ... if regexp.search(line): ... count = count + 1 ... > le.close() > print count

80

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

O programa comea pela importao de um mdulo python especco para uso em expresses regulares, chamado re. A seguir, o programa pega a string hello como uma expresso regular textual e a compila, usando para isto a funo re.compile. Isto no estritamente necessrio (o mdulo re guarda uma verso compilada para voc), mas na maioria dos programas que utilizam RE, voc ver que se usa compilar as expresses. Isto porque quando se compila a RE, aumenta-se a velocidade de execuo do seu programa. Na linha que usamos para compilar a expresso regular, criamos um objeto chamado regexp. Como todo objeto, este tambm possui alguns mtodos. Assim, este novo objeto (vamos tratar mais sobre objetos nas prximas sees) poder ser usado para reconhecer outras ocorrncias da palavra hello dentro de outras strings. Para reconhecer a ocorrncia da palavra hello (seguindo nosso exemplo), usamos o metodo search. Este mtodo retorna true se a linha lida contm a string correspondente ao objeto regexp e false em caso negativo (ns vamos falar mais sobre o search na prxima seo). Portanto, se a linha do if retornar true, adicionamos mais 1 (um) no contador. Ao nal da leitura do arquivo texto, ns o fechamos e imprimimos o valor de count. Bem, at aqui contamos quantas vezes a palavra hello ocorre no arquivo. Mas note que estamos ignorando as linhas que contm a palavra Hello (com a letra h em maisculo) pois no estamos considerando a ocorrncia de letras maisculas. A maneira como resolvemos isto usando o metacaratere | (pipe). Veja como caria a segunda linha do nosso programa: regexp = re.compile("hello|Hello") O uso de ", neste caso, signica dizer que queremos localizar a palavra hello ou Hello. Uma outra forma de fazer isto seria assim: regexp = re.compile("(h|H)ello") Neste ltimo caso estamos usando outro metacaractere; o "(". Ele usado para agrupar padres. Neste caso, o uso de "(", signica que "somente ir escolher entre a letra h (em minscula) e H (maiscula). O resultado da RE ir ser compatvel com qualquer das ocorrncias da letra h em minscula e em maiscula e sempre seguida da string ello. No uso de RE, utilizamos vrios metacaracteres. A seguir, a lista deles: . ^$ * + ? [ ] \| ( ) Bem, at aqui vimos o uso de | e (). O uso de [ e ] tambm bem interessante. Ele nos permite agrupar caracteres, especicando uma certa classe de caracteres. Por exemplo: [a z ] signica qualquer letra minscula; [A Z ] qualquer letra maiscula; [A Z ] qualquer caracter que NO seja nenhum caracter entre A e Z; [abcd] qualquer um destes caracteres; 81

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

[0 9] qualquer digito entre 0 e 9; [0 9] qualquer caracter que NO seja nenhum dgito entre 0 e 9; [5 ] signica qualquer caracter diferente de 5. Nestes casos, voc percebeu o signicado de ^ n? Ele est fazendo o papel de negativa. Mas veja outro uso do ^ : regexp = re.compile("^cabral") O que estamos querendo neste caso, achar qualquer sequncia de caracteres que comece com "cabral". O metacaractere $ nos serve para buscar sequncias na parte nal de strings. Veja: regexp = re.compile("cabral$") Assim, se tivermos um nome como "pedro alvares cabral", por exemplo, teremos sucesso se utilizarmos o objeto regexp. O talvez seja um dos metacaracteres mais utilizados. Voc pode usa-lo seguido de vrios caracteres para sinalizar sequncias especiais. Ele tambem usado para escapar todos os outros metacaracteres. Por exemplo, se voc precisar encontrar em uma string o caracter "["ou o "?", pode usar a seguinte construo: \[ e \? respectivamente. Veja algumas das sequncias especiais: \d - qualquer caracter dgito decimal; equivale a [0 9]; \D - qualquer caracter que NO seja um dgito; equivale a [0 9]; \s - qualquer caracter que signica espao , em qualquer quantidade; equivale a [ \t\n\r\f\v] \S - qualquer caracter que NO signica espao , em qualquer quantidade; equivale a [^\t\n\r\f\v] \w - qualquer caracter alfa-numrico; equivale a classe de caracteres [a zA Z 0 9] ; \W - qualquer caracter NO alfa-numrico; equivale a classe [a aA Z 0 9] . Para nalizar esta seo, vamos criar uma tabela com outros metacaracteres dos quais no falamos ainda. A tabela contm o metacaracter e seu respectivo signicado em RE:

82

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

. ^ $ *

m, n

m, n?

\ (?P<name>...)

(?P=name)

No modo default, equivale a qualquer caracter exceto o newline (\n). Testa a validade do padro no incio da String Testa a validade do padro no nal da String Equivale a 0 ou mais repeties do caracter na RE. Exemplo: ab* ir resultar verdadeiro (true) se encontrarmos na string desejada a ocorrncia de a, ab ou a seguido de qualquer quantidade de letras b Equivale a 1 ( pelo menos 1) ocorrncia do caracter na RE. Examplo: ab+ ir resultar em verdadeiro (true) se encontrarmos na string desejada a ocorrncia de a seguido de pelo menos uma letra b Equivale a nenhuma ou uma ocorrncia da expresso precedente. Exemplo: ab? ir resultar em verdadeiro se encontrarmos na string desejada a ocorrncia da letra a ou do conjunto ab Aqui a idia encontrar um mnimo (m) e um mximo (n) de caracteres na string desejada. Exemplo: a3, 5 equivale a buscar um mnimo de 3 e um mximo de 5 ocorrncias da letra a. A idia aqui diferente da anterior. Quando usamos esta construo, queremos encontrar o mnimo possvel de ocorrncias da expresso. Exemplo: Na string aaaaaa (seis caracteres), quando usamos a3, 5 encontramos 5 letras a e nos retornado aaaaa (cinco caracteres). Mas quando usamos a3, 5? equivale a buscar pelo menos 3 ocorrncias da letra a. Ou seja, a expresso retornar somente aaa (trs caracteres). Permite inserir caractres especiais como "*"ou "?"que isoladamente seriam interpretados como algum padro para a RE Agrupa alguma expresso regular, atravs de um identicador <name>. Por exemplo, se a expresso (?P<id>[a zA Z] \w*), pode ser referenciado pelo seu nome, em argumentos de mtodos, como m.group(id) ou m.end(id) Procura por um padro que for encontrado apartir do grupo name

11.3 Utilizando RE
Vamos comear a usar RE em um exemplo. E a melhor maneira de fazer isto, usar extensivamente os metacarateres. Assuma que tenhamos uma lista de pessoas com seus respectivos nmeros de telefones, todas gravadas em arquivo texto. Cada linha deste arquivo seria assim: Sobrenome, Nome NomeDoMeio: NumeroTelefone Traduzindo, teramos: Sobrenome seguido de , (vrgula) e (espao), Nome seguido por (espao), NomeDoMeio, seguido por : (dois pontos) e (espao) e nalmente, o NumeroTelefone. Para complicar, o NomeDoMeio pode ou no existir e, alm disto, o NumeroTelefone, pode ou no ter um cdigo de rea. Ele pode ser 800-124-4567, ou pode ser apenas, 123-4567. 83

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Bem, para escrever um cdigo em python para fazer o parser destas linhas, pode ser simples se usarmos RE. Ento vamos comear assumindo que Nome, NomeDoMeio e Sobrenome, todos tm somente letras e, possivelmente, um hfem. Os metacaracteres [ ] denidos na seo anterior, podem ser usados para denir um padro que nos servir para a busca de tais nomes, veja: [a zA Z ] Este padro ir encontrar um hfem, ou uma letra (qualquer letra) em minsculo ou maisculo. Para encontrar o nome completo, por exemplo Pedro, ns precisamos repetir este padro. O metacaracter + nos permite repetir (uma ou mais vezes) este padro, possibilitando-nos encontrar o nome completo. Ficaria assim: [a zA Z ]+ Agora esta RE poder encontrar um nome simples, como Marcus ou Pedro, mas tambm nos permite encontrar Marcus-Pedro. Esta RE tambm nos permite encontrar coisas que no so na verdade nome, por exemplo, ou a-b-c, mas serve para o nosso propsito neste momento. Mas o que dizer sobre o nmero do telefone? Vamos usar o \d. Seria: \d\d\d-\d\d\d-\d\d\d\d Ou seja, trs digitos, seguidos de - (hfem), seguido de mais trs dgitos, outro - (hfem) seguido de quatro dgitos. Acontece que, neste caso, iramos localizar somente as linhas nas quais os nmeros de telefone contivessem o cdigo de rea. Ento vamos mudar esta RE para: (\d\d\d-)?\d\d\d-\d\d\d\d Agora a sequncia (\d\d\d-) opcional. Ou seja, NumeroTelefone pode ou no ter o cdigo de rea. Bem, colocando tudo junto, teramos: [a zA Z ]+, [a zA Z ]+( [a zA Z ]+)?: (\d\d\d-)?\d\d\d-\d\d\d\d Poderamos ter um programa em python assim: import re regexp= re.compile( # Sobrenome e vrgula r"[a zA Z ]+," # Nome r"[a zA Z ]+" # NomeDoMeio opcional r"([a zA Z ]+)?" # dois pontos, espao e NumeroTelefone r": (\d\d\d-)?\d\d\d-\d\d\d\d 84

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

) le = open(textle, r) for line in le.readlines(): if regex.search(line): print "Ok, encontrei ... e agora?" le.close()

11.4 Extraindo contedo


At agora apenas conseguimos ver se uma determinada string possui uma certa sequncia de caracteres. Mas e se ns pudermos extrair dados destas REs? Pois , ns podemos. Para isto vamos usar o conceito de grupos. A idia que podemos dar nomes aos padres que buscamos com a RE para depois usarmos estes nomes. Veja: (?P<last>[azAZ ]+), (?P<rst>[azAZ ]+) ( (?P<middle>([azAZ ]+)))?:(?P<phone>(\d\d\d)?\d\d\d-\d\d\d\d) Aqui precisamos observar alguns detalhes: a) toda a expresso deve estar em uma nica linha; b) o caracter ? aqui tem outra funo. Ele nos d condies de usar o mtodo group; O uso do mtodo group possvel porque quando usamos o search, ele no retorna apenas true ou false; ele retorna tambm uma estrutura com os dados equivalentes. Olha como caria o nosso programa agora: #!/usr/bin/env python import re regexp= re.compile( # Sobrenome e virgula r"(?P<last>[a zA Z ]+)," # espaco e Nome r"(?P<rst>[a zA Z ]+)" # espaco NomeDoMeio opcional r"( (?P<middle>([a zA Z ]+)))?" # dois pontos, espaco e NumeroTelefone r": (?P<phone>(\d\d\d-)?\d\d\d-\d\d\d\d)") le = open(textle, r) for line in le.readlines(): result = regexp.search(line) if result == None: print "Oops, nao encontrei nadica de nada!" else: lastname = result.group(last) rstname = result.group(rst) 85

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

middlename = result.group(middle) phonenumber = result.group(phone) print "Nome (\%s) NomeDoMeio (\%s) Sobrenome (\%s) Telefone (\%s)" \% (rstname, middlename, lastname, phonenumber) le.close() Para test-lo, basta criar um arquivo chamado textle, como por exemplo este: Arantes, Edson Pele: 999-9999 Joaozinho, Trinta: 888-8888 Uma linha qualquer Veja a sada produzida ao rodar o exemplo com o arquivo acima: Nome (Edson) NomeDoMeio (Pele) Sobrenome (Arantes) Telefone (999-9999) Nome (Trinta) NomeDoMeio (None) Sobrenome (Joaozinho) Telefone (888-8888) Oops, nao encontrei nadica de nada! Repare que na ltima linha, no encontrado um padro de texto conforme o especicado.

11.5 Substituindo textos com RE


Alm de extrair strings de textos como vimos acima, podemos usar RE em Python para encontrar e substituir strings nos textos. Isto acontece usando um mtodo chamado sub. O exemplo a seguir ilustra isto. Ns vamos trocar a ocorrncia de uma string que contm Perl e vamos substituir por Python. Veja: > import re > Frase = "Quando vou trabalhar com RE, eu prero usar Perl" > regexp = re.compile(r"Perl") > regexp.sub("Python", Frase) O codigo acima ir imprimir a seguinte string: "Quando vou trabalhar com RE, eu prero usar Python" Ou seja, para o mtodo sub ns passamos dois argumentos. O primeiro o novo termo que desejamos colocar em Frase. O segundo argumento onde queremos que a substituio seja feita. Neste caso, desejamos colocar a palavra "Python"substituindo a palavra "Perl"em Frase. Bem, isto bem trivial, mas o legal de Python com RE (e sub), que podemos fazer do primeiro argumento uma funo. Veja este exemplo: > import re > Numeros = "1 2 3 4 5"# denio de uma varivel chamada Numeros > def int_para_oat(matchObj): return (matchObj.group(digitos) + ".0") # metodo que usarah o Grupo digitos denido abaixo 86

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

> pattern = r"(?P<digitos>[0 9]+)"# denio do padro de procura e de um Grupo chamado digitos > regexp = re.compile(pattern) > regexp.sub(int_para_oat, Numeros) # para a substituio, usa-se o mtodo denido acima O codigo acima, ir imprimir "1.0 2.0 3.0 4.0 5.0" Neste caso, o padro de procura consiste de um ou mais digitos ( a parte [0 9]+ ). tambm dado um nome para este padro ( a parte ?P<num> ). O mtodo sub ir procurar dentro de Numeros o padro que combina com [0 9]+. Quando o padro for encontrado, ele ir chamar o mtodo int_para_oat que, por sua vez, usar o Grupo digitos para extrair e produzir uma nova varivel Numeros.

87

Captulo 12

Bibliotecas Grcas
Conhea as mais famosas bibliotecas grcas para Python. As bibliotecas oferecem um ambiente rico para programas voc desenvolver programas grcos.

12.1 TKinter para TK


Baseada em Tcl/Tk, a Tkinter acompanha a distribuio ocial do interpretador Python. a biblioteca padro da linguagem Python. Vantagens: Portabilidade - Programas escritos usando a Tkinter so portveis livremente entre Linux, Unix, Windows e Mac, alm da garantia de que qualquer um poder executar o programa sem precisar instalar bibliotecas extras. Aprendizado - Tem uma API simples de se aprender e fcil de lembrar. Documentao - Muito bem documentada, com inmeros tutoriais e referncias de tima qualidade disponveis na Web. Desvantagens: Pobre - Faltam muitos componentes importantes, como notebooks e combo box (apesar de estes poderem ser feitos combinando outros componentes). Alguns elementos (listbox por exemplo) so incompletos ou limitados. Em compensao o componente Text muito poderoso. Aparncia - A Tk usa uma funo prpria para acessar diretamente as funes do sistema operacional e desenhar seus prprios elementos na tela. Isso tem a vantagem de ser mais facilmente portvel, mas a grande desvantagem de ter uma aparncia diferente da nativa do sistema operacional. Performance - O desempenho extremalmente baixo comparado ao que a biblioteca oferece. Exemplo de cdigo:

88

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

from Tkinter import * class App: def __init__(self, master): frame = Frame(master) frame.pack() self.button = Button(frame, text="QUIT", fg="red", command=frame.quit) self.button.pack(side=LEFT) self.hi_there = Button(frame, text="Hello", command=self.say_hi) self.hi_there.pack(side=LEFT) def say_hi(self): print "hi there, everyone!" root = Tk() app = App(root) root.mainloop() Mais informaes: http://www.python.org/topics/tkinter/

12.2 PyGTK para GTK


PyGTK um wrapper para o Python criado por James Henstridge, construdo sobre o GIMP Toolkit (GTK), a biblioteca usada pelo GNOME e muitas outras aplicaes para Linux. Tem timo desempenho, elementos ricos e visual mente agradvel. Vantagens: Desempenho - PyGTK 0.X (para GTK 1.2) tem um timo desempenho. A verso 2.0 (para gtk 2.X) no tem o mesmo desempenho, mas bem satisfatria. Documentao - Bem documentada. Existem bons tutoriais para ambas as verses. Apesar de no haver uma referncia completa para PyGTK 0.X, existe uma muito boa para a verso 2.X. API - PyGTK usa uma API eciente, baseada em propagao de sinais e callbacks. Um elemento qualquer emite um sinal, que propagado "pra cima"at ser capturado e gerar a chamada de um callback. 89

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

IDE - Possui uma ferramenta para construo de interfaces, o Glade, que permite gerar uma referncia em XML da interface, que pode ser usada diretamente pela biblioteca. Portabilidade - Portar aplicaes de PyGTK para Windows facil. Normalmente sem trocar o cdigo. Desvantagens: Tamanho do cdigo - Muito do cdigo escrito em PyGTK chega a parecer redundante, mas necessrio. Por exemplo, para usar um elemento qualquer precisamos cri-lo, chamando a classe, congur-lo atravs dos seus mtodos de congurao, posicion-lo e por m mostr-lo com o mtodo show(). So no mnimo trs chamadas de mtodos pra cada objeto. Como resultado disso, temos arquivos de cdigo fonte imensos. Linhas e mais linhas de cdigo so necessrias para se fazer qualquer coisa. Exemplo de cdigo: import gtk class HelloWorld(gtk.Window): def __init__(self): gtk.Window.__init__(self) self.connect("delete_event", gtk.main_quit) self.set_border_width(10) self.set_title("Hello World!") hbox = gtk.HBox() self.add(hbox) self.button1 = gtk.Button("Button 1") self.button1.connect("clicked", self.button_pressed_cb) hbox.pack_start(self.button1) self.button2 = gtk.Button("Button 2") self.button2.connect("clicked", self.button_pressed_cb) hbox.pack_start(self.button2) def button_pressed_cb(self, button): print "Hello again - \%s was pressed"\% button.get_label() if __name__ == "__main__": win = HelloWorld() win.show_all() gtk.main()

90

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Mais informaes: http://www.pygtk.org

12.3 PyQT para QT


PyQT um wrapper da linguagem Python para a biblioteca Qt, que a base do KDE (ambiente desktop para Linux). Muitas das vantagens e desvantagens do PyQT coincidem com as do PyGTK, pelo fato do GNOME e KDE serem "concorrentes"e se equivalerem em muitos aspectos. Existe uma biblioteca complementar, PyKDE, que atua sobre elementos especcos do KDE, como por exemplo interao com o kicker e a barra de tarefas. Vantagens: Desempenho: Como o Qt foi construdo de forma a facilitar o desenvolvimento de wrappers, o desempenho do PyQT bem prximo do Qt quando usado com C++. Fcil de aprender: A biblioteca Qt famosa por ser extremamente bem documentada, pois a prpria Trolltech possui um time de escritores tcnicos. Apesar da documentao ser para C++, fcil "traduzir"os exemplos para Python. Existe tambm um timo livro online sobre PyQT no site opendocs.org API: A API do PyQT utiliza um sistema de "slots"e "sinais", levemente similar ao sistema de sinais e callbacks utilizado por outras bibliotecas. A API bastante rica e coerente. IDE: Possui uma IDE muito boa para criao de interfaces, chamada QT Designer. O programa pyuic transforma essas denies de interfaces em cdigo Python, que pode ento ser usado por outros programas. Desvantagens: Portabilidade: Usar o PyQT excelente para programas Linux (em especial para rodar em cima do KDE, embora isso no seja obrigatrio), mas como no existe licena GPL para Windows, provavelmente no uma boa idia utiliz-lo nessa plataforma. No ambiente Windows existem DLLs disponveis para download da Qt 2.x para ns no comerciais, sobre as quais se encontra disponvel tambm o PyQt para Windows. DLLs para ns no comerciais da Qt 3.x somente se encontram disponveis no livro C++ GUI Programming with Qt 3. Exemplo de cdigo: import sys from qt import * class HelloButton(QPushButton): def __init__(self, *args): apply(QPushButton.__init__, (self,) + args) self.setText("Hello World") 91

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

class HelloWindow(QMainWindow): def __init__(self, *args): apply(QMainWindow.__init__, (self,) + args) self.button=HelloButton(self) self.setCentralWidget(self.button) def main(args): app=QApplication(args) win=HelloWindow() win.show() app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) app.exec_loop() if __name__=="__main__": main(sys.argv)

Mais informaes: http://www.riverbankcomputing.co.uk/pyqt/

12.4 wxPython para wxWidgets


wxPython um wrapper da biblioteca wxWindows. Assim como a Tkinter, as aplicaes so facilmente portveis. A diferena que a wxWindows utiliza um wrapper sobre a interface grca padro do sistema operacional (GTK em Linux, MFC em Windows), o que permite que as aplicaes sejam mais facilmente portveis e que tenham a aparncia de uma aplicao nativa. Em compensao, o desempenho vai ladeira abaixo com o acrscimo de mais uma camada entre a aplicao e o sistema operacional. Vantagens: Portabilidade - Aplicaes escritas em wxPython rodam praticamente sem problemas em vrias plataformas. Esse provavelmente o principal (seno o nico) motivo pelo qual est se tornando bem popular. Componentes ricos - Nesse ponto a wxPython imbatvel. H todo tipo de componentes, prontamente disponveis, de telas a caixas de texto que interpretam HTML e at mesmo a Scintilla. Documentao - o wxPython vem com um demo da maioria dos seus widgets que serve como teste e exemplo de uso. Desvantagens:

92

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Desempenho - A performance das aplicaes em si no ruim. O problema o uso de memria e o tempo de inicializao. Instabilidade - Mesmo estando ativamente em desenvolvimento, ainda tem alguns problemas de estabilidade. No mnimo 10% das mensagens na lista wxPython so reportando bugs. API complicada - wxWindows uma biblioteca com quase 10 anos de idade, que foi sendo remendada precariamente com o passar dos anos. Apesar da wxPython ser um wrapper excelente, muito bem escrito, os problemas da wxWindows aparecem: API completamente diferente entre alguns componentes e outros, nmeros de ID, macros, etc. Porm tem melhorado bastante a partir da verso 2.5 e o wrapper wxPython oculta bastante a complexidade e idiossincrasias do wxWindows. Documentao - Apesar de alguns tutoriais razoveis, h pouca documentao especca para wxPython. Para uma referncia da biblioteca, tem de se recorrer referncia da wxWindows. Entretanto, muitas vezes basta seguir o cdigo dos demos (em Python), sem ser necessrio recorrer a documentao do wxWindows. IDEs Livres - O wxDesigner um IDE bom, mas comercial. No h nenhum IDE RAD de qualidade e que seja disponvel livremente, embora o BoaConstructor parea muito promissor. Mais informaes: http://www.wxpython.org/

93

Você também pode gostar