Python na Pr´ Pratica: a´ tica: Um curso curso objetivo objet ivo de de programac programac¸ ao a˜ o em Python http://www.async.com.br/projects/pnp/
Christian Christian Robottom Reis Async Open Source
[email protected]
Abril de 2004
´ Conteudo 1
Introduc¸ ˜ ao 1.1
1.2
2
1
O que e´ Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.1.1
Linguagem interpretada . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.1. 1.1.2 2
Tipag ipagem em dinˆ dinˆamica . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.1.3 1.1.3
Controle Controle de bloco bloco por por inden indentac tac¸ a˜ o . . . . . . . . . . . . . . . . . . . . .
3
1.1.4
Tipos de alto n´ıvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.1.5 1.1.5
Orientac Orientac¸ a˜ o a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Por que Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Pyth ython basic a´ s ico: o: invocac invo cac¸ ˜ ao, tipos, operadores e estruturas
6
2.1
Executand tando o o inte interp rpre reta tad dor Pytho ython n inte interrativ tivamen mente . . . . . . . . . . . . . . . .
6
2.2
Criando um programa e executando-o . . . . . . . . . . . . . . . . . . . . . . .
7
2.3 2.3
Tipos ipos,, vari´ ari´aveis e valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3. 2.3.1 1
Tipos ipos num´ num´ericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3.2
Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3.3
Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.4
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.3. 2.3.5 5
Dici Dicion´ on´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.4
Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.1 2.4.1
Operad Operadore oress aritm´ aritm´eticos . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.2
Operadores sobre cadeias de bits . . . . . . . . . . . . . . . . . . . . . . 15
2.4.3
Operadores Operadores de atribuic¸ a˜ o . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1
2.5
2.6
3
4
5
1
Operadores condicionais . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.4. 2.4.5 5
Oper Operad ador ores es l´ogicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.6 2.4.6
Substituic Substituic¸ ao a˜ o em strings: o operador % . . . . . . . . . . . . . . . . . . . 18
Estruturas de controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.5.1 2.5.1
Condicion Condicional: al: a instruc instruc¸ ao a˜ o if . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.2
Lac¸o ¸o iterativo: for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.3
Lac¸o ¸o condicional: while . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5.4 2.5.4
Excec Excec¸ o˜ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Func Func¸ o˜ es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.6. 2.6.1 1
Sint Sintax axee b´asica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.6.2
Truques com argumentos . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2.7
Modulos ´ e o comando import . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.8
Strings de documentac¸ a˜ o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Func¸ ˜ oes pr´ pre´ -definidas
31
3.1
Manipulac Manipulac¸ ao a˜ o de arquivos: a func fu nc¸ ao a˜ o open() . . . . . . . . . . . . . . . . . . . . 33
3.2
Leitu Leitura ra do teclad teclado: o: raw input()
. . . . . . . . . . . . . . . . . . . . . . . . 34
Orientac¸ ˜ ao a Objetos
34
4.1
Conceitos de orientac¸ a˜ o a objetos . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4.2
Objeto Objetos, s, classe classess e instˆ instˆancias . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.3
Heranc¸ a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
4.4
Introspec Introspeccc¸ ao a˜ o e reflex˜ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Algu lguns mo´ dulos importantes 5.1
6
2.4.4
42
Mo´ dulos independentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fechamento
43
44
Introduc¸ ˜ ao
Este tutorial foi criado para apoiar um curso b´asico asico da linguagem l inguagem de programac p rogramac¸ ao a˜ o Python. Em especial, ele tem duas caracter´ caracter´ısticas: ısticas: primeiro, foi escrito originalmente em portuguˆ portugu es, eˆ s, o que e´ raro para um livro t´ecnico ecnico nesta area. a´ rea. Segundo Segundo,, ele ´e indicado para quem j´a possui alguma experiˆencia encia em programac¸ ao, a˜ o, mas que deseja uma noc¸ ˜ao a o pr´atica atica do por que e de como usar Python para programar, sem ter que navegar por horas entre livros e manuais. Uma observac obser vac¸ ao: a˜ o: este tutorial n˜ao ao e´ um guia aprofundado, e nem um manual de referˆencia. encia. A documenta docum entacc¸ ao a˜ o dispon´ disp on´ıvel ıvel em http://www.python.org/docs/ e´ excelente (e melhor do que muitos dos livros publicados sobre Python), e serve de referˆencia referˆencia para os aspectos parti-
2
culares da linguagem.
Conve onvenc nc¸ ˜ oes e Formato Este tutorial assume Python vers˜ao ao 2; a vers˜ao ao mais recente e´ a 2.3.3. O texto t exto se baseia em um grande conjunto de exemplos, exemplos, que aparecem aparecem indentados em uma sec¸ ˜ao distinta, em uma fonte de largura fixa. Os exemplos, de forma geral, descrevem precisamente a sa´ıda ıda produzida ao digitar os comandos interativamente. Definic¸ oes o ˜ es importante importantess s˜ao ao introduzidas em negrito. Nome Nomess de vari´ ari´aveis aveis e express˜oes o es de c´odigo odigo vˆem em em uma fonte diferente, com serifa. Quanto ao idioma, os termos em inglˆes es mais comuns s˜ao ao utilizados, com uma explicac¸ ao a˜ o ´ importante que os termos em inglˆes pr´evia evia do que significam. E es sejam conhecidos, porque s˜ao ao utilizados correntemente na bibliografia e em discuss˜oes oes com outros programadores.
1.1
O que e´ Python?
Python e´ uma linguagem de programac¸ ao a˜ o1 . Em outras palavras palavras,, e sendo simples simples ao extremo, extremo, usamos Python para escrever escrever software. Esta linguagem tem alguns pontos que a tornam especial:
• E´ uma linguagem interpretada . • N˜ao a o h´a pr´e-decl e-d eclara aracc¸ ao a˜ o de vari´aveis, aveis, e os tipos das vari´aveis aveis s˜ao ao determinados dinamicamente.
• O controle de bloco e´ feito apenas por inden nd enta tacc¸ ˜ ao; n ao a˜ o h´a delimitadores do tipo BEGIN e END ou { e }. • Oferece tipos de alto n´ n´ıvel ıvel: strings, listas, tuplas, dicion´arios, arios, arquivos, arquivos, classes. • E´ orientada a objetos; ali´as, as, em Python, tudo ´e um objeto. Nas pr´oximas oxim as sec¸ oes o˜ es estes aspectos s˜ao ao discutidos em detalhes.
1.1.1 1.1.1
Linguag Linguagem em interpre interpretada tada
Linguagens de programac¸ ao a˜ o s˜ao ao freq¨uentemente uentemente classificadas classificadas como como compiladas compiladas ou interpretadas. interpretadas. o´ digo-fonte ) do programa e´ lido por um programa chamado comNas compiladas, o texto (ou codigo-fonte pilador, que cria um arquivo bin´ario, ario, execut´avel avel diretamente pelo hardware da plataforma-alvo. Exemplos deste tipo de linguagem s˜ao ao C ou Fortran. A compilac compi lac¸ ao a˜ o e exec e xecuc uc¸ ao a˜ o de um programa simples em C segue algo como: % cc he hell llo. o.c c -o he hell llo o % ./hell ./hello o Hello Hello World World 1
Python ´e as a` s vezes classifi cado como linguagem de scripting, um termo com o qual n ˜ao concordo concordo muito, j´a que Python Python ´e de uso geral, podendo ser 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.
3
onde cc e´ o programa compilador, compilador, hello.c e´ o arqu arquiv ivo o de c´odigo-fonte, odigo-fonte, e o arquivo arquivo criado, hello, e´ um execut´ execut´avel avel bin ario. a´ rio. Em contrapartida, programas escritos em linguagens interpretadas n˜ao a o s˜ao ao convertidos em um arquivo execut executavel. a´ vel. Eles s˜ao ao executados utilizando um outro programa, o interpretador, que leˆ o c´odigo-fonte odigo-fonte e o interpreta diretamente, diretament e, durante dur ante a sua execuc¸ ˜ao. ao. Exemplos de linguagem interpreta interpretada da incluem o BASIC BASIC tradicional, tradicional, Perl e Python. Python. Para Para execut executar ar um programa programa Python contido no arquivo hello.py, por exemplo, utiliza-se algo como: % python python hello. hello.py py Hello Hello World World
Note que o programa que executamos diretamente ´e o interpretador python, fornecendo como parˆametro ametro o arquivo com c´odigo-fonte odigo-fonte hello.py. N˜ao a o h´a o passo de gerac¸ ao ˜ao de execut´avel; avel; o interpretador transforma o programa especificado `a medida em que e´ executado. executado.
1.1.2 1.1.2
Tipag Tipagem em din ˆ din ˆamica amica
a´ vel, que e´ uma Um dos conceitos b´asicos asic os em program pr ogramac ac¸ ao a˜ o e´ a vari avel u ma associac asso ciac¸ ao a˜ o entre um nome e um valor. Ou seja, abaixo, neste fragmento na linguagem C: int a; int a = 1;
temos uma vari´avel avel com o nome a sendo declarada, com tipo inteiro e contendo o valor 1. Em Python, Python, n ao a˜ o precisamos declarar vari´aveis, aveis, nem seus tipos: >>> a = 1
seria seri a a instr i nstruc uc¸ ao a˜ o equivalente; define uma vari´avel avel com o valor 1, que ´e um valor inteiro.
din ˆamica amica: o tip Pyth Python on poss possui ui o que que e´ conhe conhecid cido o como como tipagem din ˆ tipo ao qua qual a vari´avel avel est´ est´a asso asso-ciada pode variar durante a execuc¸ ˜ao ao do programa programa.. N˜ao ao quer dizer que n˜ao ao exista exi sta tipo t ipo espec´ e spec´ıfico ıfico definido (a chamada tipagem fraca): embora em Python n˜ao ao o declaremos explicitamente, as vari´aveis aveis sempre assumem um ´unico unico tipo em um determinado momento. >>> a = 1 >>> type(a)
>>> a = "1" >>> type(a type(a) ) ’str’> >>> a = 1.0 >>> type(a type(a) ) ’float’>
˜ # a func ¸ao a o ty type pe() () reto retorn rna a o ti tipo po ´ # associado a uma vari avel avel
Tipagem dinˆamica, amica, al´ al em e´ m de reduzir a quantidade de planejamento pr´evio evio (e digitac digi tac¸ ao!) a˜ o!) para escrever um programa, e´ um mecanismo importante para garantir a simplicidade e flexibilidade oes Python. Como os tipos dos argumentos n˜ao das func¸ ˜ a o s˜ao ao explicitamente declarados, n˜ao a o h´a restr res tric ic¸ ao a˜ o sobre o que pode ser fornecido como parˆametro. ametro. No exemplo exemplo acima acima,, s ao a˜ o fornecidos argumentos de tipos diferentes a` mesma mesm a func¸ ao a˜ o type , que retorna o tipo deste argumento. 4
1.1.3
Controle de bloco por indentac indentac¸ ˜ ao
Na maior parte das linguagens, h´a instruc inst ruc¸ oes o˜ es ou s´ımbolos ımbolos espec´ıficos ıficos que delimitam delimi tam blocos de codigo o´ digo – os blocos que comp˜oem oem o conte´udo udo de um lac¸ o ou express˜ express ao ˜ao condicional, por exemplo. Em C: if (a < 0) { /* bloco de c ´ o digo odig o */ }
ou em Fortran:
C
if (a .l .lt. t. 0) the hen n ´ bloco de c odigo odigo endif
os blocos s˜ao ao delimitados explicitamente — em C por chaves, e em Fortran pelo par then e endif. Em Pyth Python on,, bloc blocos os de c´odigo odigo s˜ao ao demarcados demarcados apenas por espac¸os ¸os formando uma inden in dentac tac¸ ao a˜ o visual: ´ " pri rint nt "O val alor or de a e if a == 0: print print "zero" "zero" else: prin pr int t a
Esta propriedade faz com que o c´odigo odigo seja muito claro e leg´ıvel ıvel — afinal, garante que a inden in dentac tac¸ ao a˜ o esteja sempre correta — por´em em requer costume e um controle mais formal 2 .
1.1.4 1.1.4
Tipos Tipos de alto alto n´ıvel ıvel
Al´ Alem e´ m dos tipos b´asicos asicos (inteiros, (inteiros, numeros u´ meros de ponto flutuante flutuante,, booleanos booleanos), ), alguns alguns tipos pr´eedeterminados determin ados em Python Py thon merecem m erecem atenc at enc¸ ao a˜ o especial:
Listas: como um vetor em outras linguagens, a lista ´e um conjunto (ou seq ¨ seq ¨u ˆencia encia) de valores acessados ( indexados) por um ´ındice ındice num´ numerico, e´ rico, inteiro, comec¸ando ¸ando em zero. A lista em Python pode armazenar valores de qualquer tipo. >>> a = ["A", "B", "C", 0, 1, 2] >>> >> > pr prin int t a[ a[0] 0] A >>> >> > pr prin int t a[5] a[5] 2 2
Por exemplo, ´e importante convencionar se a indentac¸ ˜ao ser´a 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.
5
Tuplas: tuplas tuplas s˜ sao a˜ o tamb´em em seq¨uˆ uencias eˆ ncias de elementos arbitr´arios; arios; se comportam como listas com imutaveis a´ veis: uma vez criadas n˜ao a excec exc ec¸ ao a˜ o de que s˜ao ao imut´ ao podem ser alteradas. Strings: a cadei cadeiaa de caracte caracteres res,, uma forma forma de dado muito muito comum comum;; a string string Python Python ´a uma seq¨uˆ uencia eˆ ncia imut´ imutavel, a´ vel, alocada dinamicamente, dinamicam ente, sem restric¸ ao a˜ o de tamanho. Dicion´ Dicionarios: a´ rios: dicion´arios arios s˜ao ao seq¨uˆ uencias eˆ ncias que podem utilizar util izar ´ındices ındices de tipos variados, variados, bastando que estes ´ındices ındices sejam imut´aveis aveis (n´umeros, umeros, tuplas e strings, por exemplo) exemplo).. Dicion´ Dicion´arios arios s˜ao ao conhecidos em outras linguagens como arrays associativos ou hashes. >>> au >>> auto tor r = {" {"no nome me" " : "C "Chr hris isti tian an", ", "i "ida dade de": ": 28 28} } >>> print print autor["no autor["nome"] me"] Christian >>> print print autor["id autor["idade"] ade"] 28
Arquivo: Python Python possui possui um tipo pr´e-definido e-definido para manipular manipular arquivos; arquivos; este tipo permite que seu conte´udo udo seja facilmente lido, alterado e escrito. Classes Classes e Inst ˆ Inst ˆancias: ancias: classes classes s˜ s ao a˜ o estruturas estrutu ras especiais que servem para apoiar programac pro gramac¸ ˜ao ao orientada a objetos; determinam um tipo t ipo customizado com dados e operac¸ ˜oes oes particulares. Instˆancias ancias s˜ao ao as express˜oes oes concretas destas classes. Orientac¸ ˜ao ao a objetos em Python ´e descrita em maiores maior es detalhes detal hes na sec¸ ao a˜ o 4. 1.1.5
Orientac¸ ˜ ao a objetos
Orien Or ientac tac¸ ao a˜ o a objetos (OO) ´e uma forma conceitual de estruturar um programa: ao inv´es es de definirmos vari´aveis aveis e criarmos cr iarmos func¸ oes o˜ es que as manipulam, definimos objetos que possuem dados pr´ proprios o´ pri os e ac a c¸ oes o˜ es associadas. O programa orientado a objetos ´e resultado r esultado da ‘colaborac¸ ao’ a˜ o’ entre estes objetos. Em Python, todos os dados podem ser considera considerados dos objetos: objetos: qualquer qualquer vari´avel avel — mesmo as dos tipos b´asicos asicos e pr´e-definidos e-definidos — possui um valor e um conjunto de operac¸ ˜oes oes que pode e´ todo) ser realizado sobre este. Por exemplo, toda string em Python possui uma operac¸ ˜ao ao (ou m etodo chamada upper, que gera uma string nova com seu conte´udo udo em mai´usculas: usculas: >>> a = "H "Hel ell lo" >>> a.upper( a.upper() ) ’HELLO’
Como a maior parte das linguagens que s˜ao ao consideradas ‘orientadas a objeto’, Python oferece um tipo especial para definir objetos customizados: a classe. Python suporta tamb´em em funcionalidades comuns na orientac or ientac¸ ˜ao ao a objetos obj etos:: heranc hera nc¸ a, heranc h eranc¸ a m ultipla, u ´ ltipla, polimorfismo, reflex˜ao ao e intr in trosp ospecc ecc¸ ao. a˜ o.
6
1.2 1.2
Por que que Py Pyth thon on? ?
Dado que existe uma grande diversidade de linguagens diferentes, por que aprender Python ´e ´e interessante ou mesmo importante? Na minha opini˜ao, ao, a linguagem combina um conjunto unico u ´ nico de vantagens: vantagens:
• Os conceitos fundamentais da linguagem s˜ao ao simples de entender. • A sintaxe da linguagem e´ clara e f´acil acil de aprender; o c´odigo odigo produzido e´ normalmente curto curt o e leg´ıvel. ıvel .
• Os tipos pr´e-definidos e-definidos inclu´ıdos ıdos em Python s ao a˜ o 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. odigo.
• Python e´ expressivo, com abstrac¸ oes o ˜ es de alto n´ıvel. ıvel. Na grande maioria dos casos, um programa em Python ser´a muito mais curto que seu correspondente escrito em outra linguagem. gem. Isto Isto tamb´ tamb´em em faz com o ciclo de desenvolvimento seja r´apido apido e apresente potencial de defeitos reduzido – menos c´odigo, odigo, menos oportunidade para errar.
• Existe suporte para uma diversidade diversidade grande de bibliotecas externas. externas. Ou seja, pode-se fazer em Python qualquer tipo de programa, mesmo que utilize gr´aficos, aficos , func¸ oes o˜ es matem´aticas aticas complexas, ou uma determinada base de dados SQL.
• E´ poss´ıvel ıvel escrever extens oes o ˜ es a Python em C e C++ quando ´e necess´ario ario desempenho m´aximo, aximo, ou quando for desej´avel avel fazer interface com alguma ferramenta que possua biblioteca apenas nestas linguagens.
• Python permite que o programa execute inalterado em m´ultiplas ultiplas plataformas; em outras palavras, palavras, a sua aplicac¸ ao a˜ o feita para Linux normalmente funcionar´a sem problemas em Windows e em outros sistemas onde existir um interpretador Python.
• Python e´ pouco punitiv punitivo: o: em geral, geral, ‘tudo pode’ pode’ e h´a poucas restric restri c¸ oes o˜ es arbitr´arias. arias. Esta propriedade acaba por tornar prazeroso o aprendizado e uso da linguagem.
• Python e´ livre: al´em em do interpretador ser distribu´ distribu´ıdo ıdo como software livre (e portanto, gratuitamente), pode ser usado para criar qualquer tipo de software — propriet´ario ario ou livre. O projeto e implement i mplementac ac¸ ao a˜ o da linguagem ´e discutido aberta e diariamente em uma lista de correio eletrˆonico, onico, e qualquer um ´e bem-vindo bem-v indo para propor alterac¸ oes o˜ es por meio de um processo simples e pouco burocr´atico. atico. Ao longo das pr´oximas oxim as sec¸ oes o˜ es ser˜ao ao expostos aos poucos os pontos concretos que demonstram estas vantagens.
Python basic a´ s ico: o: invoca invo cacc¸ ˜ ao, tipos, operadores operadores e estruturas estruturas
2
Esta primeira primeir a sec¸ ao a˜ o aborda os aspectos essenciais da linguagem. Por falta de um lugar melhor, ser´a introduzido aqui o s´ımbolo ımbolo para coment´arios arios em Python: quando aparece o caracter suste3 nido ( #) no c´odigo-fonte, odigo-fonte, o restante da linha e´ ignorado. 3
Tamb´em conhecido como ‘n´umero’, ‘jogo da velha’, ‘cardinal’ e ‘lasagna’.
7
2.1
Executan Executando do o interpr interpretad etador or Python Python interati interativame vamente nte
Python Python est´a dispon´ıvel ıvel tanto para Windows e Macintosh como para os diversos diversos Unix (incluindo o Linux). Lin ux). Cada plataform p lataformaa possui um pacote pacot e espec´ıfico ıfico para instalac i nstalac¸ ˜ao, ao, que normalmente inclui um grande n´umero umero de bibliotecas de c´odigo odigo e um programa execut´avel 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 outr outras as palavras, vamos entrar o c´odigo-fonte odigo-fonte diretament diretamente, e, sem criar um arquiv arquivo o separado separado.. Para este fim, execute o interpretador (digitando apenas ‘ python ’). Ser´a impresso algo como o seguinte (dependendo de qual sistema estiver usando): % py pyth thon on Pyth Py thon on 2. 2.3. 3.3 3 (# (#1, 1, De Dec c 22 20 2003 03, , 15 15:3 :38: 8:09 09) ) [GCC [GCC 2.95.4 2.95.4 200110 20011002 02 (Debia (Debian n prerel prereleas ease)] e)] on linux2 linux2 Type Type "help" "help", , "copyr "copyrigh ight", t", "credi "credits" ts" or "licen "license" se" for more more information. >>>
Este s´ımbolo ımbo lo >>> chamamos de prompt , e indica que o interpretador est´a aguardando ser digitado digitado um comando. comando. O shell Python oferece oferece uma excelente excelente forma de testar c ´odigo, odigo, e vamos comec¸ ar com algumas algu mas instru ins trucc¸ oes o˜ es simples. >>> a = 1 >>> >> > pr prin int t a 1 >>> >> > b = "H "Hel ello lo wo worl rld" d" >>> >> > pr prin int t b Hello Hello world world
Neste Neste exemplo exemplo,, s˜ao ao introduzidos dois aspectos b´asicos: asicos: primeiro, primeir o, a atribuic atri buic¸ ao a˜ o de vari´aveis; aveis; segundo, segun do, a instruc inst ruc¸ ao a˜ o print, que exibe valores e o conte´udo udo de vari´aveis. aveis. A forma interativa de executar o Python ´e conveniente; no entanto, n˜ao ao armazena o c´odigo odigo digitado, servindo apenas para testes e procedimentos simples. Para programas mais complexos, o c odigo-fonte o´ digo-fonte e´ normalmente escrito e armazenado em um arquivo.
2.2
Criando Criando um program programa a e executa executandondo-o o
o´ dulo. Nos casos Em Python, um arquivo arquivo contendo instruc¸ oes o˜ es da linguagem ´e chamado de m odulo casos mais simples pode-se usar um ´unico unico m´odulo, odulo, executando-o diretamente; no entanto, ´e interesinteressante saber que ´e poss´ıvel ıvel sub-dividir o programa em arquivos arquivos separados e facilmente integrar as func fun c¸ oes o˜ es definidas definidas neles. Para Para criar criar um arquivo arquivo contendo contendo um programa, programa, basta basta usar qualquer qualquer editor editor de texto. texto. Para Para um primeiro exemplo, exemplo, crie um arquiv arquivo o hello.py contendo as seguintes linhas: 4
Normalmente, ´e inclu´ı do um ambiente de edic¸ ˜ao e execuc¸ ˜ao simples, como como o IDLE, tamb´em escrito em Python. Estes podem ser tamb´em utilizados.
8
a = "H "Hel ello lo" " b = "w "wor orld ld" " print print a,b
E a seguir, execute-o da seguinte forma: % python python hello. hello.py py
Ou seja, execute o interpretador e passe como parˆametro o nome do arquivo que cont´em em o codigo o´ digo a ser executado. O resultado impresso deve ser: Hello Hello world world
Perceba bem que n˜ao ao h´a preˆambulo ambulo algum algum no c´odigo-fonte; odigo-fonte; escrev escrevemos emos diretamente diretamente o c´odigo odigo 5 a ser executado . Nas pr´oximas oxi mas sec s ec¸ oes o˜ es do tutorial, estaremos utilizando bastante bastante o modo shell; no entanto, para exerc´ıcios ıcios e exemplos exemplo s mais extensos que algumas al gumas linhas, lin has, vale a pena usar m ´odulos odulos para permitir edic ed ic¸ ao a˜ o e revis˜ao. ao.
2.3 2.3
Tipo Tipos, s, va vari ri´aveis a´ veis e valores
Nomes de vari´aveis aveis comec¸am ¸am sempre com uma letra, n˜ao ao cont´em em espac¸os, ¸o s, e assim ass im como co mo tudo t udo em Python, s˜ao ao sens´ıveis ıveis a caixa ( case-sensitive) — em outras palavras, min´uscula usculass e mai mai usculas u´ sculas fazem, sim, diferenc di ferenc¸ a. Como explicado anteriormente, anter iormente, a vari´ vari avel a´ vel n˜ao ao precisa ser pr´e-declarada e-declarada e seu tipo e´ determinado dinamicamente.
2.3. 2.3.1 1
Tipos ipos num num ericos e´ ricos
Tipos num´ericos ericos representam valores num´erico ericos. s. Em Pytho Python n h´a alguns tipos num´ericos ericos pr´eedefinid definidos: os: inteiro inteiross (int), n´umeros umeros de ponto flutuante ( float), boolea booleanos nos ( bool ) e complexos (complex). Estes Estes tipos suportam suportam as operac operac¸ oes o ˜ es matem´aticas aticas comuns como adic¸ ao, a˜ o, subtrac subt rac¸ ao, a˜ o, multip mul tiplic licac ac¸ao a˜ o e divis˜ao, ao, e podem ser convertidos entre si. Uma obse o bservac rvac¸ ao: a˜ o: booleanos foram adicionados na vers˜ao ao Python Pyt hon 2.2; 2.2 ; sua utilizac utili zac¸ ao a˜ o e´ normalmente associada a express˜oes oes condiciona condicionais. is. Maiores Maiores detalhes detalhes sobre este tipo est˜ao ao dispo di spon´ n´ıveis ıve is na sec¸ ao a˜ o 2.4.4. A seguir segui r alguns alg uns exemplos de criac cri ac¸ ao a˜ o de vari´aveis aveis num´ericas: ericas: >>> >>> >>> >>>
a = 1 preco = 10.99 t = True i = 4+3j
# # # #
valor valor valor valor
5
inteiro ponto flutuante, ou float. booleano complexo
Em Unix, ´e poss´ı vel criar programas programas em Python e execut´a-los execut´a-los usando usando apenas o nome do m´odulo (sem digitar o nome do interpretador python). Basta Basta adicionar a linha ‘m´agica’ ‘m´agica’ #!/usr/bin/env #!/usr/bin/env python ao in´ı cio do m´odulo e dar permiss˜ao de execuc¸ ˜ao ao arquivo. arquivo. Note que isto n˜ao evita evita que seja necess´ario necess´ario que o interpretado interpretadorr esteja instalado no sistema; apenas permite que se possa omitir digitar o seu nome.
9
Valores inteiros podem tamb´em em ser fornecidos em base octal e hexadecimal: >>> >>> >> > 57 >>> >>> >> > 255
a = 071 prin pr int t a a = 0xFF prin pr int t a
Para ser considerado um float, o n´umero umero deve possuir um ponto e uma casa decimal, mesmo que seja seja zero. zero. O fato de ser conside considerad rado o um float float ´e importante para a operac¸ ao a˜ o divis˜ao, ao, pois dependendo do tipo dos operandos, a divis˜ao e´ inteira ou em ponto flutuante. ˜ >>> 5 / 2 # divis ao ao inteir inteira, a, result resultado ado inteir inteiro o 2 ˜ >>> 5 / 2. 2.0 # di divis ao a o em po pont nto o fl flut utua uant nte e 2.5 >>> 5 * 2.13 10.649999999999999
Aten At encc¸ ao a˜ o especial para este terceiro exemplo, que demonstra uma particularidade da represent repr esentac ac¸ ao a˜ o e impress˜ao a o de n´umeros umeros de ponto flutua flutuante. nte. Numeros u ´ meros deste tipo, como o valor 2.13 do exemplo, exempl o, possuem poss uem uma representac¸ ˜ao ao interna particular devido a` natureza nat ureza dos intr´ i ntr´ınseca ınseca dos computadores comp utadores digitais; digitai s; operac¸ oes o ˜ es realizadas sobre eles tˆem em precis˜ao ao limitada, e por este motivo o resultado impresso diverge ligeiramente do resultado resultado aritmeticamente aritmeticamente correto. correto. Na pr atica, a´ tica, o resultado obtido e´ prati6 camente equivalente equivalente a 10.65 .
Determinando o tipo de uma vari avel a´ vel usar a func f unc¸ ao a˜ o type():
Para descobrir o tipo atual de uma vari´avel, avel, pode-se
>>> a = 1 >>> print print type(a type(a) ) ’int’> >>> a = "hum" >>> print print type(a type(a) ) >
Uma das vantagens de Python s˜ao ao os tipos complexos que vˆem e m pr´e-definidos, e-definidos, introduzidos na sec¸ ao a˜ o 1.1.2. 1. 1.2. As sec¸ oes o ˜ es seguintes cobrem estes tipos. 6
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 sobr e as nuances nuan ces do uso e representac represe ntac¸ ˜ao de n ´umeros de ponto po nto flutuante. utuante .
10
2.3. 2.3.2 2
Lista Listass
seq ¨u ˆencia encia: um conjunto linear A lista e´ uma seq ¨ linear (como um vetor em outras outras linguage linguagens) ns) de valores valores indexad indexados os por um n´umero umero inteiro. Os ´ındices ındices s˜ao ao iniciado iniciadoss em zero e atribu´ıdos ıdos seq¨ sequencialmente u¨ encialmente a part partir ir dest deste. e. A lista lista pode pode cont conter er quai quaisq sque uerr valor alores es,, incl inclui uind ndo o valo valore ress de tipos tipos mist mistos os,, e at´e outra outrass listas. Para criar uma lista, usamos colchetes e v´ırgulas ırgulas para enumerar os valores: >>> >>> >> > >>> >> > >>> >> >
numero nume ros s opco op coes es mode mo delo los s list li stas as
= = = =
[1, 2, 3] ["na [" nao" o", , "s "sim im", ", "talv "talvez ez"] "] [3.1 [3 .1, , 3. 3.11 11, , 95 95, , 98 98, , 20 2000 00, , "M "Mil ille leni nium um", ", "X "XP" P"] ] [num [n umer eros os, , op opco coes es] ]
Neste exemplo exemplo criamos quatro listas diferentes, com elementos de tipos diversos. diversos. A quarta lista tem como elementos outras listas: em outras palavras, ´e uma lista de listas: >>> print print listas listas [[1, [[ 1, 2, 3] 3], , [’ [’na nao’ o’, , ’s ’sim im’, ’, ’t ’tal alve vez’ z’]] ]]
Para acessar um elemento elemen to espec´ıfico ıfico de uma lista, li sta, usamos usam os o nome no me da lista l ista seguido segui do do ´ındice ındice entre colchetes: >>> print print numero numeros[0 s[0] ] 1 >>> print print opcoes opcoes[2] [2] talvez >>> print print modelo modelos[4 s[4] ] 2000
Usando Usand o ´ındices ındi ces negativos, negat ivos, as a s posic p osic¸ oes o ˜ es s˜ s ao a˜ o acessadas a partir do final da lista, -1 indicando o ultimo u´ ltimo elemento: >>> print print numero numeros[s[-1] 1] 3 >>> print print modelo modelos[s[-2] 2] Millenium
Python oferece um mecanismo para criar ‘fatias’ de uma lista, ou slices. Um slice e´ uma lista gerada gerada a partir de um fragmento fragmento de outra outra lista. O fragmento fragmento ´e especificado especi ficado com co m dois ´ındices, ındices, separados por dois pontos; pontos; o slice resultante resultante cont´em em os elementos cujas posic p osic¸ oes o ˜ es v˜ao ao do primeiro ´ındice ındice ao segundo, segundo, n˜ao ao incluindo o ultimo u ´ ltimo elemento. elemento. Se omitirmos omitirmos um dos ´ındices ındices no slice, slice, assume-se in´ıcio ıcio ou fim da lista. li sta. >>> print print numero numeros[: s[:2] 2] [1, [1 , 2] >>> print print opcoes opcoes[1: [1:] ] [’sim’, [’sim’, ’talvez’] ’talvez’] >>> print print modelo modelos[1 s[1:5] :5] [3.10000 [3.100000000 00000000 0000001, 001, 95, 98, 2000] 2000]
11
Note que o terceiro exemplo demonstra a mesma particularidade referente `a `a represent repr esentac ac¸ ao a˜ o de n´umeros umeros de ponto flutuante, descrita na sec¸ ˜ao ao 2.3.1: 2.3.1: ao imprimir imprimir a lista, lista, Python Python exibe exibe a repres rep resen enta tacc¸ao ao impressos com precis˜ao ao com˜ interna dos seus elementos, e portanto, floats s˜ao pleta.
Metodos e´ todos da Lista Na sec¸ ao a˜ o 1.1.5 introduzimos introduzimos um conceito conceito central da linguage linguagem: m: ‘tudo ´e um objeto´; uma lista em Python, sendo um objeto, possui um conjunto de operac¸ ˜oes oes pr´oprias oprias e´ todo e´ usado para descrever operac que manipulam seu conte´udo. udo. O nome metodo o perac¸ oes o ˜ es de um objeto; metodos e´ todos s˜ao ao acessados no c´odigo-fonte odigo-fonte digitando-se um ponto ap´os os o nome da vari´avel, a vel, e a seguir o nome do m´etodo. etodo. Para executar (ou chamar ) um m´etodo, etodo, usamos parˆenteses enteses ap´os os seu nome, fornecendo argumentos mentos conforme conforme necess´ necess´ario. ario. Abaixo Abaixo s˜ao ao exemp exemplifi lifica cados dos dois dois exemp exemplos los de chama chamada dass de m´etodos etodos em listas: >>> >>> [1, >>> >>> [0,
numeros. numeros.appen append(0) d(0) print print numero numeros s 2, 3, 0] numeros. numeros.sort( sort() ) print print numero numeros s 1, 2, 3]
Observe Obser ve com co m atenc at enc¸ ao a˜ o este exemplo, que demonstra os conceitos fundamentais descritos nos par´agrafos agrafos anteriores:
• O m´etodo etodo append(v) recebe como argumento um valor, e adiciona este valor ao final da lista.
• O m etodo e´ todo sort() ordena a lista, modificando-a. N˜ao ao recebe argumentos. A lista possui uma s´erie erie de outros m´etodos; etodos; consulte a referˆencia encia Python para uma um a descric descri c¸ ao a˜ o completa (e veja tamb´em em a func fun c¸ ao a˜ o dir() na sec se c¸ ao a˜ o 4.4).
2.3.3 2.3.3
Tuplas uplas
A tupla e´ uma seq¨uˆ uencia, eˆ ncia, como a lista: armazena um conjunto de elementos acess´ıveis ıveis por um ´ındice ındice inteiro. in teiro. A tupla e´ imut´avel; avel; uma vez criada, n˜ao ao pode ser modificada. Para criar uma tupla use parˆenteses, enteses, e v´ırgulas ırgulas para p ara separar seus elementos: element os: >>> t = (1, 3, 5, 7) >>> >> > pr prin int t t[ t[2] 2] 5
A tupla e´ utilizada em algumas situac sit uac¸ oes o ˜ es importantes: como a lista de argumentos de uma func fu nc¸ ao a˜ o ou m´etodo, etodo, como chave em dicion´arios, arios, e em outros casos onde fizer sentido ou for mais eficiente um conjunto fixo de valores.
12
2.3. 2.3.4 4
Stri String ngss
A string, string, como citado anteriorme anteriormente, nte, e´ uma seq¨uˆ uencia ˆencia imut´avel avel com um prop´osito osito especial: armazenar cadeias de caracteres. >>> a = "M >>> "Mon ondo do Bi Biza zarr rro" o" >>> >> > pr prin int t a Mondo Mondo Bizarro Bizarro
Strings podem ser delimitadas tanto com aspas simples quanto duplas; se delimitamos com aspas aspas duplas, podemos podemos usar as aspas simples simples como parte literal da string, string, e vice-versa. vice-versa. Para Para inserir na string aspas literais do mesmo tipo que o delimitador escolhido, prefixe-as com uma contra-barra \. As atribui at ribuicc¸ oes o˜ es abaixo abaixo s˜ s ao a˜ o equivalentes: equivalentes: >>> b = "A >>> "All ll’s ’s qu quie iet t on th the e ea east ster ern n fr fron ont. t." " >>> >> > c = ’All ’All\’ \’s s qu quie iet t on th the e ea east ster ern n fr fron ont. t.’ ’ >>> b == c True
S˜ao ao usados caracteres especiais para denotar quebra de linha ( \n), tabul t abulac ac¸ ao a˜ o ( \t) e outros. ´ o pr >>> a = "H >>> "Hoj oje\ e\n\ n\t t e prim imei eiro ro di dia. a." " >>> >> > pr prin int t a Hoje ´ o pr e prim imei eiro ro di dia. a.
Para criar uma string com m´ultiplas ultiplas linhas, e´ util u´ til o delimitador aspas triplas: as linhas podem ser quebradas diretamente, e a string pode ser finalizada com outras trˆes aspas consecutivas: consecutivas: a = "" """I "I we wear ar my su sung ngla lass sses es at ni nigh ght t So I can so I can Keep Ke ep tr trac ack k of th the e vi visi sion ons s in my ey eyes es"" """ "
Finalmente, como toda seq¨uˆ uencia, eˆ ncia, a string pode ser indexada ou dividida em slices, usando o operador colchetes: >>> a = "Anticons "Anticonstitu tituciona cionaliss lissimame imamente" nte" >>> >> > pr prin int t a[ a[0] 0] A >>> >> > pr prin int t a[ a[13 13] ] i >>> >> > pr prin int t a[ a[:4 :4] ] Anti >>> print print a[-5:a[-5:-1] 1] ment
A string possui um operador especial, a porcentagem ( %), que ser´a descrito na sec¸ ao a˜ o 2.4.6. Possui ainda um grande n´umero umero de m´etodos, etodos, descritos em detalhes detal hes na sec¸ ˜ao ao String Methods do manual de referˆencia encia Python. 13
2.3. 2.3.5 5
Dici Dicion on´arios a´ rios
Um dicion´ario ario representa uma colec¸ ao a˜ o de elementos elementos onde onde ´e poss´ıvel ıvel utilizar utili zar um ´ındice ındice de qualquer tipo imut´avel, avel, ao contr´ario ario da lista, onde ´ındices ındices s˜ao ao sempre inteiros seq¨uencialmente uencialmente ´ costumeiro usar os termos chave e valor (key/value) para descrever os elemenatri at ribu´ bu´ıdos. ıd os. E tos de um dicion´ario ario - a chave ´e o ´ındice, ındi ce, e o valor, val or, a informa inf ormacc¸ ao a˜ o correspondente `aquela aquela chave. Para declarar dicion´arios, arios, utilizamos utili zamos o s´ımbolo ımbolo chaves, separando o ´ındice ındice do valor por dois d ois pontos e separando s eparando os pares ´ındice-valor ındice-valor por v´ırgulas: ırgulas: ´" : "caf e", ´ ˜ >>> re >>> refe feic icoe oes s = {" {"ca caf fe e", "almoc "almoc ¸ o" : "m ¸o" "mac acar arr r ao", ao", ... "jantar" : "sopa"} >>> print print refeicoes refeicoes["alm ["almoc oc ¸o"] macarrao >>> pr prec ecos os_m _mod odel elo os = {98 : 89 89, , 99 : 11 119 9, 20 2000 00 : 19 199} 9} >>> print print precos_mo precos_modelos delos[98] [98] 89
Neste exemplo criamos dois dicion´arios arios com trˆes es elemen elementos tos cada cada um. As chave chavess do dicion´ario ario refeicoes s˜ao ao as strings ”caf´e”, e”, ”almoc¸o”e ¸o”e ”jantar”, e os valores respectivos, respectivos, as strings ”caf´e”, e”, ”macarr˜ao”e ao”e ”sopa”.
Metodos e´ todos do Dicion´ Dicionario a´ rio
O dicion´ario ario tamb´em em possui alguns m´etodos etodos not´aveis: 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; ario; • items() retorna uma lista de tuplas com o conte´udo udo do dicion´ario, ario, cada tupla contendo um par (chave, valor); >>> precos_modelos.keys() precos_modelos.keys() [99, [9 9, 98 98, , 20 2000 00] ] >>> precos_modelos.values() precos_modelos.values() [119 [1 19, , 89 89, , 19 199] 9] # A or orde dem m do dos s el elem emen ento tos s re reto torn rnad ados os po por r ke keys ys() () e ´ ar ´ ˜ # values values() () e arbi bitr tr´ a ria; aria ; nao a o co conf nfie ie ne nela la. .
• has key(k) verifica se a lista possui aquela chave: >>> precos_modelos.has_key(98) precos_modelos.has_key(98) True >>> precos_modelos.has_key(97) precos_modelos.has_key(97) False
• update(d2) atualiza o dicion´ario ario com base em um segundo dicion´ario ario fornecido como parˆametro; ametro; elementos do dicion´ario ario original que tamb´em em existem no segundo s˜ao ao atualizados; elementos que existem no segundo mas que n˜ao ao existem no original s˜ao ao adicionados a este. 14
>>> precos precos_mo _model delos. os.upd update ate({2 ({2000 000 : 600, 600, 2001: 2001: 700}) 700}) >>> print print precos_mo precos_modelos delos {99: {9 9: 40 400, 0, 98 98: : 30 300, 0, 20 2001 01: : 70 700, 0, 20 2000 00: : 60 600} 0}
No exemplo acima, observe que a chave 2000 foi atualizada, e 2001, acrescentada. ´ poss´ıvel E ıvel usar o dicion´ario ario como uma estrutura de dados simples, com campos para cada info in forma rmacc¸ ao a˜ o a ser armazenada. Por exemplo, para armazenar informac¸ ˜ao ao sobre um produto hipot´etico, etico, com c´odigo, odig o, descric descr ic¸ ao a˜ o e prec pre c¸ o: ´ >>> pr >>> prod odut uto o = {" {"c c odigo":7 odigo":771, 71, "desc":" "desc":"Copo Copo", ", "prec "prec ¸o":10.22} ´ >>> print print produt produto[" o["c c odigo"] odigo"] 771 >>> print print produto[" produto["desc" desc"] ] Copo
´ um padr˜ao E ao comum criar listas de dicion´arios arios neste formato, cada ´ıtem ıtem na lista l ista correspondendo a um produto em particular.
2.4 2.4
Oper Operad ador ores es
O pr´oximo oximo t´opico opico essencial da linguagem s˜ao ao operadores , s´ımbolos ımbolos que q ue operam sobre vari aveis a´ veis e valores.
2.4.1 2.4.1
Operad Operador ores es aritm aritm´eticos e´ ticos
A maior parte dos operadores aritm´eticos eticos em Python funciona de maneira intuitiva e an´aloga aloga aos operadores em outras linguagens. Demonstrando por exemplo: >>> print a + 3 10 >>> print a - 2 5 >>> print a / 2 3
# adic ¸˜ ao ao
>>> print a / 2.5 2.8
˜ # divis ao a o em po pont nto o fl flut utua uant nte: e: pelo pelo # menos um argumento deve ser float
>>> print a % 4 3 >>> print a * 2 14 >>> print a ** 2 49
˜ # resto da divis ao ao inteir inteira a
# subtrac ¸˜ ao ao ˜ # divis ao ao inteir inteira: a: argume argumento ntos s inteir inteiros os # e resultado inteiro
# multiplicac ¸˜ ao ao # exponenciac ¸˜ ao ao
15
A exponenci expon enciac ac¸ ao a˜ o tamb´em em pode ser feita por meio de uma func¸ ˜ao, ao, pow(), como descrito na sec¸ ao a˜ o 3. A raiz quadrada e outras func¸ oes o ˜ es matem´aticas aticas est˜ est ao a˜ o implementadas no m´odulo odulo math; veja vej a a sec¸ ao a˜ o 5 para maiores detalhes. Com excec exc ec¸ ao a˜ o da d a exponenc exp onenciac iac¸ ao a˜ o e da divis˜ao ao inteira, estes operadores s˜ao ao bastante comuns em linguagens de programac p rogramac¸ ao. a˜ o. Os operadores aritm´eticos eticos podem ser usados em floats tamb´em: em: >>> a = 1.15 >>> print a / a - a * a + a 0.57349375
e os operadores de adic adi c¸ ˜ao ao ( +) e mult m ultipl iplicac icac¸ao a˜ o ( *), em strings: >>> a = "e "exa xat to" >>> print a * 2 exatoexato >>> pr prin int t "q "qua uas se " + a quase quase exato 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 exemplificado exempl ificado acima, o operador operado r adic adi c¸ ao a˜ o (e multipl mult iplicac icac¸ ao) a˜ o) serve para concatenar concatenar listas, tuplas tuplas e string strings. s. N˜ao ao pode ser utilizado com dicion´arios arios (que podem ser atualizados usando a func fu nc¸ ao a˜ o update(), mas para os quais quai s a operac¸ ˜ao ao de d e concat co ncatenac enac¸ ao a˜ o n˜ao ao faria sentido).
2.4.2 2.4.2
Operador Operadores es sobr sobree cadeias cadeias de bits
Para inteiros, existem operadores que manipulam seus valores como cadeias de bits (operadores bit-wise) de acordo com a aritm´etica etica booleana: >>> a = 0xa1 >>> b = 0x01 >>> >> > pr prin int t a, b 161, 16 1, 1
# pa para ra im impr prim imir ir os va valo lore res s de deci cima mais is
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 a o em co comp mple leme ment nto o de 2
Note que a representac¸ ao a˜ o dos valores inteiros, por padr˜ao, ao, e´ decimal: aqui, embora fornecemos os valores em base hexadecimal, os resultados aparecem na base 10.
2.4.3
Operadores de atribuic¸ ˜ ao
O operador mais simples, e que j´a fui utilizado em diversos exemplos anteriores, ´e o operador de atri at ribui buicc¸ao. a˜ o. Este operador ´e representado por um unico u ´ nico s´ımbolo ımbolo de igualdade, =, definindo uma vari´avel avel e automaticamente atribuindo a ela um valor. O exemplo abaixo define uma vari´avel 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 bit-wi se introduzidos int roduzidos nas sec¸ oes o˜ es anteriores. anteriores. Estas formas formas foram introduzid introduzidos os na vers˜ao ao Python 2.0, e existem primariamente para oferecer uma maneira conveniente de re-atribuir um valor transformado a uma vari´avel. avel. A sintaxe para o operador combinado utiliza utili za o s´ımbolo ımbolo do operador aritm´ aritm ´etico/bit-wise etico/bit-wise relevante levante,, seguido seguido da igualdade igualdade.. Este operador operador combinad combinado o efetua efetua a operac operac¸ ˜ao ao sobre o valor da vari´avel, avel, j´a atribuindo o resultado a esta mesma. Exemplificando: >>> >>> >>> >> > 2 >>> >>> >> > 1 >>> >>> >> > 10
2.4.4 2.4.4
a = 1 a += 1 prin pr int t a a /= 2 prin pr int t a a *= 10 prin pr int t a
Operador Operadores es condicion condicionais ais
Tradicionalmente, Tradicionalmen te, programac¸ ao a˜ o envolve testar valores (e tomar decis˜oes oes com base no resultado do teste). teste). Um teste teste e´ essen essencia cialme lmente nte uma expre express˜ ss˜ao ao condici condicion onal al que tem um result resultad ado o verda verdade deiro iro ou falso. Esta sec¸ ao a˜ o descreve os operadores condicionais mais comuns em Python. 17
A partir da vers˜ao ao 2.2 de Python Python,, existe um tipo num´erico erico que representa o resul´ tado tado de um teste teste condic condicion ional: al: o tipo tipo boole booleano ano.. E um tipo basta bastante nte simple simples, s, possui possuindo ndo apenas dois valores poss´ıveis: ıveis: True e False. A partir partir da da vers˜ vers˜ao ao 2.3 de Python, qualquer qual quer comparac comp arac¸ ao a˜ o retorna um valor booleano; vers˜oes oes anteriores retornavam 1 ou 0, respectiv respectivamen amente. te. Na pr´atica, atica, o resultado ´e equivalente, ficando apenas mais expl´ıcito ıci to e leg´ıvel ıvel o resulta resu ltado. do.
Igualdade >>> print False >>> print True >>> pr prin int t True >>> pr prin int t True
2 == 4
# igualdade
2 != 4
# diferente de
"a" "a " == "a "a" " "a" "a " != "b "b" "
Comp Co mpar arac ac¸ ˜ ao >>> print 1 < 2 True >>> print 3 > 5 False >>> print 3 >= 4 False
# menor que # maior que # maior ou igual que
Compar Com parac ac¸ oes o˜ es podem ser realizadas tamb´em em com outros tipos de vari´aveis; aveis; para strings, listas ou dicion´arios, arios, as comparac¸ oes o˜ es ‘maior que’ e ‘menor que’ se referem ao n´umero umero e ao valor dos elementos, mas por n˜ao ao serem terrivelmente claras n˜ao ao s˜ao ao muito freq¨uentemente uentemente usadas 7 . >>> [2 >>> [2,2 ,2,3 ,3] ] < [2 [2,3 ,3,2 ,2] ] True >>> >> > "a "aba baca cate te" " < "p "per era" a" True
Dica: quan quando do comp compar aran ando do o n´umer u mero o de elem elemen ento toss de uma uma seq¨ seq¨uˆ uenci eˆ nciaa ou dici dicion´ on´ario, ario, e´ normalmente normalment e utilizada uti lizada a func f unc¸ ao a˜ o len(), que retorna o ‘comprimento’ da seq¨uˆ uencia. eˆ ncia. Presenc Pres enc¸ a em Seq ¨ Seq ¨u ˆencias encias Para seq¨uˆ uencias eˆ ncias e dicion´ dicion´arios, arios, existe o operador in, que verifica se o elemento est´a contido no conjunto; no caso do dicion´ario, ario, o operador testa t esta a presenc¸ a do valor valo r na seq¨uˆ uencia ˆencia de chaves. chaves. >>> "x >>> "x" " in "c "cha ha" " False >>> >> > 1 in [1 [1,2 ,2,3 ,3] ] True 7
A excec¸ ˜ao ´obvia ´e na ordenac¸ ˜ao de seq¨uˆencias contendo elementos destes tipos.
18
2.4.5 2.4.5
Operad Operador ores es logicos o´ gicos
Os operadores l´ogicos ogicos not, and e or permitem modificar e agrupar o resultado de testes condicionais: >>> no >>> nome me = "p "ped edro ro" " >>> id idad ade e = 24 >>> >> > no nome me == "p "ped edro ro" " an and d id idad ade e == 25 False >>> no nome me == "pe pedr dro" o" an and d id ida ade < 25 True >>> >> > le len( n(no nome me) ) < 10 or no not t no nome me == "p "ped edro ro" " False
Estes operadores s˜ao ao utilizados utilizados com freq¨ frequˆ u¨ encia eˆ ncia nas estruturas est ruturas de d e controle descritas na sec¸ ˜ao ao 2.5.
Comb Co mbin inac ac¸ ˜ ao de operadores Python oferece uma forma fo rma impl´ i mpl´ıcita ıcita de combinar comb inar operac¸ oes o˜ es condicionais, sem o uso de operadores l´ogicos. ogicos. Por exemplo, exemplo, para verificar verificar se um valor valor est´a entre dois extremos, pode-se usar a seguinte sintaxe: if 0 < a < 10: prin pr int t "E "Ent ntre re ze zero ro e de dez" z"
Podem Podem tamb´em em ser comparados comparados diversos diversos valores simultaneamente: if a == b == c: ˜ ˆ prin pr int t "S "S˜ ao identicos" enticos"
e mesmo combinados operadores comparativos com operadores de igualdade: if a == b <= c: ˜ ˆ prin pr int t "S "S˜ ao identicos" enticos"
Esta express˜ao ao verifica se a e´ igual a b e al´em em disso, se b e´ menor ou igual a c.
2.4.6
Substituic¸ ˜ ao em strings: o operador %
Uma operac oper ac¸ ao a˜ o muito util u´ til para processamento de texto ´e a substit subs tituic uic¸ ao a˜ o de s´ımbolos ımbolos em strings. st rings. ´ particularmente adequada para gerarmos strings formatadas contendo algum valor vari´avel, E avel, como o cl´assico assico formul´ario: ”Nome: Idade: anos”. 1. Escreve-se Escreve-se a string normalmente, usando um s´ımbolo ımbolo especial no lugar da lacuna:
• %d: para substituir inteiros • %f: para substituir floats 19
• %s: para substituir outra string >>> a = "To >>> Tot tal de ite tens ns: : %d" >>> >> > b = "Cu Cus sto to: : %f %f" "
2. Para efetuar a substituic¸ ao, a˜ o, aplica-se um operador % sobre a string contendo o s´ımbolo ımbolo de forma fo rmata tacc¸ ao, a˜ o, seguido do valor ou vari´avel avel a substituir: >>> print a % 10 Tota To tal l de it iten ens: s: 10
Como pode ser visto, o s´ımbolo ımbolo e´ substitu´ıdo ıdo pelo valor fornecido. Podem ser utilizados tanto valores expl´ıcitos ıcitos quanto vari´ variaveis a´ veis para a substit s ubstituic uic¸ ao: a˜ o: >>> cu >>> cust sto o = 5. 5.50 50 >>> >> > pri rint nt b % cu cust sto o Custo: Custo: 5.500000 5.500000
Caso sejam m´ultiplos ultiplos valores a substituir, use uma tupla: >>> pr >>> prin int t "C "Cli lien ente te: : %s %s, , Va Valo lor r %f %f" " % (" ("hu hung ngry ry.c .com om", ", 40 40.3 .30) 0) Fornecedo Fornecedor: r: hungry.co hungry.com, m, Custo Custo 40.300000 40.300000
Este operador permite ainda utilizar um n´umero umero junto j unto ao s´ımbolo ımbolo porcentagem para reservar res ervar um tamanho total a` string: >>> a = "Q >>> "Qua uant ntid idad ade: e: %4 %4d" d" >>> print a % 3 >>> print a % 53 >>> print a % 120 Quantidade: 3 Quantidade: 53 Quan Qu anti tida dade de: : 12 120 0
´ poss´ E p oss´ıvel ıvel control cont rolar ar a form f ormatac atac¸ ao a˜ o de tipos num´ericos ericos de maneira especial atrav´es es de modificadores nos s´ımbolos ımbolos no formato f ormato m .n. Como acima, m indica o total de caracteres reservados. Para floats, n indi indica ca o n´umero umero de casas casas decim decimais; ais; para para inteiros, inteiros, indica indica o tamanho tamanho total do do n´umero, umero, preenchido com zeros `a esquerda. Ambos os modificadores podem ser omitidos. >>> e = 2. 2.73 731 13 >>> p = 3. 3.14 141 15 >>> sete = 7 >>> print "Euler: %.7f" % e Euler: Euler: 2.731300 2.7313000 0 >>> print "Pi: %10.3f" % p Pi: 3.142 >>> pri print "Se "Sete: %10 %10.3d" % sete Sete: 007
20
# 7 casas decimais # 10 espac¸o ¸os, s, 3 ca casa sas s ´ # 10 es espac¸os, 3 d ıgitos ıgitos ´ um in # (e inte teir iro) o)
2.5
Estrut Estrutur uras as de contr controle ole
Toda linguagem de programac¸ ao a˜ o possui instruc¸ oes o˜ es que controlam controlam o fluxo de execuc execuc¸ ˜ao; a o; em Python, Python, h´ h a´ um conjunto conj unto pequeno e poderoso podero so de instruc ins truc¸ ˜oes, oes, descritas nas sec¸ oes o ˜ es a seguir.
2.5.1
Condicional: a instruc¸ ˜ ao if
A inst i nstru rucc¸ ao a˜ o condicional b´asica asica de Python e´ o if. A sintaxe ´e descrita a seguir (lembrando que a inden in dentac tac¸ ao a˜ o e´ que delimita o bloco): ˜ if condic condic ¸ao: ao: ´ # bloco de c odigo odigo ˜ elif elif condic condic ¸ao: ao: # ou outr tro o bl bloc oco o else: # bl bloc oco o fi fina nal l
As cond c ondic ic¸ oes o˜ es acima s˜ao ao comparac comp arac¸ oes o˜ es feitas utilizando os operadores condicionais descritos na sec sec¸ ao a˜ o 2.4.4, possivelmente combinados por meio dos operadores l´ogicos ogicos descritos na sec¸ ao a˜ o 2.4.5. a = 2 b = 12 if a < 5 and b * a > 0: print print "ok" "ok"
sen ˜ ao se A inst i nstruc ruc¸ ao a˜ o elif permite que se inclua uma excec¸ ˜ao ao condicional — algo como ”... sen ˜ isso ...”. O else ´e uma u ma excec exce c¸ ao a˜ o absoluta 8 . if nome nome == "p "ped edro ro": ": idad id ade e = 21 ´ elif el if no nome me == "j "jos os´ e": e": idad id ade e = 83 else: idade = 0 ´ nome="alvaro" alvaro" para o bloco acima, ser´a atribu´ Provendo nome="´ at ribu´ıdo ıdo o valor valo r zero a idade.
2.5.2
Lac¸o ¸o iterativo: for
H´a apenas dois tipos de lac¸ os em Python: for e while. O primeiro tipo, mais freq¨uentemente uentemente utilizado, percorre uma seq¨uˆ uencia eˆ ncia em ordem, a cada ciclo substituindo a vari´avel especificada por um dos elementos. Por exemplo: 8
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.
21
>>> jan_ke jan_ken_p n_pon on = ["pedr ["pedra", a", "papel "papel", ", "cenou "cenoura" ra"] ] >>> >> > fo for r it item em in ja jan_ n_ke ken_ n_po pon: n: ... print item ... pedra papel cenoura
A cada c ada iterac iter ac¸ ao, a˜ o, item recebe o valor de um elemento da seq¨uˆ uencia. eˆ ncia. Para efetuar efetu ar uma lac¸ o com um n´umero umero fixo de iterac¸ oes, o˜ es, costuma-se usar o for em conjunto con junto com a func¸ ao a˜ o range, que gera seq¨uˆ uencias eˆ ncias de n´umeros: umeros: >>> fo >>> for r i in ra rang nge( e(1, 1,4) 4): : ... print "% "%da vo volta" % i ... 1a vo volt lta a 2a vo volt lta a 3a vo volt lta a
Iterac¸ ˜ ao em dicionarios a´ rios Para iterar em dicion´arios, arios, podemos usar as func¸ oes o ˜ es keys() ou values() para gerar uma lista: >>> di >>> dict ct = {" {"ba bata tata ta": ": 50 500, 0, "a "ab b obora": ´ obora": 1200, 1200, ... "cebola": 800} >>> >> > fo for r e in di dict ct.k .key eys( s(): ): ... prin pr int t "It Item em: : %8s Peso Peso: : %8 %8s" s" % (e (e, , dic ict[ t[e e]) Item: cebola Peso: 800 Item: batata Peso: 500 ´ Item It em: : ab ab´ o bora obor a Pes Peso: 120 200 0
Note que porque o dicion´ario ario em si n˜ao ao possui um conceito de ordem, a lista que resulta do metodo e´ todo keys() possui poss ui ordenac orde nac¸ ao a˜ o arbitr´aria. aria. Por este motivo, no exemplo acima, o lac¸o ¸o n˜ao ao segue a declar de clarac ac¸ ao a˜ o do dicion´ario. ario.
Controle adicional em lac¸os ¸o s Para ambos os tipos de lac¸o, ¸o, existem duas instruc¸ oes o ˜ es de controle adicional, continue e break. A primeira reinicia uma nova iterac¸ ao a˜ o imediatamente, interrompendo interr ompendo a iterac¸ ao a˜ o atual; a segunda faz o lac¸ o terminar termi nar imediatamente. imed iatamente. A forma geral do lac¸ o for e: e´ : ´ ¨encia: ˆ for fo r vari vari´ a vel in se avel seq qu encia: ´ # bloco de c odigo odigo else: # bl bloc oco o ex exec ecut utad ado o na au aus sˆ e ncia enci a de um br brea eak k
Note a presenc pr esenc¸ a da cl´ cl ausula a´ usula else . Esta Esta cl´ausula ausula e´ executa exe cutada da quando quand o a sa´ıda ıda do lac¸ o n ao ˜ for determinada por uma instru ins trucc¸ ao a˜ o break. Um exemplo clarifica este mecanismo: 22
valores = [2, 4, 5, 2, -1] for fo r i in va valo lore res: s: if i < 0: prin pr int t "N "Neg egat ativ ivo o en enco cont ntra rado do: : %d %d" " % i break else: print print "Nenhum "Nenhum negativo negativo encontrad encontrado" o"
2.5.3
Lac¸o ¸o condicional: while
O segundo tipo de lac¸o, ¸o , while, e´ utilizado quando necessitamos fazer um teste a cada iterac¸ ˜ao ao do lac la c¸ o. ˜ while while condic condic ¸ao: ao: ´ # bloco de c odigo odigo else: # bl bloc oco o ex exec ecut utad ado o na au aus sˆ e ncia enci a de um br brea eak k
Como o lac¸ o for, o while whi le possui uma cl ausula a´ usula else. Um exemplo do uso de while segue: >>> m = 3 * 19 >>> n = 5 * 13 >>> >> > co cont ntad ador or = 0 >>> while m < n: ... m = n / 0.5 ... n = m / 0.5 ... contador = con contador + 1 ... >>> >> > pr prin int t "I "Ite tera ramo mos s %d ve veze zes. s." " % co cont ntad ador or Iteram Iteramos os 510 vezes. vezes.
N˜ao a o h´a uma instruc¸ ao a˜ o especial para efetuar um lac¸o ¸o com teste ao final da iterac¸ ˜ao ao (como o ... while() em C ), mas lac¸ o do ... mas pode pode-se -se usar usar um while while infinito infinito — usand usando o uma condi condicc¸ ˜ao ao verdadeira, fixa — em combinac com binac¸ ao a˜ o com um teste e break internos: >>> l = [" ["a" a", , "b" b", , "c" c"] ] >>> i = len(l) - 1 >>> >> > wh whil ile e Tr True ue: : ... print l[i] ... i = i - 1 ... if i < 0: ... break ... c b a
23
Veracidade e falsidade falsi dade de condic¸ ˜ oes As estruturas if e while utilizam utili zam condic¸ oes o˜ es l´ogicas ogicas para controle, controle, avalian avaliando-a do-ass de maneira booleana. booleana. Como qualquer qualquer valor valor ou express˜ express˜ao pode ser usado como condic condi c¸ ao, a˜ o, e´ importante impor tante entender ent ender qual o mecanismo mecanism o de avaliac¸ ˜ao ao da linguagem. Em Python, falso e´ denotado:
• pelo booleano False, • pelo valor 0 (zero), • pela lista, dicion´ario, ario, tupla ou string vazios, de tamanho zero, • pelo valor especial None, que significa nulo. Qualquer outro valor simples e´ considerado verdadeiro. Instˆancias ancias podem definir regras mais complexas para avaliac¸ ao; a˜ o; para detalhes consulte a sec¸ ˜ao ao Basic customization do manual de referˆencia encia Python.
2.5.4
Excec¸ ˜ oes
Com os dois d ois tipos de lac¸ os descritos na sec¸ ˜ao ao anterior, todas as necessidades ‘normais’ de controle de um programa podem ser implementadas. No entanto, quando algo inesperado ocorre, ou uma um a condi co ndicc¸ ao a˜ o de erro conhecido ´e atingida, Python oferece uma forma adicional de controlar o fluxo de execuc¸ ao: a˜ o: a excec ex cec¸ ao. a˜ o. A excec exc ec¸ ao a˜ o e´ um recurso de linguagens de programac¸ ˜ao ao modernas que serve para informar que uma condic condi c¸ ao a˜ o incomum ocorreu. Embora existam outras aplicac¸ oes, o ˜ es, em geral comunicamse atrav´es es de excec¸ oes o ˜ es erros ou problemas problem as que ocorrem ocor rem durante durant e a execuc¸ ˜ao ao de um programa. Exce Ex cecc¸ oes o˜ es s˜ao ao internamente internam ente geradas pelo interpretado in terpretadorr Python quando situac sit uac¸ oes o ˜ es excepcionais ocorrem. No exemplo abaixo, >>> a = [1, 2, 3] >>> >> > pr prin int t a[ a[5] 5]
o codigo o´ digo interno do interpretador sabe que n˜ao ao podemos acessar uma lista atrav´es es um ´ındi ın dice ce n˜ao-existente, ao-existent e, e gera uma excec¸ ˜ao: ao: Traceb Traceback ack (most (most recent recent call call last): last): File Fi le "< " n>", ", li line ne 1, in ? Inde In dexE xErr rror or: : li list st in inde dex x ou out t of ra rang nge e
Vamos analisar a mensagem exibida. A primeira linha anuncia um traceback, que e´ a forma como e´ exibida exib ida a pilha de execuc¸ ˜ao ao que gerou a excec¸ ˜ao. ao. A segunda segunda indica indica a linha de c odigo o ´ digo na qual ocorreu o problema, e o arquivo. Como estamos usando o modo interativo neste exemplo, o arquivo aparece como , que e´ a entrada padr˜ao. ao. A terceira terceira linha linha indica indica o tipo de exce ex cecc¸ ao a˜ o levantada — neste caso, IndexError — e informa uma mensagem que descreve mais especificamente especificamente o problema.
24
Tratando Trata ndo exce ex cecc¸ ˜ oes A excec¸ ao a˜ o normalme normalmente nte imprime imprime um traceba traceback ck e interrompe interrompe a execuc execuc¸ a˜ o do programa. Uma ac¸ ao a˜ o comum e´ testar e controlar contr olar a excec¸ ao; a˜ o; para este fim, usamos uma cl´ausula ausula try / except except: >>> a = [1, 2, 3] >>> >> > tr try: y: ... print a[5] ... except except IndexErr IndexError: or: ˜ ... prin pr int t "O ve veto tor r nao nao po poss ssui ui tant tantas as posi posic c¸oes!" oes!" ˜ O ve veto tor r na nao o po poss ssui ui ta tant ntas as po posi sic c ¸oes! oes!
A inst i nstruc ruc¸ ao a˜ o try captura capt ura excec¸ oes o˜ es que ocorrerem no seu bloco de c´odigo; odigo; a linha except determina determin a quais tipos de excec¸ ao a˜ o ser˜ao ao capturados. A sintaxe da cl´ausula ausula except segue os formatos: except except tipo_da_ tipo_da_exce excecao cao [, variavel variavel_da_ _da_exce excecao]: cao]: ´ # bloco de c odigo odigo
ou except except (tipo_ex (tipo_exceca cecao_1, o_1, tipo_exce tipo_excecao_2 cao_2, , ...) [, variavel_da_excecao]: variavel_da_excecao]: ´ # bloco de c odigo odigo
O primeiro elemento elemento da cl´ausula ausula except e´ um tipo da excec¸ ao, a˜ o, ou uma tupla de tipos caso multiplas u´ ltipl as excec¸ oes o˜ es devam devam ser tratadas da mesma mesma forma. O segundo elemento elemento ´e opcional; permite que seja capturada uma instˆancia ancia que qu e armazena ar mazena informac¸ oes o ˜ es da excec¸ ao. a˜ o. Um uso trivial trivial desta desta instˆancia ancia e´ imprimir a mensagem de erro: >>> a = "foo" >>> print a + 1 Traceb Traceback ack (most (most recent recent call call last): last): File Fi le "< " n>", ", li line ne 1, in ? Type Ty peEr Erro ror: r: ca cann nnot ot ad add d ty type pe "i "int nt" " to st stri ring ng
Podemos capturar e tratar de forma especial o erro acima, imprimindo a mensagem fornecida e continuando a execuc¸ ao a˜ o normalmente. >>> tr >>> try: y: ... print a + 1 ... except except TypeEr TypeError ror, , e: ... print "Um "Um err erro oco ocorreu: %s" %s" % e ... Um er erro ro oc ocor orre reu: u: ca cann nnot ot ad add d ty type pe "i "int nt" " to st stri ring ng >>>
Diversos tipos de excec¸ oes o ˜ es vˆem em pr´e-definidas e-definidas pelo interpretador Python; o guia de referˆencia encia cont´em em uma lista completa e os casos onde s˜ao levantadas. Note tamb´em em que q ue esta introduc¸ ao a˜ o a Errors and Exceptions Exceptions do tutorial exce excecc¸ oes o˜ es n˜ao ao cobre a sua sintaxe completa; consulte a sec¸ ˜ao ao Errors Python para maiores detalhes. 25
2.6
Func¸ ˜ oes
Func Fu nc¸ oes o˜ es s˜ao ao bloc blocos os de de c´odigo odigo com um nome; recebem recebem um conjunto conjunto de parˆametros ametros (ou argumentos) e retornam retornam um um valor valor.. Python possui, possui, como seria esperado esperado de uma linguagem linguagem de programa programacc¸ ˜ao ao completa, suporte a func¸ oes. o˜ es. Existem diversas func¸ oes o˜ es pr´e-definidas e-definidas pelo interpretador, descritas na sec se c¸ ao a˜ o 3; a sec¸ ao a˜ o atual detalha det alha as formas for mas de definir func¸ oes o ˜ es em em c odigo o´ digo Python.
2.6. 2.6.1 1
Sint Sintax axee basica a´ sica
A sintaxe sin taxe geral para definir defini r uma func¸ ao a˜ o e: e´ : def nome_f nome_func uncao( ao(arg arg_1, _1, arg_2, arg_2, ..., ..., arg_n) arg_n): : # # bloco de c ´ o digo odig o co cont nten endo do co corp rpo o da fu func nc ¸˜ ao ao # ´ opcion return return valor_de valor_de_reto _retorno rno # retornar retornar e opcional al
O codigo o´ dig o da d a func f unc¸ ao, a˜ o, uma vez avaliado avaliado pelo interpretad interpretador or,, define define um nome local. local. Os argumentos s˜ao ao valores fornecidos quando chamada a func¸ ˜ao, ao, e que ficam dispon´ıveis ıveis por meio de vari´aveis aveis locais l ocais no corpo da d a func¸ ao. a˜ o. No exemplo abaixo, temos uma u ma func¸ ao a˜ o que recebe uma lista de dicion´arios arios como parˆametro, ametro, e uma u ma func fun c¸ ao a˜ o que recebe um dicion´ario. ario. A primeira itera pela lista recebida, e passa o elemento atual como argumento para a segunda. def imprime_ imprime_carda cardapio pio (pratos) (pratos): : print print "Carda "Cardapio pio para para hoje\n hoje\n" " for fo r p in pr prat atos os: : imprime_prato(p) prin pr int t "\ "\nT nTot otal al de pr prat atos os: : %d %d" " % le len( n(pr prat atos os) ) def imprime_ imprime_prato prato(p) (p) print print "%s ...... ........ .. %10.2f %10.2f" " % (p["no (p["nome" me"], ], p["pre p["preco" co"]) ])
Ao ser interpretado, o c´odigo odigo acima define dois nomes locais: imprime cardapio e imprime prato . Para que a func¸ ao a˜ o seja de fato executada, usamos este nome seguido dos argumentos passados entre parˆenteses: enteses: ´ # de defi fino no di dici cion on´ arios arios descre descreven vendo do os p1 = {" {"no nome me": ": "A "Arr rroz oz co com m br broc ocol olis is", ", p2 = {" {"no nome me": ": "Soj "Soja a co com m le legu gume mes" s", , p3 = {"nome {"nome": ": "Lenti "Lentilha lhas", s", "preco "preco": ": list li sta_ a_pr prat atos os = [p [p1, 1, p2 p2, , p3 p3] ]
pratos pratos "pre "p reco co": ": 9. 9.90 90} } "pre "p reco co": ": 7.80 7.80} } 4.80} 4.80}
# e ch cham amo o um uma a fun unc c ¸˜ a o, pa ao, pass ssan ando do os pr prat atos os co como mo ar argu gume ment nto o imprime_cardapio(lista_pratos)
o que resulta na seguinte seguint e sa´ıda ıda quando executado: 26
Cardap Cardapio io para para hoje hoje Arroz Arroz com brocol brocolis is ...... ......... ..... .. 9.90 9.90 Soja Soja com legume legumes s ...... ......... ..... .. 7.80 7.80 Lentilhas Lentilhas ......... ........... .. 4.80 Tota To tal l de pr prat atos os: : 3
Retornando um valor No exemplo exemplo acima, as func¸ oes o ˜ es n˜ao ao ‘retornam’ valor algum, apenas exibindo exib indo infor i nformac mac¸ ao. a˜ o. Para retornar um valor, basta usar a express˜ao return dentro dent ro da func f unc¸ ao. a˜ o. A primeira pergunta conceitual aqui seria ‘retornar para quem?’; a resposta direta ´e ‘para quem invocou a func¸ ao’. a˜ o’. Demonstrando por exemplos, a func¸ ao a˜ o abaixo: def bar(t) bar(t): : retu re turn rn "T "The he rai ain n in Spa pain in fa fall lls s ma mai inl nly y in th the e %s. s." " % t
define um valor de retorno, que ´e uma string; ao chamar esta func¸ ao a˜ o com um argumento: a = bar("p bar("plai lains" ns") )
o codigo o´ dig o da d a func f unc¸ ao a˜ o e´ avaliado e um valor, retornado, sendo armazenado na vari´avel a (observe o uso do operador de atribuic¸ ao ˜ao seguido s eguido da chamada da d a func f unc¸ ˜ao). ao). Para Para visualizar visualizar o valor valor retornado, usamos a conveniente instruc inst ruc¸ ao a˜ o print: >>> pr >>> prin int t a The Th e ra rain in in Sp Spai ain n fa fall lls s ma main inly ly in th the e pl plai ains ns. .
Dica: para retornar conjuntos de valores, basta retornar uma seq¨uˆ uencia eˆ ncia ou outro valor de tipo composto. 2.6.2 2.6.2
Truques ruques com argument argumentos os
Argumentos nomeados Argumentos podem ser fornecidos `a func fu nc¸ ao a˜ o especificando-se o nome do parˆametro ametro ao qual corre correspo spond ndem. em. O c odigo o ´ digo abaixo e´ equivalente a` chamada no exemplo anterior: a = bar(t= bar(t="pl "plain ains") s")
mas fica explicitamente declarado que o parˆametro ametro correspond correspondee ao argumen argumento to t. NormalNormalmente s˜ao ao nomeados argumentos para tornar a leitura do c´odigo odigo mais f´acil; acil; no entanto, veremos a seguir como s˜ao ao essenciais para utilizar uma das formas de listas de argumentos vari´aveis. aveis.
27
Valores padr ˜ padr ˜ ao Uma das funcionalidades funci onalidades mais mai s interessantes interessan tes nas func fun c¸ oes ˜oes Python e´ a possibilidade de definir valores padr˜ao: ao: def aplica_m aplica_multa( ulta(valo valor, r, taxa=0.1) taxa=0.1): : retu re turn rn va valo lor r + va valo lor r * ta taxa xa
Neste Neste exemp exemplo, lo, o valor valor padr˜ padr˜ao ao para para a vari´ vari´avel avel taxa e´ 0.1; .1; se se n˜ao ao for definido definido este este argumen argumento, to, o valor padr˜ao ao ser´a utilizado. >>> print print aplica_mu aplica_multa(1 lta(10) 0) 11.0 >>> print print aplica aplica_mu _multa lta(10 (10, , 0.5) 0.5) 15.0
Dica: N˜ao ao utilize como valor padr˜ao ao listas, dicion´arios arios e outros valores mut´aveis; aveis; os valores padr˜ao ao s˜ao ao avaliados avaliados apenas apenas uma vez e o resultado obtido obtido n˜ao ´e o que intuitivamente intuitivamente se esperaria. esperaria. Conjuntos de argumentos opcionais Uma forma de definir conjuntos de argumentos opcionais utiliza parˆametros ametros ‘curinga’ ‘curinga’ que assumem valores valores compostos compostos.. Pode ser fornecido fornecido um parˆametro ametro cujo nome e´ prefixado por um s´ımbolo ımbolo asterisco, que assumir´ assumir ´a um conjunto ordenado de argumentos: def desculpa desculpa(alvo (alvo, , *motivos *motivos): ): d = "D "Des escu culp lpas as %s %s, , ma mas s es esto tou u do doen ente te" " % al alvo vo for fo r mo moti tivo vo in mo moti tivo vos: s: d = d + " e %s" % motivo retu re turn rn d + ". "." " >>> descul desculpa( pa("se "senho nhor", r", "meu "meu gato gato fugiu" fugiu", , ... "minha tia veio visitar") "Descu "Des culp lpas as se senh nhor or, , ma mas s es esto tou u do doen ente te e me meu u ga gato to fu fugi giu u e mi minh nha a tia veio veio visita visitar." r."
ou um parˆametro ametro que assume um conjunto de argumentos nomeados, prefixado de dois asteriscos: def equipe(d equipe(direto iretor, r, produtor, produtor, **atores **atores): ): for person personage agem m in atores atores.ke .keys( ys(): ): print print "%s: "%s: %s" % (perso (personag nagem, em, atores atores[pe [perso rsonag nagem] em]) ) prin pr int t ""-" " * 20 prin pr int t "D "Dir iret etor or: : %s %s" " % di dire reto tor r print print "Produ "Produtor tor: : %s" % produt produtor or >>> equipe(d equipe(direto iretor="P r="Paul aul Anderson Anderson", ", ... produtor="Paul Anderson",
28
... ...
Frank="Tom Cruise", Edmund="Pat Healy", Linda="Julianne Moore")
Frank: Frank: Tom Cruise Cruise Edmund Edmund: : Pat Healy Healy Linda: Linda: Julian Julianne ne Moore Moore -------------------Direto Diretor: r: Paul Paul Anders Anderson on Produtor Produtor: : Paul Anderson Anderson
ou ainda as duas formas formas combinada combinadas. s. Estes Estes parˆametros ametros especiais devem necessariamente ser os ultimos u´ ltimos definidos na lista de parˆametros amet ros da func f unc¸ ao. a˜ o. Note que estes argumentos especiais n˜ao ao agregam parˆametros ametros que correspondem correspondem a argumentos explicitamente definidos, como alvo, diretor e produtor nos exemplos acima; estes s˜ao ao processados de maneira normal. Conjuntos de argumentos opcionais s˜ao ao uma excelente forma de conferir flexibilidade a uma func fu nc¸ ao a˜ o mantendo compatibilidade com c´odigo odigo pr´ pr e-existente, e´ -existente, sem prejudicar a sua legibilidade.
Escopo de vari aveis a´ veis Embora o tema escopo seja complexo, e n˜ao ao esteja restrito apenas a func fu nc¸ oes, o˜ es, cabe aqui uma observac¸ ˜ao ao sobre o escopo das vari´aveis aveis definidas definid as no corpo de func¸ oes. o ˜ es. Tanto as vari´aveis aveis definidas definid as no corpo de uma func¸ ˜ao, ao, como a vari´avel avel i no exemplo abaixo, quanto os argumentos argumentos da func¸ ˜ao a o s˜ao ao acess´ıveis ıveis apenas no escopo local; em outras palavras, apenas apenas no bloco de c odigo o ´ digo da pr´opria opr ia func f unc¸ ao. a˜ o. v = 0 w = 1 def verifi verifica( ca(a, a, b): i = 0 ´digo, v, w, a, b e i s ao ˜ ´ # Ne Nest ste e blo loco co de c o a o ac aces ess s ıveis. ıveis. def cancel cancela(x a(x, , y): i = 0 ´digo, v, w, x, y e i s ao ˜ ´ # Ne Nest ste e blo loco co de c o a o ac aces ess s ıveis, ıveis, ˜ ˜ # mas note que *este* i n ao a o te tem m ne nenh nhum uma a re rela lac c ¸ao a o co com m ˜ # o i da func ¸ao ao verifi verifica( ca() ) acima. acima.
Vari´aveis aveis definidas no corpo principal (ou seja, definidas em um bloco n˜ao-indentado, ao-indentado, como as vari´aveis aveis v e w acima) de um m´odulo odulo podem ser lidas em qualquer func¸ ao a˜ o contida naquele 9 arquivo; no entanto, n˜ao ao podem ser alteradas . Caso se deseje definir ou atribuir um novo valor a uma vari´avel global, gl obal, existe uma instruc i nstruc¸ ao a˜ o especial, global. Esta instruc instr uc¸ ao a˜ o indica que a vari´avel avel cujo nome for especificado ´e para ser definida no escopo global, e n˜ao ao local. v = 0 9
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 defi nida no escopo local; acesso a` vari´avel, no entanto, efetua uma busca nos escopos, do mais local para o mais global.
29
def processa processa(t): (t): glob gl obal al v v = 1
No c´odigo odig o acima, aci ma, a func¸ ao a˜ o altera o valor da vari´avel avel global v. H´a duas func¸ oes o˜ es uteis u´ teis para estudar os escopos que se aplicam em um determinado contexto:
• locals(), que retorna um dicion´ario ario descrevendo o escopo local ao contexto atual; os itens do dicion´ario ario s˜ao ao compostos dos nomes das vari´aveis aveis definidas neste escopo e os valores aos quais correspondem. correspondem.
• global(), que retorna um dicion´ario ario semelhante ao da func¸ ao a˜ o locals(), mas que descreve o escopo global. O escopo de vari´aveis aveis funciona de maneira semelhante quando tratando com m´etodos etodos e defin de finic ic¸ oes o˜ es de classes, que ser˜ao ao discutidos discuti dos na sec¸ ao a˜ o 4.
2.7
Modulos o´ dulos e o comando import
o´ dulo. Como dito anteriormente, cada arquivo contendo c´odigo odigo Pytho Python n e´ denominado um m odulo Na grande maioria das ocasi˜oes oes utilizamos um ou mais m´odulos odulos Python em combinac¸ a˜ o: o interpretador interativo e´ adequado para realizar experimentos curtos, mas n˜ao ao para escrever codigo o´ dig o de produc prod uc¸ ao. a˜ o. Um m´odulo odulo Python consiste de c´odigo-fonte odigo-fonte contido em um arquivo denominado com a extens˜ao ao .py; como tal, pode conter vari´aveis, aveis , func¸ oes o˜ es e classes; para fins de nomenclatura, o´ dulo. qualquer um destes elementos contidos em um m´odulo odulo e´ considerado um atributo do m odulo Python, atrav´es e s do m´odulo, odulo, oferece excelentes mecanismos para modularizar c´odigo-fonte. odigo-fonte. Esta Est a modular mod ularizac izac¸ ao a˜ o pode ter diversas motivac m otivac¸ oes: o˜ es: o programa programa pode ser grande demais, demais, ter subpartes reus´aveis aveis que devem ser separadas, ou ainda necessitar de m´odulos escritos por terceiros. Esta Est a sec¸ ao a˜ o introduz este conceito atrav´es es do comando import.
Importando modulos o´ dulos e atributos de m odulos o´ dulos A instruc inst ruc¸ ao a˜ o b´asica asica para manipular m´odulos odulos 10 e´ import. O modulo ´ deve estar no caminho de procura de m´odulos odulos do interpretador . No exemplo a seguir, um m´odulo odulo com o nome os.py e´ importado. importado. Observe Observe que a extens˜ extens˜ao ao .py nao i nclu´ıda ıda no n o comando com ando import — apenas o nome principal: ˜ e´ inclu´ >>> im >>> impo port rt os >>> print print os.get os.getcwd cwd() () /home/kiko
O m odulo o´ dulo os define algumas algu mas func fu nc¸ oes o ˜ es internamente. inter namente. No exemplo acima, invocamos a func¸ ˜ao ao ´ importante esta getcwd() contida neste, prefixando prefixan do a func¸ao . E ˜ com o nome do modulo ´ 10
O caminho de procura ´e uma lista de diret´orios onde o interpretador Python busca um m´odulo quando uma instruc inst ruc¸ ˜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 ´odulo sys.path.
30
impo port rt m odulo ´ odulo, acessamos os atributos de um m´odulo obse ob serv rvac ac¸ ao: a˜ o: ao usar a forma im odulo usando esta sintaxe, idˆentica entica a` utilizada para acessar m´etodos etodos da lista l ista conforme conf orme descrito descr ito na sec¸ ao a˜ o 2.3.2.
Existe uma segunda forma do comando import que funciona de forma diferente. Ao inv´es es de impo import rtaar o m´odulo odulo inteir inteiro, o, o que nos obriga obriga a usar usar as func func¸ oes o ˜ es prefi prefixa xada dass pelo pelo nome nome do m´odulo, odulo, este formato importa um atributo do m´odulo, odulo, deixando-o acess´ıvel ıvel localmente: localment e: >>> fr >>> from om os im impo port rt ge getc tcwd wd >>> print print getcwd getcwd() () /home/kiko
´ Func¸ ˜ oes uteis H´a algumas func¸ oes o˜ es pr´e-definid e-definidas as no interpreta interpretador dor bastante bastante uteis u ´ teis quando lidando com m´odulos odulos e os atributos contidos em m´odulos: odulos: ´ • dir(nome m´ m odulo) odulo) retorna retorna uma lista dos nomes nomes dos atributos atributos contidos contidos em um m´ m odulo, o ´ dulo,
o que permite que vocˆe descubra interativamente interat ivamente quais s´ımbolos ımbolos e func¸ oes o ˜ es o comp˜oem. oem. print dir(os) dir(os) a partir do interpretador Python. Experimente, por exemplo, exemplo, executar executar print ´ • reload(nome m´ m odulo) odulo) recarrega o m´odulo odulo importado a partir do seu arquivo; desta
maneira, alterac¸ oes o˜ es podem ser efetuadas no arquivo do m´odulo o dulo e j´a utilizadas em uma sess˜ao ao do interpretador, sem que seja necess´ario ario reinici´a-lo. a-lo. O mecanismo m ecanismo de importac i mportac¸ ao a˜ o possui uma s´erie erie de nuances especiais, que est˜ao ao associados ao topico o´ pico escopo, es copo, introduzido introdu zido na sec¸ ˜ao ao anterior, e aos namespaces, que resumidamente determinam o conjunto conju nto de atributos acess´ıveis ıveis em um determinado det erminado contexto. Uma descric descri c¸ ˜ao ao mais detalhada destes t´opicos opicos e´ ofereci of erecida da na n a sec¸ ao a˜ o Python Scopes and Name Spaces do tutorial Python.
2.8
Strings de documentac¸ ˜ ao
Um recurso especialmente util u ´ til em Python e´ o suporte nativo `a docume doc ument ntac ac¸ ao a˜ o de c´odigo odigo por meio de strings localizadas estrategicamente, chamadas docstrings. Modulos, o´ dulos, classes, func¸ oes o˜ es e at´e proprieda propriedades des podem ser descritas descritas por meio de docstrings docstrings;; o exemplo exemplo a seguir seguir demonstra demonstra um modulo o´ dulo hipot´etico, etico, financ.py, documentado documentado adequadamente: adequadamente: """M´ """M ´ o dulo odul o qu que e co cont nt´ em ´ e m fu func nc ¸oes ˜ oes financei financeiras. ras.""" """ def calcula_ calcula_juros juros(val (valor, or, taxa=0.1 taxa=0.1): ): """Cal """Calcul cula a juros juros sobre sobre um valor. valor. Aplica Apli ca um uma a ta taxa xa de ju juro ros s fo forn rnec ecid ida a so sobr bre e um va valo lor r e re reto torn rna a o re resu sult ltad ado. o. Se om omit itid ida a a ta taxa xa, , o va valo lor r ´ utilizado 0.1 0. 1 se ser ra utilizado""" """ # ... class class Pagament Pagamento: o: """Cla """Classe sse que repres represent enta a um pagame pagamento nto a ser efetua efetuado. do.
31
Inclui Inclui informac informac ¸o ˜es de cr e ´dito e d ebito. ´ ebito. Permite Permite efetuar efetuar ˜ ˜ operac ¸oes oes como como devolu devoluc c ¸ao, ao, cancelame cancelamento, nto, transfer transfer ˆ e ncia enci a e paga pa game ment nto o em si si. . Po Poss ssui ui o se segu guin inte te ci cicl clo o de vi vida da: : ... """
As docstrings do m´odulo odulo acima podem ser visualizadas visualizadas em tempo de execuc execuc¸ ˜ao, ao, e mesmo a partir do modo interativo do interpretador por meio da func¸ ao a˜ o help() e do atributo doc : >>> import import financ financ >>> help(calcula_juros) help(calcula_juros) Calc Ca lcul ula a ju juro ros s so sobr bre e um va valo lor. r. Aplica Apli ca um uma a ta taxa xa de ju juro ros s fo forn rnec ecid ida a so sobr bre e um va valo lor r e re reto torn rna a o re resu sult ltad ado. o. Se om omit itid ida a a ta taxa xa, , o va valo lor r ´ utiliz 0.1 0. 1 se ser ra utilizado ado >>> print print financ.__ financ.__doc__ doc__ ´ ˜ M´ o dulo odul o qu que e co cont nt´ em e m fu func nc ¸oes oes financei financeiras. ras.
pr opri op a func fu nc¸ao ´ ria ˜ calcula juros; Observe que a func¸ ao a˜ o help recebe como argumento a pr ´ pode parecer pouco usual mas ´e um padr˜ao ao comum em Python.
Este recurso e´ extremamente util u´ til para o aprendizado da linguagem quando explorando objetos pr´e-definidos; e-definidos; utilize-o sempre que estiver necessitando de uma referˆencia encia r´apida: apida: >>> len([1,2 len([1,2,3]) ,3]) 3 >>> help(len help(len) ) Help He lp on bu buil iltt-in in fu func ncti tion on le len: n: len(...) len(ob len(objec ject) t) -> intege integer r Retu Re turn rn th the e nu numb mber er of it item ems s of a se sequ quen ence ce or ma mapp ppin ing. g.
Docstrings podem tamb´em em ser processadas utilizando ferramentas externas, como o epy11 doc , gerando referˆencias encias em formatos naveg´aveis aveis como HTML.
Func¸ ˜ oes pr´ pre-definidas e´ -definidas
3
Python possui uma s´erie erie de func f unc¸ oes o˜ es pr´e-definidas, e-definidas, que j´a est˜ao ao dispon´ıveis ıveis quando executamos o interpretador, sem ter que recorrer a bibliotecas externas. externas. Algumas func¸ oes o ˜ es importantes que ainda n˜ao ao foram apresentadas no texto seguem: 11
Dispon´ı 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/ .
32
• range(a,b): rece recebe be dois dois inte inteiro iros, s, reto retorn rnaa uma uma list listaa de inte inteir iros os entre entre a e b, n˜ao ao incluindo b. Esta func¸ ao a˜ o e´ freq¨uentemente uentemente utilizada utili zada para iterar lac¸ os for. >>> print print range( range(1,1 1,10) 0) [1, 2, 3, 4, 5, 6, 7, 8, 9]
• len(a): retorna retorna o comprimen comprimento to da vari´ vari´avel avel a: para listas, tuplas e dicion´arios, arios, retorna o numero u´ mero de elementos; para strings, o n´umero umero de caracteres; e assim por diante. >>> print print len([1 len([1,2, ,2,3]) 3]) 3 round(a, a, n): rece • round( recebe be um float float e um n´umero; umero; retorna o float arredondado com este
numero u´ mero de casas decimais. pow(a, n): recebe dois inteiros; • pow(a, i nteiros; retorna o resultado da exponenciac¸ ˜ao ao de a a` ordem n.
´ equivalente a` sintaxe a * * n . E
• chr(a): recebe um inteiro (entre 0 e 255) como parˆametro, retornando o caracter correspondente da tabela ASCII. >>> print print chr(97 chr(97) ) "a"
• unichr(a): como chr(), rece recebe be um inte inteiro iro (aqu (aquii vari varian ando do entr entree 0 e 6553 65535) 5),, reto retorn rnan ando do o caracter Unicode correspondente.
• ord(a): recebe um unico u´ nico caracter como parˆametro, ametro, retornando o seu c´odigo odigo ASCII. >>> print print ord("a ord("a") ") 97
• min(a, min(a, b): retorna retorna o menor menor entre a e b, sendo aplic´avel avel a valores de qualquer tipo. max(a, b): retorna • max(a, retorna o maior entre a e b.
• abs(n): retorna o valor absoluto de um n´umero. umero. • hex(n) e oct(n): retornam uma string stri ng contendo a representac¸ ao a˜ o em hexadecimal e octal, respectivamente, de um inteiro. H´a tamb´em em func fu nc¸ oes o˜ es de convers˜ao ao expl´ expl´ıcita ıcita de tipo; as mais freq¨ freq uentemente u ¨ entemente utilizadas incluem:
• float(n): converte um inteiro em um float. >>> print print float( float(1) 1) 1.0
33
• int(n): converte um float em inteiro. >>> print print int(5. int(5.5) 5) 5
• str(n): con converte verte qualqu qualquer er tipo em uma string. string. Tipo Tiposs seq¨uencias uencias s˜ao ao convertidos de forma literal, peculiarmente. >>> print print str([1 str([1,2, ,2,3]) 3]), , str({" str({"a": a": 1}) [1, 2, 3] {’a’ {’a’: : 1}
• list(l) e tuple(l) : con converte vertem m uma seq¨uencia uencia em uma lista ou tupla, respectivamente. ´ >>> print print list(" list("´ abaco") abaco") ´ [’´ [’ a ’, ’b a’, ’b’, ’, ’a ’a’, ’, ’c ’c’, ’, ’o ’o’] ’]
Al´em em desta d estass func fu nc¸ oes, o˜ es, existe existe uma grande grande biblioteca biblioteca dispon dispon´´ıvel ıvel nos m´ m odul o ´ dulos os j´a fornecidos com o Python. Python. Alguns Alguns destes m´odulos odulos s˜ s ao a˜ o discutidos discutid os na sec¸ ao a˜ o 5; como sempre, o manual Python ´e a referˆencia encia definitiva no assunto. As sec¸ oes o˜ es seguintes seguint es discutem discut em algumas algum as func¸ oes o ˜ es pr´e-definidas e-definidas com comportamento especialmente relevante. relevante.
3.1
Manipulac¸ ˜ ao de arquivos: arquivo s: a func f unc¸ ˜ ao open()
A func fun c¸ ao a˜ o open e´ uma das mais poderosas do Python; serve para obter uma referˆencia referˆencia a um objeto do tipo arquivo. Assumindo que temos um arquivo chamado arquivo.txt, contendo um trecho de um livro famoso, podemos codificar o seguinte exemplo: >>> a = open(" open("arq arquiv uivo.t o.txt" xt") ) >>> >> > pr prin int t a >
Uma vez obtida a referˆencia encia ao objeto arquivo, podemos usar m´etodos etodos espec´ıficos ıficos deste, como o m´etodo etodo read(), que retorna o conte´udo udo do arquivo: >>> te >>> text xto o = a. a.re read ad() () >>> >> > pr prin int t te text xto o ‘... ‘. ..Wo Woul uld d yo you u te tell ll me me, , pl plea ease se, , whic wh ich h wa way y I ou ough ght t to go fr from om he here re?’ ?’ ‘Tha ‘T hat t de depe pend nds s a go good od de deal al on wh wher ere e yo you u wa want nt to ge get t to to,’ ,’ said sa id th the e Ca Cat. t. ‘I do don’ n’t t mu much ch ca care re wh wher eree--’ -’ sa said id Al Alic ice. e. ‘The ‘T hen n it do does esn’ n’t t ma matt tter er wh whic ich h wa way y yo you u go go,’ ,’ sa said id th the e Ca Cat. t.
34
Sintaxe
O formato f ormato geral da func fu nc¸ ao a˜ o open e: e´ :
open(nome_do_arquivo, open(nome_do_arquivo, modo)
Ambos os parˆametros ametros s˜ao ao strings. strings. O modo determina determina a forma como o arquivo 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 final do arquivo. Se um s´ımbolo ımbolo ‘+’ for agregado ao modo, o arquivo pode ser lido e escrito simultaneamente.
Metodos e´ todos do objeto arquivo O objeto arquivo possui um conjunto de m´etodos etodos uteis; u´ teis; os mais importantes s˜ao ao descritos abaixo. Note que o arquivo possui um conceito de posic¸ ˜ao ao atual: em um dado momento, operac¸ oes o˜ es ser˜ao ao realizadas reali zadas com base em uma um a certa posic¸ ˜ao. ao. Alguns m´etodos etodos utilizam utili zam ou alteram esta posic po sic¸ ao; a˜ o; outros s˜ao ao operac ope rac¸ oes o˜ es globais, gl obais, independentes da posic posi c¸ ˜ao ao dela.
• read(): como visto visto acima, retorna retorna uma string unica u´ nica com todo o conte´ conte´udo udo do arquivo. • readline(): retorna a pr´oxima oxima linha li nha do arquivo, arq uivo, e incrementa increm enta a posic po sic¸ ˜ao ao atual. • readlines(): retorna todo o conte´udo udo do arquivo em uma lista, uma linha do arquivo por elemento da lista.
• write(data): escrev escrevee a string data para o arquivo, na posic po sic¸ ao a˜ o atual ou ao final do arquivo, arquivo, dependendo dependendo do modo de abertura. Esta func¸ ˜ao ao falha se o arquivo foi aberto com modo ‘r’.
• seek(n): muda a posic po sic¸ ao 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¸ ˜ao, ao, abrindo alguns arquivos locais, lendo e modificando-os.
3.2
Leitur Leitura a do teclad teclado: o: raw input()
Outra Out ra func¸ ao a˜ o util u´ til sobretudo para programas Python interativos ´e a func¸ ao a˜ o raw input : leˆ do teclado uma string, st ring, e a retorna. reto rna. Esta func¸ ao a˜ o possui um parˆametro ametro opcional, que ´e uma mensagem a ser fornecida fornecida ao usu´ usu ario. a´ rio. O exemplo seguinte utiliza um m´odulo odulo com o nome leitura.py: a = ra raw_ w_in inpu put( t("E "Ent ntre re co com m um n u ´mero de 0 a 10: ") n = in int( t(a) a) if not 0 < n < 10: ´ ´ prin pr int t "N "N´ umero umero inv´ invalido." alido." if n % 2 == 0: ´ Pa prin pr int t "E Par" r" else: ´ Impar" ´ prin pr int t "E Impar"
Este exemplo, quando executado e sendo fornecido o n´umero 7, gera ger a a seguinte segui nte sa´ıda: ıda: 35
>>> import import leitur leitura a ´mero de 0 a 10: 7 Ent ntre re co com m um n u ´ ´ E Impar Impar
Orientac¸ ˜ ao a Objetos
4
Embora termos importantes como classes, objetos e m´odulos odulos tenham sido introduzidos anteriormente, ainda n˜ao ao discutimos em detalhes os conceitos e a implementac¸ ˜ao ao de orientac¸ ao a˜ o a objetos (OO) em Python. Python suporta orientac¸ ao a˜ o a objetos utilizando um modelo flex´ flex´ıvel ıvel e particularmente homogˆeneo, eneo, que simplifica a compreens˜ao ao dos mecanismos OO fundamentais da linguagem.
4.1
Conceitos de orientac¸ ˜ ao a objetos
Orien Or ienta tacc¸ ao a˜ o a objetos e´ um termo que descreve uma s´erie erie de t´ecnicas ecnicas para estruturar est ruturar soluc¸ oes o˜ es para pro gram amac ac¸ ˜ ao OO, que e´ problemas computacionais. No nosso caso espec´ espec´ıfico, ıfico, vamos falar de progr um paradigma de programac¸ ao a˜ o no qual um programa ´e estruturado em objetos, e que enfatiza os aspectos aspec tos abstrac abst rac¸ ao, a˜ o, encapsulamento, encapsu lamento, polimorfismo polimorfi smo e heranc¸ a 12 . Convenciona Convencionalmente, lmente, um programa tem um fluxo linear, seguindo por uma func¸ ˜ao ao principal (ou o corpo principal do programa, dependendo da linguagem de programac¸ ˜ao) ao) que invoca func fu nc¸ oes o˜ es auxiliares para executar certas tarefas `a medida que for necess´ario. ario. Em Python e´ perfeipro gram amac ac¸ ˜ ao procetamente poss´ıvel ıvel programar program ar desta forma, convencionalmente chamada de progr dural. Programas que utilizam conceitos OO, ao inv´es es de definir func¸ oes o˜ es independentes que s˜ao ao 13 dom´ınio ınio ) em partes inutilizadas em conjunto, dividem conceitualmente o ‘problema’ (ou dom´ dependentes ( objetos), que podem conter atributos que os descrevem, e que implementam o e´ todos). Objeto comportamento do sistema atrav´es es de func¸ oes o˜ es definidas nestes objetos ( metodos Objetoss (e seus m´etodos) etodos) fazem referˆencia encia a outros objetos e m´etodos; etodos; o termo ‘envio de mensagens’ ´e utilizado utili zado para descrever a comunicac¸ ao a˜ o que ocorre entre os m´etodos etodos dos diferentes objetos. Na pr´atica, atica, um programa orientado a objetos em Python pode ser descrito como um con junto de classes — tanto pr e-definidas e´ -definidas quanto definidas pelo usu´ario ario — que possuem atributos e metodos, e´ todos, e que s ao a˜ o instanciadas em objetos, obj etos, durante a execuc¸ ao a˜ o do programa. A sec¸ ao a˜ o seguinte concretiza estes conceitos com exemplos.
4.2
Objet Objetos, os, classe classess e inst inst ˆancias ancias
Objetos s˜ao ao a unidade fundamental de qualquer sistema orientado a objetos. Em Python, como introduzido introdu zido na sec¸ ao a˜ o 2.3.2, tudo e´ um objeto — tipos, valores, classes, func¸ oes, o ˜ es, m´etodos etodos e, ´e claro, instˆancias: ancias: todos possuem atributos e m´etodos etodos associados. asso ciados. Nesta sec¸ ˜ao ao ser˜ao ao descritas as estruturas da linguagem para suportar objetos definidos pelo programador . 12
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, exemplo, o dom´ı nio de um editor de textos textos compreende compreende escrever escrever,, corrigir e alterar documento documentoss —e um conceito fundamental, muito provavelmente modelado em uma classe OO, seria o Documento.
36
Classes Em Python, a estrutura fundamental para definir novos objetos ´e a classe. Uma classe e´ definida em c´odigo-fonte, odigo-fonte, e possui nome, um conjunto de atributos e m´etodos. etodos. Por exemplo, em um programa que manipula formas geom´etricas, etricas, seria poss´ıvel ıvel conceber uma classe denominada Retangulo:
• Esta classe possuiria dois atributos: lado a e lado b, que representariam as dimens˜oes oes dos seus lados.
• A classe poderia realizar operac¸ oes o ˜ es como calcula area e calcula perimetro , e que retornariam os valores apropriados. Um exemplo exempl o de uma implement i mplementac ac¸ ao a˜ o poss´ıvel ıvel desta des ta classe cl asse est´ est ´a no m´odulo odulo retangulo.py a seguir: class class Retangul Retangulo: o: lado la do_a _a = No None ne lado la do_b _b = No None ne def __init__( __init__(self, self, lado_a, lado_a, lado_b): lado_b): self.l self.lado ado_a _a = lado_a lado_a self.l self.lado ado_b _b = lado_b lado_b ˆ print print "Crian "Criando do nova nova inst inst ancia ancia Retangulo Retangulo" " def calcula_area(self): calcula_area(self): return return self.l self.lado ado_a _a * self.l self.lado ado_b _b ´ def de f calc calcul ula a pe per r ımetro(self): ımetro(self): retu re turn rn 2 * se self lf.l .lad ado_ o_a a + 2 * se self lf.l .lad ado_ o_b b
Esta classe classe define define os dois atributos atributos descrito descritoss acima, e trˆ tr ˆes es m´etodos. etodos. Os tr es eˆ s m´etodos etodos definidos incluem sempre, como primeiro argumento, uma vari´avel avel denominada self , que e´ manipulada no interior do m´etodo. etodo. Este Este ´e um ponto fundamental da sintaxe Python para m´etodos: etodos: o primeiro argumento e´ especial, e convenciona-se utilizar o nome self para ele; logo a seguir ser´a ser´a discutido para que existe. Dois dos m´etodos etodos codificados correspondem `as as operac oper ac¸ oes o˜ es descritas inicialmente, e h´a um init it (). O nome metodo e´ todo especial inclu´ıdo: ıdo: in nome dest destee m´etodo etodo tem significˆancia ancia particular em Python: e´ o m´etodo etodo construtor, um m´etodo etodo opcional invocado quando a classe ´e instanciada, que e´ o nome dado `a ac¸ ao a˜ o de criar objetos a partir de uma classe.
Inst ˆ Inst ˆancias ancias A instˆancia ancia e´ objeto objeto criado criado com base base em uma classe classe definid definida. a. Este Este conceit conceito o ´e peculiar, e leva l eva algum tempo para se fixar. Uma descric¸ ˜ao ao abstrata da dualidade classe-instˆancia: ancia: a classe e´ apenas uma matriz, que especifica objetos, mas que n˜ao pode ser utilizada util izada diretamente; a instˆancia ancia representa representa o objeto objeto concretizad concretizado o a partir partir de uma classe. classe. Eu costumo dizer dizer que a classe e´ ‘morta’, existindo apenas no c´odigo-fonte, odigo-fonte, e que a instˆancia ancia e´ ‘viva’, porque durante a exec execuc uc¸ ao a˜ o do do prog progra rama ma s˜ao ao as instˆancia anciass que que de fato fato ‘func ‘funcion ionam’ am’ atrav´ atrav´es es da invocac¸ ao a˜ o de m´etodos etodos e manipula mani pulacc¸ ao a˜ o de atributos.
37
Conceitualmente, a instˆancia ancia possui possui duas proprieda propriedades des fundamen fundamentais: tais: a classe a partir partir da qual foi criada, que define suas propriedades e m´etodos padr˜ao, ao, e um estado, que representa o con junto de valores das propriedades propriedades e m ´etodos etodos definidos naquela instˆancia ancia espec´ıfica. ıfica. A inst ancia aˆ ncia possui um ciclo de vida: e´ criada (e neste momento seu construtor ´e invocado), manipulada conforme necess´ario, ario, e destru´ dest ru´ıda ıda quando qu ando n ao a˜ o for mais util u´ til para o programa programa.. O estado da instˆ instˆancia ancia evolui ao longo do seu ciclo de vida: seus atributos s˜ao ao definidos e tˆem em seu valor alterado atrav´es es de seus m´etodos etodos e de manipulac¸ ao a˜ o realizada por outros objetos. O que Python chama de ‘instˆancia’ ancia’ e´ freq¨uentemente uentemente denominado ‘objeto’ em outras outras linguage linguagens, ns, o que cria alguma alguma confus˜ao a o uma vez que qualquer dado em Python Python pode ser considerad considerado o um ‘objeto’. ‘objeto’. Em Python, Python, instˆancias ancias s˜ao ao objetos criados a partir de uma classe definida pelo programador . Retomand Retomando o o nosso exemplo exemplo acima: a partir da classe classe Retangulo que foi definida, poder´ıamos ıamos instanciar i nstanciar objetos retˆ retangulo aˆ ngulo espec´ espec´ıficos: ıficos: um com lados de comprimento 1 e 2, e outro com lados de comprimento 2 e 3: >>> from from retang retangulo ulo import import Retang Retangulo ulo >>> >> > r1 = Re Reta tang ngul ulo( o(1, 1, 2) Criand Criando o nova nova inst inst ancia ˆ ancia Retˆ Retangulo ˆ angulo >>> >> > r2 = Re Reta tang ngul ulo( o(2, 2, 3) ˆ ˆ Criand Criando o nova nova inst inst ancia ancia Retˆ Retangulo angulo
Observe que ao instanciar o retˆangulo: angulo:
• Foi importado e utilizado o nome da classe seguido de parˆenteses. enteses. • Foram fornecidos como argumentos — entre parˆenteses enteses — dois valores, correspondendo aos comprimentos dos lados diferentes dos retˆangulos angulos (1 e 2 para o primeiro retˆangulo, angulo, e 2 e 3 para o segundo).
• Estes Estes argum argumen entos tos s˜ao a o pass passad ados os — tran transp spar aren ente teme ment ntee — para para o m´etodo etodo constr construto utorr da classe classe Retangulo. O c´odigo odigo do m´etodo etodo est´ est a´ reproduzido aqui para facilitar a leitura: def __init__ __init__(self (self, , lado_a, lado_a, lado_b): lado_b): self.l self.lado ado_a _a = lado_a lado_a self.l self.lado ado_b _b = lado_b lado_b ˆ print print "Crian "Criando do nova nova inst inst ancia ancia Retangul Retangulo" o"
Aqui cabe uma pausa para revelar o prop´osito osito da vari´avel avel self , definida como primeiro sobre a qual aquele m´ metodo foi ˆ ˆ ´ argumento dos m´etodos etodos.. Esta Esta vari´ vari´avel avel representa a inst ancia invocado. Esta proprie propriedade dade e´ de importˆancia ancia fundamental para OO em Python, porque atrav´es es desta desta vari´ vari´avel avel e´ que atributos e m´etodos etodos desta instˆancia ancia podem ser manipulados no c´odigo odigo dos seus m´etodos. etodos. Continuando com a an´alise alise do bloco de c´odigo odigo acima:
38
• Nas duas primeiras linhas do m´etodo etodo — onde ´e feita atribuic¸ ao a˜ o — o c´odigo odigo do construtor ˆ ˆ est´a atribuindo valores para dois atributos, lado a e lado b , na inst ancia , aqui representada pelo argumento self . Neste Neste momento, momento, o estado da instˆancia ancia passa a conter os dois atributos novos. novos.
• O construtor const rutor inclui i nclui uma um a instruc inst ruc¸ ao a˜ o print did´atica atica que imprime uma mensagem para demonstrar que foi executado; a mensagem m ensagem aparece na sa´ıda ıda do interpret i nterpretador. ador. Uma vez instanciados os retˆangulos, angulos, podemos acessar seus m´etodos etodos.. De maneir maneiraa idˆentica entica aos m´etodos etodos da lista apresentados na sec¸ ˜ao ao 2.3.2, a sintaxe utiliza um ponto seguido do nome do metodo e´ todo acompanhado de parˆenteses: enteses: >>> print print r1.calcul r1.calcula_are a_area() a() 2 >>> print print r2.calcul r2.calcula_per a_perimet imetro() ro() 10
Conforme esperado, as func fu nc¸ oes o ˜ es retornaram os valores apropriados para cada instˆancia. ancia. Fazendo mais uma demonstrac¸ ao a˜ o do uso do argumento self, vamos observar o c´odigo odigo de um dos metodos: e´ todos: def calcula_area(self): calcula_area(self): return return self.l self.lado ado_a _a * self.l self.lado ado_b _b
O onipresente argumento self aqui e´ utilizado como meio de acesso aos atributos lado a e lado b. Este c´odigo odigo permite visualizar o funcionamento pleno deste mecanismo: ao ser invocado o m´etodo etodo calcula area sobre a instˆancia ancia r1, o argumento self assume como valor esta mesma instˆancia; ancia; portanto, acessar atributos de self internamente ao m´etodo etodo equivale, na pr´atica, atica, a acessar atributos de r1 externamente. Em Python e´ poss´ıvel, ıvel, inclusive, acessar os atributos da instˆancia ancia diretamente, sem a necessidade de usar um m´etodo: etodo: >>> print print r1.lad r1.lado_a o_a 1 >>> print print r1.lad r1.lado_b o_b 2
Os valores, logicamente, correspondem aos inicialmente fornecidos `a instˆancia ancia por meio do seu construtor.
Atributos Privados e Protegidos Algumas linguagens permitem restringir acesso aos atria´ vel privada. Pyth butos de uma instˆancia, ancia, oferecendo o conceito de vari avel Python on n˜ao ao possui uma const con struc ruc¸ ao a˜ o sint´atica atica literalmente equivalente, mas existem duas formas de indicar que um atributo n˜ao ao deve ser acessado acessado externamente: externamente:
39
• A primeira forma e´ implementada por meio de uma convenc convenc¸ ˜ao, ao, n˜ao ao havendo suporte espec´ıfico ıfico na linguagem em si: convenciona convenciona-se -se que atributos e m´etodos cujo nome e´ iniciado por um sublinhado (como metodo a ) n˜ao ao devem ser acessados externamente em situ si tuac ac¸ oes o˜ es ‘normais’.
• A segunda segun da forma fo rma estende esta convenc¸ ˜ao ao com suporte no pr´oprio oprio interpretador: m´etodos etodos e atributos cujo nome e´ iniciado por dois sublinhados (como metodo a ) s˜ao ao considerados dos de fato fato priv privad ados os,, e tˆem em seus seus nomes nomes alter alterado adoss de maneir maneiraa transp transpare arente nte pelo pelo interpr interpreta etador dor para assegurar esta protec¸ ao. a˜ o. Este mecanismo ´e descrito em maior detalhes na sec¸ ˜ao ao Private Variables do tutorial Python.
4.3
Heranc Heranc¸ a
he ranc nc¸ a: uma maUm mecanismo fundamental em sistemas orientados a objetos modernos ´e hera neira de derivar classes novas a partir da definic¸ ˜ao ao de classes existentes, denominadas neste contexto classes-base. As classes classes deriva derivadas das possuem possuem acesso acesso transparente transparente aos atributos atributos e m´etodos das classes base, e podem redefinir estes conforme conveniente. Hera Heranc nc¸ a ´e uma forma simples de promover reuso atrav´es es de uma generalizac¸ ao: a˜ o: desenvolvese uma classe-base com funcionalidade gen´erica, erica, aplic´avel avel em diversas situac¸ oes, o ˜ es, e definem-se subclasses concretas, con cretas, que qu e atendam a situac¸ ˜oes oes espe e spec´ c´ıficas. ıfic as. Classes Python suportam heranc¸ a simples e heranc¸ a m ´ultipla. ultipla. Os exemplos at´e agora evitaram o uso de heranc¸ a, mas nesta sec¸ ˜ao ao e´ poss´ p oss´ıvel ıvel apresentar a sintaxe geral para definic¸ ˜ao ao de uma classe: class class nome-cla nome-classe(b sse(base1 ase1, , base2, base2, ..., basen): basen): atribu atributoto-1 1 = valorvalor-1 1 . . atribu atributoto-n n = valorvalor-n n ´ def nome-m nome-m´ etodoetodo-1(s 1(self elf, , arg1, arg1, arg2, arg2, ..., ..., argn): argn): ´ # bloco de c ´ o digo do m etodo odi etodo . . ´ def nome-m nome-m´ etodoetodo-n(s n(self elf, , arg1, arg1, arg2, arg2, ..., ..., argn): argn): ´ # bloco de c ´ o digo do m etodo odi etodo
Como pode ser observado acima, acima, classes base s ˜ao ao especificadas especificadas entre parˆ par enteses ˆenteses ap´os os o nome da classe sendo definida. Na sua forma mais simples: class class Foo: Foo: a = 1 def cheese(se cheese(self): lf): print "cheese" "cheese" def foo(self) foo(self): : print print "foo" "foo"
40
class class Bar(Foo) Bar(Foo): : def bar(self) bar(self): : print print "bar" "bar" ´ # m etodo etodo redefini redefinido do
def foo(self): prin pr int t "f "foo oo de ba bar! r!" "
uma instˆancia ancia da classe Bar tem acesso aos m´etodos etodos cheese(), bar() e foo(), este u´ ltimo sendo redefinido localmente: ultimo >>> b = Bar() >>> b.cheese b.cheese() () cheese >>> b.foo() foo de bar! >>> b.bar( b.bar() ) foo >>> print b.a 1
´ # sa ´ ı da de ıda demo mons nstr tra a m etodo etodo redefinid redefinido o # em Bar
# acesso transparente ao atributo # definido em Foo
enquanto uma instˆancia ancia da classe Foo tem acesso apenas `as as func fun c¸ oes o˜ es definidas nela, foo() e cheese: >>> f = Foo() >>> f.foo( f.foo() ) foo
Invocando m´ metodos e´ todos de classes-base Para acessar os m´etodos etodos de uma uma classe-b classe-base ase,, usamos usamos uma const con struc ruc¸ ao a˜ o diferente para invoc´a-los, a-los, que permite especificar qual classe armazena o m´etodo sendo chamado. Seguindo o exemplo, vamos novamente a redefinir o m´etodo Bar.foo(): class class Bar(Foo) Bar(Foo): : # ... def foo(self) foo(self): : Foo.foo(self) prin pr int t "f "foo oo de ba bar! r!" "
Nesta vers˜ao, ao, o m´etodo etodo foo() inclui uma chamada ao m´etodo etodo Foo.foo(), que conforme indicado pelo seu nome, ´e uma referˆencia encia direta ao m´etodo etodo da classe base. base. Ao instanciar instanciar um objeto desta classe: >>> b = Bar() >>> b.foo( b.foo() ) foo foo fo o de ba bar! r!
41
pode-se observar que s˜ao ao executados ambos os m´etodos etodos especific especificado ados. s. Este padr˜ padr˜ao, ao, aqui demonstrado de forma muito simples, pode ser utilizado em situac¸ oes o ˜ es mais elaboradas; seu uso mais freq¨uente uente e´ para invocar, a partir de um construtor de uma classe, o construtor das suas classes-base.
´ Func¸ ˜ oes Uteis instˆancias: ancias:
H´a duas d uas func¸ oes o˜ es particularmente uteis u ´ teis para estudar uma hierarquia de classes e
• isinstance(objeto, isinstance(objeto, classe) : retorna verdadeiro se o objeto for uma instˆancia ancia da classe especificada, ou de alguma de suas subclasses.
• issubclas issubclass(cl s(classe asse a, classe classe b) : retorna retorna verdadeiro verdadeiro se a classe classe especificad especificadaa como classe a for uma subclasse da classe b , ou se for a pr´opria opria classe b .
Atributos de classe versus atributos de inst ˆ inst ˆancia ancia Uma particularidade em Python, que deriva da forma transparente como vari´aveis aveis s˜ao ao acessadas, ´e a distinc dist inc¸ ao a˜ o entre atributos definidos em uma classe, e atributos definidos em uma instˆancia ancia desta classe. Observe o c´odigo odigo a seguir: class class Foo: Foo: a = 1
A classe acima define uma vari´avel avel a com o valor 1. Ao instanciar esta classe, >>> f = Foo() >>> >> > pr prin int t f. f.a a 1
observa-se que a vari´avel avel parece estar definida na instˆancia. anci a. Esta observa o bservacc¸ ao a˜ o convida a algumas indagac ind agac¸ oes: o˜ es:
• Onde est´a definida a vari´avel avel a – na classe ou na instˆancia? ancia? • Se atribuirmos um novo valor a f.a, como abaixo: >>> f.a = 2
estamos alterando a classe ou a instˆancia? ancia?
• Uma vez atribu´ at ribu´ıdo ıdo o novo valor, que valor aparecer´ aparecer ´a para o atributo a no pr´oximo oximo objeto instanciado a partir de Foo? As respostas para estas perguntas s˜ao ao todas relacionadas a um mecanismo central em Python, que e´ o protocolo getattr. Este protocolo dita como atributos s˜ao ao transparentemente localizados em uma hierarquia de classes e suas instˆancias, e segue a seguinte receita: 1. Ao acessar acessar um atribut atributo o de uma instˆancia ancia (por meio de uma vari´avel avel qualquer ou self) o interpretador tenta localizar o atributo no estado da instˆancia. ancia. 42
2. Caso Caso n˜ao ao seja localizado, busca-se o atributo na classe da instˆancia em quest˜ao. ao. Por sinal, este passo e´ o que permite que m´etodos etodos de uma classe sejam acess´ıveis ıveis a partir de suas instˆancias. ancias. 3. Caso Caso n˜ao ao seja localizado, busca-se o atributo entre as classes base definidas para a classe da instˆancia. ancia. 4. Ao atribuir uma vari´avel avel em uma uma instˆ instˆancia, ancia, este atributo e´ sempre definido no estado local da instˆancia. ancia. Uma vez vez compre compreen endid dido o este este mecani mecanismo smo,, e´ poss´ poss´ıvel ıvel elucid elucidar ar respo resposta stass para para as quest˜ quest˜oes oes acima. acima. No exemplo, a vari´avel avel a est´a definida na classe Foo, e pelo ponto ponto 2 acima descrito, descrito, e´ acess´ ace ss´ıvel ıve l como se fosse definida pela pr´opria opria instˆancia. ancia. Ao atribuir atribuir um valor valor novo a f.a, estamos definindo uma nova vari´avel avel a no estado local da vari´avel avel f, o que n˜ao ao tem nenhum impacto sobre a vari´avel avel a definida em Foo, nem sobre novas instˆancias ancias criadas a partir desta. Se o descrito acima parece confuso, n˜ao ao se preocupe; o mecanismo normalmente funciona exatame exatamente nte da maneira maneira que se esperaria esperaria de uma linguagem linguagem orientada orientada a objetos. objetos. Existe Existe apenas uma situac sit uac¸ ao a˜ o ‘perigosa’, que ocorre quando usamos atributos de classe com valores mut´aveis, mut´aveis, como listas listas e dicion´ dicion´arios. arios. class class Foo: Foo: a = [1,2]
Nesta Nest a situac sit uac¸ ao, a˜ o, quando criamos uma instˆancia ancia a partir de Foo, a vari´avel avel a pode ser alterada at ribu buic ic¸ ˜ ao, a regra 4 descrita acima n˜ao por meio desta instˆancia ancia.. Como Como n˜ao ao foi realizada atri ao se aplica: >>> >>> >>> >>> >> > [1,
f = Foo() f.a.appe f.a.append(3) nd(3) g = Foo() prin pr int t g. g.a a 2, 3]
e a vari´avel avel da classe ´e de fato modificada modificada.. Esta particula particularidad ridadee e´ freq¨uentemente uentemente fonte de ao se utili utilize ze vari vari´aveis a´ veis bugs bugs dif´ dif´ıceis ıceis de localizar localizar,, e por este motivo motivo se recomend recomendaa fortemente fortemente que n ˜ de tipos mutaveis a´ veis em classes.
4.4
˜ Introspecc¸ ˜ ao e reflex ao
Intr In trosp ospecc ecc¸ ao a˜ o e reflex˜ao a o s˜ao ao propriedades de sistemas orientados a objetos que qualificam a existˆencia encia de mecanismos para descobrir e alterar, em tempo de execuc¸ ˜ao, ao, informa inf ormacc¸ oes o˜ es estruturais sobre um programa e objetos existentes neste. Python possui tanto caracter´ caracter´ısticas ısticas introspectivas introspectivas quanto reflexivas. reflexivas. Permite obter em tempo de execuc exec uc¸ ao a˜ o informa inf ormacc¸ oes o˜ es a respeito do tipo dos objetos, incluindo informac¸ oes o ˜ es sobre a hierarquia de classe classes. s. Preserv Preservaa tamb´em 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 codigo-fonte. o´ digo-fonte. 43
Algumas Algu mas func¸ oes o˜ es e atributos s˜ao ao particularmente importantes neste sentido, e s˜ao ao apresentaapresentadas nesta nest a sec s ec¸ ao: a˜ o:
• dir(obj): esta func¸ ao a˜ o pr´e-definida e-definida lista todos os nomes de vari´aveis aveis definidos em um determinado objeto; foi apresentada anteriormente como uma forma de obter as vari´aveis aveis definidas em um m´odulo, odulo, e aqui pode ser descrita em sua gl´oria oria completa: completa: descrev descrevee o conte´udo udo de qualquer objeto Python, incluindo classes e instˆancias. ancias. obj. j. cl clas ass s : este atributo • ob atributo da instˆancia ancia armazena o seu objeto classe correspondente.
• ob obj. j. di dict ct : este atributo atributo de instˆancias ancias e classes oferece acesso ao seu estado local. • obj. obj. module module : este atributo de instˆancias ancias e classes armazena uma string com o nome do m´odulo odulo do qual foi importado. classe. . bases bases : esta atributo da classe armazena em uma tupla as classes das quais • classe
herda.
• classe classe. . name name : este atributo da classe armazena uma string com o nome da classe.
Alguns modulos o´ dulos importantes
5
H´a um grande conjunto conjunto de m´ m odulos o ´ dulos que se instalam juntamente com o interpretador Python; s˜ao descrito descr itoss nesta nest a sec¸ ao a˜ o alguns dos mais interessantes.
• sys: oferece v´arias ari as operac oper ac¸ oes o˜ es referentes ao pr´oprio oprio interpretador. Inclui: path , uma lista dos diret´orios orios de busca de m´odulos odulos do python, argv, a lista de parˆametros ametros passados na linha de comando e exit() , uma u ma func fun c¸ ao a˜ o que termina o programa.
• time: oferece func¸ oes o˜ es para manipular manipular valores valores de tempo. Inclui: Inclui: time(), uma func¸ ao a˜ o que retorna o timestamp14 atual; sleep(n), que pausa a execuc execuc¸ ˜ao ao por n segundos; e strftime(n), que formata um timestamp em uma string de acordo com um formato fornecido.
• os: oferece ofer ece func fu nc¸ oes o˜ es relacionadas rel acionadas ao ambiente de execuc¸ ˜ao ao do sistema. Inclui: mkdir(), que cria diret diretorios; o´ rios; rename(), que altera nomes e caminhos de arquivos; e system, que executa executa comandos do sistema.
• os.path: oferece func¸ oes o˜ es de d e manipu man ipulac lac¸ ao a˜ o do caminho independente de plataforma. Inclui: isdir(p) , que testa se d e´ um diret´orio; 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¸ oes o˜ es de manip m anipulac ulac¸ ao a˜ o de string (que tamb´em em est˜ao ao dispon´ disp on´ıveis ıvei s como co mo spli lit( t(c, c, s, p) , que divide a string c em at´e p parti metodos e´ todos da string). Inclui: sp par ticc¸ oes ˜ separadas separ adas pelo p elo s´ımbolo ımb olo s, retornando-as em uma lista; lower(c), que retorna a string c convertida em min´usculas; usculas; e strip(c), que retorna c removendo espac¸os ¸o s e quebras de linha do seu s eu in´ıcio ıcio e fim. 14
O n´umero de segundos desde 1 de janeiro, 1970, 1970, que por sinal ´e a data padr˜ao do in´ı cio do tempo no Unix. o
44
• math: func fun c¸ oes o˜ es matem´aticas aticas gerais. gerai s. Inclui func f unc¸ oes o˜ es como cos(x) , que retorna o cosseno hypot(x, x, y); que retorna a distˆancia de x; hypot( ancia euclidiana entre x e y; e exp(x) ; que retorna o exponencial de x.
• random: gerac ger ac¸ ao a˜ o de n´umeros umeros randˆomicos. omicos. Inclui: Inclui: random(), que retorna um n´umero umero randˆomico o mico entre 0 e 1; randrange(m,n), que retorna um randˆomico omico entre m e n; choice(s), que retorna um elemento randˆomico omico de uma seq¨uˆ uˆencia encia s.
• getopt: processamento de argumentos de comando de linha; ou seja, os parˆametros parˆametros que passamos para o interpretador inter pretador na linha linh a de execuc¸ ˜ao. ao. Inclui: getopt(), que retorna duas listas, uma com argumentos argument os e outra out ra com opc op c¸ oes o ˜ es da linha de comando.
• Tkinter: um m´odulo odulo que permite a criac¸ ao a˜ o de programas com interface gr´afica, afica, incluindo janelas, bot˜oes oes e campos texto. A documenta docum entacc¸ ao a˜ o do Python inclui i nclui uma descric descr ic¸ ao a˜ o detalhada (e muito boa) de cada um destes modulos o´ dulos e de seus membros.
5.1
Modulos o´ dulos independentes independentes
Al´ Alemdosm´ e´ mdosm´odulos odulos distribu distribu´´ıdos ıdos com o Python, Python, existem existem v´ario a rioss m´odulos odulos auxiliare auxiliares. s. Justamente Justamente por serem numerosos numerosos e independentemente independentemente fornecidos, n˜ao ao ´e poss´ıvel ıvel descrevˆ descreve-los eˆ -los na sua totalidade; vou apenas cit´a-los; a-los; podem po dem ser obtidas obti das maiores informac i nformac¸ oes o ˜ es nos links providos.
• win32pipe: permite, permite, na plataforma plataforma Windows, Windows, executar executar programas programas win32 e capturar capturar sua sa´ıda ıda em uma string para manipulac¸ ao a˜ o posterior. Acompanha a distribuic¸ ao a˜ o Activestate Python: http://www.activestate.com/Products/ActivePython/ .
• PIL: Python Imaging Library, Library, que oferece func¸ oes o ˜ es para par a processamento, pr ocessamento, manipulac¸ ˜ao ao e exib exibic ic¸ ao a˜ o de imagens. http://www.pythonware.com/products/pil/
• NumPy: provˆe mecanismos simples e de alto desempenho para manipular matrizes multidimensionais; dimensio nais; ideal para par a operac¸ oes o˜ es num´ericas ericas de alto volume que necessitem de velocidade. http://numpy.sourceforge.net/
• HTMLgen: uma bibliot bibliotec ecaa de classe classess que gera gera docume documento ntoss HTML HTML confor conforme me padr˜ padr˜oes oes pr´eedefinidos. definidos. Oferece Oferece classes classes para manipul manipular ar tabelas, tabelas, listas, listas, e outros outros elemento elementoss de formatac formatac¸ ˜ao. ao. http://starship.python.net/crew/friedrich/HTMLgen/html/
• DB-API : Database Database Application Application Programming Programming Interface Interface;; na realidad realidade, e, um conjunto de modulos o´ dulos que acessam acessam bases bases de dados dados de uma forma padroniza padronizada. da. A API especifica especifica uma forma homogˆenea enea de se fazer consultas consul tas e operac o perac¸ ˜oes oes em bases de dados relacionais (SQL); diversos m´odulos odulos implementam imp lementam esta est a API para par a bases de dados espec´ıficas. ıficas. http://www.python.org/topic http://www.python.org/topics/databas s/database/ e/
• mx: oferece uma s´erie erie de extens˜oes oes a` linguagem, li nguagem, incluindo incluind o operac¸ oes o ˜ es complexas de data e hora, h ora, func¸ oes o˜ es nativas estendidas, e ferramentas para processamento de texto. http://www.egenix.com/files http://www.egenix.com/files/python/ /python/
45
• PyGTK: E´ outro pacote p acote que permite permi te construir constr uir aplicac¸ oes o ˜ es gr´aficas aficas com o Python; pode ser usado em conjunto com o Glade, um construtor visual de interfaces. http://www.pygtk.org/
• wxPython : uma biblioteca biblioteca de classes classes que permite permite construir construir aplicac aplicac¸ oes o ˜ es gr´aficas aficas multiplataforma usando Python. H´a um construtor const rutor visual vi sual de interfaces i nterfaces dispon´ d ispon´ıvel, ıvel, o Boa Constructor. http://www.wxpython.org/ Todos os m´odulos odulos citados se comportam como m´odulos odulos Python ‘normais’; s˜ao ao utilizados por meio mei o da instruc inst ruc¸ ao a˜ o import, e boa parte part e possui possu i documentac document ac¸ ˜ao ao e s´ımbolos ımbolos internos i nternos list aveis. a´ veis. Esta n˜ao ao e´ uma lista exaustiva, e h´a muitos outros m´odulos odulos uteis; u´ teis; h´a boas referˆencias encias que listam m´odulos odulos externos, exter nos, incluindo inclui ndo o ´ındice ındice de d e pacotes oficial ofici al PyPI: http://www.python.org/pypi.
6
Fecha echame men nto
Aqui termina este tutorial, que cobre os aspectos fundamentais da linguagem Python. Com base no texto, e´ poss´ıvel ıvel enfrentar uma tarefa pr atica, a´ tica, que ir´a exercitar seu conhecimento e ampliar sua experiˆencia. encia. Escolha um problema, e tente passar da sua modelagem para Python.
46