You are on page 1of 46

Python na Pr tica: a Um curso objetivo de programacao em Python

http://www.async.com.br/projects/pnp/ Christian Robottom Reis Async Open Source kiko@async.com.br Abril de 2004

Conteudo
1 Introducao 1.1 O que e Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.2 Linguagem interpretada . . . . . . . . . . . . . . . . . . . . . . . . . . Tipagem din mica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Controle de bloco por indentacao . . . . . . . . . . . . . . . . . . . . . Tipos de alto nvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Orientacao a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 3 4 5 5 6 6 7 8 8 9

Por que Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Python b sico: invocacao, tipos, operadores e estruturas a 2.1 2.2 2.3 Executando o interpretador Python interativamente . . . . . . . . . . . . . . . . Criando um programa e executando-o . . . . . . . . . . . . . . . . . . . . . . . Tipos, vari veis e valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.4 2.4.1 2.4.2 2.4.3 Tipos num ricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Dicion rios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 a Operadores aritm ticos . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 e Operadores sobre cadeias de bits . . . . . . . . . . . . . . . . . . . . . . 15 Operadores de atribuicao . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1

Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.4.4 2.4.5 2.4.6 2.5 2.5.1 2.5.2 2.5.3 2.5.4 2.6 2.6.1 2.6.2 2.7 2.8

Operadores condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Operadores l gicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 o Substituicao em strings: o operador % . . . . . . . . . . . . . . . . . . . 18 Condicional: a instrucao if . . . . . . . . . . . . . . . . . . . . . . . . 20 Laco iterativo: for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Laco condicional: while . . . . . . . . . . . . . . . . . . . . . . . . . 22 Excecoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Sintaxe b sica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 a Truques com argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Estruturas de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Funcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

M dulos e o comando import . . . . . . . . . . . . . . . . . . . . . . . . . . 29 o Strings de documentacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31

3 Funcoes pr -denidas e 3.1 3.2

Manipulacao de arquivos: a funcao open() . . . . . . . . . . . . . . . . . . . . 33 Leitura do teclado: raw input() . . . . . . . . . . . . . . . . . . . . . . . . 34 34

4 Orientacao a Objetos 4.1 4.2 4.3 4.4

Conceitos de orientacao a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Objetos, classes e inst ncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 a Heranca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Introspeccao e reex o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 a 42

5 Alguns m dulos importantes o 5.1

M dulos independentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 o 44

6 Fechamento

1 Introducao
Este tutorial foi criado para apoiar um curso b sico da linguagem de programacao Python. Em a especial, ele tem duas caractersticas: primeiro, foi escrito originalmente em portugu s, o que e e raro para um livro t cnico nesta area. Segundo, ele e indicado para quem j possui alguma e a experi ncia em programacao, mas que deseja uma nocao pr tica do por que e de como usar e a Python para programar, sem ter que navegar por horas entre livros e manuais. Uma observacao: este tutorial n o e um guia aprofundado, e nem um manual de refer ncia. a e A documentacao disponvel em http://www.python.org/docs/ e excelente (e melhor do que muitos dos livros publicados sobre Python), e serve de refer ncia para os aspectos partie

culares da linguagem. Convencoes e Formato Este tutorial assume Python vers o 2; a vers o mais recente e a 2.3.3. a a O texto se baseia em um grande conjunto de exemplos, que aparecem indentados em uma secao distinta, em uma fonte de largura xa. Os exemplos, de forma geral, descrevem precisamente a sada produzida ao digitar os comandos interativamente. Denicoes importantes s o introduzidas a em negrito. Nomes de vari veis e express es de c digo v m em uma fonte diferente, com a o o e serifa. Quanto ao idioma, os termos em ingl s mais comuns s o utilizados, com uma explicacao e a importante que os termos em ingl s sejam conhecidos, porque s o pr via do que signicam. E e e a utilizados correntemente na bibliograa e em discuss es com outros programadores. o

1.1 O que e Python?


Python e uma linguagem de programacao1 . Em outras palavras, e sendo simples ao extremo, usamos Python para escrever software. Esta linguagem tem alguns pontos que a tornam especial: E uma linguagem interpretada. N o h pr -declaracao de vari veis, e os tipos das vari veis s o determinados dinamicaa a e a a a mente. O controle de bloco e feito apenas por indentac ao; n o h delimitadores do tipo BEGIN e a a END ou { e }. Oferece tipos de alto nvel: strings, listas, tuplas, dicion rios, arquivos, classes. a E orientada a objetos; ali s, em Python, tudo e um objeto. a Nas pr ximas secoes estes aspectos s o discutidos em detalhes. o a 1.1.1 Linguagem interpretada Linguagens de programacao s o freq entemente classicadas como compiladas ou interpretadas. a u Nas compiladas, o texto (ou c digo-fonte) do programa e lido por um programa chamado como pilador, que cria um arquivo bin rio, execut vel diretamente pelo hardware da plataforma-alvo. a a Exemplos deste tipo de linguagem s o C ou Fortran. A compilacao e execucao de um programa a simples em C segue algo como: % cc hello.c -o hello % ./hello Hello World
Python as vezes classicado como linguagem de scripting, um termo com o qual n concordo muito, j que e` ao a Python de uso geral, podendo ser usada para criar qualquer tipo de software. O termo script geralmente se refere e a programas escritos em linguagens interpretadas que automatizam tarefas ou que conectam programas distintos.
1

onde cc e o programa compilador, hello.c e o arquivo de c digo-fonte, e o arquivo criado, o hello, e um execut vel bin rio. a a Em contrapartida, programas escritos em linguagens interpretadas n o s o convertidos em a a um arquivo execut vel. Eles s o executados utilizando um outro programa, o interpretador, que a a l o c digo-fonte e o interpreta diretamente, durante a sua execucao. Exemplos de linguagem e o interpretada incluem o BASIC tradicional, Perl e Python. Para executar um programa Python contido no arquivo hello.py, por exemplo, utiliza-se algo como: % python hello.py Hello World Note que o programa que executamos diretamente e o interpretador python, fornecendo como par metro o arquivo com c digo-fonte hello.py. N o h o passo de geracao de exea o a a cut vel; o interpretador transforma o programa especicado a medida em que e executado. a ` 1.1.2 Tipagem din mica a Um dos conceitos b sicos em programacao e a variavel, que e uma associacao entre um nome e a um valor. Ou seja, abaixo, neste fragmento na linguagem C: int a; a = 1; temos uma vari vel com o nome a sendo declarada, com tipo inteiro e contendo o valor 1. a Em Python, n o precisamos declarar vari veis, nem seus tipos: a a >>> a = 1 seria a instrucao equivalente; dene uma vari vel com o valor 1, que e um valor inteiro. a Python possui o que e conhecido como tipagem dinamica: o tipo ao qual a vari vel est asso a a ciada pode variar durante a execucao do programa. N o quer dizer que n o exista tipo especco a a denido (a chamada tipagem fraca): embora em Python n o o declaremos explicitamente, as a vari veis sempre assumem um unico tipo em um determinado momento. a >>> a = 1 >>> type(a) <type int> >>> a = "1" >>> type(a) <type str> >>> a = 1.0 >>> type(a) <type float>

# a funcao type() retorna o tipo # associado a uma varivel a

