Вы находитесь на странице: 1из 46

Python na Pr atica: o em Python Um curso objetivo de programac a

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

Conteudo
o 1 Introduc a 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 amica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controle de bloco por indentac a o . . . . . . . . . . . . . . . . . . . . . Tipos de alto n vel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Orientac a o a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 3 4 5 5 6 6 7 8 8 9

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

o, tipos, operadores e estruturas 2 Python b asico: invocac a 2.1 2.2 2.3 Executando o interpretador Python interativamente . . . . . . . . . . . . . . . . Criando um programa e executando-o . . . . . . . . . . . . . . . . . . . . . . . Tipos, vari aveis e valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Dicion arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Operadores aritm eticos . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Operadores sobre cadeias de bits . . . . . . . . . . . . . . . . . . . . . . 15 Operadores de atribuic a o . . . . . . . . . . . . . . . . . . . . . . . . . . 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 ogicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Substituic a o em strings: o operador % . . . . . . . . . . . . . . . . . . . 18 Condicional: a instruc a o if . . . . . . . . . . . . . . . . . . . . . . . . 20 Lac o iterativo: for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Lac o condicional: while . . . . . . . . . . . . . . . . . . . . . . . . . 22 Excec o es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Sintaxe b asica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Truques com argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . 26

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

Func o es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

M odulos e o comando import . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Strings de documentac a o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31

es pr 3 Func o e-denidas 3.1 3.2

Manipulac a o de arquivos: a func a o open() . . . . . . . . . . . . . . . . . . . . 33 Leitura do teclado: raw input() . . . . . . . . . . . . . . . . . . . . . . . . 34 34

o a Objetos 4 Orientac a 4.1 4.2 4.3 4.4

Conceitos de orientac a o a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Objetos, classes e inst ancias . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Heranc a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Introspecc a o e reex ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 42

5 Alguns m odulos importantes 5.1

M odulos independentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 44

6 Fechamento

1 Introduc a o
Este tutorial foi criado para apoiar um curso b asico da linguagem de programac a o Python. Em especial, ele tem duas caracter sticas: primeiro, foi escrito originalmente em portugu es, o que e raro para um livro t ecnico nesta a rea. Segundo, ele e indicado para quem j a possui alguma experi encia em programac a o, mas que deseja uma noc a o pr atica do por que e de como usar Python para programar, sem ter que navegar por horas entre livros e manuais. Uma observac a o: este tutorial n ao e um guia aprofundado, e nem um manual de refer encia. A documentac a o dispon vel em http://www.python.org/docs/ e excelente (e melhor do que muitos dos livros publicados sobre Python), e serve de refer encia para os aspectos parti-

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

Python? 1.1 O que e


Python e uma linguagem de programac a o1 . Em outras palavras, e sendo simples ao extremo, usamos Python para escrever software. Esta linguagem tem alguns pontos que a tornam especial: uma linguagem interpretada. E N ao h a pr e-declarac a o de vari aveis, e os tipos das vari aveis s ao determinados dinamicamente. o; n O controle de bloco e feito apenas por indentac a ao h a delimitadores do tipo BEGIN e END ou { e }. Oferece tipos de alto n vel: strings, listas, tuplas, dicion arios, arquivos, classes. orientada a objetos; ali E as, em Python, tudo e um objeto. Nas pr oximas sec o es estes aspectos s ao discutidos em detalhes. 1.1.1 Linguagem interpretada Linguagens de programac a o s ao freq uentemente classicadas como compiladas ou interpretadas. Nas compiladas, o texto (ou c odigo-fonte) do programa e lido por um programa chamado compilador, que cria um arquivo bin ario, execut avel diretamente pelo hardware da plataforma-alvo. Exemplos deste tipo de linguagem s ao C ou Fortran. A compilac a o e execuc a o de um programa simples em C segue algo como: % cc hello.c -o hello % ./hello Hello World
Python ea ` s vezes classicado como linguagem de scripting, um termo com o qual n ao concordo muito, j a que Python e de uso geral, podendo ser usada para criar qualquer tipo de software. O termo script geralmente se refere 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 odigo-fonte, e o arquivo criado, hello, e um execut avel bin ario. Em contrapartida, programas escritos em linguagens interpretadas n ao s ao convertidos em um arquivo execut avel. Eles s ao executados utilizando um outro programa, o interpretador, que l e o c odigo-fonte e o interpreta diretamente, durante a sua execuc a o. Exemplos de linguagem 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 ametro o arquivo com c odigo-fonte hello.py. N ao h a o passo de gerac a o de execut avel; o interpretador transforma o programa especicado a ` medida em que e executado. 1.1.2 Tipagem din amica vel, que e Um dos conceitos b asicos em programac a o e a varia uma associac a o entre um nome e um valor. Ou seja, abaixo, neste fragmento na linguagem C: int a; a = 1; temos uma vari avel com o nome a sendo declarada, com tipo inteiro e contendo o valor 1. Em Python, n ao precisamos declarar vari aveis, nem seus tipos: >>> a = 1 seria a instruc a o equivalente; dene uma vari avel com o valor 1, que e um valor inteiro. mica: o tipo ao qual a vari Python possui o que e conhecido como tipagem dina avel est a associada pode variar durante a execuc a o do programa. N ao quer dizer que n ao exista tipo espec co denido (a chamada tipagem fraca): embora em Python n ao o declaremos explicitamente, as vari aveis sempre assumem um u nico tipo em um determinado momento. >>> a = 1 >>> type(a) <type int> >>> a = "1" >>> type(a) <type str> >>> a = 1.0 >>> type(a) <type float>

o type() retorna o tipo # a func a # associado a uma vari avel

