You are on page 1of 46
Python na Pratica: Um curso objetivo de programagao em Python http: //www.async.com.br/projects/pnp/ Christian Robottom Reis Asyne Open Source kiko@async.com.br Abril de 2004 Contetido Introdu 1.1 Oque é Python? 1.1.1 Linguagem interpretada 1.1.2 Tipagem dinamica 1.1.3 Controle de bloco por indentagdo L.L.4 Tipos de alto nivel 1.1.5 Orientagio a objetos 1.2. Por que Python? Python bisico: invocacao, tipos, operadores e estruturas 2.1 Executando o interpretador Python interativamente 2.2 Criando um programa ¢ executando-o 2.3. Tipos, varidveis e valores 23.1 Tipos numéricos 23.2 Listas 23.3. Tuplas 23.4. Strings 2.3.5 Dicionérios 24 Operadores 24.1 Operadores aritméticos 24.2 Operadores sobre cadeias de bits 2.4.3. Operadores de atribuigio ul ul 12 4 4 16 244 Operadores condicionais ee 16 24.5 Operadores logicos "7 24.6. Substituigdio em strings: 0 operador eee 18 2.5. Estruturas de controle 19 2.5.1 Condicional: a instrugio if 20 25.2 Lago iterative: for 20 2.5.3 Lago condicional: while 2 254 Excegies 23 2.6 Fungies oe : 24 2.6.1 Sintaxe bisica 28 2.6.2. Truques com argumentos 26 2.7 Médulos ¢ 0 comando import 29 2.8 Strings de documentagio 30 3 Fungées pré-definidas er 3.1 Manipulagao de arquivos: a fungdo open () 33 3.2. Leituradoteclado: raw input () ... 44 4 Orientacio a Objetos 4 4.1 Conceitos de orientagao a objetos eee 34. 4.2 Objetos, classes e instincias 35 4.3. Heranga 38 4.4 Introspecgao ¢ reflexdo 2 5 an 5.1 Médulos independentes 4B 6 Fechamento 44 1 Introducaéo Este tutorial foi criado para apoiar um curso basico da linguagem de programagio Python, Em especial, ele tem duas caracteristicas: primeiro, foi escrito originalmente em portugués, 0 que € raro para um livro técnico nesta area. Segundo, ele & indicado para quem ja possui alguma experigncia em programago, mas que deseja uma nogdo pritica do por que e de como usar Python para programar, sem ter que navegar por horas entre livros e manuais. Uma observagio: este tutorial nfo é um guia aprofundado, e nem um manual de referéncia, A documentagao disponivel em http: //www.python.org/docs/ é excelente (e melhor do que muitos dos livros publicados sobre Python), e serve de referéncia para os aspectos parti- culares da linguagem. Convengdes e Formato Este tutorial assume Python versio 2; a versio mais recente € a 2.3.3 O texto se baseia em um grande conjunto de exemplos, que aparecem indentados em uma se¢o distinta, em uma fonte de largura fixa. Os exemplos, de forma geral, descrevem precisamente a ia produzida ao digitar os comandos interativamente. Definigdes importantes sio introduzidas em negrito, Nomes de variiveis ¢ expresses de cédigo vém em uma fonte diferente, com serifa. Quanto a0 idioma, os termos em inglés mais comuns sio utilizados, com uma explicago prévia do que significam. E importante que os termos em inglés sejam conhecidos, porque so utilizados correntemente na bibliografia e em discussdes com outros programadores. 1.1 O que é Python? Python é uma linguagem de programagio'. Em outras palavras, e sendo simples ao extremo, uusamos Python para eserever software. Esta linguagem tem alguns pontos que a tornam especial « uma linguagem interpretada. # Nao ha pré-declaracdo de varidveis, e os tipos das variaveis so determinados dinamica- mente. O controle de bloco é feito apenas por indentago; nao hi delimitadores do tipo BEGIN € ENDou { €} Oferece tipos de alto nivel: strings, listas, tuplas, diciondrios, arquivos, classes. E orientada a objetos; alids, em Python, tudo é um objeto, [Nas préximas segaes estes aspectos sio discutidos em detalhes. 1.1.1 Linguagem interpretada Linguagens de programacao sio freqiientemente classificadas como compiladas ou interpretadas. Nas compiladas, 0 texto (ou eddigo-fonte) do programa é lido por um programa chamado eom- pilador, que cria um arquivo binario, executivel diretamente pelo hardware da plataforma-alvo. Exemplos deste tipo de linguagem so C ou Fortran. A compilagao ¢ execugao de um programa simples em C segue algo como’ % cc hello.c -o hello 8 ./hello Hello World "Python ‘eis vezes classifi cado como Tinguagem de scripting, um termo com o qual n'a0 concordo muito, ja que Python ‘ede uso geral, podendo ser usada para crue qualquer tipo de software. O termo script gralmente se refere a programas eserios em linguagens interpretadas que aulomatzam tarefas ou que “eonecam programas dstinos ‘onde cc €0 programa compilador, he 11. €0 arquivo de cédigo-fonte, ¢ 0 arquivo criado, hel Lo, é um executdvel binario, Em contrapattida, programas escritos em linguagens interpretadas ndo sio convertidos em ‘um arquivo executivel. Eles sio executados utilizando um outro programa, o interpretador, que 18 0 cédigo-fonte ¢ o interpreta ditetamente, durante a sua execugao. Exemplos de linguagem interpretada incluem 0 BASIC tradicional, Perl e Python. Para executar um programa Python contido no arquivo he 110 . py, por exemplo, utiliza-se algo como: python hello.py Hello World Note que 0 programa que executamos diretamente € 0 interpretador python, fornecendo como parimetro 0 arquivo com cédigo-fonte he1Lo.py. Nao ha o passo de geracdo de exe- cutavel; o interpretador transforma programa especificado & medida em que ¢ executado, 1.1.2 Tipagem dinamica Um dos conceitos basicos em programagao é a varidvel, que é uma associagao entre um nome € um valor, Ou seja, abaixo, neste fragmento na linguagem C {emos uma variavel com 0 nome a sendo declarada, com tipo inteiro e contendo o valor 1 Em Python, ndo precisamos declarar variaveis, nem seus tipos: >>> a seria a instrugio equivalente: define uma variavel com o valor 1, que é um valor inteiro. Python possui o que é conhecido como tipagem dindmica: o tipo a0 qual a varidvel esti asso- ciada pode variar durante a execugdo do programa. Nao quer dizer que nao exista tipo especifico definido (a chamada tipagem fraea): embora em Python mio o declaremos explicitamente, as varidveis sempre assumem um tinico tipo em um determinado momento, ppp a= >>> type (a) 4a funcdo type() retorna o tipo # associado a uma variavel b>> a= "1" >>> type (a) >>> a = 1.0 >>> type (a) Tipagem dindmica, além de reduzir a quantidade de planejamento prévio (¢ digitagao!) para escrever um programa, é um mecanismo importante para garantir a simplicidade e flexibilidade das fungdes Python. Como os tipos dos argumentos nao sao explicitamente declarados, nio ha restrigdo sobre o que pode ser fornecido como pardmetro. No exemplo acima, sio fornecidos argumentos de tipos diferentes & mesma fumgao type, que retorna o tipo deste argumento. 4 1.1.3. Controle de bloco por indentacao Na maior parte das linguagens, hi instruges ou simbolos especificos que delimitam blocos de cédigo — os blocos que compdem o contetido de um lago ou expresso condicional, por exemplo. EmC: if (a>> a = (MAM, "B™, "CY, 0, 1, 2] >>> print a[0] A >>> print a[5] 2 "Por exemplo, “ importante conveneionar se a indentag “ao sera feta por uma tabulay “ao ou por um numero deter ‘minado de espag os, ja que todos editando um mesmo modulo Python devem usar 0 mesino padr"o. Tuplas: tuplas so também seqiiéncias de elementos arbitrarios; se comportam como listas com aexcegao de que so imutiveis: uma vez criadas nio podem ser alteradas, Strings: a cadeia de caracteres, uma forma de dado muito comum; a string Python & uma seqiiéncia imutavel, alocada dinamicamente, sem restrigdo de tamanho. Dicionarios: dicionérios sio seqiiéncias que podem utilizar indices de tipos variados, bastando que estes indices sejam imutiveis (nimeros, tuplas e strings, por exemplo). Dicionédrios so conhecidos em outras linguagens como arrays associativos ou hashes >>> autor = {"nome" : "Christian", "idade": 28} >>> print autor["nome"] Christian >>> print autor["idade"] 28 Arquivo: Python possui um tipo pré-definido para manipular arquivos; este tipo permite que seu contetido seja facilmente lido, alterado ¢ escrito. Classes e Instincias: classes sio estruturas especiais que servem para apoiar programago ori- entada a objetos; determinam um tipo customizado com dados e operagdes particulares. Instincias sio as expresses concretas destas classes. Orientagio a objetos em Python & descrita em maiores detalhes na segio 4 intagio a objetos Orientago a objetos (OO) é uma forma conceitual de estruturar um programa: ao invés de de- finirmos varidveis e criarmos fiungdes que as manipulam, definimos objetos que possuem dados proprios e ages associadas. O programa orientado a objetos ¢ resultado da ‘colaboragao’ entre estes objetos. Em Python, todos os dados podem ser considerados objetos: qualquer varidvel — mesmo as dos tipos bisicos e pré-definidos — possui um valor e um conjunto de operagées que pode ser realizado sobre este. Por exemplo, toda string em Python possui uma operagio (ou método) chamada upper, que gera uma string nova com seu contetido em maitisculas: >>> a = “Hello >>> a.upper () "HELLO! Como a maior parte das linguagens que sio consideradas ‘orientadas a objeto’, Python ofe- rece um tipo especial para definir objetos customizados: a classe. Python suporta também funci- onalidades comuns na orientagdo a objetos: heranga, heranca miltipla, polimorfismo, reflexdo ¢ introspecgao. 6 1.2. Por que Python? Dado que existe uma grande diversidade de linguagens diferentes, por que aprender Python & interessante ou mesmo importante? Na minha opinido. a linguagem combina um conjunto tnico de vantagens: * Os conceitos fundamentais da linguagem sio simples de entender. © A sintaxe da linguagem é clara e facil de aprender; 0 eédigo produzido & normalmente curto e legivel. +* Os tipos pré-definidos incluidos em Python sio poderosos, ¢ ainda assim simples de usar. * A linguagem possui um interpretador de comandos interativo que permite aprender e testar rapidamente trechos de cédigo. «# Python expressivo, com abstragdes de alto nivel. Na grande maioria dos casos, um pro- ‘grama em Python serd muito mais curto que seu correspondente escrito em outra lingua- gem. Isto também faz com 0 ciclo de desenvolvimento seja rapido e apresente potencial de defeitos reduzido — menos cédigo, menos oportunidade para errar. # Existe suporte para uma diversidade grande de bibliotecas externas. Ou seja, pode-se fazer ‘em Python qualquer tipo de programa, mesmo que utilize gréficos, fungGes matematicas complexas, ou uma determinada base de dados SQL. # E possivel escrever extensdes a Python em C ¢ C++ quando é necessirio desempenho maximo, ou quando for desejavel fazer interface com alguma ferramenta que possua bibli- ‘oteca apenas nestas linguagens. # Python permite que o programa execute inalterado em miiltiplas plataformas; em outras palavras, a sua aplicagdo feita para Linux normalmente funcionara sem problemas em Windows em outros sistemas onde existir um interpretador Python. * Python é pouco punitivo: em geral, ‘tudo pode’ e ha poucas restrigdes arbitrérias. Esta propriedade acaba por tomar prazeroso o aprendizado e uso da linguagem, Python ¢ livre: além do interpretador ser distribuido como software livre (e portanto, gra- tuitamente), pode ser usado para criar qualquer tipo de software — proprietaio ou livre. O projeto c implementagao da linguagem é discutido aberta ¢ diariamente em uma lista de correio eletrénico, e qualquer um é bem-vindo para propor alterages por meio de um processo simples e pouco burocritico. Ao longo das préximas segdes serio expostos aos poucos os pontos concretos que demons- tram estas vantagens, 2 Python basico: invocagao, tipos, operadores e estruturas Esta primeira seedo aborda os aspectos essenciais da linguagem. Por falta de um lugar melhor, seri introduzido aqui o simbolo para comentarios em Python: quando aparece o caracter suste- nido ( #4)° no eédigo-fonte, o restante da linha é ignorado, FTamb'em conhecide como ‘numero’, jogo da velha’, ‘cardinal’ e “lasagna 2.1 Executando o interpretador Python interativamente Python esté disponivel tanto para Windows e Macintosh como para os diversos Unix (incluindo © Linux). Cada plataforma possui um pacote especifico para instalago, que normalmente inclui um grande nimero de bibliotecas de cédigo e um programa executavel python‘. Este ¢ 0 interpretador Python que usaremos para executar nossos programas. Para iniciar, vamos executar o interpretador interativamente, no modo shell. Em outras palavras, vamos entrar 0 cédigo-fonte diretamente, sem criar um arquivo separado. Para este fim, execute o interpretador (digitando apenas *pyt hon’). Sera impresso algo como o seguinte (dependendo de qual sistema estiver usando): % python Python 2.3.3 (#1, Dec 22 2003, 15:38:09) [GCC 2.95.4 20011002 (Debian prerelease)] on linux? Type "help", "copyright", “credits” or "license" for more information. >>> Este simbolo >>> chamamos de prompt, ¢ indica que o interpretador esti aguardando ser digitado um comando. O shell Python oferece uma excelente forma de testar e6digo, e vamos comegar com algumas instrugdes simples. o> a >>> print a a >>> b = "Hello world" >>> print b Hello world Neste exemplo, sio introduzidos dois aspectos bisicos: primeiro, a atribuigdo de varidveis; segundo, a instrugio print, que exibe valores ¢ 0 conteiido de varidveis. A forma interativa de executar 0 Python é conveniente; no entanto, nao armazena 0 cédigo digitado, servindo apenas para testes e procedimentos simples, Para programas mais complexos, © c6digo-fonte & normalmente escrito ¢ armazenado em um arquivo. 2.2. Criando um programa e executando-o Em Python, um arquivo contendo instrugdes da linguagem & chamado de médulo, Nos casos mais simples pode-se usar um tinico médulo, executando-o diretamente; no entanto, é interes- sante saber que € possivel sub-dividir o programa em arquivos separados e facilmente integrar as fungies definidas neles. Para criar um arquivo contendo um programa, basta usar qualquer editor de texto, Para um primeiro exemplo, crie um arquivo hello . py contendo as seguintes linhas: "Normalmente, “einelu' do um ambiente de eg “ao e execu “ao simples, como o IDLE, tamb ‘em escrito em Python Estes podem ser tamb ‘em utilizados. a = "Hello" b = "world" print a/b Ea seguir, execute-o da seguinte forma: % python hello.py Ou seja, execute o interpretador e passe como parimetro o nome do arquivo que contém o cédigo a ser executado. O resultado impresso deve ser: Hello world Perceba bem que nio ha predmbulo algum no cédigo-fonte; escrevemos diretamente o cédigo a ser executado’. Nas proximas segdes do tutorial, estaremos utilizando bastante o modo shell: no entanto, para exercicios e exemplos mais extensos que algumas linhas, vale a pena usar médulos para permitir edigdo e revisio, 2.3 Tipos, varidveis e valores Nomes de varidveis comegam sempre com uma letra, no contém espagos, e assim como tudo em Python, sio sensiveis a caixa (case-sensitive) — em outras palavras, minisculas e maiisculas fazem, sim, diferenea. Como explicado anteriormente, a variavel nao precisa ser pré-declarada ¢ seu tipo ¢ determinado dinamicamente. 2.3.1 Tipos numéricos Tipos numéricos representam valores numéricos. Em Python hé alguns tipos numéricos pré- definidos: inteiros (int), mimeros de ponto flutuante (float), booleanos (bool) ¢ complexos (complex). Estes tipos suportam as operagdes matemiticas comuns como adigao, subtragao, multiplicagao e divisio, e podem ser convertidos entre si. Uma observago: booleanos foram adicionados na versio Python 2.2: sua utilizagao € normalmente associada a expresses condicionais, Maiores detalhes sobre este tipo esto disponiveis na segao 2.4.4 A seguir alguns exemplos de criagao de variveis numéricas: >>> a=l # valor inteiro >>> preco = 10.99 # valor ponto flutuante, ou float. >>> t = True # valor booleano >>> i = 4433 # valor complexo “Fim Unix, © poss 1 vel eriar programas em Python ¢ execut‘a-os usando apenas o nome do modulo (sem digitar ‘© nome do interpretador python). Basta adicionar a linha ‘magica’ #!/usr/bin/env python ao in’reio do modulo e dar permiss”ao de execu “ao ao arquivo. Note que isto 1°ao evita que seja necess “arto que o interpretador este instalado no sistema; apenas permite que Se possa omitir dgitar 0 seu nome 9 ‘Valores inteiros podem também ser fornecidos em base octal ¢ hexadecimal: >>> a = 071 >>> print a 87 >>> a = OxFF >>> print a 255 Para ser considerado um float, o niimero deve possuir um ponto ¢ uma casa decimal, mesmo que seja zero. O fato de ser considerado um float é importante para a operacao divisio, pois, dependendo do tipo dos operandos, a divisio é inteira ou em ponto flutuante, por 5/2 # divisdo inteira, resultado inteiro 2 >>> 5 / 2.0 # divisdo em ponto flutuante 2.5 >> 5 * 2.13 10.649999999999999 Atengao especial para este terceiro exemplo, que demonstra uma particularidade da representagio e impressio de mimeros de ponto flutuante. Nameros deste tipo, como o valor 2.13 do exemplo, possuem uma representagao interna particular de- ‘vido a natureza dos intrinseca dos computadores digitais; operagdes realizadas sobre cles tém precisio limitada, e por este motivo o resultado impresso diverge ligeira- ‘mente do resultado aritmeticamente correto. Na pritica, o resultado obtido é prati- ‘camente equivalente a 10.65°. Determinando 0 tipo de uma variavel Para descobrir o tipo atual de uma variivel, pode-se usar a fungio type () >>> a >>> print type(a) >>> a = "hum" >>> print type(a) ‘Uma das vantagens de Python sio os tipos complexos que vém pré-definidos, introduzidos na segdo 1.1.2. As secdes seguintes cobrem estes tipos, “Todas as Finguagens de programag "a0 convencionais utlizam este mesmo mecanismo de representag “ao, ¢ na pratica n'go resultam grandes problemas com isso, mas Python deixa transparecer esta particularidade em algumas situag “oes, como esta. O tutorial Python em http: / /wsw-python.org/docs/current/tut/ inclui uma seg “do sobre as nuances do uso e representag “ao de numeros de ponto fhtuante 23.2 Listas ‘A lista é uma seqiiéneia: um conjunto linear (como um vetor em outras linguagens) de valores indexados por um mimero inteiro. Os indices sio iniciados em zero e atribuidos seqiiencialmente apartir deste. A lista pode conter quaisquer valores, incluindo valores de tipos mistos, e até outras listas, Para criar uma lista, usamos colchetes e virgulas para enumerar os valores: >>> numeros >>> opcoes = ["nao", "sim", "talvez"] >>> modelos = [3.1, 3.11, 95, 98, 2000, "Millenium", "xP"] >>> listas = [numeros, opcoes] [1, 2, 3) Neste exemplo criamos quatro listas diferentes, com elementos de tipos diversos. A quarta lista tem como elementos outras listas: em outras palavras, & uma lista de listas: >>> print listas [1, 2, 31, ['naot, ‘sim’, ‘talvez’]] Para acessar um elemento especifico de uma lista, usamos o nome da lista seguido do indice entre colchetes: >>> print numeros [0] a >>> print opcoes [2] talvez >>> print modelos [4] 2000 Usando indices negatives, as posigdes sio acessadas a partir do final da lista, -1 indicando o ‘iltimo elemento’ >>> print numeros[-1] 3 >>> print modelos[-2] Millenium Python oferece um mecanismo para criar “fatias” de uma lista, ou slices. Um slice é uma lista gerada a partir de um fragmento de outra lista. O fragmento & especificado com dois indices, separados por dois pontos; o slice resultante contém os elementos cujas posigdes vio do primeiro indice a segundo, nao incluindo o tltimo elemento. Se omitirmos um dos indices no slice, assume-se inicio ou fim da lista >>> print numeros G1, 2) >>> print opcoes[ ('sim’, ‘talvez'] >>> print modelos [1:5] {3.1000000000000001, 95, 98, 2000] Note que 0 terceito exemplo demonstra a mesma particularidade referente & representagio de mimeros de ponto flutuante, descrita na segio 2.3.1: ao imprimir a lista, Python exibe a representagao interna dos seus elementos, ¢ portanto, floats so impressos com preciso com- pleta, Métodos da Lista Na se¢do 1.1.5 introduzimos um conceito central da linguagem: “tudo & um objeto’; uma lista em Python, sendo um objeto, possui um conjunto de operacdes proprias que manipulam seu conteido. O nome método é usado para descrever operagdes de um objeto; métodos sio acessados no cédigo-fonte digitando-se um ponto apés 0 nome da variavel, € a seguir 0 nome do método, Para executar (ou ehamar) um método, usamos parénteses apés seu nome, fornecendo argu- ‘mentos conforme necessirio, Abaixo sio exemplificados dois exemplos de chamadas de métodos em listas: >>> numeros. append (0) >>> print numeros 11, 2, 3, 01 >>> numeros.sort () >>> print numeros On tees sl Observe com atengao este exemplo, que demonstra os conceitos fundamentais descritos nos pardgrafos anteriores '* O método append (v) recebe como argumento um valor, ¢ adiciona este valor ao final da lista. # Ométodo sort () ordena a lista, modificando-a. Nao recebe argumentos, A lista possui uma série de outros métodos; consulte a referéncia Python para uma descrigaio completa (¢ veja também a fungio dir () na seco 4.4) 2.3.3 Tuplas A tupla & uma seqiiéneia, como a lista: armazena um conjunto de elementos acessiveis por um indice inteiro. A tupla é imutavel; uma vez criada, nao pode ser modificada, Para criar uma tupla use parénteses, ¢ virgulas para separar seus elementos: oe el yO) >>> print t[2] 5 A tupla € utilizada em algumas situagdes importantes: como a lista de argumentos de uma fungio ou método, como chave em dicionirios, e em outros casos onde fizer sentido ou for mais, eficiente um conjunto fixo de valores, 234 Strings A string, como citado anteriormente, ¢ uma seqiiéncia imutével com um propésito especial: armazenar cadeias de caracteres. >>> a = "Mondo Bizarro" >>> print a Mondo Bizarro Strings podem ser delimitadas tanto com aspas simples quanto duplas; se delimitamos com aspas duplas, podemos usar as aspas simples como parte literal da string, e vice-versa. Para inserir na string aspas literais do mesmo tipo que o delimitador escolhido, prefixe-as com uma contra-barra \, As atribuigdes abaixo so equivalentes: >>> b = “All’s quiet on the eastern front." >>> c = 'A11\'s quiet on the eastern front.’ >>> b= True Sho usados caracteres especiais para denotar quebra de linha (\n), tabulagdo (\t) ¢ outros. >>> a = "Hoje\n\t é o primeiro dia." >>> print a Hoje 6 0 primeiro dia. Para criar uma string com miiltiplas linhas, ¢ itil o delimitador aspas triplas: as linhas podem ser quebradas diretamente, ¢ a string pode ser finalizada com outras trés aspas consecutivas a= """I wear my sunglasses at night So I can so I can Keep track of the visions in my eyes" Finalmente, como toda seqiiéncia, a string pode ser indexada ou dividida em slices, usando 0 operador colchetes: >>> a = "Anticonstitucionalissimamente" >>> print a[0] A >>> print a[13] i >>> print al:4] Anti >>> print al-! ment 1) A string possui um operador especial, a porcentagem (‘s), que sera descrito na segio 2.4.6, Possui ainda um grande nimero de métodos, descritos em detalhes na seco String Methods do ‘manual de referéncia Python. 3 2.35. Diciondrios Um dicionario representa uma colegio de elementos onde € possivel utilizar um indice de qual- quer tipo imutavel, a0 contrario da lista, onde indices sio sempre inteiros seqiiencialmente atribuidos. E costumeiro usar os termos chave e valor (key/value) para descrever os elemen- tos de um diciondrio - a chave € 0 indice, e 0 valor, a informagao correspondente aquela chave. Para declarar dicionérios, utilizamos 0 simbolo chaves, separando o indice do valor por dois pontos ¢ separando os pares indice-valor por virgulas: >>> refeicoes = {"café" : "café", “almogo" : "macarrao", : "jantar" : "sopa"} >>> print refeicoes["almogo"] macarrao >>> precos_modelos = {98 : 89, 99 : 119, 2000 : 199} >>> print precos_modelos [98] 88 Neste exemplo criamos dois diciondrios com trés elementos cada um. As chaves do di- ciondrio refeicoes sio as strings “café”, “almogo"e "jantar”, e 05 valores respectivos, as, strings “café”, "macarrio”e "sopa”. ‘Métodos do Dicionario 0 dicionirio também possui alguns métodos notiveis: ‘* keys () retoma uma lista (sim, exatamente, do tipo lista) com as chaves do dicionari * values () retoma uma lista com os valores do dicionério; '* items () retoma uma lista de tuplas com o contetido do dicionério, cada tupla contendo, ‘um par (chave, valor); >>> precos_modelos.keys () [99, 98, 2000} >>> precos_modelos.values () (119, 89, 199) ¥ A ordem dos elementos retornados por keys() e # values() é arbitraria; nao confie nela. * has.key (k) verifica se a lista possui aquela chave: >>> precos_modelos.has_key (98) True >>> precos_modelos.has_key (97) False ‘+ update (d2) atualiza o dicionario com base em um segundo dicionério fornecido como, pardmetro; elementos do dicionario original que também existem no segundo so atualiza- dos; elementos que existem no segundo mas que nao existem no original sdo adicionados neste, 4 >>> precos_modelos.update ({2000 : 600, 2001: 700}) >>> print precos_modelos 98: 199 400, 300, 2001: 700, 2000: 600} No exemplo acima, observe que a chave 2000 foi atualizada, e 2001, acrescentada, E possivel usar o dicionario como uma estrutura de dados simples, com campos para cada informagao a ser armazenada. Por exemplo, para armazenar informacao sobre um produto hi- potético, com cédigo, descrigio e preco: >>> >>> m >>> produto = {"cédigo" Copo", "preco":10.22} print produto["cédigo"] print produto ("desc") Cope E um padrio comum criar listas de dicionarios neste formato, cada item na lista correspon- dendo a um produto em particular. 2.4 Operadores © proximo tépico essencial da linguagem so operadores, simbolos que operam sobre varifveis e valores. 2.4.1 Operadores aritméticos ‘A maior parte dos operadores aritméticos em Python funciona de maneira intuitiva e andloga aos operadores em outras linguagens. Demonstrando por exemplo >>> print a + 10 >>> 5 SS >>> >>> 14 >>> 49 print print print print print print a a 3 # adicdo 2 # subtracao 2 # divisao inteira: argumentos inteiros # e@ resultado inteiro 2.5 # divisao em ponto flutuante: pelo # menos um argumento deve ser float 4 # resto da diviséo inteira 2 # multiplicacdo 2 # exponenciagao A exponenciagio também pode ser feita por meio de uma fung0, pow () , como descrito na segio 3. A raiz quadrada e outras fungdes matemiiticas estio implementadas no médulo math; veja a seco 5 para maiores detalhes. Com excectio da exponenciagio e da divisio inteira, estes operadores sio bastante comuns em linguagens de programagio. Os operadores aritméticos podem ser usados em floats também: >e> a= 1.15 >>> printa /a-atata 0.57349375 © 05 operadores de adigaio (+) e multiplicagao (*), em strings: >>> a = “exato" >>> print a * 2 exatoexato >>> print "quase "+a quase exato » listas: >>> a = [-1, 01 >>> b= (1, 2, 3] >>> print b * 3 fees oes >>> print a + b [-1, 0, 1, 2, 3) 3, 1, 2, 3] e tuplas, >e> a= (1, 2) >>> print a + (2, 1) @, 2, 2,0) Como exemplificado acima, o operador adigo (e multiplicagao) serve para concatenar listas, tuplas e strings. Nao pode ser utilizado com diciondrios (que podem ser atualizados usando a fungdo update (), mas para os quais a operago de concatenagao nao faria sentido). 2.4.2 Operadores sobre cadeias de bits Para inteiros, existem operadores que manipulam seus valores como cadeias de bits (operadores bit-wise) de acordo com a aritmética booleana: >>> a = Oxal >>> b = 0x01 >>> print a, b # para imprimir os valores decimais 161, 1 16 >>> a bb # and 1 >>> a | b # or 161 pop a << 4 shift para esquerda 322 >>> b >> 1 ¥ shift para direita 0 >>> 4 inversao em complemento de 2 -162 Note que a representagio dos valores inteiros, por padrio, é decimal: aqui, embora fornece- ‘mos os valores em base hexadecimal, os resultados aparecem na base 10. 24,3. Operadores de atri operador mais simples, e que ja fui utilizado em diversos exemplos anteriores, é o operador de atribuigdo. Este operador é representado por um iinico simbolo de igualdade, =, definindo uma varidvel ¢ automaticamente atribuindo a cla um valor. © exemplo abaixo define uma varidvel a, com valor inteiro | ppp as Existem formas variantes deste operador que o combinam com os operadores aritméticos € bit-wise introduzidos nas segdes anteriores. Estas formas foram introduzidos na versio Python 2.0, e existem primariamente para oferecer uma maneira conveniente de re-atribuir um valor transformado a-uma varidvel A sintaxe para 0 operador combinado utiliza o simbolo do operador aritmético/bit-wise re- levante, seguido da igualdade, Este operador combinado efetua a operagio sobre o valor da varidvel, jf atribuindo o resultado a esta mesma, Exemplificando: p> al ppp ate >>> print a 2 pop a fa 2 >>> print a a >>> a t= 10 >>> print a 10 2.4.4 Operadores condicionais Tradicionalmente, programagao envolve testar valores (e tomar decisdes com base no resultado do teste). Um teste é essencialmente uma expresso condicional que tem um resultado verdadeiro ou falso, Esta secdo descreve os operadores condicionais mais comuns em Python. 7 A partir da versio 2.2 de Python, existe um tipo numérico que representa o resul- tado de um teste condicional: 0 tipo booleano. & um tipo bastante simples, possuindo apenas dois valores possiveis: True e False. A partir da versio 2.3 de Python, qualquer comparagao retoma um valor booleano; versdes anteriores retornavam 1 ‘ou 0, respectivamente, Na pritica, o resultado é equivalente, fieando apenas mais explicito¢ legivel o resultado. Igualdade >>> print 2 False >>> print 2 True >>> print "a" True >>> print "a" True # igualdade 4 # diferente de pe Comparagio >>> print 1 < 2 # menor que True >>> print 3 > False >>> print False # maior que # maior ou igual que Comparagdes podem ser realizadas também com outros tipos de varidveis; para strings, listas ou diciondrios, as comparagdes ‘maior que’ ¢ “menor que’ se referem ao niimero ¢ ao valor dos elementos, mas por nao serem terrivelmente claras nao so muito freqiientemente usadas” >>> 12,2,3] < [2,3,2] True >>> abacate" < “pera” True Dica: quando comparando o nimero de elementos de uma seqiténcia ou dicionatio, & normalmente utilizada a fungao Len (), que retorna o ‘comprimento” da seqiiéncia Presenca em Seqiiéncias Para seqiiéncias e dicionérios, existe o operador iin, que verifica se © elemento esti contido no conjunto; no caso do diciondrio, o operador testa a presenga do valor na seqiiéncia de chaves >>> "x" in "cha" False >>> 1 in [1,2,3] True TA exces "a0 “obvia ‘ena ordenag ao de sq'u’encias contendo elementos destestipos, 18 24.8 Operadores logicos Os operadores ldgicos not, and e or permitem modificar ¢ agrupar o resultado de testes con- dicionais: >>> nome = "pedro" >>> idade = 24 >>> nome pedro" and idade == 25 False >>> nome pedro" and idade < 25 True >>> len(nome) < 10 or not nome == "pedro" False Estes operadores sio utilizados com freqiiéncia nas estruturas de controle descritas na segaio 25. Combinagio de operadores Python oferece uma forma implicita de combinar operagdes con dicionais, sem 0 uso de operadores Iégicos. Por exemplo, para verificar se um valor esti entre dois extremos, pode-se usar a seguinte sintaxe: if0>> b Total de itens: %d" Custo: BE" 2. Para efetuar a substituigio, aplica-se um operador ® sobre a string contendo o simbolo de formatacio, seguido do valor ou variavel a substitui >>> print a $10 Total de itens: 10 Como pode ser visto, o simbolo é substituido pelo valor fornecido, Podem ser uilizados tanto valores explicitos quanto varidveis para a substtuigao: >>> custo = 5.50 >>> print b % custo Custo: 5.500000 Caso sejam miltiplos valores a substituir, use uma tupla: >>> print "Cliente: %s, Valor %£" % ("hungry.com", 40.30) Fornecedor: hungry.com, Custo 40.300000 Este operador permite ainda utilizar um nimero junto ao simbolo porcentagem para reservar um tamanho total d string: >>> a “"Quantidade: ae >>> print a $3 >>> print a $ 53 >>> print a $ 120 Quantidade: 3 Quantidade: 53 Quantidade: 120 E possivel controlar a formatagao de tipos numéricos de maneira especial através de modifi- cadores nos simbolos no formato m.n. Como acima, m indica o total de caracteres reservados. Para floats, n indica o nimero de casas decimais; para inteitos, indica o tamanho total do mimero, preenchido com zeros 4 esquerda. Ambos os modificadores podem ser omitidos. >>> e = 2.7313 >>> p = 3.1415 >>> sete = 7 >>> print "Euler: %.7£" 3 e # 7 casas decimais Euler: 2.7313000 >>> print "Pi: $10.36" % p # 10 espacos, 3 casas Pir 3.142 >>> print "Sete: $10.3 sete # 10 espacos, 3 digitos Sete: 007 # (6 um inteiro) 20 2.5 Estruturas de controle Toda linguagem de programagao possui instrugdes que controlam o flux de execugao; em. Python, hd um conjunto pequeno e poderoso de instrugdes, descritas nas segdes a seguir. 2.5.1 Condicional: a instrugio if AA instrugdo condicional basica de Python é 0 i £. A sintaxe é descrita a seguir (Iembrando que a indentagdo é que delimita 0 bloco): if condigao: # bloco de cédigo elif condigao: # outro bloco else: # bloco final As condigdes acima so comparagdes feitas utilizando os operadores condicionais descritos na segio 2.4.4, possivelmente combinados por meio dos operadores logicos descritos na se¢io 245. a=2 b=12 ifa<5andb*a> print "ok" A instrugdo elif permite que se inclua uma excesao condicional — algo como”... senao se isso ..”. O else & uma excegao absoluta’. if nome == "pedro": idade = 21 elif nome == "josé idade = 83 else: idade = 0 Provendo nome="41varo" para o bloco acima, seri atribuido 0 valor zero a idade. 2.5.2 Lago iterative: for Hé apenas dois tipos de lagos em Python: for e whi le. O primeiro tipo, mais freqiientemente utilizado, percorte uma seqiiéncia em ordem, a cada ciclo substituindo a variével especificada por um dos elementos. Por exemplo: *N'ao Ia nenhuma estrutura do tipo switch/case, mas “e poss’ vel simul a-la usando uma express"ao 4 £ com lum e1.£ para cada caso diferente 21 >>> jan_ken_pon = ["pedra", “papel”, "cenoura"] >>> for item in jan_ken_po print item pedra papel cenoura A cada iteragdo, i tem recebe o valor de um elemento da seqiiéncia, Para efetuar uma lago com um niimero fixo de iteragdes, costuma-se usar 0 for em conjunto com a fungdo range, que gera seqiiéncias de nimeros >>> for i in range (1,4): print "tda volta” $i la volta 2a volta 3a volta Ieragio em diciontirios Para iterar em diciondrios, podemos usar as fungdes keys () ou values () para gerar uma lista >>> dict = {"batata": 500, "abébora": 1200, cebola": 800} >>> for e in dict.keys(): print “Item: $85 Peso: $85" % (e, dict[el) Item: cebola Peso: 800 Item: batata Pes 500 Item: abébora Peso: 1200 Note que porque o dicionario em si nao possui um conceito de ordem, a lista que resulta do método keys () possui ordenago arbitréria, Por este motivo, no exemplo acima, 0 lago no segue a declaragao do dicionério Controle adicional em lagos Para ambos os tipos de lago, existem duas instrugdes de con- trole adicional, continue ¢ break. A primeita reinicia uma nova iteragdo imediatamente, interrompendo a iteragio atual; a segunda faz o lago terminar imediatamente. A forma geral do lago for &: for variavel in seqiiéncia: # bloco de cédigo else: # bloco executado na auséncia de um break Note a presenga da cléusula ¢1se. Esta cldusula é executada quando a saida do lago nav for determinada por uma instrugao break, Um exemplo clarifica este mecanismo: 22 valores = [2, 4, 5, 2, -1] for i in valores: ifi>> n= 5 * 13 >>> contador = 0 >>> while m >> print “Iteramos %d vezes." % contador Iteramos 510 vezes. ‘Nao hé uma instrugio especial para efetuar um lago com teste ao final da iteragio (como 0 lagodo ... hile () em C),mas pode-se usar um while infinito — usando uma condigio verdadeira, fixa — em combinagio com um teste e break intemos: >>> >>> >>> print 1[i] on Sh ifi <0: break 23 Veracidade e falsidade de condigées As estruturas if ¢ while utilizam condigées légicas para controle, avaliando-as de mancira booleana. Como qualquer valor ou expresso pode ser uusado como condigdo, é importante entender qual o mecanismo de avaliagio da linguagem, Em Python, falso é denotado: pelo booleano False, pelo valor 0 (zero), pela lista, diciondrio, tupla ou string vazios, de tamanho zero, pelo valor especial None, que significa nulo. Qualquer outro valor simples é considerado verdadeiro. Instancias podem definir regras mais complexas para avaliagao; para detalhes consulte a se¢do Basic customization do manual de referéncia Python. 4 Excegies Com o5 dois tipos de lagos descritos na segao anterior, todas as necessidades ‘normais’ de con- trole de um programa podem ser implementadas. No entanto, quando algo inesperado ocorre, ou uma condigao de erro conhecido ¢ atingida, Python oferece uma forma adicional de controlar 0 fluxo de execugao: a excesio. A excegio & um recurso de linguagens de programagio modemas que serve para informar que uma condigao incomum ocorreu. Embora existam outras aplicagdes, em geral comunicam- se através de excegdes etros ou problemas que ocorrem durante a execucdo de um programa Excegdes sio internamente geradas pelo interpretador Python quando situagdes excepcionais ocorrem. No exemplo abaixo, >>> a= (1, 2, 3] >>> print a[5] © cédigo interno do interpretador sabe que no podemos acessar uma lista através um indice nao-existente, e gera uma excegao: Traceback (most recent call last): File "", line 1, in ? IndexError: list index out of range ‘Vamos analisar a mensagem exibida. A primeira linha anuncia um traceback, que é a forma como é exibida a pilha de execugao que gerou a excecao. A segunda indica a linha de cédigo na qual ocorreu o problema, ¢ o arquivo. Como estamos usando 0 modo interativo neste exemplo, © arquivo aparece como , que é a entrada padrao. A terceira linha indica 0 tipo de excegao levantada — neste caso, IndexError —e informa uma mensagem que descreve mais especificamente 0 problema 24 Tratando excegdes A excegdo normalmente imprime um traceback ¢ interrompe a execugio do programa, Uma ago comum é testar ¢ controlar a excegao; para este fim, usamos uma cliusula try/except: >>> a= (1, 2, 3] >>> try: print a[5] except IndexError: print "O vetor nao possui tantas posicdes!" © vetor nao possui tantas posicées! A instrugio try captura excegdes que ocorrerem no seu bloco de eédigo: a linha except. determina quais tipos de excego serio capturados. A sintaxe da cliusula except segue os forma- tos: except tipo_da_excecao [, variavel_da_excecao] : # bloco de cédigo ou except (tipo_excecao_1, tipo_excecao 2, ...) [, variavel_da_excecao]: # bloco de cédigo O primeiro elemento da cliusula except ¢ um tipo da excego, ou uma tupla de tipos caso ‘iiltiplas excegdes devam ser tratadas da mesma forma, O segundo elemento & opcional; permite que seja capturada uma instincia que armazena informagGes da excegao. Um uso trivial desta instdncia & imprimir a mensagem de erro: >>> a = "Foo" >>> print a +1 Traceback (most recent call last): File "", line 1, in ? TypeBrror: cannot add type "int" to string Podemos capturar e tratar de forma especial o erro acima, imprimindo a mensagem fomnecida e continuando a execugio normalmente. >>> try: print a +1 except TypeError, e: print "Um erro ocorreu: Um erro ocorreu: cannot add type "int" to string >>> Diversos tipos de excegdes vém pré-definidas pelo interpretador Python: o guia de referéncia contém uma lista completa e os casos onde sao levantadas. Note também que esta introdugdo a excegdes nao cobre a sua sintaxe completa: consulte a segao Errors and Exceptions do tutorial Python para maiores detalhes. 25 2.6 Fungées FungGes sao blocos de eédigo com um nome; recebem um conjunto de pardmetros (ou argumen- tos) e retornam um valor. Python possui, como seria esperado de uma linguagem de programagao completa, suporte a fungdes. Existem diversas fungdes pré-definidas pelo interpretador, descritas na segGo 3; a sega atual detatha as formas de definir fungSes em cédigo Python. 2.6.1 Sintaxe basica ‘A sintaxe geral para definir uma fungao é: def nome_funcao(arg_l, arg_2, ..., arg_n): # # bloco de cédigo contendo corpo da funcao # return valor_de_retorno # retornar é opcional © cédigo da fungio, uma ver avaliado pelo interpretador, define um nome local. Os argu- mentos sio valores fornecidos quando chamada a fungdo, e que ficam disponiveis por meio de variaveis locais no corpo da fungi. ‘No exemplo abaixo, temos uma funcio que recebe uma lista de diciondrios como parimetro, € uma fingo que recebe um diciondirio. A primeira itera pela lista recebida, e passa 0 elemento alual como argumento para a segunda def imprime_cardapio (pratos) : print "Cardapio para hoje\n" for p in pratos: imprime_prato(p) print "\nTotal de pratos: % len(pratos) def imprime_prato(p) seeees $10,2£" % (p["nome"], p["preco"]) Ao ser interpretado, 0 eddigo acima define dois nomes locais: imprime.cardapio e imprime prato. Para que a fungio seja de fato executada, usamos este nome seguido dos argumentos passados entre parénteses # defino dicionérios descrevendo os pratos pl = {"nome": “Arroz com brocolis", "preco": 9.90} p2 = (nome! joja com legumes", "preco": 7.80} p3 = {"nome": “Lentilhas", "preco": 4.80} lista_pratos = (pl, p2, p3] # © chamo uma funcéo, passando os pratos como argumento imprime_cardapio(1ista_pratos) ‘o que resulta na seguinte saida quando executado: 26 Cardapio para hoje Arroz com brocolis ... 9.90 Soja com legumes ... 7.80 Lentilhas ... 4.80 Total de pratos: 3 Retornando um valor No exemplo acima, as fungdes nao ‘retomam’ valor algum, apenas exibindo informagio, Para retomar um valor, basta usar a expresso return dentro da fungio. A primeira pergunta conceitual aqui seria “retornar para quem)”; a resposta direta € “para quem invocou a fungo". Demonstrando por exemplos, a fungo abaixo: def bar (t) return "The rain in Spain falls mainly in the és. define um valor de retomo, que é uma string; ao chamar esta fungao com um argumento: a = bar("plains") © cédigo da fungao é avaliado ¢ um valor, retornado, sendo armazenado na variivel a (ob- serve 0 uso do operador de atribuigdo seguido da chamada da fungio). Para visualizar 0 valor retomado, usamos a conveniente instrugao pr int: >>> print a The rain in Spain falls mainly in the plains. Dica: para retornar conjuntos de valores, basta retomnar uma seqiiéncia ou outro valor de tipo composto. 2.6.2 ‘Truques com argumentos Argumentos nomeados Argumentos podem ser fomecidos 4 fungo especificando-se 0 nome do parametro a0 qual correspondem, O cddigo abaixo é equivalente & chamada no exemplo amterior: a = bar(t="plains") mas fica explicitamente declarado que 0 parimetro corresponde ao argumento t. Normal- mente sio nomeados argumentos para tomar a leitura do eédigo mais facil: no entanto, veremos a seguir como sao essenciais para utilizar uma das formas de listas de argumentos variaveis. 27 Valores padrio Uma das funcionalidades mais interessantes nas fungdes Python ¢ a possibili- dade de definir valores padrao: def aplica_multa(valor, taxa=0.1): return valor + valor * taxa ‘Neste exemplo, o valor padrio para a variivel taxa € 0.1; se nao for definido este argumento, © valor padrio sera utilizado, >>> print aplica_multa(10) 11.0 >>> print aplica_muilta(10, 0.5) 15.0 Dica: Nao utilize como valor padrao listas, dicionérios ¢ outros valores mutiveis; os valores padrdo so avaliados apenas uma vez ¢ 0 resultado obtido nao ¢ o que intuitivamente se esperar. Conjuntos de argumentos opeionais Uma forma de definir conjuntos de argumentos opei- onais utiliza parimetros ‘curinga” que assumem valores compostos. Pode ser fomecido um parametro cujo nome € prefixado por um simbolo asterisco, que assumiré um conjunto orde- nado de argumentos; def desculpa(alvo, *motivos): d= "Desculpas %s, mas estou doente" % alvo for motivo in motivos: d=d+"e %s" % motivo return d +". >>> desculpa("senhor", "meu gato fugiu", "minha tia veio visitar esculpas senhor, mas estou doente e meu gato fugiu e minha tia veio visitar.” ‘ou um parmetro que assume um conjunto de argumentos nomeados, prefixado de dois aste- riscos: def equipe(diretor, produtor, **atores): for personagem in atores.keys(): print "$s: %s" 8 (personagem, atores(personagem]) print "-" * 20 print "Diretor: %s print "Produtor: 4s' % diretor % produtor >>> equipe (direto: produtor: "paul Anderson", Paul Anderson", 28 Frank="Tom Cruise", Edmund="Pat Healy", Linda="Julianne Moore") Tom Cruise Edmund: Pat Healy Linda: Julianne Moore Diretor: Paul Anderson Produtor: Paul Anderson ‘ow ainda as duas formas combinadas. Estes parimetros especiais devem necessariamente ser 05 iltimos definidos na lista de parametros da fungo. Note que estes argumentos especiais no agregam pardimetros que correspondem a argumentos explicitamente definidos, como avo, diretor e produtor nos exemplos acima: estes so processados de maneira normal. Conjuntos de argumentos opcionais so uma excelente forma de conferir flexibilidade a uma fungio mantendo compatibilidade com cddigo pré-existente, sem prejudicar a sua legibilidade Escopo de variiveis Embora o tema escopo seja complexo, ¢ nao esteja restrito apenas a fungdes, cabe aqui uma observagao sobre o escopo das varidveis definidas no corpo de fungdes. ‘Tanto as varidveis definidas no corpo de uma fungo, como a varidvel 4 no exemplo abaixo, quanto os argumentos da fungao sio acessiveis apenas no eseopo local; em outras palavras, apenas no bloco de cédigo da propria funcao. v=o ee def verifica(a, b): i=0 # Neste bloco de cédigo, v, w, a, b e i séo acessiveis def cancela(x, y): iso # Neste bloco de cédigo, v, w, x, ye i séo acessiveis, # mas note que *este* i ndo tem nenhuma relacdo com ¥ 0 i da funcdo verifica() acima. Variaveis definidas no corpo principal (ou seja, definidas em um bloco nao-indentado, como as varidveis v e w acima) de um médulo podem ser liday em qualquer fungao contida naquele arquivo; no entanto, nao podem ser alteradas?. Caso se deseje definir ou atribuir um novo valor a uma varidvel global, existe uma instrugzio especial, global. Esta instrugdo indica que a varidvel cujo nome for especificado é para ser definida no escopo global, ¢ nao local. v=o %O motivo pelo qual existe esta disting "ao est'aintimamente associado a forma como Python atrbui vari‘aveis. Ao realizar uma opetag “ao de atribuig “ao, a vati‘avel ‘e sempre definida no escopo local; acesso vari‘avel, no entanto, cfetua uma busca nos escopos, do mais local para o mais global. 29 def processa(t): global v No eddigo acima, a fungdo altera o valor da varidvel global v Ha duas fungGes titeis para estudar os escopos que se aplicam em um determinado contexto: # Locals (), que retoma um dicionirio descrevendo 0 escopo local a0 contexto atual; os itens do dicionario sio compostos dos nomes das varidveis definidas neste escopo e os valores aos quais correspondem. ‘* global (), que retoma um dicionério semelhante ao da fungio Locals (), mas que descreve o escopo global. © escopo de varidveis funciona de maneira semethante quando tratando com métodos definigdes de classes, que serio discutidos na segdo 4 2.7 Médulos eo comando import Como dito anteriormente, cada arquivo contendo cédigo Python & denominado um médulo. Na grande maioria das ocasides utilizamos um ou mais médulos Python em combinacio: 0 interpretador interativo & adequado para realizar experimentos curtos, mas no para escrever codigo de produgio. Um médulo Python consiste de cédigo-fonte contido em um arquivo denominado com a extensio .py; como tal, pode conter varidveis, fungdes ¢ classes; para fins de nomenclatura, qualquer um destes elementos contidos em um médulo é considerado um atributo do médulo. Python, através do médulo, oferece excelentes mecanismos para modularizar cédigo-fonte Esta modularizagio pode ter diversas motivagdes: 0 programa pode ser grande demais, ter sub- partes reusiveis que devem ser separadas, ou ainda necessitar de médulos escritos por tereeiros, Esta seco introduz este conceito através do comando import. Importando médulos ¢ atributos de médulos A instrugio bisica para manipular médulos € import. O médulo deve estar no caminho de procura de médulos do interpretador'". No exemplo a seguir, um médulo com o nome os .py é importado. Observe que a extensio .py rndo & incluida no comando import — apenas o nome principal >>> import os >>> print os.getewd() Yhome/ kiko O médulo oss define algumas fiungdes internamente. No exemplo acima, invocamos a fungaio getowd() contida neste, prefixando a fungdo com 0 nome do médulo, E importante esta 0 eaminho de procura “e uma lista de direorios onde o inferpretador Python busca wm modulo quando uma insirug “ao import “e processada; normalmente esta lista inclu diret‘orio atual eos diet ‘orios de biblioteca padr“ao. Pode ser manipulado pela vari‘avel de ambiente PYTHONPATH ou pelo m’edulo sys.path, 30 observacio: ao usar a forma import médulo, acessamos os atributos de um médulo usando esta sintaxe, idéntica & utilizada para acessar métodos da lista conforme descrito na seo 2.3.2. Existe uma segunda forma do comando import que funciona de forma diferente. Ao invés de importar 0 médulo inteito, o que nos obriga a usar as fungdes prefixadas pelo nome do médulo, este formato importa um atributo do médulo, deixando-o acessivel localmente: >>> from os import getewd >>> print getewd() /home/ kiko Fungdes iteis Ha algumas fungdes pré-definidas no interpretador bastante iiteis quando li- dando com médulos ¢ 0s atributos contidos em médulos: © dir (nome.médulo) retorna uma lista dos nomes dos atributos contidos em um médulo, ‘0 que permite que vocé descubra interativamente quais simbolos e funcdes 0 compdem. Experimente, por exemplo, executar print dir (os) a partir do interpretador Python, * reload (nome.médulo) recarrega 0 médulo importado a partir do seu arquivo; desta maneira, alteragdes podem ser efetuadas no arquivo do médulo e jé utilizadas em uma sesso do interpretador, sem que seja necessario reinicié-lo. mecanismo de importagio possui uma série de nuances especiais, que esto associados a0 t6pico escopo, introduzido na sega anterior, e aos namespaces, que resumidamente determinam © conjunto de atributos acessiveis em um determinado contexto. Uma descrigo mais detalhada destes tépicos € oferecida na segdo Python Scopes and Name Spaces do tutorial Python. 2.8 Strings de documentagio ‘Um recurso especialmente til em Python é o suporte nativo & documentagao de eédigo por meio de strings localizadas estrategicamente, chamadas doestrings. Médulos, classes, fungdes ¢ até propriedades podem ser descritas por meio de doestrings; 0 exemplo a seguir demonstra um médulo hipotético, £inanc py, documentado adequadamente: Médulo que contém funcSes financeiras. def calcula_juros (valor, taxa=0.1): ""Calcula juros sobre um valor. Aplica uma taxa de juros fornecida sobre um valor e retorna o resultado. Se omitida a taxa, o valor 0.1 sera utilizado""™ Boe class Pagamento: ""Classe que representa um pagamento a ser efetuado. 31 Inclui informagdes de crédito e débito. Permite efetuar operacées como devolucdo, cancelamento, transferéncia e pagamento em si. Possui o seguinte ciclo de vida: As doestrings do médulo acima podem ser visualizadas em tempo de execugdo, ¢ mesmo a partir do modo interativo do interpretador por meio da fungdo he 1p () edo atributo _.doc. >>> import finane >>> help (calcula_juros) Calcula juros sobre um valor. Aplica uma taxa de juros fornecida sobre um valor e retorna o resultado. Se omitida a taxa, o valor 0.1 sera utilizado >>> print financ. doc Médulo que contém funcées financeiras. Observe que a fungdo help recebe como argumento a propria funcdo calcula juros: pode parecer pouco usual mas é um padrdo comum em Python. Este recurso ¢ extremamente itil para o aprendizado da linguagem quando explorando obje~ tos pré-definidos; utilize-o sempre que estiver necessitando de uma referencia répida: >>> len([1,2,3]) 3 >>> help (Len) Help on built-in function len: ) len (object) -> integer len( Return the number of items of a sequence or mapping. Docstrings podem também ser processadas utilizando ferramentas externas, como 0 epy- doc'!, gerando referéncias em formatos navegdveis como HTML. 3 Fungoes pré-definidas Python possui uma série de fungdes pré-definidas, que jé esto disponiveis quando executamos 6 interpretador, sem ter que recorrer a bibliotecas extemas. Algumas fungSes importantes que ainda no foram apresentadas no texto seguem: "Dispon't vel em http: //epydoc sourceforge .net/; um exemplo da documenta “ao gerada pode ser consultadoem http: //www.asyne.con.br/projects/kiwi/api/, 32 ‘* range (a,b): recebe dois inteiros, retorna uma lista de inteiros entre a eb nao incluindo b, Esta fungao ¢ freqiientemente utilizada para iterar lagos for. >>> print range (1,10) (1, 2, 3, 4, 5, 6, 7, 8, 91 '* Len (a) : retorna o comprimento da varivel 2: para listas, tuplas e diciondrios, retorna 0 niimero de elementos: para strings, o nimero de caracteres: ¢ assim por diante. >>> print len({1,2,3]) 3 ‘* round(a, n): recebe um float ¢ um numero; retoma o float arredondado com este nimero de casas decimais. * pow (a, n): recebe dois inteiros; retoma o resultado da exponenciagao de a a ordem n E equivalente a sintaxe a ** n. '* chr (a) : recebe um inteiro (entre 0 ¢ 255) como parimetro, retornando o caracter corres- pondente da tabela ASCIL >>> print chr (97) # unichr (a): como chr () ,recebe um inteiro (aqui variando entre 0 e 65535), retornando ‘ caracter Unicode correspondente. * ord (a): reeebe um tinico caracter como parimetro, retorando o seu eédigo ASCII. >>> print ord("a") 97 # min (a,b): retoma o menor entre a e b, sendo aplicavel a valores de qualquer tipo. * max (a,b): retoma o maior entre a eb. # abs (n): retoma o valor absoluto de um nimero. # hex(n) e oct (n): retomam uma string contendo a representagio em hexadecimal ¢ ‘octal, respectivamente, de um inteiro. Ha também fungdes de conversio explicita de tipo; as mais freqiientemente utilizadas in- cluem: ‘© £loat (nm): converte um inteiro em um float >>> print float (1) 1.0 33 ‘© int (n) : converte um float em inteiro. >>> print int (5.5) 5 * str (n): converte qualquer tipo em uma string. Tipos seqiiencias so convertidos de forma literal, peculiarmente. >>> print str([1,2,3]), str({"a": 1}) flee, 3) (eau 2) # List (1) e tuple (1): converte uma seqiiencia em uma lista ou tupla, respectiva- mente. >>> print list ("ébaco") [ay "bl, fa’, el, for] Além destas fungdes, existe uma grande biblioteca disponivel nos médulos jé fornecidos com © Python, Alguns destes médulos sio discutidos na segio 5; como sempre, © manual Python & a referéncia definitiva no assunto. As segies seguintes discutem algumas fungdes pré-definidas com comportamento especial- ‘mente relevante. 3.1 Manipulagao de arquivos: a fungio open () A fungio open é uma das mais poderosas do Python; serve para obter uma referéneia a um objeto do tipo arquivo. Assumindo que temos um arquivo chamado arquivo. txt, contendo um trecho de um livro famoso, podemos codificar seguinte exemplo’ >>> a = open("arquivo.txt") >>> print a Uma ver obtida a referéncia a0 objeto arquivo, podemos usar métodos especificos deste, como 0 método read () , que retoma 0 contetido do arquivo: >>> texto = a.read() >>> print texto *...Would you tell me, please, which way I ought to go from here?’ ‘That depends a good deal on where you want to get to,’ said the Cat. ‘I don’t much care where--' said Alice. “Then it doesn’t matter which way you go,’ said the Cat. 34 Sintaxe 0 formato geral da fungao open é: open (nome_do_arquivo, modo) Ambos os parimetros so strings. O modo determina a forma como o arquivo seri aberto ¢ € 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 simbolo ‘+’ for agregado a0 modo, o arquivo pode ser lido e escrito simultaneamente. Métodos do objeto arquivo 0 objeto arquivo possui um conjunto de métodos iiteis: os mais importantes sio descritos abaixo. Note que o arquivo possui um conceito de posigo atual: em um dado momento, operages serio realizadas com base em uma certa posi¢io. Alguns métodos utilizam ou alteram esta posicio; outros sio operacées globais, independentes da posicio dela. * read (): como visto acima, retorna uma string tinica com todo o contetido do arquivo. ‘* readline () : retoma a proxima linha do arquivo, ¢ incrementa a posigao atual '* readlines (): retoma todo 0 contetido do arquivo em uma lista, uma linha do arquivo por elemento da lista. * write (data): esereve a string data para o arquivo, na posigao atual ou ao final do arquivo, dependendo do modo de abertura. Esta fungao falha se 0 arquivo foi aberto com modo ‘x’ '* seek (n): muda a posigdo atual do arquivo para o valor indicado em n, * close (): fecha 0 arquivo, Qualquer arquivo pode ser aberto ¢ lido desta forma; experimente com esta func, abrindo alguns arquivos locais, lendo e modificando-os. ura do teclado: raw input () Outra fungio stil sobretudo para programas Python interativos & a fungi raw input: 1é do teclado uma string, e a retoma. Esta fingo possui um parametro opcional, que é uma mensagem a ser fornecida ao usuario. O exemplo seguinte utiliza um médulo com 0 nome leitura.py: a = raw_input ("Entre com um mimero de 0 a 10: ") n = int(a) if not 0 >> import leitura Entre com um niimero de 0 a 10: 7 £ impar 4 Orientagio a Objetos Emibora termos importantes como classes, objetos e médulos tenham sido introduzidos ante- riormente, ainda no discutimos em detalhes os conceitos ¢ a implementaco de orientacio a objetos (00) em Python, Python suporta orientagao a objetos utilizando um modelo flexivel e particularmente homogéneo, que simplifica a compreensio dos mecanismos OO fundamentais da linguagem. 4.1 Conceitos de orientagaio a objetos Orientagao a objetos ¢ um termo que descreve uma série de técnicas para estruturar solugdes para problemas computacionais. No nosso caso especifico, vamos falar de programag’o OO, que ¢ uum paradigma de programacao no qual um programa é estruturado em objetos, e que enfatiza os, aspectos abstragao, encapsulamento, polimorfismo e heranga!™ Convencionalmente, um programa tem um fluxo linear, seguindo por uma fungio princi- pal (ou 0 corpo principal do programa, dependendo da linguagem de programagio) que invoca fungdes auxiliares para executar certas tarefas a medida que for necessério. Em Python é perfei- tamente possivel programar desta forma, convencionalmente chamada de programagao proce- dural Programas que utilizam conceitos OO, ao invés de definir fungdes independentes que so utilizadas em conjunto, dividem conceitualmente 0 “problema” (ou dominio") em partes in- dependentes (objetos), que podem conter atributos que os descrevem, ¢ que implementam 0 comportamento do sistema através de funcdes definidas nestes objetos (métodos). Objetos (© seus métodos) fazem referéncia a outros objetos € métodos; o termo ‘envio de mensagens’ & utilizado para descrever a comunicagaio que ocorre entre os métodos dos diferentes objetos Na pritica, um programa orientado a objetos em Python pode ser descrito como um con- junto de classes — tanto pré-definidas quanto definidas pelo usudrio — que possuem atributos ¢ métodos, e que sio instanciadas em objetos, durante a execucio do programa. A seco seguinte concretiza estes conceitos com exemplos. 4.2 Objetos, classes e instancias Objetos so a unidade fundamental de qualquer sistema orientado a objetos. Em Python, como introduzido na se¢do 2.3.2, tudo é um objeto — tipos, valores, classes, fungdes, métodos ¢, & claro, instncias: todos possuem atributos e métodos associados. Nesta segdo serdo descritas as estruturas da linguagem para suportar objetos definidos pelo programador "Mais detalhes sobre coneeitos fundamentais de OO podem se obtidos em http: //en.svikipedia.crg/ wiki /object-oriented_programni: 0 ‘problema’ ou “dom’1nio" de um software compreendeo conjunto de tarefas essenciais que este deve realizar por exemplo,o dom’ nio de um editor de textos compreende escrever, corigr alterar documentos —e um conceito fundamental, muito provavelmente modelado em uma classe 00, seria o Document 36 Classes Em Python, a estrutura fundamental para definir novos objetos ¢ a classe, Uma classe € definida em cédigo-fonte, ¢ possui nome, um conjunto de atributos e métodos. Por exemplo, em um programa que manipula formas geométricas, seria possivel conceber uma classe denominada Retangulo: ‘* Esta classe possuiria dois atributos: 1ado.a ¢ Lado-b, que representariam as dimensdes dos seus lados. ‘* A classe poderia realizar operagdes como calcula.area ¢ calcula_perimetro,¢ que retomariam os valores apropriados. Um exemplo de uma implementagio possivel desta classe esta no médulo retangulo.py a seguir: class Retangulo: ado_a = None lado_b = None def __init__(self, lado_a, lado_b): self.lado_a = lado a self.lado_b = lado_b print "Criando nova instancia Retangulo” def calcula_area (self): return Self.lado_a * self.lado b def calcula perimetro(self return 2 * self.lado_a + 2 * self.lado b Esta classe define os dois atributos descritos acima, e trés métodos. Os trés métodos definidos incluem sempre, como primeiro argumento, uma varidvel denominada self, que € manipulada no interior do método. Este é um ponto fundamental da sintaxe Python para métodos: 0 primeiro argumento é especial, e convenciona-se utilizar 0 nome self para cle; logo a seguir sera discutido para que existe Dois dos métodos codificados correspondem as operagées descritas inicialmente, ¢ hé um método especial incluido: _init_(). O nome deste método tem significdncia particular em Python: & 0 método construtor, um método opeional invocado quando a classe é instanciada, que € 0 nome dado a agio de eriar objetos a partir de uma classe. Instincias A instancia & objeto criado com base em uma classe definida. Este conceito & peculiar, ¢ leva algum tempo para se fixar. Uma descrig&o abstrata da dualidade classe-instincia: classe & apenas uma mattiz, que especifiea objetos, mas que nao pode ser utilizada diretamente; 1 instincia representa o objeto coneretizado a partir de uma classe. Eu costumo dizer que a classe ¢ ‘morta’, existindo apenas no cédigo-fonte, ¢ que a instincia & ‘viva’, porque durante a execucio do programa sio as instincias que de fato ‘funcionam’ através da invocagao de métodos ¢ manipulagio de atributos. 37 Conceitualmente, a instincia possui duas propriedades fundamentais: a classe a partir da qual foi criada, que define suas propriedades e métodos padrio, e um estado, que representa 0 con- junto de valores das propriedades e métodos definidos naquela instancia especifica. A instincia possui um ciclo de vida: é criada (e neste momento seu construtor é invocado), manipulada con- forme necesséirio, ¢ destruida quando nio for mais dtil para o programa. O estado da insténcia evolui ao longo do seu ciclo de vida: seus atributos so definidos e tém seu valor alterado através de seus métodos e de manipulagio realizada por outros objetos. (© que Python chama de ‘instancia’ ¢ freqiientemente denominado “objeto” em outras linguagens, o que cia alguma confusio uma vez que qualquer dado em Python pode ser considerado um ‘objeto’. Em Python, instincias sio objetos eri- ados a partir de uma classe definida pelo programador. Retomando 0 nosso exemplo acima: a partir da classe Retangulo que foi definida, po- deriamos instanciar objetos retingulo especificos: um com lados de comprimento 1 ¢ 2, ¢ outro com lados de comprimento 2 ¢ 3: >>> from retangulo import Retangulo >>> rl = Retangulo(1, 2) Criando nova instancia Retangulo >>> 12 = Retangulo(2, 3) Criando nova instancia Re! gulo Observe que ao instanciar 0 retangulo: ‘* Foi importado e utilizado o nome da classe seguido de parénteses, + Foram fornecidos como argumentos — entre parénteses — dois valores, correspondendo ‘208 comprimentos dos lados diferentes dos retingulos (1 ¢ 2 para o primeiro retangulo, ¢ 23 para o segundo) ‘Estes argumentos so passados — transparentemente —para o método construtor da classe Retangulo. O cédigo do método esté reproduzido aqui para facilitar a leitura: def __init__ (self, lado_a, lado_b): Self.lado_a = lado_a self.lado_b = lado_b print "Criando nova instancia Retangulo" Aqui cabe uma pausa para revelar o propésito da variivel se14, definida como primeiro argumento dos métodos. Esta varidvel representa a insfdncia sobre a qual aquele método foi invocado. Esta propriedade é de importincia fundamental para OO em Python, porque através desta varidvel é que atributos e métodos desta instincia podem ser manipulados no cédigo dos seus métodos. Continuando com a anilise do bloco de eédigo acima: 38 ‘* Nas duas primeiras linhas do método — onde ¢ feita atribuigio — o e6digo do construtor std atribuindo valores para dois atributos, 1ado.a ¢ lado.b, na instdncia, aqui repre- sentada pelo angumento se1£, Neste momento, o estado da instancia passa a conter os dois atributos novos. ‘© O construtor inclui uma instrugao print diditica que imprime uma mensagem para de- monstrar que foi executado; a mensagem aparece na saida do interpretador. ‘Uma vez instanciados os retdngulos, podemos acessar seus métodos. De maneira idéntica ‘a0s métodos da lista apresentados na segdo 2.3.2, a sintaxe utiliza um ponto seguido do nome do método acompanhado de parénteses: >>> print rl.calcula_area() 2 >>> print r2.calcula_perimetro() 10 Conforme esperado, as funges retornaram os valores apropriados para cada instncia, Fa- zendo mais uma demonstracao do uso do argumento se1 £, vamos observar 0 cédigo de um dos métodos: def calcula_area(self) return self.lado_a * self.1lado_b O onipresente argumento se1£ aqui é utilizado como meio de acesso aos atributos Lado.a € lado.b. Este eédigo permite visualizar o funcionamento pleno deste mecanismo: ao ser in- vocado 0 método calcula.area sobre a instincia r1,o argumento se1£ assume como valor esta mesma instdncia; portanto, acessar atributos de se1 £ internamente ao método equivale, na pritica, a acessar atributos de r1 externamente. Em Python ¢ possivel, inclusive, acessar os atributos da instincia diretamente, sem a neces- sidade de usar um método: >>> print r1.lado_a 1 >>> print r1.lado_b 2 Os valores, logicamente, correspondem aos inicialmente fomnecidos 4 instancia por meio do seu construtor, Atributos Privados ¢ Protegidos Algumas linguagens permitem restringir acesso aos atri- butos de uma instincia, oferecendo 0 conceito de varivel privada. Python nao possui uma construcao sintitica literalmente equivalente, mas existem duas formas de indicar que um atri- buto nao deve ser acessado externamente: ‘* A primeira forma ¢ implementada por meio de uma convengao, nao havendo suporte es- pecifico na linguagem em si: convenciona-se que aributos ¢ métodos cujo nome ¢ ini- ciado por um sublinhado (como metodo.a) nao devem ser acessados extemamente em situagies ‘normais ‘A segunda forma estende esta convengao com suporte no proprio interpretador: métodos e atributos cujo nome ¢ iniciado por dois sublinhados (como —metodo.a) sio considera- dos de fato privados, e tém seus nomes alterados de maneira transparente pelo interpretador para assegurar esta protecao. Este mecanismo é descrito em maior detalhes na secdo Pri- vate Variables do tutorial Python. 4.3. Herang a ‘Um mecanismo fundamental em sistemas orientados a objetos modemnos é heranga: uma ma- neira de derivar classes novas a partir da definigao de classes existentes, denominadas neste con- texto classes-base. As classes derivadas possuem acesso transparente aos atributos e métodos das classes base, ¢ podem redefinir estes conforme conveniente. Heranca é uma forma simples de promover reuso através de uma generalizagdo: desenvolve- se uma classe-base com funcionalidade genérica, aplicdvel em diversas situagdes, ¢ definem-se subelasses coneretas, que atendam a situag&es especificas, Classes Python suportam heranga simples ¢ heranga miltipla, Os exemplos até agora evita- ram o uso de heranga, mas nesta secdo é possivel apresentar a sintaxe geral para definigdo de uma classe’ class nome-classe(basel, base2, basen): atributo-1 = valor-1 atributo-n = valor-n def nome-método-1(self, argl, arg2, ..., argn): # bloco de cédigo do método def nome-método-n(self, argl, arg2, ..., argn): # bloco de cédigo do método Como pode ser observado acima, classes base sio especificadas entre parénteses aps o nome da classe sendo definida, Na sua forma mais simples: class Foo: Aon def cheese (self): print "cheese" def foo(self): print "foo" 40 class Bar (Foo): def bar (self): print “bar' def foo(self): # método redefinido print "foo de bar!" uma instancia da classe Bar tem acesso aos métodos cheese (), bar () € £00 (), este liltimo sendo redefinido localmente: >>> b = Bar() >>> b.cheese() cheese >>> b.f00() # saida demonstra método redefinido foo de bar! # em Bar >>> b-bar() foo >>> print b.a # acesso transparente ao atributo 1 # definido em Foo ‘enquanto uma instdncia da classe Foo tem acesso apenas as fungdes definidas nela, £09 () e cheese >>> £ = Foo) >>> £.f00() foo Inyocando métodos de classes-base Para acessar os métodos de uma classe-base, usamos uma construcio diferente para invocé-los, que permite especificar qual classe armazena o método sendo chamado, Seguindo o exemplo, vamos novamente a redefinir 0 método Bar. £00 () class Bar (Foo): te def fo0(self): Foo. f00 (self) print "foo de bar!" Nesta versio, o método foo () inclui uma chamada ao método Foo . £00 () , que conforme indicado pelo seu nome, é uma referéneia direta ao método da classe base. Ao instanciar um objeto desta classe: >>> b = Bar() >>> b.fo0() foo foo de bar! 41 pode-se observar que sio executados ambos os métodos especificados. Este padrio, aqui demonstrado de forma muito simples, pode ser utilizado em situagdes mais elaboradas; seu uso mais freqiiente 6 para invocar, a partir de um construtor de uma classe, o construtor das suas classes-base. Fungoes Uteis Ha duas fungdes particularmente tteis para estudar uma hierarquia de classes e instincias: * isinstance (objeto, classe): retoma verdadeiro se 0 objeto for uma instincia da classe especificada, ou de alguma de suas subclasses, * issubclass(classe.a, classe.b): retoma verdadeiro se a classe especificada como classe_a for uma subclasse da classe _b, ou se for a propria classe. Atributos de classe versus atributos de instdineia Uma particularidade em Python, que deriva da forma transparente como variaveis so acessadas, ¢ a distingio entre atributos definidos em uma classe, ¢ atributos definidos em uma instdncia desta classe. Observe 0 cédigo a seguir: class Foo A classe acima define uma variavel a com o valor 1. Ao instanciar esta classe, >>> £ = Foo() >>> print £.a 1 observa-se que a varidvel parece estar definida na instancia. Esta observacio convida a algu- ‘mas indagagdes: ‘© Onde esti definida a varidvel a ~ na classe ou na instincia? # Se atribuirmos um novo valor a £ . a, como abaixo: eee tea 2) estamos alterando a classe ou a instincia? ‘© Uma ve7 atribuido 0 novo valor, que valor aparecerd para 0 atributo a no préximo objeto instanciado a partir de Foo? As respostas para estas perguntas sio todas relacionadas a um mecanismo central em Python, que € 0 protocol getattr. Este protocolo dita como atributos sio transparentemente locali- zados em uma hierarquia de classes ¢ suas instincias, e segue a seguinte receita: 1. Ao acessar um atributo de uma instincia (por meio de uma variivel qualquer ou se1-£) 0 interpretador tenta localizar o atributto no estado da instincia, 42 2. Caso nao seja localizado, busca-se 0 atributo na classe da instancia em questio. Por sinal, este passo € 0 que permite que métodos de uma classe sejam acessiveis a partir de suas instancias 3. Caso nao seja localizado, busca-se o atributo entre as classes base definidas para a classe da instancia 4, Ao atribuir uma varidvel em uma instincia, este atributo ¢ sempre definido no estado local da instancia, ‘Uma ver,compreendido este mecanismo, ¢ possivel elucidar respostas para as questbes acim No exemplo, a varidvel a esti definida na classe Foo, ¢ pelo ponto 2 acima descrito, é acessivel como se fosse definida pela propria instincia, Ao atribuir um valor novo a £ .a, estamos defi- niindo uma nova varidvel a no estado local da varidvel £, 0 que nao tem nenhum impacto sobre a varidvel a definida em Foo, nem sobre novas instincias eriadas a partir desta. Se o descrito acima parece confuso, nao se preocupe: 0 mecanismo normalmente funciona exatamente da maneira que se esperaria de uma linguagem orientada a objetos. Existe apenas uma situago “perigosa’, que ocorre quando usamos atributos de classe com valores mutaveis, como listas e dicionarios. class Foo: a= [1,2] Nesta situago, quando criamos uma instncia a partir de Foo, a varidvel a pode ser alterada por meio desta instincia. Como nio foi realizada atribuicao, a regra 4 descrita acima nao se aplica’ >>> £ = Foo() >>> f.a.append(3) >>> g = Foot) >>> print g.a (1, 2, 3] € a variavel da classe € de fato modificada, Esta particularidade é freqiientemente Fonte de bugs dificeis de localizar, e por este motivo se recomenda fortemente que mio se utilize variveis de tipos mutiiveis em classes. 4.4 Introspecgio ¢ reflex fo Introspeccio e reflexio sio propriedades de sistemas orientados a objetos que qualificam a existéncia de mecanismos para descobrir e alterar, em tempo de execugao, informagoes estru- turais sobre um programa ¢ objetos existentes neste. Python possui tanto caracteristicas introspectivas quanto reflexivas. Permite obter em tempo de execugao informagdes a respeito do tipo dos objetos, incluindo informagdes sobre a hierar quia de classes. Preserva também metadados que descrevem a estrutura do programa sendo executado, ¢ permitindo que se estude como esta organizado este sem a necessidade de ler o seu cédigo-fonte. 4B Algumas fungGes ¢ atributos so particularmente importantes neste sentido, e so apresenta- das nesta segio: ‘* dir (obj): esta fungdo pré-definida lista todos os nomes de varidveis definidos em um determinado objeto; foi apresentada anteriormente como uma forma de obter as variiveis, definidas em um modulo, e aqui pode ser descrita em sua gloria completa: descreve 0 contetido de qualquer objeto Python, incluindo classes ¢ instincias, © ob}. class. este atributo da instdncia armazena o seu objeto classe correspondente. * obj ._dict_-: este atributo de instincias e classes oferece acesso ao seu estado local. # ob} ._module_ este atributo de instncias ¢ classes armazena uma string com o nome «do médulo do qual foi importado, * classe.-bases..: esta atributo da classe armazena em uma tupla as classes das quai herda. © classe. _name_: este atributo da classe armazena uma string com 0 nome da classe. 5 Alguns médulos importantes Hé um grande conjunto de médulos que se instalam juntamente com o interpretador Python; so descritos nesta secao alguns dos mais interessantes. ‘* sys: oferece virias operagdes referentes ao proprio interpretador. Inclui: path, uma lista dos diretorios de busca de médulos do python, arqy, a lista de pardmetros passados na linha de comando e exit () , uma fungo que termina o programa. # time: oferece fungdes para manipular valores de tempo. Inclui: time () , uma fungio que retoma o timestamp" atual; sleep (n), que pausa a execugdo por n segundos; strftime (n), que formata um timestamp em uma string de acordo com um formato fornecido. * os: oferece fungdes relacionadas ao ambiente de execugdo do sistema. Inclui: mkair (), ‘que cria diretorios; rename () , que altera nomes e caminhos de arquivos; e system, que execuita comandos do sistema ‘* os.path: oferece fuingdes de manipulagio do caminho independente de plataforma, In- clui: isdix(p), que testa se d € um diretério; exists (p), que testa se p existe; join (p,m) , que retoma uma string com os dois caminhos p e m concatenados. * string: oferece fungies de manipulagio de string (que também esto disponiveis como métodos da string). Inclui: split (c, s, p), que divide a string c em até p partigies separadas pelo simbolo s, retornando-as em uma lista; Lower (c) , que retoma a string c convertida em mimisculas; e strip (c), que retorna c removendo espagos e quebras de linha do seu inicio e fim. TO numero de segundos desde F de janeito, 1970, que por sina ‘ea data padr°ao do in‘ cio do tempo no Unis. 44 ‘* math: fungGes matematicas gerais. Inclui fungdes como cos (x), que retorna o cosseno de x; hypot (x,y); que retoma a distincia euclidiana entre x ¢ y; © exp (x); que retoma o exponencial de x. '* random: geragio de mimeros randémicos. Inclui: random () , que retorna um nimero randémico entre 0 ¢ I; randrange (m,n), que retoma um randémico entre m en; choice (s) , que retoma um elemento randémico de uma seqtiéncia s. * getopt: processamento de argumentos de comando de linha; ou seja, os pardmetros que ppassamos para o interpretador na linha de execugao. Inclui: getopt () , que retorna duas listas, uma com argumentos ¢ outra com opedes da linha de comando, © Tkinter: um médulo que permite a criagdo de programas com interface grifica, in- cluindo janelas, botdes e campos texto. A documentagao do Python inclui uma descrigao detalhada (e muito boa) de cada um destes médulos e de seus membros, 5.1 Médulos independentes Além dos médulos distribuidos com o Python, existem varios médulos auxiliares. Justamente por serem numerosos ¢ independentemente forneciddos, nao & possivel descrevé-los na sua totalidade; ‘vou apenas cité-los; podem ser obtidas maiores informagies nos links providos. ‘+ win32pipe: permite, na plataforma Windows, executar programas win32 e capturar sua saida em uma string para manipulagio posterior. Acompanha a distribuigio Activestate Python: http: //www.activestate .com/Products/ActivePython/ ‘© PIL: Python Imaging Library, que oferece fungdes para processamento, manipulagio ¢ exibigdo de imagens. http: //www.pythonware.. com/products/pil/ ‘© NumPy: prové mecanismos simples ¢ de alto desempenho para manipular matrizes multi- dimensionais: ideal para operagdes numéricas de alto volume que necessitem de veloci- dade. http: //numpy. sourceforge .net/ « HTMLgen: uma biblioteca de classes que gera documentos HTML conforme padres pré- definidos. Oferece classes para manipular tabelas, lista e outros elementos de formatagao. http: //starship.python.net/crew/friedrich/HTMLgen/html/ '* DB-API: Database Application Programming Interface; na realidade, um conjunto de médulos que acessam bases de dados de uma forma padronizada. A API especifica uma forma homogénea de se fazer consultas ¢ operagées em bases de dados relacionais (SQL); diversos médulos implementam esta API para bases de dados especificas. http: //www.python.org/topics/database/ mx: oferece uma série de extensdes a linguagem, incluindo operagdes complexas de data hora, fungdes nativas estendidas, ¢ ferramentas para processamento de texto. http: //www.egenix.com/files/python/ ‘* PyGTK: E outro pacote que permite construir aplicagdes grificas com o Python; pode ser uusado em conjunto com 0 Glade, um construtor visual de interfaces. http://www.pygtk.org/ ‘© wxPython: uma biblioteca de classes que permite construir aplicagdes gréficas multi- plataforma usando Python. Ha um construtor visual de interfaces disponivel, o Boa Cons- tmuctor. ht tp: //waw.wxpython.org/ Todos os médulos citados se comportam como médulos Python ‘normais’; sao utilizados por meio da instrugdo import, ¢ boa parte possui documentagao ¢ simbolos intemos listaveis, Esta no é uma lista exaustiva, ¢ ha muitos outros médulos titeis; ha boas referéneias que listam médulos externos, incluindo o indice de pacotes oficial PyPL http: //www.python. org/pypi. 6 Fechamento Aqui termina este tutorial, que cobre os aspectos fundamentais da linguagem Python. Com base no texto, é possivel enfrentar uma tarefa pritica, que ird exercitar seu conhecimento ¢ ampliar sua experiéncia, Escolhia um problema, e tente passar da sua modelagem para Python, 46

You might also like