Tipagem din mica, al m de reduzir a quantidade de planejamento pr vio (e digitacao!) para a e e escrever um programa, e um mecanismo importante para garantir a simplicidade e exibilidade das funcoes Python. Como os tipos dos argumentos n o s o explicitamente declarados, n o h a a a a restricao sobre o que pode ser fornecido como par metro. No exemplo acima, s o fornecidos a a argumentos de tipos diferentes a mesma funcao type, que retorna o tipo deste argumento. ` 4

1.1.3 Controle de bloco por indentacao Na maior parte das linguagens, h instrucoes ou smbolos especcos que delimitam blocos de a c digo os blocos que comp em o conte do de um laco ou express o condicional, por exemplo. o o u a Em C: if (a < 0) { /* bloco de cdigo */ o } ou em Fortran: if (a .lt. 0) then o bloco de cdigo endif

os blocos s o delimitados explicitamente em C por chaves, e em Fortran pelo par then a e endif. Em Python, blocos de c digo s o demarcados apenas por espacos formando uma o a indentacao visual: e print "O valor de a " if a == 0: print "zero" else: print a Esta propriedade faz com que o c digo seja muito claro e legvel anal, garante que a o indentacao esteja sempre correta por m requer costume e um controle mais formal 2 . e 1.1.4 Tipos de alto nvel Al m dos tipos b sicos (inteiros, n meros de ponto utuante, booleanos), alguns tipos pr e a u e determinados em Python merecem atencao especial: e Listas: como um vetor em outras linguagens, a lista e um conjunto (ou seq u ncia) de valores acessados (indexados) por um ndice num rico, inteiro, comecando em zero. A lista em e Python pode armazenar valores de qualquer tipo. >>> a = ["A", "B", "C", 0, 1, 2] >>> print a[0] A >>> print a[5] 2
Por exemplo, importante convencionar se a indentac ser feita por uma tabulac ou por um n e ao a ao umero determinado de espac os, j que todos editando um mesmo m a odulo Python devem usar o mesmo padr ao.
2

Tuplas: tuplas s o tamb m seq encias de elementos arbitr rios; se comportam como listas com a e u a a excecao de que s o imut veis: uma vez criadas n o podem ser alteradas. a a a Strings: a cadeia de caracteres, uma forma de dado muito comum; a string Python a uma seq encia imut vel, alocada dinamicamente, sem restricao de tamanho. u a Dicion rios: dicion rios s o seq encias que podem utilizar ndices de tipos variados, bastando a a a u que estes ndices sejam imut veis (n meros, tuplas e strings, por exemplo). Dicion rios a u a s o conhecidos em outras linguagens como arrays associativos ou hashes. a >>> autor = {"nome" : "Christian", "idade": 28} >>> print autor["nome"] Christian >>> print autor["idade"] 28 Arquivo: Python possui um tipo pr -denido para manipular arquivos; este tipo permite que seu e conte do seja facilmente lido, alterado e escrito. u Classes e Inst ncias: classes s o estruturas especiais que servem para apoiar programacao oria a entada a objetos; determinam um tipo customizado com dados e operacoes particulares. Inst ncias s o as express es concretas destas classes. Orientacao a objetos em Python e a a o descrita em maiores detalhes na secao 4. 1.1.5 Orientacao a objetos Orientacao a objetos (OO) e uma forma conceitual de estruturar um programa: ao inv s de de e nirmos vari veis e criarmos funcoes que as manipulam, denimos objetos que possuem dados a pr prios e acoes associadas. O programa orientado a objetos e resultado da colaboracao entre o estes objetos. Em Python, todos os dados podem ser considerados objetos: qualquer vari vel mesmo a as dos tipos b sicos e pr -denidos possui um valor e um conjunto de operacoes que pode a e ser realizado sobre este. Por exemplo, toda string em Python possui uma operacao (ou m etodo) chamada upper, que gera uma string nova com seu conte do em mai sculas: u u >>> a = "Hello" >>> a.upper() HELLO Como a maior parte das linguagens que s o consideradas orientadas a objeto, Python ofea rece um tipo especial para denir objetos customizados: a classe. Python suporta tamb m funcie onalidades comuns na orientacao a objetos: heranca, heranca m ltipla, polimorsmo, reex o e u a introspeccao.

1.2 Por que Python?


Dado que existe uma grande diversidade de linguagens diferentes, por que aprender Python e interessante ou mesmo importante? Na minha opini o, a linguagem combina um conjunto unico a de vantagens: Os conceitos fundamentais da linguagem s o simples de entender. a A sintaxe da linguagem e clara e f cil de aprender; o c digo produzido e normalmente a o curto e legvel. Os tipos pr -denidos includos em Python s o poderosos, e ainda assim simples de usar. e a A linguagem possui um interpretador de comandos interativo que permite aprender e testar rapidamente trechos de c digo. o Python e expressivo, com abstracoes de alto nvel. Na grande maioria dos casos, um pro grama em Python ser muito mais curto que seu correspondente escrito em outra linguaa gem. Isto tamb m faz com o ciclo de desenvolvimento seja r pido e apresente potencial e a de defeitos reduzido menos c digo, menos oportunidade para errar. o Existe suporte para uma diversidade grande de bibliotecas externas. Ou seja, pode-se fazer em Python qualquer tipo de programa, mesmo que utilize gr cos, funcoes matem ticas a a complexas, ou uma determinada base de dados SQL. E possvel escrever extens es a Python em C e C++ quando e necess rio desempenho o a m ximo, ou quando for desej vel fazer interface com alguma ferramenta que possua biblia a oteca apenas nestas linguagens. Python permite que o programa execute inalterado em m ltiplas plataformas; em outras u palavras, a sua aplicacao feita para Linux normalmente funcionar sem problemas em a Windows e em outros sistemas onde existir um interpretador Python. Python e pouco punitivo: em geral, tudo pode e h poucas restricoes arbitr rias. Esta a a propriedade acaba por tornar prazeroso o aprendizado e uso da linguagem. Python e livre: al m do interpretador ser distribudo como software livre (e portanto, gra e tuitamente), pode ser usado para criar qualquer tipo de software propriet rio ou livre. a O projeto e implementacao da linguagem e discutido aberta e diariamente em uma lista de correio eletr nico, e qualquer um e bem-vindo para propor alteracoes por meio de um o processo simples e pouco burocr tico. a Ao longo das pr ximas secoes ser o expostos aos poucos os pontos concretos que demonso a tram estas vantagens.

2 Python b sico: invocacao, tipos, operadores e estruturas a


Esta primeira secao aborda os aspectos essenciais da linguagem. Por falta de um lugar melhor, ser introduzido aqui o smbolo para coment rios em Python: quando aparece o caracter sustea a 3 nido ( #) no c digo-fonte, o restante da linha e ignorado. o
3

Tamb conhecido como n em umero, jogo da velha, cardinal e lasagna.

2.1 Executando o interpretador Python interativamente


Python est disponvel tanto para Windows e Macintosh como para os diversos Unix (incluindo a o Linux). Cada plataforma possui um pacote especco para instalacao, que normalmente inclui um grande n mero de bibliotecas de c digo e um programa execut vel python 4 . Este e o u o a interpretador Python que usaremos para executar nossos programas. Para iniciar, vamos executar o interpretador interativamente, no modo shell. Em outras palavras, vamos entrar o c digo-fonte diretamente, sem criar um arquivo separado. Para este o m, execute o interpretador (digitando apenas python). Ser impresso algo como o seguinte a (dependendo de qual sistema estiver usando): % python Python 2.3.3 (#1, Dec 22 2003, 15:38:09) [GCC 2.95.4 20011002 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> Este smbolo >>> chamamos de prompt, e indica que o interpretador est aguardando ser a digitado um comando. O shell Python oferece uma excelente forma de testar c digo, e vamos o comecar com algumas instrucoes simples. >>> a = 1 >>> print a 1 >>> b = "Hello world" >>> print b Hello world Neste exemplo, s o introduzidos dois aspectos b sicos: primeiro, a atribuicao de vari veis; a a a segundo, a instrucao print, que exibe valores e o conte do de vari veis. u a A forma interativa de executar o Python e conveniente; no entanto, n o armazena o c digo a o digitado, servindo apenas para testes e procedimentos simples. Para programas mais complexos, o c digo-fonte e normalmente escrito e armazenado em um arquivo. o

2.2 Criando um programa e executando-o


Em Python, um arquivo contendo instrucoes da linguagem e chamado de m odulo. Nos casos mais simples pode-se usar um unico m dulo, executando-o diretamente; no entanto, e interes o sante saber que e possvel sub-dividir o programa em arquivos separados e facilmente integrar as funcoes denidas neles. Para criar um arquivo contendo um programa, basta usar qualquer editor de texto. Para um primeiro exemplo, crie um arquivo hello.py contendo as seguintes linhas:
Normalmente, inclu um ambiente de edic e execuc simples, como o IDLE, tamb escrito em Python. e do ao ao em Estes podem ser tamb utilizados. em
4

a = "Hello" b = "world" print a,b E a seguir, execute-o da seguinte forma: % python hello.py Ou seja, execute o interpretador e passe como par metro o nome do arquivo que cont m o a e c digo a ser executado. O resultado impresso deve ser: o Hello world Perceba bem que n o h pre mbulo algum no c digo-fonte; escrevemos diretamente o c digo a a a o o 5 a ser executado . Nas pr ximas secoes do tutorial, estaremos utilizando bastante o modo shell; no entanto, para o exerccios e exemplos mais extensos que algumas linhas, vale a pena usar m dulos para permitir o edicao e revis o. a

2.3 Tipos, vari aveis e valores


Nomes de vari veis comecam sempre com uma letra, n o cont m espacos, e assim como tudo a a e em Python, s o sensveis a caixa (case-sensitive) em outras palavras, min sculas e mai sculas a u u fazem, sim, diferenca. Como explicado anteriormente, a vari vel n o precisa ser pr -declarada e a a e seu tipo e determinado dinamicamente. 2.3.1 Tipos num ricos e Tipos num ricos representam valores num ricos. Em Python h alguns tipos num ricos pr e e a e e denidos: inteiros (int), n meros de ponto utuante (oat), booleanos (bool) e complexos u (complex). Estes tipos suportam as operacoes matem ticas comuns como adicao, subtracao, a multiplicacao e divis o, e podem ser convertidos entre si. a Uma observacao: booleanos foram adicionados na vers o Python 2.2; sua utilizacao a e normalmente associada a express es condicionais. Maiores detalhes sobre este o tipo est o disponveis na secao 2.4.4. a A seguir alguns exemplos de criacao de vari veis num ricas: a e >>> >>> >>> >>>
5

a = 1 preco = 10.99 t = True i = 4+3j

# # # #

valor valor valor valor

inteiro ponto flutuante, ou float. booleano complexo

Em Unix, poss e vel criar programas em Python e execut a-los usando apenas o nome do m odulo (sem digitar o nome do interpretador python). Basta adicionar a linha m agica #!/usr/bin/env python ao in cio do m odulo e dar permiss de execuc ao arquivo. Note que isto n evita que seja necess que o interpretador ao ao ao ario esteja instalado no sistema; apenas permite que se possa omitir digitar o seu nome.

Valores inteiros podem tamb m ser fornecidos em base octal e hexadecimal: e >>> >>> 57 >>> >>> 255 a = 071 print a a = 0xFF print a

Para ser considerado um oat, o n mero deve possuir um ponto e uma casa decimal, mesmo u que seja zero. O fato de ser considerado um oat e importante para a operacao divis o, pois a dependendo do tipo dos operandos, a divis o e inteira ou em ponto utuante. a >>> 5 / 2 # diviso inteira, resultado inteiro a 2 >>> 5 / 2.0 # diviso em ponto flutuante a 2.5 >>> 5 * 2.13 10.649999999999999 Atencao especial para este terceiro exemplo, que demonstra uma particularidade da representacao e impress o de n meros de ponto utuante. N meros deste tipo, a u u como o valor 2.13 do exemplo, possuem uma representacao interna particular de vido a natureza dos intrnseca dos computadores digitais; operacoes realizadas sobre ` eles t m precis o limitada, e por este motivo o resultado impresso diverge ligeirae a mente do resultado aritmeticamente correto. Na pr tica, o resultado obtido e pratia camente equivalente a 10.656 . Determinando o tipo de uma vari vel Para descobrir o tipo atual de uma vari vel, pode-se a a usar a funcao type(): >>> a = 1 >>> print type(a) <type int> >>> a = "hum" >>> print type(a) <type string> Uma das vantagens de Python s o os tipos complexos que v m pr -denidos, introduzidos na a e e secao 1.1.2. As secoes seguintes cobrem estes tipos.
Todas as linguagens de programac convencionais utilizam este mesmo mecanismo de representac e na ao ao, pr atica n resultam grandes problemas com isso, mas Python deixa transparecer esta particularidade em algumas ao situac como esta. O tutorial Python em http://www.python.org/docs/current/tut/ inclui uma oes, sec sobre as nuances do uso e representac de n ao ao umeros de ponto utuante.
6

10

2.3.2 Listas e A lista e uma sequ ncia: um conjunto linear (como um vetor em outras linguagens) de valores indexados por um n mero inteiro. Os ndices s o iniciados em zero e atribudos seq encialmente u a u a partir deste. A lista pode conter quaisquer valores, incluindo valores de tipos mistos, e at outras e listas. Para criar uma lista, usamos colchetes e vrgulas para enumerar os valores: >>> >>> >>> >>> numeros opcoes modelos listas = = = = [1, 2, 3] ["nao", "sim", "talvez"] [3.1, 3.11, 95, 98, 2000, "Millenium", "XP"] [numeros, opcoes]

Neste exemplo criamos quatro listas diferentes, com elementos de tipos diversos. A quarta lista tem como elementos outras listas: em outras palavras, e uma lista de listas: >>> print listas [[1, 2, 3], [nao, sim, talvez]] Para acessar um elemento especco de uma lista, usamos o nome da lista seguido do ndice entre colchetes: >>> print numeros[0] 1 >>> print opcoes[2] talvez >>> print modelos[4] 2000 Usando ndices negativos, as posicoes s o acessadas a partir do nal da lista, -1 indicando o a ultimo elemento: >>> print numeros[-1] 3 >>> print modelos[-2] Millenium Python oferece um mecanismo para criar fatias de uma lista, ou slices. Um slice e uma lista gerada a partir de um fragmento de outra lista. O fragmento e especicado com dois ndices, separados por dois pontos; o slice resultante cont m os elementos cujas posicoes v o do primeiro e a ndice ao segundo, n o incluindo o ultimo elemento. Se omitirmos um dos ndices no slice, a assume-se incio ou m da lista. >>> print numeros[:2] [1, 2] >>> print opcoes[1:] [sim, talvez] >>> print modelos[1:5] [3.1000000000000001, 95, 98, 2000] 11