Tipagem din amica, al em de reduzir a quantidade de planejamento pr evio (e digitac a o!) para escrever um programa, e um mecanismo importante para garantir a simplicidade e exibilidade es Python. Como os tipos dos argumentos n das func o ao s ao explicitamente declarados, n ao h a restric a o sobre o que pode ser fornecido como par ametro. No exemplo acima, s ao fornecidos argumentos de tipos diferentes a ` mesma func a o type, que retorna o tipo deste argumento. 4

o 1.1.3 Controle de bloco por indentac a Na maior parte das linguagens, h a instruc o es ou s mbolos espec cos que delimitam blocos de c odigo os blocos que comp oem o conte udo de um lac o ou express ao condicional, por exemplo. Em C: if (a < 0) { /* bloco de c odigo */ } ou em Fortran: if (a .lt. 0) then odigo bloco de c endif

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

Tuplas: tuplas s ao tamb em seq ue ncias de elementos arbitr arios; se comportam como listas com a excec a o de que s ao imut aveis: uma vez criadas n ao podem ser alteradas. Strings: a cadeia de caracteres, uma forma de dado muito comum; a string Python a uma seq ue ncia imut avel, alocada dinamicamente, sem restric a o de tamanho. Dicion arios: dicion arios s ao seq ue ncias que podem utilizar ndices de tipos variados, bastando que estes ndices sejam imut aveis (n umeros, tuplas e strings, por exemplo). Dicion arios s ao conhecidos em outras linguagens como arrays associativos ou hashes. >>> autor = {"nome" : "Christian", "idade": 28} >>> print autor["nome"] Christian >>> print autor["idade"] 28 Arquivo: Python possui um tipo pr e-denido para manipular arquivos; este tipo permite que seu conte udo seja facilmente lido, alterado e escrito. Classes e Inst ancias: classes s ao estruturas especiais que servem para apoiar programac a o orientada a objetos; determinam um tipo customizado com dados e operac o es particulares. Inst ancias s ao as express oes concretas destas classes. Orientac a o a objetos em Python e descrita em maiores detalhes na sec a o 4. o a objetos 1.1.5 Orientac a Orientac a o a objetos (OO) e uma forma conceitual de estruturar um programa: ao inv es de denirmos vari aveis e criarmos func o es que as manipulam, denimos objetos que possuem dados pr oprios e ac o es associadas. O programa orientado a objetos e resultado da colaborac a o entre estes objetos. Em Python, todos os dados podem ser considerados objetos: qualquer vari avel mesmo as dos tipos b asicos e pr e-denidos possui um valor e um conjunto de operac o es que pode todo) ser realizado sobre este. Por exemplo, toda string em Python possui uma operac a o (ou m e chamada upper, que gera uma string nova com seu conte udo em mai usculas: >>> a = "Hello" >>> a.upper() HELLO Como a maior parte das linguagens que s ao consideradas orientadas a objeto, Python oferece um tipo especial para denir objetos customizados: a classe. Python suporta tamb em funcionalidades comuns na orientac a o a objetos: heranc a, heranc a m ultipla, polimorsmo, reex ao e introspecc a o.

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 ao, a linguagem combina um conjunto u nico de vantagens: Os conceitos fundamentais da linguagem s ao simples de entender. A sintaxe da linguagem e clara e f acil de aprender; o c odigo produzido e normalmente curto e leg vel. Os tipos pr e-denidos inclu dos em Python s ao poderosos, e ainda assim simples de usar. A linguagem possui um interpretador de comandos interativo que permite aprender e testar rapidamente trechos de c odigo. Python e expressivo, com abstrac o es de alto n vel. Na grande maioria dos casos, um programa em Python ser a muito mais curto que seu correspondente escrito em outra linguagem. Isto tamb em faz com o ciclo de desenvolvimento seja r apido e apresente potencial de defeitos reduzido menos c odigo, 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 gr acos, func o es matem aticas complexas, ou uma determinada base de dados SQL. poss E vel escrever extens oes a Python em C e C++ quando e necess ario desempenho m aximo, ou quando for desej avel fazer interface com alguma ferramenta que possua biblioteca apenas nestas linguagens. Python permite que o programa execute inalterado em m ultiplas plataformas; em outras palavras, a sua aplicac a o feita para Linux normalmente funcionar a sem problemas em Windows e em outros sistemas onde existir um interpretador Python. Python e pouco punitivo: em geral, tudo pode e h a poucas restric o es arbitr arias. Esta propriedade acaba por tornar prazeroso o aprendizado e uso da linguagem. Python e livre: al em do interpretador ser distribu do como software livre (e portanto, gratuitamente), pode ser usado para criar qualquer tipo de software propriet ario ou livre. O projeto e implementac a o da linguagem e discutido aberta e diariamente em uma lista de correio eletr onico, e qualquer um e bem-vindo para propor alterac o es por meio de um processo simples e pouco burocr atico. Ao longo das pr oximas sec o es ser ao expostos aos poucos os pontos concretos que demonstram estas vantagens.

2 Python b asico: invocac a o, tipos, operadores e estruturas


Esta primeira sec a o aborda os aspectos essenciais da linguagem. Por falta de um lugar melhor, ser a introduzido aqui o s mbolo para coment arios em Python: quando aparece o caracter suste3 nido ( #) no c odigo-fonte, o restante da linha e ignorado.
3

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

2.1 Executando o interpretador Python interativamente


Python est a dispon vel tanto para Windows e Macintosh como para os diversos Unix (incluindo o Linux). Cada plataforma possui um pacote espec co para instalac a o, que normalmente inclui um grande n umero de bibliotecas de c odigo e um programa execut avel python 4 . Este e o 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 odigo-fonte diretamente, sem criar um arquivo separado. Para este m, execute o interpretador (digitando apenas python). Ser a impresso algo como o seguinte (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 s mbolo >>> chamamos de prompt, e indica que o interpretador est a aguardando ser digitado um comando. O shell Python oferece uma excelente forma de testar c odigo, e vamos comec ar com algumas instruc o es simples. >>> a = 1 >>> print a 1 >>> b = "Hello world" >>> print b Hello world Neste exemplo, s ao introduzidos dois aspectos b asicos: primeiro, a atribuic a o de vari aveis; segundo, a instruc a o print, que exibe valores e o conte udo de vari aveis. A forma interativa de executar o Python e conveniente; no entanto, n ao armazena o c odigo digitado, servindo apenas para testes e procedimentos simples. Para programas mais complexos, o c odigo-fonte e normalmente escrito e armazenado em um arquivo.

2.2 Criando um programa e executando-o


dulo. Nos casos Em Python, um arquivo contendo instruc o es da linguagem e chamado de m o mais simples pode-se usar um u nico m odulo, executando-o diretamente; no entanto, e interessante saber que e poss vel sub-dividir o programa em arquivos separados e facilmente integrar as func o es 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, e inclu do um ambiente de edic ao e execuc ao simples, como o IDLE, tamb em escrito em Python. Estes podem ser tamb em utilizados.
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 ametro o nome do arquivo que cont em o c odigo a ser executado. O resultado impresso deve ser: Hello world Perceba bem que n ao h a pre ambulo algum no c odigo-fonte; escrevemos diretamente o c odigo 5 a ser executado . Nas pr oximas sec o es do tutorial, estaremos utilizando bastante o modo shell; no entanto, para exerc cios e exemplos mais extensos que algumas linhas, vale a pena usar m odulos para permitir edic a o e revis ao.

2.3 Tipos, vari aveis e valores


Nomes de vari aveis comec am sempre com uma letra, n ao cont em espac os, e assim como tudo em Python, s ao sens veis a caixa (case-sensitive) em outras palavras, min usculas e mai usculas fazem, sim, diferenc a. Como explicado anteriormente, a vari avel n ao precisa ser pr e-declarada e seu tipo e determinado dinamicamente. 2.3.1 Tipos num ericos Tipos num ericos representam valores num ericos. Em Python h a alguns tipos num ericos pr edenidos: inteiros (int), n umeros de ponto utuante (oat), booleanos (bool) e complexos (complex). Estes tipos suportam as operac o es matem aticas comuns como adic a o, subtrac a o, multiplicac a o e divis ao, e podem ser convertidos entre si. Uma observac a o: booleanos foram adicionados na vers ao Python 2.2; sua utilizac a o e normalmente associada a express oes condicionais. Maiores detalhes sobre este tipo est ao dispon veis na sec a o 2.4.4. A seguir alguns exemplos de criac a o de vari aveis num ericas: >>> >>> >>> >>>
5

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

# # # #

valor valor valor valor

inteiro ponto flutuante, ou float. booleano complexo

Em Unix, e poss 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 ao de execuc ao ao arquivo. Note que isto n ao evita que seja necess ario que o interpretador esteja instalado no sistema; apenas permite que se possa omitir digitar o seu nome.

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

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

10

2.3.2 Listas encia: um conjunto linear (como um vetor em outras linguagens) de valores A lista e uma sequ indexados por um n umero inteiro. Os ndices s ao iniciados em zero e atribu dos seq uencialmente a partir deste. A lista pode conter quaisquer valores, incluindo valores de tipos mistos, e at e outras listas. Para criar uma lista, usamos colchetes e v rgulas 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 espec co 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 posic o es s ao acessadas a partir do nal da lista, -1 indicando o u ltimo 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 em os elementos cujas posic o es v ao do primeiro ndice ao segundo, n ao incluindo o u ltimo elemento. Se omitirmos um dos ndices no slice, assume-se in cio 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 ` representac a o de n umeros de ponto utuante, descrita na sec a o 2.3.1: ao imprimir a lista, Python exibe a representac a ao impressos com precis ao com o interna dos seus elementos, e portanto, oats s pleta. M etodos da Lista Na sec a o 1.1.5 introduzimos um conceito central da linguagem: tudo e um objeto; uma lista em Python, sendo um objeto, possui um conjunto de operac o es pr oprias que manipulam seu conte udo. O nome m etodo e usado para descrever operac o es de um objeto; m etodos s ao acessados no c odigo-fonte digitando-se um ponto ap os o nome da vari avel, e a seguir o nome do m etodo. Para executar (ou chamar) um m etodo, usamos par enteses ap os seu nome, fornecendo argumentos conforme necess ario. Abaixo s ao exemplicados dois exemplos de chamadas de m etodos em listas: >>> >>> [1, >>> >>> [0, numeros.append(0) print numeros 2, 3, 0] numeros.sort() print numeros 1, 2, 3]