Note que o terceiro exemplo demonstra a mesma particularidade referente a representacao ` de n meros de ponto utuante, descrita na secao 2.3.1: ao imprimir a lista, Python exibe a u representacao interna dos seus elementos, e portanto, oats s o impressos com precis o com a a pleta. M todos da Lista Na secao 1.1.5 introduzimos um conceito central da linguagem: tudo e e um objeto; uma lista em Python, sendo um objeto, possui um conjunto de operacoes pr prias o que manipulam seu conte do. O nome m todo e usado para descrever operacoes de um objeto; u e m todos s o acessados no c digo-fonte digitando-se um ponto ap s o nome da vari vel, e a e a o o a seguir o nome do m todo. e Para executar (ou chamar) um m todo, usamos par nteses ap s seu nome, fornecendo argue e o mentos conforme necess rio. Abaixo s o exemplicados dois exemplos de chamadas de m todos a a e em listas: >>> >>> [1, >>> >>> [0, numeros.append(0) print numeros 2, 3, 0] numeros.sort() print numeros 1, 2, 3]

Observe com atencao este exemplo, que demonstra os conceitos fundamentais descritos nos par grafos anteriores: a O m todo append(v) recebe como argumento um valor, e adiciona este valor ao nal e da lista. O m todo sort() ordena a lista, modicando-a. N o recebe argumentos. e a A lista possui uma s rie de outros m todos; consulte a refer ncia Python para uma descricao e e e completa (e veja tamb m a funcao dir() na secao 4.4). e 2.3.3 Tuplas A tupla e uma seq encia, como a lista: armazena um conjunto de elementos acessveis por um u ndice inteiro. A tupla e imut vel; uma vez criada, n o pode ser modicada. Para criar uma tupla a a use par nteses, e vrgulas para separar seus elementos: e >>> t = (1, 3, 5, 7) >>> print t[2] 5 A tupla e utilizada em algumas situacoes importantes: como a lista de argumentos de uma funcao ou m todo, como chave em dicion rios, e em outros casos onde zer sentido ou for mais e a eciente um conjunto xo de valores.

12

2.3.4 Strings A string, como citado anteriormente, e uma seq encia imut vel com um prop sito especial: u a o armazenar cadeias de caracteres. >>> a = "Mondo Bizarro" >>> print a Mondo Bizarro Strings podem ser delimitadas tanto com aspas simples quanto duplas; se delimitamos com aspas duplas, podemos usar as aspas simples como parte literal da string, e vice-versa. Para inserir na string aspas literais do mesmo tipo que o delimitador escolhido, prexe-as com uma contra-barra \. As atribuicoes abaixo s o equivalentes: a >>> b = "Alls quiet on the eastern front." >>> c = All\s quiet on the eastern front. >>> b == c True S o usados caracteres especiais para denotar quebra de linha (\n), tabulacao (\t) e outros. a >>> a = "Hoje\n\t e o primeiro dia." >>> print a Hoje o primeiro dia. e Para criar uma string com m ltiplas linhas, e util o delimitador aspas triplas: as linhas podem u ser quebradas diretamente, e a string pode ser nalizada com outras tr s aspas consecutivas: e a = """I wear my sunglasses at night So I can so I can Keep track of the visions in my eyes""" Finalmente, como toda seq encia, a string pode ser indexada ou dividida em slices, usando o u operador colchetes: >>> a = "Anticonstitucionalissimamente" >>> print a[0] A >>> print a[13] i >>> print a[:4] Anti >>> print a[-5:-1] ment A string possui um operador especial, a porcentagem (%), que ser descrito na secao 2.4.6. a Possui ainda um grande n mero de m todos, descritos em detalhes na secao String Methods do u e manual de refer ncia Python. e 13

2.3.5 Dicion rios a Um dicion rio representa uma colecao de elementos onde e possvel utilizar um ndice de quala quer tipo imut vel, ao contr rio da lista, onde ndices s o sempre inteiros seq encialmente a a a u atribudos. E costumeiro usar os termos chave e valor (key/value) para descrever os elemen tos de um dicion rio - a chave e o ndice, e o valor, a informacao correspondente aquela chave. a ` Para declarar dicion rios, utilizamos o smbolo chaves, separando o ndice do valor por dois a pontos e separando os pares ndice-valor por vrgulas: >>> refeicoes = {"caf" : "caf", "almoco" : "macarro", e e a ... "jantar" : "sopa"} >>> print refeicoes["almoco"] macarrao >>> precos_modelos = {98 : 89, 99 : 119, 2000 : 199} >>> print precos_modelos[98] 89 Neste exemplo criamos dois dicion rios com tr s elementos cada um. As chaves do dia e cion rio refeicoes s o as strings caf , almocoe jantar, e os valores respectivos, as a a e strings caf , macarr oe sopa. e a M todos do Dicion rio O dicion rio tamb m possui alguns m todos not veis: e a a e e a keys() retorna uma lista (sim, exatamente, do tipo lista) com as chaves do dicion rio; a values() retorna uma lista com os valores do dicion rio; a items() retorna uma lista de tuplas com o conte do do dicion rio, cada tupla contendo u a um par (chave, valor); >>> precos_modelos.keys() [99, 98, 2000] >>> precos_modelos.values() [119, 89, 199] # A ordem dos elementos retornados por keys() e # values() arbitrria; no confie nela. e a a has key(k) verica se a lista possui aquela chave: >>> precos_modelos.has_key(98) True >>> precos_modelos.has_key(97) False update(d2) atualiza o dicion rio com base em um segundo dicion rio fornecido como a a par metro; elementos do dicion rio original que tamb m existem no segundo s o atualizaa a e a dos; elementos que existem no segundo mas que n o existem no original s o adicionados a a a este. 14

>>> precos_modelos.update({2000 : 600, 2001: 700}) >>> print precos_modelos {99: 400, 98: 300, 2001: 700, 2000: 600} No exemplo acima, observe que a chave 2000 foi atualizada, e 2001, acrescentada. E possvel usar o dicion rio como uma estrutura de dados simples, com campos para cada a informacao a ser armazenada. Por exemplo, para armazenar informacao sobre um produto hi pot tico, com c digo, descricao e preco: e o >>> produto = {"cdigo":771, "desc":"Copo", "preco":10.22} o >>> print produto["cdigo"] o 771 >>> print produto["desc"] Copo E um padr o comum criar listas de dicion rios neste formato, cada tem na lista correspona a dendo a um produto em particular.

2.4 Operadores
O pr ximo t pico essencial da linguagem s o operadores, smbolos que operam sobre vari veis o o a a e valores. 2.4.1 Operadores aritm ticos e A maior parte dos operadores aritm ticos em Python funciona de maneira intuitiva e an loga aos e a operadores em outras linguagens. Demonstrando por exemplo: >>> print a + 3 10 >>> print a - 2 5 >>> print a / 2 3 >>> print a / 2.5 2.8 >>> print a % 4 3 >>> print a * 2 14 >>> print a ** 2 49 # adicao # subtracao # diviso inteira: argumentos inteiros a # e resultado inteiro # diviso em ponto flutuante: pelo a # menos um argumento deve ser float # resto da diviso inteira a # multiplicacao # exponenciacao

15

A exponenciacao tamb m pode ser feita por meio de uma funcao, pow(), como descrito na e secao 3. A raiz quadrada e outras funcoes matem ticas est o implementadas no m dulo math; a a o veja a secao 5 para maiores detalhes. Com excecao da exponenciacao e da divis o inteira, estes operadores s o bastante comuns a a em linguagens de programacao. Os operadores aritm ticos podem ser usados em oats tamb m: e e >>> a = 1.15 >>> print a / a - a * a + a 0.57349375 e os operadores de adicao (+) e multiplicacao (*), em strings: >>> a = "exato" >>> print a * 2 exatoexato >>> print "quase " + a quase exato , listas: >>> a = [-1, 0] >>> b = [1, 2, 3] >>> print b * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3] >>> print a + b [-1, 0, 1, 2, 3] e tuplas: >>> a = (1, 2) >>> print a + (2, 1) (1, 2, 2, 1) Como exemplicado acima, o operador adicao (e multiplicacao) serve para concatenar listas, tuplas e strings. N o pode ser utilizado com dicion rios (que podem ser atualizados usando a a a funcao update(), mas para os quais a operacao de concatenacao n o faria sentido). a 2.4.2 Operadores sobre cadeias de bits Para inteiros, existem operadores que manipulam seus valores como cadeias de bits (operadores bit-wise) de acordo com a aritm tica booleana: e >>> a = 0xa1 >>> b = 0x01 >>> print a, b 161, 1

# para imprimir os valores decimais

16

>>> a & b 1 >>> a | b 161 >>> a << 1 322 >>> b >> 1 0 >>> a -162

# and # or # shift para esquerda # shift para direita # inverso em complemento de 2 a

Note que a representacao dos valores inteiros, por padr o, e decimal: aqui, embora fornece a mos os valores em base hexadecimal, os resultados aparecem na base 10. 2.4.3 Operadores de atribuicao O operador mais simples, e que j fui utilizado em diversos exemplos anteriores, e o operador de a atribuicao. Este operador e representado por um unico smbolo de igualdade, =, denindo uma vari vel e automaticamente atribuindo a ela um valor. O exemplo abaixo dene uma vari vel a, a a com valor inteiro 1. >>> a = 1 Existem formas variantes deste operador que o combinam com os operadores aritm ticos e e bit-wise introduzidos nas secoes anteriores. Estas formas foram introduzidos na vers o Python a 2.0, e existem primariamente para oferecer uma maneira conveniente de re-atribuir um valor transformado a uma vari vel. a A sintaxe para o operador combinado utiliza o smbolo do operador aritm tico/bit-wise re e levante, seguido da igualdade. Este operador combinado efetua a operacao sobre o valor da vari vel, j atribuindo o resultado a esta mesma. Exemplicando: a a >>> >>> >>> 2 >>> >>> 1 >>> >>> 10 a = 1 a += 1 print a a /= 2 print a a *= 10 print a

2.4.4 Operadores condicionais Tradicionalmente, programacao envolve testar valores (e tomar decis es com base no resultado o do teste). Um teste e essencialmente uma express o condicional que tem um resultado verdadeiro a ou falso. Esta secao descreve os operadores condicionais mais comuns em Python. 17