Observe com atenc a o este exemplo, que demonstra os conceitos fundamentais descritos nos par agrafos anteriores: O m etodo append(v) recebe como argumento um valor, e adiciona este valor ao nal da lista. O m etodo sort() ordena a lista, modicando-a. N ao recebe argumentos. A lista possui uma s erie de outros m etodos; consulte a refer encia Python para uma descric a o completa (e veja tamb em a func a o dir() na sec a o 4.4). 2.3.3 Tuplas A tupla e uma seq ue ncia, como a lista: armazena um conjunto de elementos acess veis por um ndice inteiro. A tupla e imut avel; uma vez criada, n ao pode ser modicada. Para criar uma tupla use par enteses, e v rgulas para separar seus elementos: >>> t = (1, 3, 5, 7) >>> print t[2] 5 A tupla e utilizada em algumas situac o es importantes: como a lista de argumentos de uma func a o ou m etodo, como chave em dicion arios, e em outros casos onde zer sentido ou for mais eciente um conjunto xo de valores.

12

2.3.4 Strings A string, como citado anteriormente, e uma seq ue ncia imut avel com um prop osito especial: 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 atribuic o es abaixo s ao equivalentes: >>> b = "Alls quiet on the eastern front." >>> c = All\s quiet on the eastern front. >>> b == c True S ao usados caracteres especiais para denotar quebra de linha (\n), tabulac a o (\t) e outros. >>> a = "Hoje\n\t e o primeiro dia." >>> print a Hoje e o primeiro dia. Para criar uma string com m ultiplas linhas, e u til o delimitador aspas triplas: as linhas podem ser quebradas diretamente, e a string pode ser nalizada com outras tr es aspas consecutivas: 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 ue ncia, a string pode ser indexada ou dividida em slices, usando o 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 a descrito na sec a o 2.4.6. Possui ainda um grande n umero de m etodos, descritos em detalhes na sec a o String Methods do manual de refer encia Python. 13

2.3.5 Dicion arios Um dicion ario representa uma colec a o de elementos onde e poss vel utilizar um ndice de qualquer tipo imut avel, ao contr ario da lista, onde ndices s ao sempre inteiros seq uencialmente costumeiro usar os termos chave e valor (key/value) para descrever os elemenatribu dos. E tos de um dicion ario - a chave e o ndice, e o valor, a informac a o correspondente a ` quela chave. Para declarar dicion arios, utilizamos o s mbolo chaves, separando o ndice do valor por dois pontos e separando os pares ndice-valor por v rgulas: >>> refeicoes = {"caf e" : "caf e", "almoc o" : "macarr ao", ... "jantar" : "sopa"} >>> print refeicoes["almoc o"] macarrao >>> precos_modelos = {98 : 89, 99 : 119, 2000 : 199} >>> print precos_modelos[98] 89 Neste exemplo criamos dois dicion arios com tr es elementos cada um. As chaves do dicion ario refeicoes s ao as strings caf e, almoc oe jantar, e os valores respectivos, as strings caf e, macarr aoe sopa. M etodos do Dicion ario O dicion ario tamb em possui alguns m etodos not aveis: keys() retorna uma lista (sim, exatamente, do tipo lista) com as chaves do dicion ario; values() retorna uma lista com os valores do dicion ario; items() retorna uma lista de tuplas com o conte udo do dicion ario, cada tupla contendo 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() e arbitr aria; n ao confie nela. 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 ario com base em um segundo dicion ario fornecido como par ametro; elementos do dicion ario original que tamb em existem no segundo s ao atualizados; elementos que existem no segundo mas que n ao existem no original s ao adicionados 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. poss E vel usar o dicion ario como uma estrutura de dados simples, com campos para cada informac a o a ser armazenada. Por exemplo, para armazenar informac a o sobre um produto hipot etico, com c odigo, descric a o e prec o: >>> produto = {"c odigo":771, "desc":"Copo", "prec o":10.22} >>> print produto["c odigo"] 771 >>> print produto["desc"] Copo um padr E ao comum criar listas de dicion arios neste formato, cada tem na lista correspondendo a um produto em particular.

2.4 Operadores
O pr oximo t opico essencial da linguagem s ao operadores, s mbolos que operam sobre vari aveis e valores. 2.4.1 Operadores aritm eticos A maior parte dos operadores aritm eticos em Python funciona de maneira intuitiva e an aloga aos 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 o # adic a o # subtrac a # divis ao inteira: argumentos inteiros # e resultado inteiro # divis ao em ponto flutuante: pelo # menos um argumento deve ser float # resto da divis ao inteira o # multiplicac a o # exponenciac a

15

A exponenciac a o tamb em pode ser feita por meio de uma func a o, pow(), como descrito na sec a o 3. A raiz quadrada e outras func o es matem aticas est ao implementadas no m odulo math; veja a sec a o 5 para maiores detalhes. Com excec a o da exponenciac a o e da divis ao inteira, estes operadores s ao bastante comuns em linguagens de programac a o. Os operadores aritm eticos podem ser usados em oats tamb em: >>> a = 1.15 >>> print a / a - a * a + a 0.57349375 e os operadores de adic a o (+) e multiplicac a o (*), 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 adic a o (e multiplicac a o) serve para concatenar listas, tuplas e strings. N ao pode ser utilizado com dicion arios (que podem ser atualizados usando a func a o update(), mas para os quais a operac a o de concatenac a o n ao faria sentido). 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 etica booleana: >>> 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 # invers ao em complemento de 2

Note que a representac a o dos valores inteiros, por padr ao, e decimal: aqui, embora fornecemos os valores em base hexadecimal, os resultados aparecem na base 10. o 2.4.3 Operadores de atribuic a O operador mais simples, e que j a fui utilizado em diversos exemplos anteriores, e o operador de atribuic a o. Este operador e representado por um u nico s mbolo de igualdade, =, denindo uma vari avel e automaticamente atribuindo a ela um valor. O exemplo abaixo dene uma vari avel a, com valor inteiro 1. >>> a = 1 Existem formas variantes deste operador que o combinam com os operadores aritm eticos e bit-wise introduzidos nas sec o es anteriores. Estas formas foram introduzidos na vers ao Python 2.0, e existem primariamente para oferecer uma maneira conveniente de re-atribuir um valor transformado a uma vari avel. A sintaxe para o operador combinado utiliza o s mbolo do operador aritm etico/bit-wise relevante, seguido da igualdade. Este operador combinado efetua a operac a o sobre o valor da vari avel, j a atribuindo o resultado a esta mesma. Exemplicando: >>> >>> >>> 2 >>> >>> 1 >>> >>> 10 a = 1 a += 1 print a a /= 2 print a a *= 10 print a

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

A partir da vers ao 2.2 de Python, existe um tipo num erico que representa o resul tado de um teste condicional: o tipo booleano. E um tipo bastante simples, possuindo apenas dois valores poss veis: True e False. A partir da vers ao 2.3 de Python, qualquer comparac a o retorna um valor booleano; vers oes anteriores retornavam 1 ou 0, respectivamente. Na pr atica, o resultado e equivalente, cando apenas mais expl cito e leg vel o resultado. Igualdade >>> print False >>> print True >>> print True >>> print True o Comparac a >>> 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

Comparac o es podem ser realizadas tamb em com outros tipos de vari aveis; para strings, listas ou dicion arios, as comparac o es maior que e menor que se referem ao n umero e ao valor dos elementos, mas por n ao serem terrivelmente claras n ao s ao muito freq uentemente usadas 7 . >>> [2,2,3] < [2,3,2] True >>> "abacate" < "pera" True Dica: quando comparando o n umero de elementos de uma seq ue ncia ou dicion ario, e normalmente utilizada a func a o len(), que retorna o comprimento da seq ue ncia. encias Para seq Presenc a em Sequ ue ncias e dicion arios, existe o operador in, que verica se o elemento est a contido no conjunto; no caso do dicion ario, o operador testa a presenc a do valor na seq ue ncia de chaves. >>> "x" in "cha" False >>> 1 in [1,2,3] True
7

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

18

2.4.5 Operadores l ogicos Os operadores l ogicos not, and e or permitem modicar e agrupar o resultado de testes condicionais: >>> 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 ao utilizados com freq ue ncia nas estruturas de controle descritas na sec a o 2.5. o de operadores Python oferece uma forma impl Combinac a cita de combinar operac o es condicionais, sem o uso de operadores l ogicos. Por exemplo, para vericar se um valor est a entre dois extremos, pode-se usar a seguinte sintaxe: if 0 < a < 10: print "Entre zero e dez" Podem tamb em ser comparados diversos valores simultaneamente: if a == b == c: print "S ao id enticos" e mesmo combinados operadores comparativos com operadores de igualdade: if a == b <= c: print "S ao id enticos" Esta express ao verica se a e igual a b e al em disso, se b e menor ou igual a c. o em strings: o operador % 2.4.6 Substituic a Uma operac a o muito u til para processamento de texto e a substituic a o de s mbolos em strings. particularmente adequada para gerarmos strings formatadas contendo algum valor vari E avel, Idade: anos. como o cl assico formul ario: Nome: 1. Escreve-se a string normalmente, usando um s mbolo 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 substituic a o, aplica-se um operador % sobre a string contendo o s mbolo de formatac a o, seguido do valor ou vari avel a substituir: >>> print a % 10 Total de itens: 10 Como pode ser visto, o s mbolo e substitu do pelo valor fornecido. Podem ser utilizados tanto valores expl citos quanto vari aveis para a substituic a o: >>> custo = 5.50 >>> print b % custo Custo: 5.500000 Caso sejam m ultiplos 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 n umero junto ao s mbolo porcentagem para reservar um tamanho total a ` string: >>> a = "Quantidade: %4d" >>> print a % 3 >>> print a % 53 >>> print a % 120 Quantidade: 3 Quantidade: 53 Quantidade: 120 poss E vel controlar a formatac a o de tipos num ericos de maneira especial atrav es de modicadores nos s mbolos no formato m.n. Como acima, m indica o total de caracteres reservados. Para oats, n indica o n umero de casas decimais; para inteiros, indica o tamanho total do n umero, 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 espac os, 3 casas # 10 espac os, 3 d gitos # ( e um inteiro)

2.5 Estruturas de controle


Toda linguagem de programac a o possui instruc o es que controlam o uxo de execuc a o; em Python, h a um conjunto pequeno e poderoso de instruc o es, descritas nas sec o es a seguir. o if 2.5.1 Condicional: a instruc a A instruc a o condicional b asica de Python e o if. A sintaxe e descrita a seguir (lembrando que a indentac a o e que delimita o bloco): o: if condic a # bloco de c odigo elif condic ao: # outro bloco else: # bloco final As condic o es acima s ao comparac o es feitas utilizando os operadores condicionais descritos na sec a o 2.4.4, possivelmente combinados por meio dos operadores l ogicos descritos na sec a o 2.4.5. a = 2 b = 12 if a < 5 and b * a > 0: print "ok" o se A instruc a o elif permite que se inclua uma excec a o condicional algo como ... sen a 8 isso .... O else e uma excec a o absoluta . if nome == "pedro": idade = 21 elif nome == "jos e": idade = 83 else: idade = 0 Provendo nome=" alvaro" para o bloco acima, ser a atribu do o valor zero a idade. 2.5.2 Lac o iterativo: for H a apenas dois tipos de lac os em Python: for e while. O primeiro tipo, mais freq uentemente utilizado, percorre uma seq ue ncia em ordem, a cada ciclo substituindo a vari avel especicada por um dos elementos. Por exemplo:
N ao h a nenhuma estrutura do tipo switch/case, mas e poss vel simul a-la usando uma express ao if com 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 iterac a o, item recebe o valor de um elemento da seq ue ncia. Para efetuar uma lac o com um n umero xo de iterac o es, costuma-se usar o for em conjunto com a func a o range, que gera seq ue ncias de n umeros: >>> for i in range(1,4): ... print "%da volta" % i ... 1a volta 2a volta 3a volta o em dicion Iterac a arios Para iterar em dicion arios, podemos usar as func o es keys() ou values() para gerar uma lista: >>> dict = {"batata": 500, "ab obora": 1200, ... "cebola": 800} >>> for e in dict.keys(): ... print "Item: %8s Peso: %8s" % (e, dict[e]) Item: cebola Peso: 800 Item: batata Peso: 500 obora Peso: 1200 Item: ab Note que porque o dicion ario em si n ao possui um conceito de ordem, a lista que resulta do m etodo keys() possui ordenac a o arbitr aria. Por este motivo, no exemplo acima, o lac o n ao segue a declarac a o do dicion ario. Controle adicional em lac os Para ambos os tipos de lac o, existem duas instruc o es de controle adicional, continue e break. A primeira reinicia uma nova iterac a o imediatamente, interrompendo a iterac a o atual; a segunda faz o lac o terminar imediatamente. A forma geral do lac o for e : encia: u avel in seq for vari odigo # bloco de c else: encia de um break # bloco executado na aus Note a presenc a da cl ausula else. Esta cl ausula e executada quando a sa da do lac o na o for determinada por uma instruc a o 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 Lac o condicional: while O segundo tipo de lac o, while, e utilizado quando necessitamos fazer um teste a cada iterac a o do lac o. o: while condic a # bloco de c odigo else: # bloco executado na aus encia de um break Como o lac o for, o while possui uma cl ausula else. Um exemplo do uso de while segue: >>> 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 ao h a uma instruc a o especial para efetuar um lac o com teste ao nal da iterac a o (como o lac o do ... while() em C), mas pode-se usar um while innito usando uma condic a o verdadeira, xa em combinac a o 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

es As estruturas if e while utilizam condic Veracidade e falsidade de condic o o es l ogicas para controle, avaliando-as de maneira booleana. Como qualquer valor ou express ao pode ser usado como condic a o, e importante entender qual o mecanismo de avaliac a o da linguagem. Em Python, falso e denotado: pelo booleano False, pelo valor 0 (zero), pela lista, dicion ario, tupla ou string vazios, de tamanho zero, pelo valor especial None, que signica nulo. Qualquer outro valor simples e considerado verdadeiro. Inst ancias podem denir regras mais complexas para avaliac a o; para detalhes consulte a sec a o Basic customization do manual de refer encia Python. es 2.5.4 Excec o Com os dois tipos de lac os descritos na sec a o anterior, todas as necessidades normais de controle de um programa podem ser implementadas. No entanto, quando algo inesperado ocorre, ou uma condic a o de erro conhecido e atingida, Python oferece uma forma adicional de controlar o uxo de execuc a o: a excec a o. A excec a o e um recurso de linguagens de programac a o modernas que serve para informar que uma condic a o incomum ocorreu. Embora existam outras aplicac o es, em geral comunicamse atrav es de excec o es erros ou problemas que ocorrem durante a execuc a o de um programa. Excec o es s ao internamente geradas pelo interpretador Python quando situac o es excepcionais ocorrem. No exemplo abaixo, >>> a = [1, 2, 3] >>> print a[5] o c odigo interno do interpretador sabe que n ao podemos acessar uma lista atrav es um ndice n ao-existente, e gera uma excec a o: 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 execuc a o que gerou a excec a o. A segunda indica a linha de c odigo na 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 ao. A terceira linha indica o tipo de excec a o levantada neste caso, IndexError e informa uma mensagem que descreve mais especicamente o problema.

24

es A excec Tratando excec o a o normalmente imprime um traceback e interrompe a execuc a o do programa. Uma ac a o comum e testar e controlar a excec a o; para este m, usamos uma cl ausula try/except: >>> a = [1, 2, 3] >>> try: ... print a[5] ... except IndexError: ... print "O vetor nao possui tantas posic oes!" O vetor nao possui tantas posic oes! A instruc a o try captura excec o es que ocorrerem no seu bloco de c odigo; a linha except determina quais tipos de excec a o ser ao capturados. A sintaxe da cl ausula except segue os formatos: except tipo_da_excecao [, variavel_da_excecao]: # bloco de c odigo ou except (tipo_excecao_1, tipo_excecao_2, ...) [, variavel_da_excecao]: # bloco de c odigo O primeiro elemento da cl ausula except e um tipo da excec a o, ou uma tupla de tipos caso m ultiplas excec o es devam ser tratadas da mesma forma. O segundo elemento e opcional; permite que seja capturada uma inst ancia que armazena informac o es da excec a o. Um uso trivial desta inst ancia e imprimir a mensagem de erro: >>> 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 execuc a o 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 excec o es v em pr e-denidas pelo interpretador Python; o guia de refer encia cont em uma lista completa e os casos onde s ao levantadas. Note tamb em que esta introduc a o a excec o es n ao cobre a sua sintaxe completa; consulte a sec a o Errors and Exceptions do tutorial Python para maiores detalhes. 25