A partir da vers o 2.2 de Python, existe um tipo num rico que representa o resula e um tipo bastante simples, possuindo tado de um teste condicional: o tipo booleano. E apenas dois valores possveis: True e False. A partir da vers o 2.3 de Python, a qualquer comparacao retorna um valor booleano; vers es anteriores retornavam 1 o ou 0, respectivamente. Na pr tica, o resultado e equivalente, cando apenas mais a explcito e legvel o resultado. Igualdade >>> print False >>> print True >>> print True >>> print True Comparacao >>> print 1 < 2 True >>> print 3 > 5 False >>> print 3 >= 4 False # menor que # maior que # maior ou igual que 2 == 4 2 != 4 "a" == "a" "a" != "b" # igualdade # diferente de

Comparacoes podem ser realizadas tamb m com outros tipos de vari veis; para strings, listas e a ou dicion rios, as comparacoes maior que e menor que se referem ao n mero e ao valor dos a u elementos, mas por n o serem terrivelmente claras n o s o muito freq entemente usadas 7 . a a a u >>> [2,2,3] < [2,3,2] True >>> "abacate" < "pera" True Dica: quando comparando o n mero de elementos de uma seq encia ou dicion rio, e u u a normalmente utilizada a funcao len(), que retorna o comprimento da seq encia. u e Presenca em Sequ ncias Para seq encias e dicion rios, existe o operador in, que verica se u a o elemento est contido no conjunto; no caso do dicion rio, o operador testa a presenca do valor a a na seq encia de chaves. u >>> "x" in "cha" False >>> 1 in [1,2,3] True
7

A excec ao obvia na ordenac de seq encias contendo elementos destes tipos. e ao u

18

2.4.5 Operadores l gicos o Os operadores l gicos not, and e or permitem modicar e agrupar o resultado de testes cono dicionais: >>> nome = "pedro" >>> idade = 24 >>> nome == "pedro" and idade == 25 False >>> nome == "pedro" and idade < 25 True >>> len(nome) < 10 or not nome == "pedro" False Estes operadores s o utilizados com freq encia nas estruturas de controle descritas na secao a u 2.5. Combinacao de operadores Python oferece uma forma implcita de combinar operacoes con dicionais, sem o uso de operadores l gicos. Por exemplo, para vericar se um valor est entre o a dois extremos, pode-se usar a seguinte sintaxe: if 0 < a < 10: print "Entre zero e dez" Podem tamb m ser comparados diversos valores simultaneamente: e if a == b == c: print "So idnticos" a e e mesmo combinados operadores comparativos com operadores de igualdade: if a == b <= c: print "So idnticos" a e Esta express o verica se a e igual a b e al m disso, se b e menor ou igual a c. a e 2.4.6 Substituicao em strings: o operador % Uma operacao muito util para processamento de texto e a substituicao de smbolos em strings. E particularmente adequada para gerarmos strings formatadas contendo algum valor vari vel, a Idade: anos. como o cl ssico formul rio: Nome: a a 1. Escreve-se a string normalmente, usando um smbolo especial no lugar da lacuna: %d: para substituir inteiros %f: para substituir oats 19

%s: para substituir outra string >>> a = "Total de itens: %d" >>> b = "Custo: %f" 2. Para efetuar a substituicao, aplica-se um operador % sobre a string contendo o smbolo de formatacao, seguido do valor ou vari vel a substituir: a >>> print a % 10 Total de itens: 10 Como pode ser visto, o smbolo e substitudo pelo valor fornecido. Podem ser utilizados tanto valores explcitos quanto vari veis para a substituicao: a >>> custo = 5.50 >>> print b % custo Custo: 5.500000 Caso sejam m ltiplos valores a substituir, use uma tupla: u >>> print "Cliente: %s, Valor %f" % ("hungry.com", 40.30) Fornecedor: hungry.com, Custo 40.300000 Este operador permite ainda utilizar um n mero junto ao smbolo porcentagem para reservar u um tamanho total a string: ` >>> a = "Quantidade: %4d" >>> print a % 3 >>> print a % 53 >>> print a % 120 Quantidade: 3 Quantidade: 53 Quantidade: 120 E possvel controlar a formatacao de tipos num ricos de maneira especial atrav s de modi e e cadores nos smbolos no formato m.n. Como acima, m indica o total de caracteres reservados. Para oats, n indica o n mero de casas decimais; para inteiros, indica o tamanho total do n mero, u u preenchido com zeros a esquerda. Ambos os modicadores podem ser omitidos. ` >>> e = 2.7313 >>> p = 3.1415 >>> sete = 7 >>> print "Euler: %.7f" % e Euler: 2.7313000 >>> print "Pi: %10.3f" % p Pi: 3.142 >>> print "Sete: %10.3d" % sete Sete: 007 20

# 7 casas decimais # 10 espacos, 3 casas # 10 espacos, 3 dgitos # ( um inteiro) e

2.5 Estruturas de controle


Toda linguagem de programacao possui instrucoes que controlam o uxo de execucao; em Python, h um conjunto pequeno e poderoso de instrucoes, descritas nas secoes a seguir. a 2.5.1 Condicional: a instrucao if A instrucao condicional b sica de Python e o if. A sintaxe e descrita a seguir (lembrando que a a indentacao e que delimita o bloco): if condicao: # bloco de cdigo o elif condico: a # outro bloco else: # bloco final As condicoes acima s o comparacoes feitas utilizando os operadores condicionais descritos a na secao 2.4.4, possivelmente combinados por meio dos operadores l gicos descritos na secao o 2.4.5. a = 2 b = 12 if a < 5 and b * a > 0: print "ok" A instrucao elif permite que se inclua uma excecao condicional algo como ... sen ao se 8 isso .... O else e uma excecao absoluta . if nome == "pedro": idade = 21 elif nome == "jos": e idade = 83 else: idade = 0 Provendo nome="lvaro" para o bloco acima, ser atribudo o valor zero a idade. a a 2.5.2 Laco iterativo: for H apenas dois tipos de lacos em Python: for e while. O primeiro tipo, mais freq entemente a u utilizado, percorre uma seq encia em ordem, a cada ciclo substituindo a vari vel especicada u a por um dos elementos. Por exemplo:
N h nenhuma estrutura do tipo switch/case, mas poss ao a e vel simul usando uma express if com a-la ao um elif para cada caso diferente.
8

21

>>> jan_ken_pon = ["pedra", "papel", "cenoura"] >>> for item in jan_ken_pon: ... print item ... pedra papel cenoura A cada iteracao, item recebe o valor de um elemento da seq encia. Para efetuar uma laco u com um n mero xo de iteracoes, costuma-se usar o for em conjunto com a funcao range, u que gera seq encias de n meros: u u >>> for i in range(1,4): ... print "%da volta" % i ... 1a volta 2a volta 3a volta Iteracao em dicion rios Para iterar em dicion rios, podemos usar as funcoes keys() ou a a values() para gerar uma lista: >>> dict = {"batata": 500, "abbora": 1200, o ... "cebola": 800} >>> for e in dict.keys(): ... print "Item: %8s Peso: %8s" % (e, dict[e]) Item: cebola Peso: 800 Item: batata Peso: 500 o Item: abbora Peso: 1200 Note que porque o dicion rio em si n o possui um conceito de ordem, a lista que resulta do a a m todo keys() possui ordenacao arbitr ria. Por este motivo, no exemplo acima, o laco n o e a a segue a declaracao do dicion rio. a Controle adicional em lacos Para ambos os tipos de laco, existem duas instrucoes de con trole adicional, continue e break. A primeira reinicia uma nova iteracao imediatamente, interrompendo a iteracao atual; a segunda faz o laco terminar imediatamente. A forma geral do laco for e: ue a for varivel in seqncia: o # bloco de cdigo else: e # bloco executado na ausncia de um break Note a presenca da cl usula else. Esta cl usula e executada quando a sada do laco n ao for a a determinada por uma instrucao break. Um exemplo clarica este mecanismo: 22

valores = [2, 4, 5, 2, -1] for i in valores: if i < 0: print "Negativo encontrado: %d" % i break else: print "Nenhum negativo encontrado" 2.5.3 Laco condicional: while O segundo tipo de laco, while, e utilizado quando necessitamos fazer um teste a cada iteracao do laco. while condicao: # bloco de cdigo o else: # bloco executado na ausncia de um break e Como o laco for, o while possui uma cl usula else. Um exemplo do uso de while segue: a >>> m = 3 * 19 >>> n = 5 * 13 >>> contador = 0 >>> while m < n: ... m = n / 0.5 ... n = m / 0.5 ... contador = contador + 1 ... >>> print "Iteramos %d vezes." % contador Iteramos 510 vezes. N o h uma instrucao especial para efetuar um laco com teste ao nal da iteracao (como o a a laco do ... while() em C), mas pode-se usar um while innito usando uma condicao verdadeira, xa em combinacao com um teste e break internos: >>> l = ["a", "b", "c"] >>> i = len(l) - 1 >>> while True: ... print l[i] ... i = i - 1 ... if i < 0: ... break ... c b a

23

Veracidade e falsidade de condicoes As estruturas if e while utilizam condicoes l gicas o para controle, avaliando-as de maneira booleana. Como qualquer valor ou express o pode ser a usado como condicao, e importante entender qual o mecanismo de avaliacao da linguagem. Em Python, falso e denotado: pelo booleano False, pelo valor 0 (zero), pela lista, dicion rio, tupla ou string vazios, de tamanho zero, a pelo valor especial None, que signica nulo. Qualquer outro valor simples e considerado verdadeiro. Inst ncias podem denir regras mais a complexas para avaliacao; para detalhes consulte a secao Basic customization do manual de refer ncia Python. e 2.5.4 Excecoes Com os dois tipos de lacos descritos na secao anterior, todas as necessidades normais de con trole de um programa podem ser implementadas. No entanto, quando algo inesperado ocorre, ou uma condicao de erro conhecido e atingida, Python oferece uma forma adicional de controlar o uxo de execucao: a excecao. A excecao e um recurso de linguagens de programacao modernas que serve para informar que uma condicao incomum ocorreu. Embora existam outras aplicacoes, em geral comunicam se atrav s de excecoes erros ou problemas que ocorrem durante a execucao de um programa. e Excecoes s o internamente geradas pelo interpretador Python quando situacoes excepcionais a ocorrem. No exemplo abaixo, >>> a = [1, 2, 3] >>> print a[5] o c digo interno do interpretador sabe que n o podemos acessar uma lista atrav s um ndice o a e n o-existente, e gera uma excecao: a Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: list index out of range Vamos analisar a mensagem exibida. A primeira linha anuncia um traceback, que e a forma como e exibida a pilha de execucao que gerou a excecao. A segunda indica a linha de c digo na o qual ocorreu o problema, e o arquivo. Como estamos usando o modo interativo neste exemplo, o arquivo aparece como <stdin>, que e a entrada padr o. A terceira linha indica o tipo de a excecao levantada neste caso, IndexError e informa uma mensagem que descreve mais especicamente o problema.

24