2.6 Func o es
Func o es s ao blocos de c odigo com um nome; recebem um conjunto de par ametros (ou argumentos) e retornam um valor. Python possui, como seria esperado de uma linguagem de programac a o completa, suporte a func o es. Existem diversas func o es pr e-denidas pelo interpretador, descritas na sec a o 3; a sec a o atual detalha as formas de denir func o es em c odigo Python. 2.6.1 Sintaxe b asica A sintaxe geral para denir uma func a o e : def nome_funcao(arg_1, arg_2, ..., arg_n): # # bloco de c odigo contendo corpo da func ao # return valor_de_retorno # retornar e opcional O c odigo da func a o, uma vez avaliado pelo interpretador, dene um nome local. Os argumentos s ao valores fornecidos quando chamada a func a o, e que cam dispon veis por meio de vari aveis locais no corpo da func a o. No exemplo abaixo, temos uma func a o que recebe uma lista de dicion arios como par ametro, e uma func a o que recebe um dicion ario. A primeira itera pela lista recebida, e passa o elemento 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 odigo acima dene dois nomes locais: imprime cardapio e imprime prato. Para que a func a o seja de fato executada, usamos este nome seguido dos argumentos passados entre par enteses: # defino dicion arios descrevendo os 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 func ao, passando os pratos como argumento imprime_cardapio(lista_pratos) o que resulta na seguinte sa da 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 func o es n ao retornam valor algum, apenas exibindo informac a o. Para retornar um valor, basta usar a express ao return dentro da func a o. A primeira pergunta conceitual aqui seria retornar para quem?; a resposta direta e para quem invocou a func a o. Demonstrando por exemplos, a func a o 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 func a o com um argumento: a = bar("plains") o c odigo da func a o e avaliado e um valor, retornado, sendo armazenado na vari avel a (observe o uso do operador de atribuic a o seguido da chamada da func a o). Para visualizar o valor retornado, usamos a conveniente instruc a o print: >>> print a The rain in Spain falls mainly in the plains. Dica: para retornar conjuntos de valores, basta retornar uma seq ue ncia ou outro valor de tipo composto. 2.6.2 Truques com argumentos Argumentos nomeados Argumentos podem ser fornecidos a ` func a o especicando-se o nome do par ametro ao qual correspondem. O c odigo abaixo e equivalente a ` chamada no exemplo anterior: a = bar(t="plains") mas ca explicitamente declarado que o par ametro corresponde ao argumento t. Normalmente s ao nomeados argumentos para tornar a leitura do c odigo mais f acil; no entanto, veremos a seguir como s ao essenciais para utilizar uma das formas de listas de argumentos vari aveis.

27

Valores padr ao Uma das funcionalidades mais interessantes nas func o es Python e a possibilidade de denir valores padr ao: def aplica_multa(valor, taxa=0.1): return valor + valor * taxa Neste exemplo, o valor padr ao para a vari avel taxa e 0.1; se n ao for denido este argumento, o valor padr ao ser a utilizado. >>> print aplica_multa(10) 11.0 >>> print aplica_multa(10, 0.5) 15.0 Dica: N ao utilize como valor padr ao listas, dicion arios e outros valores mut aveis; os valores padr ao s ao avaliados apenas uma vez e o resultado obtido n ao e o que intuitivamente se esperaria. Conjuntos de argumentos opcionais Uma forma de denir conjuntos de argumentos opcionais utiliza par ametros curinga que assumem valores compostos. Pode ser fornecido um par ametro cujo nome e prexado por um s mbolo asterisco, que assumir a um conjunto ordenado 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 ametro que assume um conjunto de argumentos nomeados, prexado de dois asteriscos: 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 ametros especiais devem necessariamente ser os u ltimos denidos na lista de par ametros da func a o. Note que estes argumentos especiais n ao agregam par ametros que correspondem a argumentos explicitamente denidos, como alvo, diretor e produtor nos exemplos acima; estes s ao processados de maneira normal. Conjuntos de argumentos opcionais s ao uma excelente forma de conferir exibilidade a uma func a o mantendo compatibilidade com c odigo pr e-existente, sem prejudicar a sua legibilidade. Escopo de vari aveis Embora o tema escopo seja complexo, e n ao esteja restrito apenas a func o es, cabe aqui uma observac a o sobre o escopo das vari aveis denidas no corpo de func o es. Tanto as vari aveis denidas no corpo de uma func a o, como a vari avel i no exemplo abaixo, quanto os argumentos da func a o s ao acess veis apenas no escopo local; em outras palavras, apenas no bloco de c odigo da pr opria func a o. v = 0 w = 1 def verifica(a, b): i = 0 # Neste bloco de c odigo, v, w, a, b e i s ao acess veis. def cancela(x, y): i = 0 # Neste bloco de c odigo, v, w, x, y e i s ao acess veis, # mas note que *este* i n ao tem nenhuma relac ao com # o i da func ao verifica() acima. Vari aveis denidas no corpo principal (ou seja, denidas em um bloco n ao-indentado, como as vari aveis v e w acima) de um m odulo podem ser lidas em qualquer func a o contida naquele 9 arquivo; no entanto, n ao podem ser alteradas . Caso se deseje denir ou atribuir um novo valor a uma vari avel global, existe uma instruc a o especial, global. Esta instruc a o indica que a vari avel cujo nome for especicado e para ser denida no escopo global, e n ao local. v = 0
O motivo pelo qual existe esta distinc ao est a intimamente associado a ` forma como Python atribui vari aveis. Ao realizar uma operac ao de atribuic ao, a vari avel e sempre denida no escopo local; acesso a ` vari 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 odigo acima, a func a o altera o valor da vari avel global v. H a duas func o es u teis para estudar os escopos que se aplicam em um determinado contexto: locals(), que retorna um dicion ario descrevendo o escopo local ao contexto atual; os itens do dicion ario s ao compostos dos nomes das vari aveis denidas neste escopo e os valores aos quais correspondem. global(), que retorna um dicion ario semelhante ao da func a o locals(), mas que descreve o escopo global. O escopo de vari aveis funciona de maneira semelhante quando tratando com m etodos e denic o es de classes, que ser ao discutidos na sec a o 4.

2.7 M odulos e o comando import


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

30

observac a o: ao usar a forma import m odulo, acessamos os atributos de um m odulo usando esta sintaxe, id entica a ` utilizada para acessar m etodos da lista conforme descrito na sec a o 2.3.2. Existe uma segunda forma do comando import que funciona de forma diferente. Ao inv es de importar o m odulo inteiro, o que nos obriga a usar as func o es prexadas pelo nome do m odulo, este formato importa um atributo do m odulo, deixando-o acess vel localmente: >>> from os import getcwd >>> print getcwd() /home/kiko es uteis Func o H a algumas func o es pr e-denidas no interpretador bastante u teis quando lidando com m odulos e os atributos contidos em m odulos: dir(nome m odulo) retorna uma lista dos nomes dos atributos contidos em um m odulo, o que permite que voc e descubra interativamente quais s mbolos e func o es o comp oem. Experimente, por exemplo, executar print dir(os) a partir do interpretador Python. reload(nome m odulo) recarrega o m odulo importado a partir do seu arquivo; desta maneira, alterac o es podem ser efetuadas no arquivo do m odulo e j a utilizadas em uma sess ao do interpretador, sem que seja necess ario reinici a-lo. O mecanismo de importac a o possui uma s erie de nuances especiais, que est ao associados ao t opico escopo, introduzido na sec a o anterior, e aos namespaces, que resumidamente determinam o conjunto de atributos acess veis em um determinado contexto. Uma descric a o mais detalhada destes t opicos e oferecida na sec a o Python Scopes and Name Spaces do tutorial Python.

2.8 Strings de documentac a o


Um recurso especialmente u til em Python e o suporte nativo a ` documentac a o de c odigo por meio de strings localizadas estrategicamente, chamadas docstrings. M odulos, classes, func o es e at e propriedades podem ser descritas por meio de docstrings; o exemplo a seguir demonstra um m odulo hipot etico, financ.py, documentado adequadamente: es financeiras.""" """M odulo que cont em func o 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 a utilizado""" # ... class Pagamento: """Classe que representa um pagamento a ser efetuado.