Tratando excecoes A excecao normalmente imprime um traceback e interrompe a execucao do programa. Uma acao comum e testar e controlar a excecao; para este m, usamos uma cl usula a try/except: >>> a = [1, 2, 3] >>> try: ... print a[5] ... except IndexError: ... print "O vetor nao possui tantas posices!" o O vetor nao possui tantas posices! o A instrucao try captura excecoes que ocorrerem no seu bloco de c digo; a linha except o determina quais tipos de excecao ser o capturados. A sintaxe da cl usula except segue os forma a a tos: except tipo_da_excecao [, variavel_da_excecao]: # bloco de cdigo o ou except (tipo_excecao_1, tipo_excecao_2, ...) [, variavel_da_excecao]: # bloco de cdigo o O primeiro elemento da cl usula except e um tipo da excecao, ou uma tupla de tipos caso a m ltiplas excecoes devam ser tratadas da mesma forma. O segundo elemento e opcional; permite u que seja capturada uma inst ncia que armazena informacoes da excecao. Um uso trivial desta a inst ncia e imprimir a mensagem de erro: a >>> a = "foo" >>> print a + 1 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot add type "int" to string Podemos capturar e tratar de forma especial o erro acima, imprimindo a mensagem fornecida e continuando a execucao normalmente. >>> try: ... print a + 1 ... except TypeError, e: ... print "Um erro ocorreu: %s" % e ... Um erro ocorreu: cannot add type "int" to string >>> Diversos tipos de excecoes v m pr -denidas pelo interpretador Python; o guia de refer ncia e e e cont m uma lista completa e os casos onde s o levantadas. Note tamb m que esta introducao a e a e excecoes n o cobre a sua sintaxe completa; consulte a secao Errors and Exceptions do tutorial a Python para maiores detalhes. 25

2.6 Funcoes
Funcoes s o blocos de c digo com um nome; recebem um conjunto de par metros (ou argumen a o a tos) e retornam um valor. Python possui, como seria esperado de uma linguagem de programacao completa, suporte a funcoes. Existem diversas funcoes pr -denidas pelo interpretador, descritas e na secao 3; a secao atual detalha as formas de denir funcoes em c digo Python. o 2.6.1 Sintaxe b sica a A sintaxe geral para denir uma funcao e: def nome_funcao(arg_1, arg_2, ..., arg_n): # # bloco de cdigo contendo corpo da funco o a # return valor_de_retorno # retornar opcional e O c digo da funcao, uma vez avaliado pelo interpretador, dene um nome local. Os arguo mentos s o valores fornecidos quando chamada a funcao, e que cam disponveis por meio de a vari veis locais no corpo da funcao. a No exemplo abaixo, temos uma funcao que recebe uma lista de dicion rios como par metro, a a e uma funcao que recebe um dicion rio. A primeira itera pela lista recebida, e passa o elemento a atual como argumento para a segunda. def imprime_cardapio (pratos): print "Cardapio para hoje\n" for p in pratos: imprime_prato(p) print "\nTotal de pratos: %d" % len(pratos) def imprime_prato(p) print "%s ........ %10.2f" % (p["nome"], p["preco"]) Ao ser interpretado, o c digo acima dene dois nomes locais: imprime cardapio e o imprime prato. Para que a funcao seja de fato executada, usamos este nome seguido dos argumentos passados entre par nteses: e # defino dicionrios descrevendo os a p1 = {"nome": "Arroz com brocolis", p2 = {"nome": "Soja com legumes", p3 = {"nome": "Lentilhas", "preco": lista_pratos = [p1, p2, p3] pratos "preco": 9.90} "preco": 7.80} 4.80}

# e chamo uma funco, passando os pratos como argumento a imprime_cardapio(lista_pratos) o que resulta na seguinte sada quando executado: 26

Cardapio para hoje Arroz com brocolis ........... 9.90 Soja com legumes ........... 7.80 Lentilhas ........... 4.80 Total de pratos: 3 Retornando um valor No exemplo acima, as funcoes n o retornam valor algum, apenas a exibindo informacao. Para retornar um valor, basta usar a express o return dentro da funcao. a A primeira pergunta conceitual aqui seria retornar para quem?; a resposta direta e para quem invocou a funcao. Demonstrando por exemplos, a funcao abaixo: def bar(t): return "The rain in Spain falls mainly in the %s." % t dene um valor de retorno, que e uma string; ao chamar esta funcao com um argumento: a = bar("plains") o c digo da funcao e avaliado e um valor, retornado, sendo armazenado na vari vel a (obo a serve o uso do operador de atribuicao seguido da chamada da funcao). Para visualizar o valor retornado, usamos a conveniente instrucao print: >>> print a The rain in Spain falls mainly in the plains. Dica: para retornar conjuntos de valores, basta retornar uma seq encia ou outro valor de tipo u composto. 2.6.2 Truques com argumentos Argumentos nomeados Argumentos podem ser fornecidos a funcao especicando-se o nome ` do par metro ao qual correspondem. O c digo abaixo e equivalente a chamada no exemplo a o ` anterior: a = bar(t="plains") mas ca explicitamente declarado que o par metro corresponde ao argumento t. Normala mente s o nomeados argumentos para tornar a leitura do c digo mais f cil; no entanto, veremos a o a a seguir como s o essenciais para utilizar uma das formas de listas de argumentos vari veis. a a

27

Valores padr o Uma das funcionalidades mais interessantes nas funcoes Python e a possibilia dade de denir valores padr o: a def aplica_multa(valor, taxa=0.1): return valor + valor * taxa Neste exemplo, o valor padr o para a vari vel taxa e 0.1; se n o for denido este argumento, a a a o valor padr o ser utilizado. a a >>> print aplica_multa(10) 11.0 >>> print aplica_multa(10, 0.5) 15.0 Dica: N o utilize como valor padr o listas, dicion rios e outros valores mut veis; os valores a a a a padr o s o avaliados apenas uma vez e o resultado obtido n o e o que intuitivamente se esperaria. a a a Conjuntos de argumentos opcionais Uma forma de denir conjuntos de argumentos opcionais utiliza par metros curinga que assumem valores compostos. Pode ser fornecido um a par metro cujo nome e prexado por um smbolo asterisco, que assumir um conjunto ordea a nado de argumentos: def desculpa(alvo, *motivos): d = "Desculpas %s, mas estou doente" % alvo for motivo in motivos: d = d + " e %s" % motivo return d + "." >>> desculpa("senhor", "meu gato fugiu", ... "minha tia veio visitar") "Desculpas senhor, mas estou doente e meu gato fugiu e minha tia veio visitar." ou um par metro que assume um conjunto de argumentos nomeados, prexado de dois astea riscos: def equipe(diretor, produtor, **atores): for personagem in atores.keys(): print "%s: %s" % (personagem, atores[personagem]) print "-" * 20 print "Diretor: %s" % diretor print "Produtor: %s" % produtor >>> equipe(diretor="Paul Anderson", ... produtor="Paul Anderson", 28

... ...

Frank="Tom Cruise", Edmund="Pat Healy", Linda="Julianne Moore")

Frank: Tom Cruise Edmund: Pat Healy Linda: Julianne Moore -------------------Diretor: Paul Anderson Produtor: Paul Anderson ou ainda as duas formas combinadas. Estes par metros especiais devem necessariamente a ser os ultimos denidos na lista de par metros da funcao. Note que estes argumentos especiais a n o agregam par metros que correspondem a argumentos explicitamente denidos, como alvo, a a diretor e produtor nos exemplos acima; estes s o processados de maneira normal. a Conjuntos de argumentos opcionais s o uma excelente forma de conferir exibilidade a uma a funcao mantendo compatibilidade com c digo pr -existente, sem prejudicar a sua legibilidade. o e Escopo de vari veis Embora o tema escopo seja complexo, e n o esteja restrito apenas a a a funcoes, cabe aqui uma observacao sobre o escopo das vari veis denidas no corpo de funcoes. a Tanto as vari veis denidas no corpo de uma funcao, como a vari vel i no exemplo abaixo, a a quanto os argumentos da funcao s o acessveis apenas no escopo local; em outras palavras, a apenas no bloco de c digo da pr pria funcao. o o v = 0 w = 1 def verifica(a, b): i = 0 # Neste bloco de cdigo, v, w, a, b e i so acessveis. o a def cancela(x, y): i = 0 # Neste bloco de cdigo, v, w, x, y e i so acessveis, o a # mas note que *este* i no tem nenhuma relaco com a a # o i da funco verifica() acima. a Vari veis denidas no corpo principal (ou seja, denidas em um bloco n o-indentado, como a a as vari veis v e w acima) de um m dulo podem ser lidas em qualquer funcao contida naquele a o arquivo; no entanto, n o podem ser alteradas9 . a Caso se deseje denir ou atribuir um novo valor a uma vari vel global, existe uma instrucao a especial, global. Esta instrucao indica que a vari vel cujo nome for especicado e para ser a denida no escopo global, e n o local. a v = 0
O motivo pelo qual existe esta distinc est intimamente associado a forma como Python atribui vari ao a ` aveis. Ao realizar uma operac de atribuic a vari ao ao, avel sempre denida no escopo local; acesso a vari e ` avel, no entanto, efetua uma busca nos escopos, do mais local para o mais global.
9

29

def processa(t): global v v = 1 No c digo acima, a funcao altera o valor da vari vel global v. o a H duas funcoes uteis para estudar os escopos que se aplicam em um determinado contexto: a locals(), que retorna um dicion rio descrevendo o escopo local ao contexto atual; os a itens do dicion rio s o compostos dos nomes das vari veis denidas neste escopo e os a a a valores aos quais correspondem. global(), que retorna um dicion rio semelhante ao da funcao locals(), mas que a descreve o escopo global. O escopo de vari veis funciona de maneira semelhante quando tratando com m todos e a e denicoes de classes, que ser o discutidos na secao 4. a

2.7 M odulos e o comando import


Como dito anteriormente, cada arquivo contendo c digo Python e denominado um m odulo. o Na grande maioria das ocasi es utilizamos um ou mais m dulos Python em combinacao: o o o interpretador interativo e adequado para realizar experimentos curtos, mas n o para escrever a c digo de producao. o Um m dulo Python consiste de c digo-fonte contido em um arquivo denominado com a o o extens o .py; como tal, pode conter vari veis, funcoes e classes; para ns de nomenclatura, a a qualquer um destes elementos contidos em um m dulo e considerado um atributo do m odulo. o Python, atrav s do m dulo, oferece excelentes mecanismos para modularizar c digo-fonte. e o o Esta modularizacao pode ter diversas motivacoes: o programa pode ser grande demais, ter sub partes reus veis que devem ser separadas, ou ainda necessitar de m dulos escritos por terceiros. a o Esta secao introduz este conceito atrav s do comando import. e Importando m dulos e atributos de m dulos A instrucao b sica para manipular m dulos o o a o 10 e import. O m dulo deve estar no caminho de procura de m dulos do interpretador . No o o exemplo a seguir, um m dulo com o nome os.py e importado. Observe que a extens o .py o a n o e includa no comando import apenas o nome principal: a >>> import os >>> print os.getcwd() /home/kiko O m dulo os dene algumas funcoes internamente. No exemplo acima, invocamos a funcao o importante esta getcwd() contida neste, prexando a funcao com o nome do m dulo. E o
O caminho de procura uma lista de diret e orios onde o interpretador Python busca um m odulo quando uma instruc import processada; normalmente esta lista inclui o diret atual e os diret ao e orio orios de biblioteca padr ao. Pode ser manipulado pela vari de ambiente PYTHONPATH ou pelo m avel odulo sys.path.
10

30

observacao: ao usar a forma import mdulo, acessamos os atributos de um m dulo usando o o esta sintaxe, id ntica a utilizada para acessar m todos da lista conforme descrito na secao 2.3.2. e ` e Existe uma segunda forma do comando import que funciona de forma diferente. Ao inv s e de importar o m dulo inteiro, o que nos obriga a usar as funcoes prexadas pelo nome do m dulo, o o este formato importa um atributo do m dulo, deixando-o acessvel localmente: o >>> from os import getcwd >>> print getcwd() /home/kiko Funcoes uteis H algumas funcoes pr -denidas no interpretador bastante uteis quando li a e dando com m dulos e os atributos contidos em m dulos: o o dir(nome mdulo) retorna uma lista dos nomes dos atributos contidos em um m dulo, o o o que permite que voc descubra interativamente quais smbolos e funcoes o comp em. e o Experimente, por exemplo, executar print dir(os) a partir do interpretador Python. reload(nome mdulo) recarrega o m dulo importado a partir do seu arquivo; desta o o maneira, alteracoes podem ser efetuadas no arquivo do m dulo e j utilizadas em uma o a sess o do interpretador, sem que seja necess rio reinici -lo. a a a O mecanismo de importacao possui uma s rie de nuances especiais, que est o associados ao e a t pico escopo, introduzido na secao anterior, e aos namespaces, que resumidamente determinam o o conjunto de atributos acessveis em um determinado contexto. Uma descricao mais detalhada destes t picos e oferecida na secao Python Scopes and Name Spaces do tutorial Python. o

2.8 Strings de documentacao


Um recurso especialmente util em Python e o suporte nativo a documentacao de c digo por meio ` o de strings localizadas estrategicamente, chamadas docstrings. M dulos, classes, funcoes e at o e propriedades podem ser descritas por meio de docstrings; o exemplo a seguir demonstra um m dulo hipot tico, financ.py, documentado adequadamente: o e """Mdulo que contm funcoes financeiras.""" o e def calcula_juros(valor, taxa=0.1): """Calcula juros sobre um valor. Aplica uma taxa de juros fornecida sobre um valor e retorna o resultado. Se omitida a taxa, o valor 0.1 ser utilizado""" a # ... class Pagamento: """Classe que representa um pagamento a ser efetuado.

31