31

Inclui informac oes de cr edito e d ebito. Permite efetuar operac oes como devoluc ao, cancelamento, transfer encia e pagamento em si. Possui o seguinte ciclo de vida: ... """ As docstrings do m odulo acima podem ser visualizadas em tempo de execuc a o, e mesmo a partir do modo interativo do interpretador por meio da func a o 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 a utilizado >>> print financ.__doc__ M odulo que cont em func oes financeiras. Observe que a func a o help recebe como argumento a pro a pria func o calcula juros; pode parecer pouco usual mas e um padr ao comum em Python. Este recurso e extremamente u til para o aprendizado da linguagem quando explorando objetos pr e-denidos; utilize-o sempre que estiver necessitando de uma refer encia r apida: >>> 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 em ser processadas utilizando ferramentas externas, como o epydoc11 , gerando refer encias em formatos naveg aveis como HTML.

3 Func o es pr e-denidas
Python possui uma s erie de func o es pr e-denidas, que j a est ao dispon veis quando executamos o interpretador, sem ter que recorrer a bibliotecas externas. Algumas func o es importantes que ainda n ao foram apresentadas no texto seguem:
Dispon vel em http://epydoc.sourceforge.net/; um exemplo da documentac ao gerada pode ser 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 ao incluindo b. Esta func a o e freq uentemente utilizada para iterar lac os for. >>> print range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] len(a): retorna o comprimento da vari avel a: para listas, tuplas e dicion arios, retorna o n umero de elementos; para strings, o n umero de caracteres; e assim por diante. >>> print len([1,2,3]) 3 round(a, n): recebe um oat e um n umero; retorna o oat arredondado com este n umero de casas decimais. pow(a, n): recebe dois inteiros; retorna o resultado da exponenciac a o de a a ` ordem n. E equivalente a ` sintaxe a ** n. chr(a): recebe um inteiro (entre 0 e 255) como par ametro, retornando o caracter correspondente 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 u nico caracter como par ametro, retornando o seu c odigo ASCII. >>> print ord("a") 97 min(a, b): retorna o menor entre a e b, sendo aplic avel a valores de qualquer tipo. max(a, b): retorna o maior entre a e b. abs(n): retorna o valor absoluto de um n umero. hex(n) e oct(n): retornam uma string contendo a representac a o em hexadecimal e octal, respectivamente, de um inteiro. H a tamb em func o es de convers ao expl cita de tipo; as mais freq uentemente utilizadas incluem: 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 uencias s ao convertidos de forma literal, peculiarmente. >>> print str([1,2,3]), str({"a": 1}) [1, 2, 3] {a: 1} list(l) e tuple(l): convertem uma seq uencia em uma lista ou tupla, respectivamente. >>> print list(" abaco") [ a, b, a, c, o] Al em destas func o es, existe uma grande biblioteca dispon vel nos m odulos j a fornecidos com o Python. Alguns destes m odulos s ao discutidos na sec a o 5; como sempre, o manual Python e a refer encia denitiva no assunto. As sec o es seguintes discutem algumas func o es pr e-denidas com comportamento especialmente relevante.

3.1 Manipulac a o de arquivos: a func a o open()


A func a o open e uma das mais poderosas do Python; serve para obter uma refer encia a um 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 encia ao objeto arquivo, podemos usar m etodos espec cos deste, como o m etodo read(), que retorna o conte udo do arquivo: >>> 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 func a o open e :

open(nome_do_arquivo, modo) Ambos os par ametros s ao strings. O modo determina a forma como o arquivo ser a aberto e 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 s mbolo + for agregado ao modo, o arquivo pode ser lido e escrito simultaneamente. M etodos do objeto arquivo O objeto arquivo possui um conjunto de m etodos u teis; os mais importantes s ao descritos abaixo. Note que o arquivo possui um conceito de posic a o atual: em um dado momento, operac o es ser ao realizadas com base em uma certa posic a o. Alguns m etodos utilizam ou alteram esta posic a o; outros s ao operac o es globais, independentes da posic a o dela. read(): como visto acima, retorna uma string u nica com todo o conte udo do arquivo. readline(): retorna a pr oxima linha do arquivo, e incrementa a posic a o atual. readlines(): retorna todo o conte udo do arquivo em uma lista, uma linha do arquivo por elemento da lista. write(data): escreve a string data para o arquivo, na posic a o atual ou ao nal do arquivo, dependendo do modo de abertura. Esta func a o falha se o arquivo foi aberto com modo r. seek(n): muda a posic a o 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 func a o, abrindo alguns arquivos locais, lendo e modicando-os.

3.2 Leitura do teclado: raw input()


Outra func a o u til sobretudo para programas Python interativos e a func a o raw input: l e do teclado uma string, e a retorna. Esta func a o possui um par ametro opcional, que e uma mensagem a ser fornecida ao usu ario. O exemplo seguinte utiliza um m odulo com o nome leitura.py: a = raw_input("Entre com um n umero de 0 a 10: ") n = int(a) if not 0 < n < 10: print "N umero inv alido." if n % 2 == 0: print " E Par" else: print " E Impar" Este exemplo, quando executado e sendo fornecido o n umero 7, gera a seguinte sa da: 35

>>> import leitura Entre com um n umero de 0 a 10: 7 E Impar

4 Orientac a o a Objetos
Embora termos importantes como classes, objetos e m odulos tenham sido introduzidos anteriormente, ainda n ao discutimos em detalhes os conceitos e a implementac a o de orientac a o a objetos (OO) em Python. Python suporta orientac a o a objetos utilizando um modelo ex vel e particularmente homog eneo, que simplica a compreens ao dos mecanismos OO fundamentais da linguagem.

4.1 Conceitos de orientac a o a objetos


Orientac a o a objetos e um termo que descreve uma s erie de t ecnicas para estruturar soluc o es para o OO, que e problemas computacionais. No nosso caso espec co, vamos falar de programac a um paradigma de programac a o no qual um programa e estruturado em objetos, e que enfatiza os aspectos abstrac a o, encapsulamento, polimorsmo e heranc a 12 . Convencionalmente, um programa tem um uxo linear, seguindo por uma func a o principal (ou o corpo principal do programa, dependendo da linguagem de programac a o) que invoca func o es auxiliares para executar certas tarefas a ` medida que for necess ario. Em Python e perfei o procetamente poss vel programar desta forma, convencionalmente chamada de programac a dural. Programas que utilizam conceitos OO, ao inv es de denir func o es independentes que s ao 13 utilizadas em conjunto, dividem conceitualmente o problema (ou dom nio ) em partes independentes (objetos), que podem conter atributos que os descrevem, e que implementam o comportamento do sistema atrav es de func o es denidas nestes objetos (m etodos). Objetos (e seus m etodos) fazem refer encia a outros objetos e m etodos; o termo envio de mensagens e utilizado para descrever a comunicac a o que ocorre entre os m etodos dos diferentes objetos. Na pr atica, um programa orientado a objetos em Python pode ser descrito como um conjunto de classes tanto pr e-denidas quanto denidas pelo usu ario que possuem atributos e m etodos, e que s ao instanciadas em objetos, durante a execuc a o do programa. A sec a o seguinte concretiza estes conceitos com exemplos.

4.2 Objetos, classes e inst ancias


Objetos s ao a unidade fundamental de qualquer sistema orientado a objetos. Em Python, como introduzido na sec a o 2.3.2, tudo e o es, m etodos e, e um objeto tipos, valores, classes, func claro, inst ancias: todos possuem atributos e m etodos associados. Nesta sec a o ser ao descritas as 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 odigo-fonte, e possui nome, um conjunto de atributos e m etodos. Por exemplo, em um programa que manipula formas geom etricas, seria poss vel conceber uma classe denominada Retangulo: Esta classe possuiria dois atributos: lado a e lado b, que representariam as dimens oes dos seus lados. A classe poderia realizar operac o es como calcula area e calcula perimetro, e que retornariam os valores apropriados. Um exemplo de uma implementac a o poss vel desta classe est a no m odulo retangulo.py 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 inst ancia Retangulo" def calcula_area(self): return self.lado_a * self.lado_b metro(self): def calcula per return 2 * self.lado_a + 2 * self.lado_b Esta classe dene os dois atributos descritos acima, e tr es m etodos. Os tr es m etodos denidos incluem sempre, como primeiro argumento, uma vari avel denominada self, que e manipulada no interior do m etodo. Este e um ponto fundamental da sintaxe Python para m etodos: o primeiro argumento e especial, e convenciona-se utilizar o nome self para ele; logo a seguir ser a discutido para que existe. Dois dos m etodos codicados correspondem a ` s operac o es descritas inicialmente, e h a um m etodo especial inclu do: init (). O nome deste m etodo tem signic ancia particular em Python: e o m etodo construtor, um m etodo opcional invocado quando a classe e instanciada, que e o nome dado a ` ac a o de criar objetos a partir de uma classe. Inst ancias A inst ancia e objeto criado com base em uma classe denida. Este conceito e peculiar, e leva algum tempo para se xar. Uma descric a o abstrata da dualidade classe-inst ancia: a classe e apenas uma matriz, que especica objetos, mas que n ao pode ser utilizada diretamente; a inst ancia representa o objeto concretizado a partir de uma classe. Eu costumo dizer que a classe e morta, existindo apenas no c odigo-fonte, e que a inst ancia e viva, porque durante a execuc a o do programa s ao as inst ancias que de fato funcionam atrav es da invocac a o de m etodos e manipulac a o de atributos.

37

Conceitualmente, a inst ancia possui duas propriedades fundamentais: a classe a partir da qual foi criada, que dene suas propriedades e m etodos padr ao, e um estado, que representa o conjunto de valores das propriedades e m etodos denidos naquela inst ancia espec ca. A inst ancia possui um ciclo de vida: e criada (e neste momento seu construtor e invocado), manipulada conforme necess ario, e destru da quando n ao for mais u til para o programa. O estado da inst ancia evolui ao longo do seu ciclo de vida: seus atributos s ao denidos e t em seu valor alterado atrav es de seus m etodos e de manipulac a o realizada por outros objetos. O que Python chama de inst ancia e freq uentemente denominado objeto em outras linguagens, o que cria alguma confus ao uma vez que qualquer dado em Python pode ser considerado um objeto. Em Python, inst ancias s ao objetos criados a partir de uma classe denida pelo programador. Retomando o nosso exemplo acima: a partir da classe Retangulo que foi denida, poder amos instanciar objetos ret angulo espec cos: um com lados de comprimento 1 e 2, e outro com lados de comprimento 2 e 3: >>> from retangulo import Retangulo >>> r1 = Retangulo(1, 2) Criando nova inst ancia Ret angulo >>> r2 = Retangulo(2, 3) Criando nova inst ancia Ret angulo Observe que ao instanciar o ret angulo: Foi importado e utilizado o nome da classe seguido de par enteses. Foram fornecidos como argumentos entre par enteses dois valores, correspondendo aos comprimentos dos lados diferentes dos ret angulos (1 e 2 para o primeiro ret angulo, e 2 e 3 para o segundo). Estes argumentos s ao passados transparentemente para o m etodo construtor da classe Retangulo. O c odigo do m etodo est a reproduzido aqui para facilitar a leitura: def __init__(self, lado_a, lado_b): self.lado_a = lado_a self.lado_b = lado_b print "Criando nova inst ancia Retangulo" Aqui cabe uma pausa para revelar o prop osito da vari avel self, denida como primeiro argumento dos m etodos. Esta vari avel representa a insta etodo foi ncia sobre a qual aquele m invocado. Esta propriedade e de import ancia fundamental para OO em Python, porque atrav es desta vari avel e que atributos e m etodos desta inst ancia podem ser manipulados no c odigo dos seus m etodos. Continuando com a an alise do bloco de c odigo acima:

38

Nas duas primeiras linhas do m etodo onde e feita atribuic a o o c odigo do construtor est a atribuindo valores para dois atributos, lado a e lado b, na insta ncia, aqui representada pelo argumento self. Neste momento, o estado da inst ancia passa a conter os dois atributos novos. O construtor inclui uma instruc a o print did atica que imprime uma mensagem para demonstrar que foi executado; a mensagem aparece na sa da do interpretador. Uma vez instanciados os ret angulos, podemos acessar seus m etodos. De maneira id entica aos m etodos da lista apresentados na sec a o 2.3.2, a sintaxe utiliza um ponto seguido do nome do m etodo acompanhado de par enteses: >>> print r1.calcula_area() 2 >>> print r2.calcula_perimetro() 10 Conforme esperado, as func o es retornaram os valores apropriados para cada inst ancia. Fazendo mais uma demonstrac a o do uso do argumento self, vamos observar o c odigo de um dos m etodos: 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 odigo permite visualizar o funcionamento pleno deste mecanismo: ao ser invocado o m etodo calcula area sobre a inst ancia r1, o argumento self assume como valor esta mesma inst ancia; portanto, acessar atributos de self internamente ao m etodo equivale, na pr atica, a acessar atributos de r1 externamente. Em Python e poss vel, inclusive, acessar os atributos da inst ancia diretamente, sem a necessidade de usar um m etodo: >>> print r1.lado_a 1 >>> print r1.lado_b 2 Os valores, logicamente, correspondem aos inicialmente fornecidos a ` inst ancia por meio do seu construtor. Atributos Privados e Protegidos Algumas linguagens permitem restringir acesso aos atri vel privada. Python n butos de uma inst ancia, oferecendo o conceito de varia ao possui uma construc a o sint atica literalmente equivalente, mas existem duas formas de indicar que um atributo n ao deve ser acessado externamente:

39

A primeira forma e implementada por meio de uma convenc a o, n ao havendo suporte espec co na linguagem em si: convenciona-se que atributos e m etodos cujo nome e iniciado por um sublinhado (como metodo a) n ao devem ser acessados externamente em situac o es normais. A segunda forma estende esta convenc a o com suporte no pr oprio interpretador: m etodos e atributos cujo nome e iniciado por dois sublinhados (como metodo a) s ao considerados de fato privados, e t em seus nomes alterados de maneira transparente pelo interpretador para assegurar esta protec a o. Este mecanismo e descrito em maior detalhes na sec a o Private Variables do tutorial Python.

4.3 Heranc a
Um mecanismo fundamental em sistemas orientados a objetos modernos e heranc a: uma maneira de derivar classes novas a partir da denic a o de classes existentes, denominadas neste contexto classes-base. As classes derivadas possuem acesso transparente aos atributos e m etodos das classes base, e podem redenir estes conforme conveniente. Heranc a e uma forma simples de promover reuso atrav es de uma generalizac a o: desenvolvese uma classe-base com funcionalidade gen erica, aplic avel em diversas situac o es, e denem-se subclasses concretas, que atendam a situac o es espec cas. Classes Python suportam heranc a simples e heranc a m ultipla. Os exemplos at e agora evitaram o uso de heranc a, mas nesta sec a o e poss vel apresentar a sintaxe geral para denic a o de uma classe: class nome-classe(base1, base2, ..., basen): atributo-1 = valor-1 . . atributo-n = valor-n def nome-m etodo-1(self, arg1, arg2, ..., argn): etodo odigo do m # bloco de c . . def nome-m etodo-n(self, arg1, arg2, ..., argn): # bloco de c odigo do m etodo Como pode ser observado acima, classes base s ao especicadas entre par enteses ap os o nome 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!" # m etodo redefinido

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

# sa da demonstra m etodo redefinido # em Bar

# acesso transparente ao atributo # definido em Foo

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

pode-se observar que s ao executados ambos os m etodos especicados. Este padr ao, aqui demonstrado de forma muito simples, pode ser utilizado em situac o es mais elaboradas; seu uso mais freq uente e para invocar, a partir de um construtor de uma classe, o construtor das suas classes-base. es Uteis Func o H a duas func o es particularmente u teis para estudar uma hierarquia de classes e inst ancias: isinstance(objeto, classe): retorna verdadeiro se o objeto for uma inst ancia 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 opria classe b. Atributos de classe versus atributos de inst ancia Uma particularidade em Python, que deriva da forma transparente como vari aveis s ao acessadas, e a distinc a o entre atributos denidos em uma classe, e atributos denidos em uma inst ancia desta classe. Observe o c odigo a seguir: class Foo: a = 1 A classe acima dene uma vari avel a com o valor 1. Ao instanciar esta classe, >>> f = Foo() >>> print f.a 1 observa-se que a vari avel parece estar denida na inst ancia. Esta observac a o convida a algumas indagac o es: Onde est a denida a vari avel a na classe ou na inst ancia? Se atribuirmos um novo valor a f.a, como abaixo: >>> f.a = 2 estamos alterando a classe ou a inst ancia? Uma vez atribu do o novo valor, que valor aparecer a para o atributo a no pr oximo objeto instanciado a partir de Foo? As respostas para estas perguntas s ao todas relacionadas a um mecanismo central em Python, que e o protocolo getattr. Este protocolo dita como atributos s ao transparentemente localizados em uma hierarquia de classes e suas inst ancias, e segue a seguinte receita: 1. Ao acessar um atributo de uma inst ancia (por meio de uma vari avel qualquer ou self) o interpretador tenta localizar o atributo no estado da inst ancia. 42

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

e a vari avel da classe e de fato modicada. Esta particularidade e freq uentemente fonte de o se utilize vari bugs dif ceis de localizar, e por este motivo se recomenda fortemente que n a aveis de tipos mut aveis em classes.

4.4 Introspecc a o e reex a o


Introspecc a o e reex ao s ao propriedades de sistemas orientados a objetos que qualicam a exist encia de mecanismos para descobrir e alterar, em tempo de execuc a o, informac o es estruturais sobre um programa e objetos existentes neste. Python possui tanto caracter sticas introspectivas quanto reexivas. Permite obter em tempo de execuc a o informac o es a respeito do tipo dos objetos, incluindo informac o es sobre a hierarquia de classes. Preserva tamb em metadados que descrevem a estrutura do programa sendo executado, e permitindo que se estude como est a organizado este sem a necessidade de ler o seu c odigo-fonte. 43

Algumas func o es e atributos s ao particularmente importantes neste sentido, e s ao apresentadas nesta sec a o: dir(obj): esta func a o pr e-denida lista todos os nomes de vari aveis denidos em um determinado objeto; foi apresentada anteriormente como uma forma de obter as vari aveis denidas em um m odulo, e aqui pode ser descrita em sua gl oria completa: descreve o conte udo de qualquer objeto Python, incluindo classes e inst ancias. obj. class : este atributo da inst ancia armazena o seu objeto classe correspondente. obj. dict : este atributo de inst ancias e classes oferece acesso ao seu estado local. obj. module : este atributo de inst ancias e classes armazena uma string com o nome do m odulo do qual foi importado. 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 odulos importantes


H a um grande conjunto de m odulos que se instalam juntamente com o interpretador Python; s ao descritos nesta sec a o alguns dos mais interessantes. sys: oferece v arias operac o es referentes ao pr oprio interpretador. Inclui: path, uma lista dos diret orios de busca de m odulos do python, argv, a lista de par ametros passados na linha de comando e exit(), uma func a o que termina o programa. time: oferece func o es para manipular valores de tempo. Inclui: time(), uma func a o 14 que retorna o timestamp atual; sleep(n), que pausa a execuc a o por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido. os: oferece func o es relacionadas ao ambiente de execuc a o do sistema. Inclui: mkdir(), que cria diret orios; rename(), que altera nomes e caminhos de arquivos; e system, que executa comandos do sistema. os.path: oferece func o es de manipulac a o do caminho independente de plataforma. Inclui: isdir(p), que testa se d e um diret orio; exists(p), que testa se p existe; join(p,m), que retorna uma string com os dois caminhos p e m concatenados. string: oferece func o es de manipulac a o de string (que tamb em est ao dispon veis como m etodos da string). Inclui: split(c, s, p), que divide a string c em at e p partic o es separadas pelo s mbolo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em min usculas; e strip(c), que retorna c removendo espac os e quebras de linha do seu in cio e m.
14 o O n umero de segundos desde 1 de janeiro, 1970, que por sinal e a data padr ao do in cio do tempo no Unix.

44

math: func o es matem aticas gerais. Inclui func o es como cos(x), que retorna o cosseno de x; hypot(x, y); que retorna a dist ancia euclidiana entre x e y; e exp(x); que retorna o exponencial de x. random: gerac a o de n umeros rand omicos. Inclui: random(), que retorna um n umero rand omico entre 0 e 1; randrange(m,n), que retorna um rand omico entre m e n; choice(s), que retorna um elemento rand omico de uma seq ue ncia s. getopt: processamento de argumentos de comando de linha; ou seja, os par ametros que passamos para o interpretador na linha de execuc a o. Inclui: getopt(), que retorna duas listas, uma com argumentos e outra com opc o es da linha de comando. Tkinter: um m odulo que permite a criac a o de programas com interface gr aca, incluindo janelas, bot oes e campos texto. A documentac a o do Python inclui uma descric a o detalhada (e muito boa) de cada um destes m odulos e de seus membros.

5.1 M odulos independentes


Al em dos m odulos distribu dos com o Python, existem v arios m odulos auxiliares. Justamente por serem numerosos e independentemente fornecidos, n ao e poss vel descrev e-los na sua totalidade; vou apenas cit a-los; podem ser obtidas maiores informac o es nos links providos. win32pipe: permite, na plataforma Windows, executar programas win32 e capturar sua sa da em uma string para manipulac a o posterior. Acompanha a distribuic a o Activestate Python: http://www.activestate.com/Products/ActivePython/. PIL: Python Imaging Library, que oferece func o es para processamento, manipulac a o e exibic a o de imagens. http://www.pythonware.com/products/pil/ NumPy: prov e mecanismos simples e de alto desempenho para manipular matrizes multidimensionais; ideal para operac o es num ericas de alto volume que necessitem de velocidade. http://numpy.sourceforge.net/ HTMLgen: uma biblioteca de classes que gera documentos HTML conforme padr oes pr edenidos. Oferece classes para manipular tabelas, listas, e outros elementos de formatac a o. http://starship.python.net/crew/friedrich/HTMLgen/html/ DB-API: Database Application Programming Interface; na realidade, um conjunto de m odulos que acessam bases de dados de uma forma padronizada. A API especica uma forma homog enea de se fazer consultas e operac o es em bases de dados relacionais (SQL); diversos m odulos implementam esta API para bases de dados espec cas. http://www.python.org/topics/database/ mx: oferece uma s erie de extens oes a ` linguagem, incluindo operac o es complexas de data e hora, func o es nativas estendidas, e ferramentas para processamento de texto. http://www.egenix.com/files/python/

45

outro pacote que permite construir aplicac PyGTK: E o es gr acas 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 aplicac o es gr acas multiplataforma usando Python. H a um construtor visual de interfaces dispon vel, o Boa Constructor. http://www.wxpython.org/ Todos os m odulos citados se comportam como m odulos Python normais; s ao utilizados por meio da instruc a o import, e boa parte possui documentac a o e s mbolos internos list aveis. Esta n ao e uma lista exaustiva, e h a muitos outros m odulos u teis; h a boas refer encias que listam m odulos externos, incluindo o ndice de pacotes ocial PyPI: http://www.python.org/pypi.

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

46

Вам также может понравиться