Inclui informaces de crdito e dbito. Permite efetuar o e e operaces como devoluco, cancelamento, transferncia e o a e pagamento em si. Possui o seguinte ciclo de vida: ... """ As docstrings do m dulo acima podem ser visualizadas em tempo de execucao, e mesmo a o partir do modo interativo do interpretador por meio da funcao help() e do atributo doc : >>> import financ >>> help(calcula_juros) Calcula juros sobre um valor. Aplica uma taxa de juros fornecida sobre um valor e retorna o resultado. Se omitida a taxa, o valor 0.1 ser utilizado a >>> print financ.__doc__ Mdulo que contm funces financeiras. o e o Observe que a funcao help recebe como argumento a propria funcao calcula juros; pode parecer pouco usual mas e um padr o comum em Python. a Este recurso e extremamente util para o aprendizado da linguagem quando explorando obje tos pr -denidos; utilize-o sempre que estiver necessitando de uma refer ncia r pida: e e a >>> len([1,2,3]) 3 >>> help(len) Help on built-in function len: len(...) len(object) -> integer Return the number of items of a sequence or mapping. Docstrings podem tamb m ser processadas utilizando ferramentas externas, como o epye doc11 , gerando refer ncias em formatos naveg veis como HTML. e a

3 Funcoes pr -denidas e
Python possui uma s rie de funcoes pr -denidas, que j est o disponveis quando executamos e e a a o interpretador, sem ter que recorrer a bibliotecas externas. Algumas funcoes importantes que ainda n o foram apresentadas no texto seguem: a
Dispon vel em http://epydoc.sourceforge.net/; um exemplo da documentac gerada pode ser ao consultado em http://www.async.com.br/projects/kiwi/api/.
11

32

range(a,b): recebe dois inteiros, retorna uma lista de inteiros entre a e b, n o incluindo a b. Esta funcao e freq entemente utilizada para iterar lacos for. u >>> print range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] len(a): retorna o comprimento da vari vel a: para listas, tuplas e dicion rios, retorna o a a n mero de elementos; para strings, o n mero de caracteres; e assim por diante. u u >>> print len([1,2,3]) 3 round(a, n): recebe um oat e um n mero; retorna o oat arredondado com este u n mero de casas decimais. u pow(a, n): recebe dois inteiros; retorna o resultado da exponenciacao de a a ordem n. ` equivalente a sintaxe a ** n. E ` chr(a): recebe um inteiro (entre 0 e 255) como par metro, retornando o caracter corresa pondente da tabela ASCII. >>> print chr(97) "a" unichr(a): como chr(), recebe um inteiro (aqui variando entre 0 e 65535), retornando o caracter Unicode correspondente. ord(a): recebe um unico caracter como par metro, retornando o seu c digo ASCII. a o >>> print ord("a") 97 min(a, b): retorna o menor entre a e b, sendo aplic vel a valores de qualquer tipo. a max(a, b): retorna o maior entre a e b. abs(n): retorna o valor absoluto de um n mero. u hex(n) e oct(n): retornam uma string contendo a representacao em hexadecimal e octal, respectivamente, de um inteiro. H tamb m funcoes de convers o explcita de tipo; as mais freq entemente utilizadas ina e a u cluem: float(n): converte um inteiro em um oat. >>> print float(1) 1.0 33

int(n): converte um oat em inteiro. >>> print int(5.5) 5 str(n): converte qualquer tipo em uma string. Tipos seq encias s o convertidos de u a forma literal, peculiarmente. >>> print str([1,2,3]), str({"a": 1}) [1, 2, 3] {a: 1} list(l) e tuple(l): convertem uma seq encia em uma lista ou tupla, respectivau mente. >>> print list("baco") a [, b, a, c, o] a Al m destas funcoes, existe uma grande biblioteca disponvel nos m dulos j fornecidos com e o a o Python. Alguns destes m dulos s o discutidos na secao 5; como sempre, o manual Python e a o a refer ncia denitiva no assunto. e As secoes seguintes discutem algumas funcoes pr -denidas com comportamento especial e mente relevante.

3.1 Manipulacao de arquivos: a funcao open()


A funcao open e uma das mais poderosas do Python; serve para obter uma refer ncia a um e objeto do tipo arquivo. Assumindo que temos um arquivo chamado arquivo.txt, contendo um trecho de um livro famoso, podemos codicar o seguinte exemplo: >>> a = open("arquivo.txt") >>> print a <open file arquivo.txt, mode r at 0x820b8c8> Uma vez obtida a refer ncia ao objeto arquivo, podemos usar m todos especcos deste, e e como o m todo read(), que retorna o conte do do arquivo: e u >>> texto = a.read() >>> print texto ...Would you tell me, please, which way I ought to go from here? That depends a good deal on where you want to get to, said the Cat. I dont much care where-- said Alice. Then it doesnt matter which way you go, said the Cat.

34

Sintaxe

O formato geral da funcao open e:

open(nome_do_arquivo, modo) Ambos os par metros s o strings. O modo determina a forma como o arquivo ser aberto e a a a e composto de uma ou mais letras; r (ou nada) abre para leitura, w abre para escrita, a abre para escrita, com dados escritos acrescentados ao nal do arquivo. Se um smbolo + for agregado ao modo, o arquivo pode ser lido e escrito simultaneamente. M todos do objeto arquivo O objeto arquivo possui um conjunto de m todos uteis; os mais e e importantes s o descritos abaixo. Note que o arquivo possui um conceito de posicao atual: em a um dado momento, operacoes ser o realizadas com base em uma certa posicao. Alguns m todos a e utilizam ou alteram esta posicao; outros s o operacoes globais, independentes da posicao dela. a read(): como visto acima, retorna uma string unica com todo o conte do do arquivo. u readline(): retorna a pr xima linha do arquivo, e incrementa a posicao atual. o readlines(): retorna todo o conte do do arquivo em uma lista, uma linha do arquivo u por elemento da lista. write(data): escreve a string data para o arquivo, na posicao atual ou ao nal do arquivo, dependendo do modo de abertura. Esta funcao falha se o arquivo foi aberto com modo r. seek(n): muda a posicao atual do arquivo para o valor indicado em n. close(): fecha o arquivo. Qualquer arquivo pode ser aberto e lido desta forma; experimente com esta funcao, abrindo alguns arquivos locais, lendo e modicando-os.

3.2 Leitura do teclado: raw input()


Outra funcao util sobretudo para programas Python interativos e a funcao raw input: l do e teclado uma string, e a retorna. Esta funcao possui um par metro opcional, que e uma mensagem a a ser fornecida ao usu rio. O exemplo seguinte utiliza um m dulo com o nome leitura.py: a o a = raw_input("Entre com um nmero de 0 a 10: ") u n = int(a) if not 0 < n < 10: print "Nmero invlido." u a if n % 2 == 0: print " Par" E else: print " mpar" E I Este exemplo, quando executado e sendo fornecido o n mero 7, gera a seguinte sada: u 35

>>> import leitura Entre com um nmero de 0 a 10: 7 u mpar E I

4 Orientacao a Objetos
Embora termos importantes como classes, objetos e m dulos tenham sido introduzidos anteo riormente, ainda n o discutimos em detalhes os conceitos e a implementacao de orientacao a a objetos (OO) em Python. Python suporta orientacao a objetos utilizando um modelo exvel e particularmente homog neo, que simplica a compreens o dos mecanismos OO fundamentais e a da linguagem.

4.1 Conceitos de orientacao a objetos


Orientacao a objetos e um termo que descreve uma s rie de t cnicas para estruturar solucoes para e e problemas computacionais. No nosso caso especco, vamos falar de programac ao OO, que e um paradigma de programacao no qual um programa e estruturado em objetos, e que enfatiza os aspectos abstracao, encapsulamento, polimorsmo e heranca 12 . Convencionalmente, um programa tem um uxo linear, seguindo por uma funcao princi pal (ou o corpo principal do programa, dependendo da linguagem de programacao) que invoca funcoes auxiliares para executar certas tarefas a medida que for necess rio. Em Python e perfei ` a tamente possvel programar desta forma, convencionalmente chamada de programac ao proce dural. Programas que utilizam conceitos OO, ao inv s de denir funcoes independentes que s o e a 13 utilizadas em conjunto, dividem conceitualmente o problema (ou domnio ) em partes in dependentes (objetos), que podem conter atributos que os descrevem, e que implementam o comportamento do sistema atrav s de funcoes denidas nestes objetos (m todos). Objetos (e e e seus m todos) fazem refer ncia a outros objetos e m todos; o termo envio de mensagens e e e e utilizado para descrever a comunicacao que ocorre entre os m todos dos diferentes objetos. e Na pr tica, um programa orientado a objetos em Python pode ser descrito como um cona junto de classes tanto pr -denidas quanto denidas pelo usu rio que possuem atributos e e a m todos, e que s o instanciadas em objetos, durante a execucao do programa. A secao seguinte e a concretiza estes conceitos com exemplos.

4.2 Objetos, classes e inst ancias


Objetos s o a unidade fundamental de qualquer sistema orientado a objetos. Em Python, como a introduzido na secao 2.3.2, tudo e um objeto tipos, valores, classes, funcoes, m todos e, e e claro, inst ncias: todos possuem atributos e m todos associados. Nesta secao ser o descritas as a e a estruturas da linguagem para suportar objetos denidos pelo programador.
Mais detalhes sobre conceitos fundamentais de OO podem ser obtidos em http://en.wikipedia.org/ wiki/Object-oriented_programming 13 O problema ou dom nio de um software compreende o conjunto de tarefas essenciais que este deve realizar; por exemplo, o dom nio de um editor de textos compreende escrever, corrigir e alterar documentos e um conceito fundamental, muito provavelmente modelado em uma classe OO, seria o Documento.
12

36

Classes Em Python, a estrutura fundamental para denir novos objetos e a classe. Uma classe e denida em c digo-fonte, e possui nome, um conjunto de atributos e m todos. o e Por exemplo, em um programa que manipula formas geom tricas, seria possvel conceber e uma classe denominada Retangulo: Esta classe possuiria dois atributos: lado a e lado b, que representariam as dimens es o dos seus lados. A classe poderia realizar operacoes como calcula area e calcula perimetro, e que retornariam os valores apropriados. Um exemplo de uma implementacao possvel desta classe est no m dulo retangulo.py a o a seguir: class Retangulo: lado_a = None lado_b = None def __init__(self, lado_a, lado_b): self.lado_a = lado_a self.lado_b = lado_b print "Criando nova instncia Retangulo" a def calcula_area(self): return self.lado_a * self.lado_b def calcula permetro(self): return 2 * self.lado_a + 2 * self.lado_b Esta classe dene os dois atributos descritos acima, e tr s m todos. Os tr s m todos denidos e e e e incluem sempre, como primeiro argumento, uma vari vel denominada self, que e manipulada no a interior do m todo. Este e um ponto fundamental da sintaxe Python para m todos: o primeiro e e argumento e especial, e convenciona-se utilizar o nome self para ele; logo a seguir ser discutido a para que existe. Dois dos m todos codicados correspondem as operacoes descritas inicialmente, e h um e ` a m todo especial includo: init (). O nome deste m todo tem signic ncia particular em e e a Python: e o m todo construtor, um m todo opcional invocado quando a classe e instanciada, e e que e o nome dado a acao de criar objetos a partir de uma classe. ` Inst ncias A inst ncia e objeto criado com base em uma classe denida. Este conceito e a a peculiar, e leva algum tempo para se xar. Uma descricao abstrata da dualidade classe-inst ncia: a a classe e apenas uma matriz, que especica objetos, mas que n o pode ser utilizada diretamente; a a inst ncia representa o objeto concretizado a partir de uma classe. Eu costumo dizer que a a classe e morta, existindo apenas no c digo-fonte, e que a inst ncia e viva, porque durante a o a execucao do programa s o as inst ncias que de fato funcionam atrav s da invocacao de m todos a a e e e manipulacao de atributos.

37

Conceitualmente, a inst ncia possui duas propriedades fundamentais: a classe a partir da qual a foi criada, que dene suas propriedades e m todos padr o, e um estado, que representa o cone a junto de valores das propriedades e m todos denidos naquela inst ncia especca. A inst ncia e a a possui um ciclo de vida: e criada (e neste momento seu construtor e invocado), manipulada con forme necess rio, e destruda quando n o for mais util para o programa. O estado da inst ncia a a a evolui ao longo do seu ciclo de vida: seus atributos s o denidos e t m seu valor alterado atrav s a e e de seus m todos e de manipulacao realizada por outros objetos. e O que Python chama de inst ncia e freq entemente denominado objeto em a u outras linguagens, o que cria alguma confus o uma vez que qualquer dado em a Python pode ser considerado um objeto. Em Python, inst ncias s o objetos cria a ados a partir de uma classe denida pelo programador. Retomando o nosso exemplo acima: a partir da classe Retangulo que foi denida, poderamos instanciar objetos ret ngulo especcos: um com lados de comprimento 1 e 2, e outro a com lados de comprimento 2 e 3: >>> from retangulo import Retangulo >>> r1 = Retangulo(1, 2) Criando nova instncia Retngulo a a >>> r2 = Retangulo(2, 3) Criando nova instncia Retngulo a a Observe que ao instanciar o ret ngulo: a Foi importado e utilizado o nome da classe seguido de par nteses. e Foram fornecidos como argumentos entre par nteses dois valores, correspondendo e aos comprimentos dos lados diferentes dos ret ngulos (1 e 2 para o primeiro ret ngulo, e a a 2 e 3 para o segundo). Estes argumentos s o passados transparentemente para o m todo construtor da classe a e Retangulo. O c digo do m todo est reproduzido aqui para facilitar a leitura: o e a def __init__(self, lado_a, lado_b): self.lado_a = lado_a self.lado_b = lado_b print "Criando nova instncia Retangulo" a Aqui cabe uma pausa para revelar o prop sito da vari vel self, denida como primeiro o a argumento dos m todos. Esta vari vel representa a instancia sobre a qual aquele m todo foi e a e invocado. Esta propriedade e de import ncia fundamental para OO em Python, porque atrav s a e desta vari vel e que atributos e m todos desta inst ncia podem ser manipulados no c digo dos a e a o seus m todos. e Continuando com a an lise do bloco de c digo acima: a o

38

Nas duas primeiras linhas do m todo onde e feita atribuicao o c digo do construtor e o est atribuindo valores para dois atributos, lado a e lado b, na instancia, aqui reprea sentada pelo argumento self. Neste momento, o estado da inst ncia passa a conter os a dois atributos novos. O construtor inclui uma instrucao print did tica que imprime uma mensagem para de a monstrar que foi executado; a mensagem aparece na sada do interpretador. Uma vez instanciados os ret ngulos, podemos acessar seus m todos. De maneira id ntica a e e aos m todos da lista apresentados na secao 2.3.2, a sintaxe utiliza um ponto seguido do nome do e m todo acompanhado de par nteses: e e >>> print r1.calcula_area() 2 >>> print r2.calcula_perimetro() 10 Conforme esperado, as funcoes retornaram os valores apropriados para cada inst ncia. Fa a zendo mais uma demonstracao do uso do argumento self, vamos observar o c digo de um dos o m todos: e def calcula_area(self): return self.lado_a * self.lado_b O onipresente argumento self aqui e utilizado como meio de acesso aos atributos lado a e lado b. Este c digo permite visualizar o funcionamento pleno deste mecanismo: ao ser ino vocado o m todo calcula area sobre a inst ncia r1, o argumento self assume como valor e a esta mesma inst ncia; portanto, acessar atributos de self internamente ao m todo equivale, na a e pr tica, a acessar atributos de r1 externamente. a Em Python e possvel, inclusive, acessar os atributos da inst ncia diretamente, sem a neces a sidade de usar um m todo: e >>> print r1.lado_a 1 >>> print r1.lado_b 2 Os valores, logicamente, correspondem aos inicialmente fornecidos a inst ncia por meio do ` a seu construtor. Atributos Privados e Protegidos Algumas linguagens permitem restringir acesso aos atri butos de uma inst ncia, oferecendo o conceito de variavel privada. Python n o possui uma a a construcao sint tica literalmente equivalente, mas existem duas formas de indicar que um atri a buto n o deve ser acessado externamente: a

39

A primeira forma e implementada por meio de uma convencao, n o havendo suporte es a pecco na linguagem em si: convenciona-se que atributos e m todos cujo nome e ini e ciado por um sublinhado (como metodo a) n o devem ser acessados externamente em a situacoes normais. A segunda forma estende esta convencao com suporte no pr prio interpretador: m todos o e e atributos cujo nome e iniciado por dois sublinhados (como metodo a) s o considera a dos de fato privados, e t m seus nomes alterados de maneira transparente pelo interpretador e para assegurar esta protecao. Este mecanismo e descrito em maior detalhes na secao Pri vate Variables do tutorial Python.

4.3 Heranc a
Um mecanismo fundamental em sistemas orientados a objetos modernos e heranca: uma ma neira de derivar classes novas a partir da denicao de classes existentes, denominadas neste con texto classes-base. As classes derivadas possuem acesso transparente aos atributos e m todos e das classes base, e podem redenir estes conforme conveniente. Heranca e uma forma simples de promover reuso atrav s de uma generalizacao: desenvolve e se uma classe-base com funcionalidade gen rica, aplic vel em diversas situacoes, e denem-se e a subclasses concretas, que atendam a situacoes especcas. Classes Python suportam heranca simples e heranca m ltipla. Os exemplos at agora evita u e ram o uso de heranca, mas nesta secao e possvel apresentar a sintaxe geral para denicao de uma classe: class nome-classe(base1, base2, ..., basen): atributo-1 = valor-1 . . atributo-n = valor-n def nome-mtodo-1(self, arg1, arg2, ..., argn): e e o # bloco de cdigo do mtodo . . def nome-mtodo-n(self, arg1, arg2, ..., argn): e # bloco de cdigo do mtodo o e Como pode ser observado acima, classes base s o especicadas entre par nteses ap s o nome a e o da classe sendo denida. Na sua forma mais simples: class Foo: a = 1 def cheese(self): print "cheese" def foo(self): print "foo" 40

class Bar(Foo): def bar(self): print "bar" def foo(self): print "foo de bar!" # mtodo redefinido e

uma inst ncia da classe Bar tem acesso aos m todos cheese(), bar() e foo(), este a e ultimo sendo redenido localmente: >>> b = Bar() >>> b.cheese() cheese >>> b.foo() foo de bar! >>> b.bar() foo >>> print b.a 1

# sada demonstra mtodo redefinido e # em Bar

# acesso transparente ao atributo # definido em Foo

enquanto uma inst ncia da classe Foo tem acesso apenas as funcoes denidas nela, foo() a ` e cheese: >>> f = Foo() >>> f.foo() foo Invocando m todos de classes-base Para acessar os m todos de uma classe-base, usamos uma e e construcao diferente para invoc -los, que permite especicar qual classe armazena o m todo a e sendo chamado. Seguindo o exemplo, vamos novamente a redenir o m todo Bar.foo(): e class Bar(Foo): # ... def foo(self): Foo.foo(self) print "foo de bar!" Nesta vers o, o m todo foo() inclui uma chamada ao m todo Foo.foo(), que conforme a e e indicado pelo seu nome, e uma refer ncia direta ao m todo da classe base. Ao instanciar um e e objeto desta classe: >>> b = Bar() >>> b.foo() foo foo de bar! 41

pode-se observar que s o executados ambos os m todos especicados. Este padr o, aqui a e a demonstrado de forma muito simples, pode ser utilizado em situacoes mais elaboradas; seu uso mais freq ente e para invocar, a partir de um construtor de uma classe, o construtor das suas u classes-base. Funcoes Uteis H duas funcoes particularmente uteis para estudar uma hierarquia de classes e a inst ncias: a isinstance(objeto, classe): retorna verdadeiro se o objeto for uma inst ncia a da classe especicada, ou de alguma de suas subclasses. issubclass(classe a, classe b): retorna verdadeiro se a classe especicada como classe a for uma subclasse da classe b, ou se for a pr pria classe b. o Atributos de classe versus atributos de inst ncia Uma particularidade em Python, que deriva a da forma transparente como vari veis s o acessadas, e a distincao entre atributos denidos em a a uma classe, e atributos denidos em uma inst ncia desta classe. Observe o c digo a seguir: a o class Foo: a = 1 A classe acima dene uma vari vel a com o valor 1. Ao instanciar esta classe, a >>> f = Foo() >>> print f.a 1 observa-se que a vari vel parece estar denida na inst ncia. Esta observacao convida a algua a mas indagacoes: Onde est denida a vari vel a na classe ou na inst ncia? a a a Se atribuirmos um novo valor a f.a, como abaixo: >>> f.a = 2 estamos alterando a classe ou a inst ncia? a Uma vez atribudo o novo valor, que valor aparecer para o atributo a no pr ximo objeto a o instanciado a partir de Foo? As respostas para estas perguntas s o todas relacionadas a um mecanismo central em Python, a que e o protocolo getattr. Este protocolo dita como atributos s o transparentemente locali a zados em uma hierarquia de classes e suas inst ncias, e segue a seguinte receita: a 1. Ao acessar um atributo de uma inst ncia (por meio de uma vari vel qualquer ou self) o a a interpretador tenta localizar o atributo no estado da inst ncia. a 42

2. Caso n o seja localizado, busca-se o atributo na classe da inst ncia em quest o. Por sinal, a a a este passo e o que permite que m todos de uma classe sejam acessveis a partir de suas e inst ncias. a 3. Caso n o seja localizado, busca-se o atributo entre as classes base denidas para a classe a da inst ncia. a 4. Ao atribuir uma vari vel em uma inst ncia, este atributo e sempre denido no estado local a a da inst ncia. a Uma vez compreendido este mecanismo, e possvel elucidar respostas para as quest es acima. o No exemplo, a vari vel a est denida na classe Foo, e pelo ponto 2 acima descrito, e acessvel a a como se fosse denida pela pr pria inst ncia. Ao atribuir um valor novo a f.a, estamos deo a nindo uma nova vari vel a no estado local da vari vel f, o que n o tem nenhum impacto sobre a a a a vari vel a denida em Foo, nem sobre novas inst ncias criadas a partir desta. a a Se o descrito acima parece confuso, n o se preocupe; o mecanismo normalmente funciona a exatamente da maneira que se esperaria de uma linguagem orientada a objetos. Existe apenas uma situacao perigosa, que ocorre quando usamos atributos de classe com valores mut veis, a como listas e dicion rios. a class Foo: a = [1,2] Nesta situacao, quando criamos uma inst ncia a partir de Foo, a vari vel a pode ser alterada a a por meio desta inst ncia. Como n o foi realizada atribuic ao, a regra 4 descrita acima n o se a a a aplica: >>> >>> >>> >>> [1, f = Foo() f.a.append(3) g = Foo() print g.a 2, 3]

e a vari vel da classe e de fato modicada. Esta particularidade e freq entemente fonte de a u bugs difceis de localizar, e por este motivo se recomenda fortemente que n ao se utilize vari veis a de tipos mut veis em classes. a

4.4 Introspeccao e reex ao


Introspeccao e reex o s o propriedades de sistemas orientados a objetos que qualicam a a a exist ncia de mecanismos para descobrir e alterar, em tempo de execucao, informacoes estrue turais sobre um programa e objetos existentes neste. Python possui tanto caractersticas introspectivas quanto reexivas. Permite obter em tempo de execucao informacoes a respeito do tipo dos objetos, incluindo informacoes sobre a hierar quia de classes. Preserva tamb m metadados que descrevem a estrutura do programa sendo e executado, e permitindo que se estude como est organizado este sem a necessidade de ler o seu a c digo-fonte. o 43

Algumas funcoes e atributos s o particularmente importantes neste sentido, e s o apresenta a a das nesta secao: dir(obj): esta funcao pr -denida lista todos os nomes de vari veis denidos em um e a determinado objeto; foi apresentada anteriormente como uma forma de obter as vari veis a denidas em um m dulo, e aqui pode ser descrita em sua gl ria completa: descreve o o o conte do de qualquer objeto Python, incluindo classes e inst ncias. u a obj. class : este atributo da inst ncia armazena o seu objeto classe correspondente. a obj. dict : este atributo de inst ncias e classes oferece acesso ao seu estado local. a obj. module : este atributo de inst ncias e classes armazena uma string com o nome a do m dulo do qual foi importado. o classe. bases : esta atributo da classe armazena em uma tupla as classes das quais herda. classe. name : este atributo da classe armazena uma string com o nome da classe.

5 Alguns m dulos importantes o


H um grande conjunto de m dulos que se instalam juntamente com o interpretador Python; s o a o a descritos nesta secao alguns dos mais interessantes. sys: oferece v rias operacoes referentes ao pr prio interpretador. Inclui: path, uma lista a o dos diret rios de busca de m dulos do python, argv, a lista de par metros passados na o o a linha de comando e exit(), uma funcao que termina o programa. time: oferece funcoes para manipular valores de tempo. Inclui: time(), uma funcao 14 que retorna o timestamp atual; sleep(n), que pausa a execucao por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido. os: oferece funcoes relacionadas ao ambiente de execucao do sistema. Inclui: mkdir(), que cria diret rios; rename(), que altera nomes e caminhos de arquivos; e system, que o executa comandos do sistema. os.path: oferece funcoes de manipulacao do caminho independente de plataforma. In clui: isdir(p), que testa se d e um diret rio; exists(p), que testa se p existe; o join(p,m), que retorna uma string com os dois caminhos p e m concatenados. string: oferece funcoes de manipulacao de string (que tamb m est o disponveis como e a m todos da string). Inclui: split(c, s, p), que divide a string c em at p particoes e e separadas pelo smbolo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em min sculas; e strip(c), que retorna c removendo espacos e quebras de u linha do seu incio e m.
14 o O n umero de segundos desde 1 de janeiro, 1970, que por sinal a data padr do in e ao cio do tempo no Unix.

44

math: funcoes matem ticas gerais. Inclui funcoes como cos(x), que retorna o cosseno a de x; hypot(x, y); que retorna a dist ncia euclidiana entre x e y; e exp(x); que a retorna o exponencial de x. random: geracao de n meros rand micos. Inclui: random(), que retorna um n mero u o u rand mico entre 0 e 1; randrange(m,n), que retorna um rand mico entre m e n; o o choice(s), que retorna um elemento rand mico de uma seq encia s. o u getopt: processamento de argumentos de comando de linha; ou seja, os par metros que a passamos para o interpretador na linha de execucao. Inclui: getopt(), que retorna duas listas, uma com argumentos e outra com opcoes da linha de comando. Tkinter: um m dulo que permite a criacao de programas com interface gr ca, ino a cluindo janelas, bot es e campos texto. o A documentacao do Python inclui uma descricao detalhada (e muito boa) de cada um destes m dulos e de seus membros. o

5.1 M odulos independentes


Al m dos m dulos distribudos com o Python, existem v rios m dulos auxiliares. Justamente por e o a o serem numerosos e independentemente fornecidos, n o e possvel descrev -los na sua totalidade; a e vou apenas cit -los; podem ser obtidas maiores informacoes nos links providos. a win32pipe: permite, na plataforma Windows, executar programas win32 e capturar sua sada em uma string para manipulacao posterior. Acompanha a distribuicao Activestate Python: http://www.activestate.com/Products/ActivePython/. PIL: Python Imaging Library, que oferece funcoes para processamento, manipulacao e exibicao de imagens. http://www.pythonware.com/products/pil/ NumPy: prov mecanismos simples e de alto desempenho para manipular matrizes multie dimensionais; ideal para operacoes num ricas de alto volume que necessitem de veloci e dade. http://numpy.sourceforge.net/ HTMLgen: uma biblioteca de classes que gera documentos HTML conforme padr es pr o e denidos. Oferece classes para manipular tabelas, listas, e outros elementos de formatacao. http://starship.python.net/crew/friedrich/HTMLgen/html/ DB-API: Database Application Programming Interface; na realidade, um conjunto de m dulos que acessam bases de dados de uma forma padronizada. A API especica uma o forma homog nea de se fazer consultas e operacoes em bases de dados relacionais (SQL); e diversos m dulos implementam esta API para bases de dados especcas. o http://www.python.org/topics/database/ mx: oferece uma s rie de extens es a linguagem, incluindo operacoes complexas de data e o ` e hora, funcoes nativas estendidas, e ferramentas para processamento de texto. http://www.egenix.com/files/python/

45

PyGTK: E outro pacote que permite construir aplicacoes gr cas com o Python; pode ser a usado em conjunto com o Glade, um construtor visual de interfaces. http://www.pygtk.org/ wxPython: uma biblioteca de classes que permite construir aplicacoes gr cas multi a plataforma usando Python. H um construtor visual de interfaces disponvel, o Boa Consa tructor. http://www.wxpython.org/ Todos os m dulos citados se comportam como m dulos Python normais; s o utilizados por o o a meio da instrucao import, e boa parte possui documentacao e smbolos internos list veis. a Esta n o e uma lista exaustiva, e h muitos outros m dulos uteis; h boas refer ncias que a a o a e listam m dulos externos, incluindo o ndice de pacotes ocial PyPI: o http://www.python.org/pypi.

6 Fechamento
Aqui termina este tutorial, que cobre os aspectos fundamentais da linguagem Python. Com base no texto, e possvel enfrentar uma tarefa pr tica, que ir exercitar seu conhecimento e ampliar a a sua experi ncia. Escolha um problema, e tente passar da sua modelagem para Python. e

46

You might also like