Vous êtes sur la page 1sur 253

Licena

Este trabalho est licenciado sob uma Licena Creative Commons Atribuio-Uso No-
Comercial-Compartilhamento pela mesma Licena 2.5 Brasil. Para ver uma cpia desta
licena, visite http://creativecommons.org/licenses/by-nc-sa/.!/br/ ou envie uma carta
para "reative "ommons, #$# %econd %treet, %uite &'', %an (rancisco, "ali)ornia *+#'!,
,%-.
Lui. Eduardo /orges
Python para desenvolvedores
#0 E12345
625 1E 7-8E265
E12345 15 -,956
''*
Python para desenvolvedores / Lui. Eduardo /orges
6io de 7aneiro, Edi:o do -utor, ''*
2%/8 *$;-;!-*'*+!#-'-*
Sumrio
Parte 2 ;
Pre)cio *
2ntrodu:o #'
"aracter<sticas #'
=istrico #'
E>emplo ##
?ers@es ##
9ipagem dinAmica #
/ytecode #
Bodo interativo #
(erramentas #+
"ultura #!
%inta>e #$
"ontrole de )lu>o '
5peradores lgicos #
Laos
(or
Chile &
9ipos !
8Dmeros E
9e>to $
Listas &#
9uplas &
5utros tipos de seFGHncias &&
1icionrios &+
?erdadeiro, )also e nulo &;
(un@es &*
1ocumenta:o +
E>erc<cios 2 +&
Parte 22 ++
Bdulos +!
Bdulos da biblioteca padr:o +$
Escopo de nomes +;
Pacotes !'
/ibliotecas compartilhadas !#
/ibliotecas de terceiros !&
-rFuivos e 2/5 !!
%istema de arFuivos !E
-rFuivos compactados !$
-rFuivos de dados !;
E>ce@es E'
9empo E
2ntrospec:o E!
Bdulo inspect EE
E>erc<cios 22 E;
Parte 222 E*
Ieradores $'
Programa:o )uncional $
Lambda $
Bapeamento $&
(iltragem $+
6edu:o $!
9ransposi:o $E
List "omprehension $$
Ienerator E>pression $$
E>erc<cios 222 $*
Parte 2? ;'
1ecoradores ;#
"lasses ;&
"lasses abertas ;;
=erana simples *'
=erana mDltipla *
Propriedades *!
%obrecarga de operadores *;
Betaclasses #''
9estes automati.ados #'&
E>erc<cios 2? #'$
Parte ? #';
8umPy #'*
-rranJos #'*
Batri.es ###
Ir)icos ##+
Processamento de imagem ##
Ir)icos &1 #$
PersistHncia #&#
%eriali.a:o #&#
K51/ #&&
L-BL #&!
MBL #&;
/anco de dados #++
1/2 #++
%NLite #+!
Postgre%NL #+E
Bapeamento obJeto-relacional #!
Ceb #!!
"herryPy #!E
"herry9emplate #!E
"liente Ceb #!;
B?" #E'
E>erc<cios ? #E*
Parte ?2 #$'
2nter)ace Ir)ica #$#
-rFuitetura #$
"onstruindo inter)aces #$&
9hreads #;+
Processamento distribu<do #;$
5bJetos distribu<dos #*'
Per)ormance #*&
Empacotamento e distribui:o de aplica@es '#
E>erc<cios ?2 '+
-pHndices '!
2ntegra:o com /lender 'E
2ntegra:o com /r5))ice.org #&
2ntegra:o com Linguagem " #E
Python OP " #E
" OP Python #;
2ntegra:o com .8E9 #*
6espostas dos e>erc<cios 2 !
6espostas dos e>erc<cios 22 *
6espostas dos e>erc<cios 222 &!
6espostas dos e>erc<cios 2? &;
6espostas dos e>erc<cios ? ++
6espostas dos e>erc<cios ?2 +;
Qndice remissivo !#
8 Parte I
Parte I
Pre)cio.
2ntrodu:o.
%inta>e.
9ipos.
(un@es.
1ocumenta:o.
E>erc<cios 2.
Prefcio 9
Prefcio
-s linguagens dinAmicas eram vistas no passado apenas como linguagens script, usadas
para automati.ar peFuenas tare)as, porRm, com o passar do tempo, elas cresceram,
amadureceram e conFuistaram seu espao no mercado, a ponto de chamar a aten:o dos
grandes )ornecedores de tecnologia.
?rios )atores contribu<ram para esta mudana, tais como a internet, o so)tSare de cdigo
aberto e as metodologias geis de desenvolvimento.
- internet viabili.ou o compartilhamento de in)orma@es de uma )orma sem precedentes
na histria, Fue tornou poss<vel o crescimento do so)tSare de cdigo aberto. -s
linguagens dinAmicas geralmente s:o cdigo aberto e compartilham as mesmas
)uncionalidades e em alguns casos, os mesmos obJetivos.
- produtividade e e>pressividade das linguagens dinAmicas se encai>am per)eitamente
com as metodologias geis, Fue nasceram do desenvolvimento de so)tSare de cdigo
aberto e de)endem um en)oFue mais pragmtico no processo de cria:o e manuten:o de
so)tSare do Fue as metodologias mais tradicionais.
Entre as linguagens dinAmicas, o Python se destaca como uma das mais populares e
poderosas. E>iste uma comunidade movimentada de usurios da linguagem no mundo, o
Fue se re)lete em listas de discuss:o ativas e muitas )erramentas dispon<veis em cdigo
aberto.
-prender uma nova linguagem de programa:o signi)ica aprender a pensar de outra
)orma. E aprender uma linguagem dinAmica representa uma mudana de paradigma
ainda mais )orte para aFuelas pessoas Fue passaram anos desenvolvendo em linguagens
estticas.
10 Introduo
Introduo
Python
#
R uma linguagem de alt<ssimo n<vel Tem inglHs, Very High Level LanguageU
orientada a obJetos, de tipagem dinAmica e )orte, interpretada e interativa.
Caractersticas
5 Python possui uma sinta>e clara e concisa, Fue )avorece a legibilidade do cdigo )onte,
tornando a linguagem mais produtiva.
- linguagem inclui diversas estruturas de alto n<vel Tlistas, tuplas, dicionrios, data / hora,
comple>os e outrasU e uma vasta cole:o de mdulos prontos para uso, alRm de frae!or"s
de terceiros Fue podem ser adicionados. 9ambRm possui recursos encontrados em outras
linguagens modernas, tais como: geradores, introspec:o, persistHncia, metaclasses e
unidades de teste. Bultiparadigma, a linguagem suporta programa:o modular e
)uncional, alRm da orienta:o a obJetos. Besmo os tipos bsicos no Python s:o obJetos.
- linguagem R interpretada atravRs de #ytecode pela mFuina virtual Python, tornando o
cdigo portvel. "om isso R poss<vel compilar aplica@es em uma plata)orma e rodar em
outras ou e>ecutar direto do cdigo )onte.
Python R um so)tSare de cdigo aberto Tcom licena compat<vel com a $eneral Pu#lic
License TIPLU, porRm menos restritiva, permitindo Fue o Python seJa incorporados em
produtos proprietriosU e a especi)ica:o da linguagem R mantida pela Python %oft!are
&oundation
'
TP%(U.
Python R muito utili.ado como linguagem script em vrios so)tSares, permitindo
automati.ar tare)as e adicionar novas )uncionalidades, entre eles: /r5))ice.org,
Postgre%NL, /lender e I2BP. 9ambRm R poss<vel integrar o Python a outras linguagens,
como a Linguagem ". Em termos gerais, o Python apresenta muitas similaridades com
outras linguagens dinAmicas, como Perl e 6uby.
Histrico
Python )oi criada em #**' por Iuido van 6ossum, no 2nstituto 8acional de PesFuisa para
Batemtica e "iHncia da "omputa:o da =olanda T"C2U e tinha como )oco original
usurios como )<sicos e engenheiros. 5 Python )oi concebido a partir de outra linguagem
e>istente na Rpoca, chamada -/".
=oJe, a linguagem R bem aceita na industria por empresas de alta tecnologia, tais como:
# Pgina o)icial: http://SSS.python.org/.
Endereo na internet da P%(: http://SSS.python.org/ps)/.
Introduo 11
Ioogle Taplica@es (e#U.
Lahoo Taplica@es (e#U.
Bicroso)t T2ronPython: Python para .8E9U.
8oVia Tdispon<vel para as linhas recentes de celulares e P1-sU.
1isney Tanima@es &1U.
Exemplo
E>emplo de programa em Python:
# Exemplo de programa em Python
# Uma lista de instrumentos musicais
instrumentos = ['Baixo', 'Bateria', 'Guitarra']
# Para cada nome na lista de instrumentos
for instrumento in instrumentos:
# mostre o nome do instrumento musical
print instrumento
%a<da:
Baixo
Bateria
Guitarra
8o e>emplo, WinstrumentosX R uma lista contendo itens W/ai>oX, W/ateriaX e WIuitarraX. 7
WinstrumentoX R um nome Fue corresponde a cada um dos itens da lista, con)orme o lao R
e>ecutado.
Verses
- implementa:o o)icial do Python R mantida pela P%( e escrita em ", e por isso R tambRm
conhecida como "Python. - vers:o estvel mais recente est dispon<vel para do!nload no
endereo:
http://SSS.python.org/doSnload/
Para CindoSs, basta e>ecutar o instalador. Para outras plata)ormas, geralmente o Python
J )a. parte do sistema, porRm em alguns casos pode ser necessrio compilar e instalar a
partir dos arFuivos )onte.
1' Introduo
E>istem tambRm implementa@es de Python para .8E9 T2ronPythonU e 7?B T7ythonU.
ipa!em din"mica
Python utili.a tipagem dinAmica, o Fue signi)ica Fue o tipo de uma varivel R in)erido
pelo interpretador em tempo de e>ecu:o Tisto R conhecido como )uc" *ypingU. 8o
momento em Fue uma varivel R criada atravRs de atribui:o, o interpretador de)ine um
tipo para a varivel, com as opera@es Fue podem ser aplicadas.
5 Python tem tipagem )orte, ou seJa, ele veri)ica se as opera@es s:o vlidas e n:o )a.
coer@es automticas entre tipos incompat<veis
&
. Para reali.ar a opera:o entre tipos n:o
compat<veis, R necessrio converter e>plicitamente o tipo da varivel ou variveis antes da
opera:o.
#$tecode
5 cdigo )onte R tradu.ido pelo interpretador para o )ormato #ytecode, Fue R
multiplata)orma e pode ser e>ecutado e distribu<do sem )onte original.
Por padr:o, o interpretador compila os )ontes e arma.ena o #ytecode em disco, para Fue a
pr>ima ve. Fue o e>ecutar, n:o precise compilar novamente o programa, redu.indo o
tempo de carga na e>ecu:o. %e os )ontes )orem alterados, o interpretador se encarregar
de regerar o #ytecode automaticamente, mesmo utili.ando o shell interativo. Nuando um
programa ou um mdulo R evocado, o interpretador reali.a a anlise do cdigo, converte
para s<mbolos, compila Tse n:o houver #ytecode atuali.ado em discoU e e>ecuta na mFuina
virtual Python.
5 #ytecode R arma.enado em arFuivos com e>tens:o W+pyc, T#ytecode normalU ou W+pyo,
T#ytecode otimi.adoU.
5 #ytecode tambRm pode ser empacotado Junto com o interpretador em um e>ecutvel,
para )acilitar a distribui:o da aplica:o.
%odo interati&o
5 interpretador Python pode ser usado de )orma interativa, na Fual as linhas de cdigo
s:o digitadas em um propt Tlinha de comandoU semelhante ao shell do sistema
operacional.
Para evocar o modo interativo basta rodar o Python Tse ele estiver no pathU:
& Em Python, coer@es s:o reali.adas automaticamente apenas entre tipos Fue s:o claramente relacionados,
como inteiro e inteiro longo.
Introduo 1-
python
Ele estar pronto para receber comandos surgir o propt WPPPX na tela.
5 modo interativo R uma caracter<stica di)erencial da linguagem, pois R poss<vel testar e
modi)icar o cdigo de um programa antes da inclus:o do cdigo nos programas, por
e>emplo.
E>emplo do Python sendo usado de )orma interativa Tcom o shell Py"rust
+
U:
5s arFuivos )onte normalmente s:o identi)icados pela e>tens:o W+py, e podem ser
e>ecutados diretamente pelo interpretador:
python apl.py
+ Py"rust R uma )erramenta Fue )a. parte do proJeto S>Python Thttp://SSS.S>python.org/U.
1. Introduo
-ssim o programa Wapl.pyX ser e>ecutado.
'erramentas
E>istem muitas )erramentas de desenvolvimento para Python, como 21Es, editores e shells
TFue aproveitam da capacidade interativa do PythonU.
Integrated )evelopent /nvironents T21EsU s:o pacotes de so)tSare integram vrias
)erramentas de desenvolvimento em um ambiente integrado, com o obJetivo de aumentar
a produtividade do desenvolvedor.
Entre as 21Es Fue suportam Python, encontram-se:
%PE T%taniYs Python EditorU.
Eric.
5pen Zomodo.
Py1ev Tplugin para a 21E EclipseU.
E>istem tambRm editores de te>to especiali.ados em cdigo de programa:o, Fue
possuem )uncionalidades como colori.a:o de sinta>e, e>porta:o para outros )ormatos e
convers:o de codi)ica:o de te>to.
Esses editores suportam diversas linguagens de programa:o, dentre elas o Python:
%ci9E.
8otepad[[.
%hells s:o ambientes interativos para e>ecu:o de comandos, muito Dteis para testar
peFuenas por@es de cdigo e para atividades como data crunching Te>trair in)orma@es de
interessa de massas de dados ou tradu.ir dados de um )ormato para outroU.
-lRm do prprio %hell padr:o do Python, e>istem os outros dispon<veis:
Py"rust Tgr)icoU.
2python Tte>toU.
Empacotadores s:o utilitrios Fue empacotam o bytecode com o interpretador e outras
dependHncias, em um ou mais e>ecutveis e arFuivos compactados, permitindo Fue o
aplicativo rode em mFuinas sem Python instalado.
Entre empacotadores )eitos para Python, est:o dispon<veis:
Pye>e Tapenas para CindoSsU.
c>\(ree.e TportvelU.
Introduo 10
&rae!or"s s:o cole@es de componentes de so)tSare Tbibliotecas, utilitrios e outrosU Fue
)oram proJetados para serem utili.ados por outros sistemas.
-lguns frae!or"s dispon<veis mais conhecidos:
Ceb: 1Jango, 9urboIears e Kope.
2nter)ace gr)ica: S>Python, PyI9Z e PyN9.
Processamento cienti)ico: 8umPy.
Processamento de imagens: P2L.
1: Batplotlib.
&1: ?isual Python, Py5penIL e Python 5gre.
Bapeamento obJeto-relacional: %NL-lchemy e %NL5bJect.
Cultura
5 nome Python )oi tirado por Iuido van 6ossum do programa da 9? britAnica 1onty
Python &lying 2ircus, e e>istem vrias re)erHncias na documenta:o da linguagem ao
programa, como, por e>emplo, o repositrio de pacotes o)icial do Python se chamava
2heese %hop, Fue era o nome de um dos Fuadros do programa. -tualmente, o nome do
repositrio R Python Pac"age Inde3
0
TPLP2U.
- comunidade de usurios de Python criou algumas e>press@es para se re)erir aos
assuntos relacionados ] linguagem. 8este Jarg:o, o termo Pythonic R usado para indicar
Fue algo R compat<vel com as premissas de proJeto do Python, e 4npythonic signi)ica o
oposto. 7 o usurio da linguagem R chamado de Pythonist.
-s metas do proJeto )oram resumidas por 9im Peters em um te>to chamado 5en of Python6
Fue est dispon<vel no prprio Python atravRs do comando:
import this
5 te>to en)ati.a a postura pragmtica do 7enevolent )ictator for Life T/1(LU, como Iuido R
conhecido na comunidade Python.
Propostas para melhoria da linguagem s:o chamadas de PEPs TPython /nhanceent
ProposalsU, Fue tambRm servem de re)erHncia para novos recursos a serem implementados
na linguagem.
-lRm do site o)icial, outras boas )ontes de in)orma:o sobre a linguagem s:o:
! Endereo: http://pypi.python.org/pypi.
18 Introduo
Python/rasil
E
, o site da comunidade Python no /rasil, com bastante in)orma:o em
portuguHs, e Python "ooVbooV
$
, site Fue arma.ena WreceitasX: peFuenas por@es de cdigo
para reali.ar tare)as espec<)icas.
E Endereo: http://SSS.pythonbrasil.com.br/.
$ Endereo: http://aspn.activestate.com/-%P8/Python/"ooVbooV/.
%inta3e 19
Sintaxe
,m programa )eito em Python R constitu<do de linhas, Fue podem continuar nas linhas
seguintes, pelo uso do caractere de barra invertida T^U ao )inal da linha ou parHnteses,
colchetes ou chaves, em e>press@es Fue utili.am tais caracteres.
5 caractere : marca o inicio de comentrio. NualFuer te>to depois do _ ser ignorado atR o
)im da linha , com e>ce:o dos comentrios )uncionais.
"omentrios )uncionais geralmente s:o usados para:
alterar a codi)ica:o do arFuivo )onte do programa acrescentando um comentrio
com o te>to W_-`- coding: aencodingP -`_-X no inicio do arFuivo, aonde aencodingP R
a codi)ica:o do arFuivo Tgeralmente latin1 ou utf;8U. -lterar a codi)ica:o R
necessrio para suportar caracteres Fue n:o )a.em parte da linguagem inglesa, no
cdigo )onte do programa.
de)inir o interpretador Fue ser utili.ado para rodar o programa em sistemas
,82M, atravRs de um comentrio comeando com W_bX no inicio do arFuivo, Fue
indica o caminho para o interpretador Tgeralmente a linha de comentrio ser algo
como W_b/usr/bin/env pythonXU.
E>emplo de comentrios )uncionais:
#!/usr/bin/env python
# -*- coding: latin1 -*-
# Uma linha de cdigo que mostra o resultado de 7 vezes 3
print 7 * 3
E>emplos de linhas Fuebradas:
# Uma linha quebrada por contra-barra
a = 7 * 3 + \
5 / 2
# Uma lista (quebrada por vrgula)
b = ['a', 'b', 'c',
'd', 'e']
# Uma chamada de funo (quebrada por vrgula)
c = range(1,
11)
18 %inta3e
# imprime todos na tela
print a, b, c
Em Python, os blocos de cdigo s:o delimitados pelo uso de indenta:o. - indenta:o
deve ser constante no bloco de cdigo, porRm R considerada uma boa prtica manter a
consistHncia no proJeto todo e evitar a mistura tabula@es e espaos
;
.
E>emplo:
# Para i na lista 234, 654, 378, 798:
for i in [234, 654, 378, 798]:
# Se o resto dividindo por 3 for igual a zero:
if i % 3 == 0:
# Imprime...
print i, '/ 3 =', i / 3
%a<da:
; - recomenda:o o)icial de estilo de codi)ica:o Thttp://SSS.python.org/dev/peps/pep-''';/U R usar
Fuatro espaos para indenta:o e esta conven:o R amplamente aceita pelos desenvolvedores.
Programa
Instrues
Enquanto condio:
Dois pontos obrigatrios.
Se condio:
Instrues
Seno:
Instrues
Instrues
Inicio de um bloco.
Fim dos dois blocos.
Outro bloco.
Fim do programa.
Instrues
Inicio do programa.
%inta3e 19
234 / 3 = 78
654 / 3 = 218
378 / 3 = 126
798 / 3 = 266
5 comando print coloca espaos entre as e>press@es Fue )orem recebidas como parAmetro
e um caractere de nova linha no )inal, a n:o ser Fue ele receba uma v<rgula no )im da lista
parAmetros.
5 Python R uma linguagem orientada a obJeto, sendo assim as variveis atributos TdadosU
e mRtodos Trotinas associadas ao obJetoU. 9anto os atributos Fuanto os mRtodos s:o
acessados usando ponto T.U, sendo Fue os mRtodos devem ser sempre seguidos de
parHnteses:
Para mostrar um atributo:
print obJeto.atributo
Para e>ecutar um mRtodo:
objeto.metodo(argumentos)
Besmo um mRtodo sem argumentos precisa de parHnteses:
objeto.metodo()
5 ponto tambRm R usado para acessar estruturas de mdulos Fue )oram importados pelo
programa.
'0 2ontrole de flu3o
Controle de fluxo
c muito comum em um programa Fue certos conJuntos de instru@es seJam e>ecutados de
)orma condicional, em casos como validar entradas de dados, por e>emplo.
%inta>e:
if <condio>:
<bloco de cdigo>
elif <condio>:
<bloco de cdigo>
elif <condio>:
<bloco de cdigo>
else:
<bloco de cdigo>
-onde:
acondi:oP: sentena Fue possa ser avaliada como verdadeira ou )alsa.
abloco de cdigoP: seFGHncia de linhas de comando.
-s clausulas elif e else s:o opcionais e podem e>istir vrios elifs para o mesmo if.
ParHnteses s s:o necessrios para evitar ambigGidades.
E>emplo:
temp = int(raw_input('Entre com a temperatura: '))
if temp < 0:
print 'Congelando...'
elif 0 <= temp <= 20:
print 'Frio'
elif 21 <= temp <= 25:
print 'Normal'
elif 26 <= temp <= 35:
print 'Quente'
else:
print 'Muito quente!'
%e o bloco de cdigo )or composto de apenas uma linha, ele pode ser escrito aps os dois
pontos:
if temp < 0: print 'Congelando...'
- partir da vers:o .!, o Python suporta a e>press:o:
2ontrole de flu3o '1
avarivelP O avalor #P i) acondi:oP else avalor P
-onde avarivelP receber avalor #P se acondi:oP )or verdadeira e avalor P caso
contrrio.
(peradores l!icos
5s operadores lgicos s:o: and, or, not, is e in.
and: retorna verdadeiro se e somente se receber duas e>press@es Fue )orem
verdadeiras.
or: retorna )also se e somente se receber duas e>press@es Fue )orem )alsas.
not: retorna )also se receber uma e>press:o verdadeira e vice-versa.
is: retorna verdadeiro se receber duas re)erHncias ao mesmo obJeto e )also em caso
contrrio.
in: retorna verdadeiro se receber um item e uma lista e o item ocorrer uma ou mais
ve.es na lista e )also em caso contrrio.
"om operadores lgicos R poss<vel construir condi@es mais comple>as para controlar
desvios condicionais e laos.
'' Laos
Laos
Laos s:o estruturas de repeti:o, geralmente usados para processar cole@es de dados,
tais como linhas de um arFuivo ou registros de um banco de dados, Fue precisam ser
processados por um mesmo bloco de cdigo.
'or
c a estrutura de repeti:o mais usada no Python. dtil para percorrer seFGHncias ou
processar iteradores.
- instru:o for aceita n:o s seFGHncias estticas, mas tambRm seFGHncias geradas por
iteradores. 2terador R uma estrutura Fue permite itera@es, ou seJa, acesso aos itens de uma
cole:o de elementos, de )orma seFGencial.
1urante a e>ecu:o de um lao for, a re)erHncia aponta para um elemento da seFGHncia. -
cada itera:o, a re)erHncia R atuali.ada, para Fue o bloco de cdigo do for processe o
elemento correspondente.
- clausula #rea" interrompe o lao e continue passa para a pr>ima itera:o. 5 cdigo
dentro do else R e>ecutado ao )inal do lao, a n:o ser Fue o lao tenha sido interrompido
Lista
aponta para !.
1
2
3
4
5
6
...
x
"rimeira
iterao
# re$er%ncia
$oi atuali&ada.
Lista
1
2
3
4
5
6
...
x
Segunda
iterao
' apenas uma
re$er%ncia.
aponta para (.
Laos '-
por #rea".
Buito Dtil em laos com a instru:o for, a )un:o range<6 n6 p= retorna uma lista de
inteiros, comeando em e menores Fue n, em passos de comprimento p, Fue podem ser
usados como seFGHncia para o lao.
%inta>e:
for <referncia> in <sequncia>:
<bloco de cdigo>
continue
break
else:
<bloco de cdigo>
E>emplo:
# Soma de 0 a 99
s = 0
for x in range(1, 100):
s = s + x
print s
5 resultado R +*!'.
)*ile
E>ecuta um bloco de cdigo atendendo a uma condi:o.
%inta>e:
while <condio>:
<bloco de cdigo>
continue
break
else:
<bloco de cdigo>
5 bloco de cdigo dentro do lao !hile R repetido enFuanto a condi:o do lao estiver
sendo avaliada como verdadeira.
E>emplo:
'. Laos
# Soma de 0 a 99
s = 0
x = 1
while x < 100:
s = s + x
x = x + 1
print s
5 lao !hile R adeFuado Fuando n:o h como determinar Fuantas itera@es v:o ocorrer e
n:o h uma seFGHncia a seguir.
*ipos '0
ipos
?ariveis no interpretador Python s:o criadas atravRs da atribui:o e destru<das pelo
coletor de li>o, Fuando n:o e>istem mais re)erHncias a elas.
5s nomes das variveis devem comear com letra Tsem acentua:oU ou sublinhado T\U e
seguido por letras Tsem acentua:oU, d<gitos ou sublinhados T\U, sendo Fue maiDsculas e
minDsculas s:o consideradas di)erentes.
E>istem vrios tipos simples de dados prR-de)inidos no Python, tais como:
8Dmeros Tinteiros, reais, comple>os, ... U.
9e>to.
/ooleanos.
-lRm disso, e>istem tipos Fue )uncionam como cole@es. 5s principais s:o:
Lista.
9upla.
1icionrio.
5s tipos no Python podem ser:
Butveis: permitem Fue os conteDdos das variveis seJam alterados.
2mutveis: n:o permitem Fue os conteDdos das variveis seJam alterados.
Em Python, os nomes de variveis s:o re)erHncias, Fue podem ser alteradas em tempos de
e>ecu:o.
'8 *ipos
+,meros
Python o)erece vrios tipos numRricos:
2nteiro TintU: i O #
6eal de ponto )lutuante TfloatU: ) O &.#+
"omple>o Tcople3U: c O & [ +J
5bserva@es:
-s convers@es entre inteiro e longo s:o automticas.
6eais podem ser representados em nota:o cienti)ica: #.e
5pera@es numRricas:
%oma T[U.
1i)erena T-U.
Bultiplica:o T`U.
1ivis:o T/U: entre dois inteiros )unciona igual ] divis:o inteira. Em outros casos, o
resultado R real.
1ivis:o inteira T//U: o resultado R truncado para o inteiro imediatamente in)erior,
mesmo Fuando aplicado em nDmeros reais, porRm neste caso o resultado ser real
tambRm.
E>ponencia:o T``U: pode ser usada para calcular a rai., atravRs de e>poentes
)racionrios Te>emplo: #''``'.!U.
Bdulo TeU: retorna o resto da divis:o.
1urante as opera@es, os nDmeros ser:o convertidos de )orma adeFuada Te>emplo: T#.![+JU
[ & resulta em +.![+JU.
-lRm dos tipos #uiltins do interpretador, na biblioteca padr:o ainda e>iste o mdulo
decial, Fue de)ine opera@es com nDmeros reais com precis:o )i>a, e tipos para data e
hora.
*ipos '9
exto
-s strings no Python s:o #uitins para arma.enar te>to. %:o imutveis, sendo assim, n:o R
poss<vel adicionar, remover ou mesmo modi)icar algum caractere de uma string. Para
reali.ar essas opera@es, o Python precisa criar um nova string.
9ipos:
%tring padr:o: s O YLed KeppelinY
%tring unicode: u O uY/JfrVY
- string padr:o pode ser convertida para unicode atravRs da )un:o unicode<=.
- iniciali.a:o de strings pode ser:
"om aspas simples ou duplas.
Em vrias linhas consecutivas, desde Fue seJa entre trHs aspas simples ou duplas.
%em e>pans:o de caracteres Te>emplo: s O rY^nY, aonde s conter os caracteres W^X e
WnXU.
5pera@es com strings:
s = 'Camel'
# Concatenao
print 'The ' + s + ' run away!'
# Interpolao
print 'tamanho de %s => %d' % (s, len(s))
# String tratada como seqncia
for ch in s: print ch
# Strings so objetos
if s.startswith('C'): print s.upper()
# o que acontecer?
print 3 * s
# 3 * s consistente com s +s + s
2nterpola:o:
5perador WeX R usado para )a.er interpola:o de strings. - interpola:o R mais e)iciente
do Fue a concatena:o convencional.
print 'Agora so %02d:%02d.' % (16, 30)
'8 *ipos
# Imprime: Agora so 16:30.
%<mbolos usados na interpola:o:
es: string.
ed: inteiro.
e): real.
(atias TslicesU de strings podem ser obtidas colocando <ndices entre colchetes aps a string.
5s <ndices no Python:
"omeam em .ero.
"ontam a partir do )im se )orem negativos.
Podem ser de)inidos como trechos, na )orma ginicio:)im [ #:intervaloh. %e n:o )or
de)inido o inicio, ser considerado como .ero. %e n:o )or de)inido o )im [ #, ser
considerado o tamanho do obJeto. 5 intervalo Tentre os caracteresU, se n:o )or
de)inido, ser #.
c poss<vel inverter strings usando um intervalo negativo:
Fatiando strings
String s
" ) t * o n
+ ! ( , - .
s/+0
1aracteres
"osies
s/:(0 s/(:0 s/2!0
" ") t*on n
Epresses
Fatias
*ipos '9
print 'Python'[::!1]
# Mostra: nohtyP
?rias )un@es para tratar com te>to est:o no mdulo string.
# -*- coding: latin1 -*-
# importando o mdulo string
i"port string
# O alfabeto
a = string.ascii_letters
# Rodando o alfabeto um caractere para a esquerda
b = a[1:] + a[0]
# A funo maketrans() cria uma tabela de traduo
# entre os caracteres das duas strings que ela
# recebeu como parmetro.
# Os caracteres ausentes nas tabelas sero
# copiados para a sada.
tab = string.maketrans(a, b)
# A mensagem...
msg = '''Esse texto ser traduzido..
Vai ficar bem estranho.
'''
# A funo translate() usa a tabela de traduo
# criada pela maketrans() para traduzir uma string
print string.translate(msg, tab)
%a<da:
Fttf ufyup tfs usbevAjep..
Wbj gjdbs cfn ftusboip.
5 mdulo tambRm implementa um tipo chamado *eplate, Fue R um modelo de string Fue
pode ser preenchido atravRs de um dicionrio. 5s identi)icadores s:o inciados por ci)r:o
TiU e podem ser cercados por chaves, para evitar con)us@es.
E>emplo:
# -*- coding: latin1 -*-
-0 *ipos
# importando o mdulo string
i"port string
# Cria uma string template
st = string.Template('$aviso aconteceu em $quando')
# Preenche o modelo com um dicionrio
s = st.substitute(#'aviso': 'Falta de eletricidade',
'quando': '03 de Abril de 2002'$)
# Mostra:
# Falta de eletricidade aconteceu em 03 de Abril de 2002
print s
c poss<vel usar strings mutveis no Python, atravRs do mdulo 4ser%tring, Fue de)ine o
tipo 1uta#le%tring:
# -*- coding: latin1 -*-
# importando o mdulo UserString
i"port UserString
s = UserString.MutableString('Python')
s[0] = 'p'
print s # mostra "python"
%trings mutveis s:o menos e)icientes do Fue strings mutveis.
*ipos -1
Listas
Listas s:o cole@es heterogHneas de obJetos, Fue podem ser de FualFuer tipo, inclusive
outras listas.
-s listas no Python s:o mutveis, podendo ser alteradas a FualFuer momento. Listas
podem ser )atiadas da mesma )orma Fue as strings, mas como as listas s:o mutveis, R
poss<vel )a.er atribui@es a itens da lista.
%inta>e:
lista = [a, b, ..., z]
5pera@es comuns com listas:
# Uma nova lista: Brit Progs dos anos 70
progs = ['Yes', 'Genesis', 'Pink Floyd', 'ELP']
# Varrendo a lista inteira
for prog in progs:
print prog
# Trocando o ltimo elemento
progs[!1] = 'King Crimson'
# Incluindo
progs.append('Camel')
# Removendo
progs.remove('Pink Floyd')
# Ordena a lista
progs.sort()
# Inverte a lista
progs.reverse()
# Imprime numerado
for i, prog in enumerate(progs):
print i + 1, '=>', prog
# Imprime do segundo item em diante
print progs[1:]
print range(10)
-' *ipos
- )un:o enuerate<= retorna uma tupla de dois elementos a cada itera:o: um nDmero
seFGencial e um item da seFGHncia correspondente.
- opera@es de ordena:o TsortU e invers:o TreverseU s:o reali.adas na prpria lista, sendo
assim, n:o geram novas listas.
uplas
%emelhantes as listas, porRm s:o imutveis: n:o se pode acrescentar, apagar ou )a.er
atribui@es aos itens.
%inta>e:
tupla = (a, b, ..., z)
5s parHnteses s:o opcionais.
Particularidade: tupla com apenas um elemento R representada como:
t1 = (1,)
5s elementos de uma tupla podem ser re)erenciados da mesma )orma Fue os elementos de
uma lista:
primeiro_elemento = tupla[0]
Listas podem ser convertidas em tuplas:
tupla = tuple(lista)
E tuplas podem ser convertidas em listas:
lista = list(tupla)
Embora a tupla possa conter elementos mutveis, esses elementos n:o podem so)rer
atribui:o, pois isto modi)icaria a re)erHncia ao obJeto.
E>emplo usando o modo interativo:
*ipos --
>>> t = ([1, 2], 4)
>>> t[0].append(3)
>>> t
([1, 2, 3], 4)
>>> t[0] = [1, 2, 3]
Traceback (most recent call last):
File "<input>", line 1, in %
TypeError: object does not support item assignment
>>>
-s tuplas s:o mais e)icientes do Fue as listas convencionais, pois consomem menos
recursos computacionais.
(utros tipos de se-./ncias
5 Python provH entre os #uiltins tambRm:
set: lista mutvel un<voca Tsem repeti@esU.
fro>enset: lista imutvel un<voca.
-. *ipos
0icionrios
,m dicionrio R uma lista de associa@es compostas por uma chave Dnica e estruturas
correspondentes. 1icionrios s:o mutveis, tais como as listas.
- chave tem Fue ser de um tipo imutvel, geralmente strings, mas tambRm podem ser
tuplas ou tipos numRricos. 5 dicionrio do Python n:o )ornece garantia de Fue as chaves
estar:o ordenadas.
%inta>e:
dicionario = #'a': a, 'b': b, ..., 'z', z$
Estrutura:
E>emplo de dicionrio:
dic = #'nome': 'Shirley Manson', 'banda': 'Garbage'$
1*a3es
Fractal
#'Fractal': 'IFS', 'Palheta': 'Verde', 'Limites': (640, 480), (0, 0): (42, 35)$
4alores
IFS
"al*eta 4erde
Limites 56-+7 -8+9
5+7 +9 5-(7 ,.9
Elementos
imut:3eis
Ob;etos
quaisquer
*ipos -0
-cessando elementos:
print dic['nome']
-dicionando elementos:
dic['album'] = 'Version 2.0'
-pagando um elemento do dicionrio:
&el dic['album']
5btendo os itens, chaves e valores:
itens = dic.items()
chaves = dic.keys()
valores = dic.values()
E>emplos com dicionrios:
# Progs e seus albuns
progs = #'Yes': ['Close To The Edge', 'Fragile'],
'Genesis': ['Foxtrot', 'The Nursery Crime'],
'ELP': ['Brain Salad Surgery']$
# Mais progs
progs['King Crimson'] = ['Red', 'Discipline']
# Iterao
for prog, albuns in progs.items():
print prog, '=>', albuns
# Se tiver 'ELP', deleta
if progs.has_key('ELP'):
&el progs['ELP']
E>emplo de matri. esparsa:
# -*- coding: latin1 -*-
# Matriz esparsa implementada
items() retorna uma lista de
tuplas com a chave e o valor.
-8 *ipos
# com dicionrio
# Matriz esparsa uma estrutura
# que s armazena os valores que
# existem na matriz
dim = 6, 12
mat = #$
# Tuplas so imutveis
# Cada tupla representa
# uma posio na matriz
mat[3, 7] = 3
mat[4, 6] = 5
mat[6, 3] = 7
mat[5, 4] = 6
mat[2, 9] = 4
mat[1, 0] = 9
for lin in range(dim[0]):
for col in range(dim[1]):
# Mtodo get(chave, valor)
# retorna o valor da chave
# no dicionrio ou se a chave
# no existir, retorna o
# segundo argumento
print mat.get((lin, col), 0),
print
%a<da:
0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0 0
0 0 0 0 0 0 0 3 0 0 0 0
0 0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 6 0 0 0 0 0 0 0
Ierando a matri. esparsa:
# -*- coding: latin1 -*-
# Matriz em forma de string
matriz = '''0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0 0
0 0 0 0 0 0 0 3 0 0 0 0
*ipos -9
0 0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 6 0 0 0 0 0 0 0'''
mat = #$
# Quebra a matriz em linhas
for lin, linha in enumerate(matriz.splitlines()):
# Quebra a linha em colunas
for col, coluna in enumerate(linha.split()):
coluna = int(coluna)
# Coloca a coluna no resultado,
# se for diferente de zero
if coluna:
mat[lin, col] = coluna
print mat
# Some um nas dimenses pois a contagem comea em zero
print 'Tamanho da matriz completa:', (lin + 1) * (col + 1)
print 'Tamanho da matriz esparsa:', len(mat)
%a<da:
{(5, 4): 6, (3, 7): 3, (1, 0): 9, (4, 6): 5, (2, 9): 4}
Tamanho da matriz completa: 72
Tamanho da matriz esparsa: 5
- matri. esparsa R uma boa solu:o de processamento para estruturas em Fue a maioria
dos itens permanecem va.ios, como planilhas, por e>emplo.
-8 *ipos
Verdadeiro1 falso e nulo
Em Python, o tipo booleano T#oolU R uma especiali.a:o do tipo inteiro TintU. 5 verdadeiro R
chamado *rue e R igual a #, enFuanto o )also R chamado &alse e R igual a .ero.
5s seguintes valores s:o considerados )alsos:
&alse T)alsoU.
?one TnuloU.
' T.eroU.
YY Tstring va.iaU.
gh Tlista va.iaU.
TU Ttupla va.iaU.
jk Tdicionrio va.ioU.
5utras estruturas com o tamanho igual a .ero.
%:o considerados verdadeiros todos os outros obJetos )ora dessa lista.
5 obJeto ?one, Fue R do tipo ?one*ype, do Python representa o nulo e R avaliado como
)also pelo interpretador.
&un@es -9
'unes
(un@es s:o blocos de cdigo identi)icados por um nome, Fue podem receber parAmetros
prR-determinados.
8o Python, as )un@es:
Podem retornar ou n:o obJetos.
-ceitam )oc %trings.
-ceitam parAmetros opcionais Tcom defaultsU. %e n:o )or passado o parAmetro ser
igual ao default de)inido na )un:o.
-ceitam Fue os parAmetros seJam passados com nome. 8este caso,a ordem em Fue
os parAmetros )oram passados n:o importa.
9em naespace prprio Tescopo localU, e por isso podem o)uscar de)ini@es de
escopo global.
Podem ter suas propriedades alteradas Tgeralmente por decoradoresU.
)oc %trings s:o strings Fue est:o associadas a uma estrutura do Python. 8as )un@es, as
)oc %trings s:o colocadas dentro do corpo da )un:o, geralmente no comeo. 5 obJetivo
das )oc %trings R servir de documenta:o para aFuela estrutura.
%inta>e:
&ef func(parametro1, parametro2=padrao):
"""Doc String
"""
<bloco de cdigo>
return valor
5s parAmetros com default devem )icar aps os Fue n:o tem default.
E>emplo T)atorialU:
&ef fatorial(num):
if num <= 1:
return 1
else:
return(num * fatorial(num ! 1))
E>emplo TsRrie de (ibonacciU:
!un"#o $ recursiva.
% retorno $ opcional.
.0 &un@es
&ef fib(n):
"""Fibonacci:
fib(n) => fib(n - 1) + fib(n - 2) se n > 1
fib(n) => 1 se n <= 1
"""
if n > 1:
return fib(n ! 1) + fib(n ! 2)
else:
return 1
# Mostrar Fibonacci de 1 a 5
for i in [1, 2, 3, 4, 5]:
print i, '=>', fib(i)
E>emplo Tconvers:o de 6I/U:
# -*- coding: latin1 -*-
&ef r'b(ht"l(r=0, g=0, b=0):
"""Converte R, G, B em #RRGGBB"""
return '#%02x%02x%02x' % (r, g, b)
&ef ht"l(r'b(color='#000000'):
"""Converte #RRGGBB em R, G, B"""
if color.startswith('#'): color = color[1:]
r = int(color[:2], 16)
g = int(color[2:4], 16)
b = int(color[4:], 16)
return r, g, b # Uma seqncia
print rgb_html(200, 200, 255)
print rgb_html(b=200, g=200, r=255) # O que houve?
print html_rgb('#c8c8ff')
5bserva@es:
5s argumentos com padr:o devem vir por Dltimo, depois dos argumentos sem
padr:o.
5 valor do padr:o para um parAmetro R calculado Fuando a )un:o R de)inida.
5s argumentos passados sem identi)icador s:o recebidos pela )un:o na )orma de
uma lista.
5s argumentos passados com identi)icador s:o recebidos pela )un:o na )orma de
um dicionrio.
5s parAmetros passados com identi)icador na chamada da )un:o devem vir no )im
&un@es .1
da lista de parAmetros.
E>emplo de como receber todos parAmetros:
# -*- coding: latin1 -*-
# *args - argumentos sem nome (lista)
# **kargs - argumentos com nome (dicionrio)
&ef func(*args, **kargs):
print args
print kargs
8o e>emplo, "args receber os argumentos nomeados e args receber os outros.
.' )ocuentao
0ocumentao
Py15" R a )erramenta padr:o de documenta:o
*
do Python. Ela pode ser utili.ada tanto
para acessar a documenta:o dos mdulos Fue acompanham o Python, Fuanto mdulos
de terceiros.
8o CindoSs, acesse o <cone WBodule 1ocsX para a documenta:o da biblioteca padr:o e
WPython BanualsX para consultar o tutorial, re)erHncias e outros documentos mais
e>tensos.
Para utili.ar o Py15" no Linu>:
pydoc ./modulo.py
Para e>ibir a documenta:o de Wmodulo.pyX no diretrio atual.
8o Linu>, para ver a documenta:o das bibliotecas no #ro!ser, utili.e o comando:
pydoc -p 8000
E acesse o endereo http://localhost:;'''/.
Para rodar a vers:o gr)ica do Py15" e>ecute:
pydoc -g
5 Py15" utili.a as )oc %trings dos mdulos para gerar a documenta:o.
-lRm disso, R poss<vel ainda consultar a documenta:o no prprio interpretador, atravRs
da )un:o help<=.
E>emplo:
help(list)
Bostra a documenta:o para a lista do Python.
* - documenta:o do Python tambRm dispon<vel na internet em: http://SSS.python.org/doc/.
/3ercAcios I .-
Exerccios I
#. 2mplementar duas )un@es:
,ma Fue converta temperatura em graus 2elsius para &ahrenheit+
5utra Fue converta temperatura em graus &ahrenheit para 2elsius.
Lembrando Fue:
. 2mplementar uma )un:o Fue retorne verdadeiro se o nDmero )or primo T)also caso
contrrioU. 9estar de # a #''.
&. 2mplementar uma )un:o Fue receba uma lista de listas de comprimentos FuaisFuer e
retorne uma lista de uma dimens:o.
+. 2mplementar uma )un:o Fue receba um dicionrio e retorne a soma, a mRdia e a
varia:o dos valores.
!. Escreva uma )un:o Fue:
6eceba uma )rase como parAmetro.
6etorne uma nova )rase com cada palavra com as letras invertidas.
E. "rie uma )un:o Fue:
6eceba uma lista de tuplas TdadosU, um inteiro Tchave, .ero por padr:o igualU e um
booleano Treverso, )also por padr:oU.
6etorne dados ordenados pelo item indicado pela chave e em ordem decrescente se
reverso )or verdadeiro.
F=
9
5
C32
.. Parte II
Parte II
Bdulos.
Escopo de nomes.
Pacotes.
/ibliotecas compartilhadas.
/ibliotecas de terceiros.
-rFuivos e 2/5.
E>ce@es.
9empo.
2ntrospec:o.
E>erc<cios 22.
1Bdulos .0
%dulos
Bdulos s:o arFuivos Fue podem importados para um programa. Podem conter FualFuer
estrutura do Python e s:o e>ecutados Fuando importados
#'
. Eles s:o compilados Fuando
importados pela primeira ve. e arma.enados em arFuivo Tcom e>tens:o W+pyc, ou W+pyo,U,
possuem naespace prprio e aceitam )oc %trings. %:o obJetos %ingleton Ts R carregada
uma instAncia em memria, Fue )ica dispon<vel de )orma global para o programaU.
5s mdulos s:o locali.ados pelo interpretador atravRs da lista de pastas PC*HD?PE*H
Tsys+pathU, Fue normalmente inclui a pasta corrente em primeiro lugar. 5 mdulo principal
de um programa tem a varivel FFnaeFF igual ] W\\main\\X, ent:o R poss<vel testar se o
mdulo R o principal usando:
if __name__ == "__main__":
# Aqui o cdigo s ser executado
# se este for o mdulo principal
# e no quando ele for importado por outro programa
#' "aso seJa necessrio e>ecutar de novo o mdulo durante a e>ecu:o da aplica:o, ele ter Fue carregado
outra ve. atravRs da )un:o reload.
<<main<<
Funo
s)s.pat*
s)s.eit59
=dulo principal em eecuo.
s)s
pat*
eit
=dulo sys 5import sys9
path ' uma lista.
exit ' uma $uno.
Funo de$inida em __main__.
1*amando exit de sys.
.8 1Bdulos
"om isso R )cil trans)ormar um programa em um mdulo.
5s mdulos s:o carregados atravRs da instru:o iport. 1esta )orma, ao usar alguma
estrutura do mdulo, R necessrio identi)icar o mdulo. 2sto R chamado de iportao
a#soluta.
i"port os
print os.name
9ambRm poss<vel importar mdulos de )orma relativa:
fro" os i"port name
print name
5 caractere W`X pode ser usado para importar tudo Fue est de)inido no mdulo:
fro" os i"port *
print name
Por evitar problemas como a o)usca:o de variveis, a importa:o absoluta R uma prtica
melhor de programa:o do Fue a importa:o relativa.
E>emplo de mdulo:
# -*- coding: latin1 -*-
"""
modutils => rotinas utilitrias para mdulos
"""
i"port os.path
i"port sys
i"port glob
&ef fin&(txt):
"""encontra mdulos que tem o nome
contendo o parmetro
"""
resp = []
for path in sys.path:
mods = glob.glob('%s/*.py' % path)
1Bdulos .9
for mod in mods:
if txt in os.path.basename(mod):
resp.append(mod)
return resp
E>emplo de uso do mdulo:
fro" os.path i"port getsize, getmtime
fro" time i"port localtime, asctime
i"port modutils
mods = modutils.find('xml')
for mod in mods:
tm = asctime(localtime(getmtime(mod)))
kb = getsize(mod) / 1024
print '%s: (%d kbytes, %s)' % (mod, kb, tm)
%a<da:
c:\python25\lib\xmllib.py: (34 kbytes, Fri Oct 28 20:07:40 2005)
c:\python25\lib\xmlrpclib.py: (46 kbytes, Thu Dec 08 14:20:04 2005)
1ividir programas em mdulos )acilita o reaproveitamento e locali.a:o de )alhas no
cdigo.
%dulos da 2i2lioteca padro
c comum di.er Fue o Python vem com Wbaterias inclusasX, em re)erHncia a vasta biblioteca
de mdulos e pacotes Fue R distribu<da com o interpretador.
-lguns mdulos importantes da biblioteca padr:o:
%istema: os, glo#, shutils, su#process.
*hreads: threading.
PersistHncia: pic"le, cPic"le.
MBL: 3l+do, 3l+sa3, eleent*ree Ta partir da vers:o .!U.
"on)igura:o: 2onfigParser, optparse.
9empo: tie, datetie.
5utros: sys, logging, trace#ac", types, tieit.
.8 /scopo de noes
Escopo de nomes
?aespaces s:o dicionrios Fue relacionam os nomes dos obJetos Tre)erHnciasU e os obJetos
em si.
8ormalmente, os nomes est:o de)inidos em dois dicionrios, Fue podem ser consultados
atravRs das )un@es locals<= e glo#als<=. Estes dicionrios s:o alterados dinamicamente em
tempo de e>ecu:o
##
.
?ariveis globais podem ser o)uscadas por variveis Tpois o escopo local R veri)icado antes
do escopo globalU. Para evitar isso, R preciso declarar a varivel como global no escopo
local.
E>emplo:
&ef so"alista(lista):
"""
## Embora os dicionrios retornados por locals<= e glo#als<= possam ser alterados diretamente, isso deve ser
evitado, pois pode ter e)eitos indeseJveis.
=dulo
Funo
4ar<!
4ar<(
4ar<,
4ar<,
4ar<-
Estas so 3ari:3eis globais.
Estas so 3ari:3eis locais.
4ar<, $oi o$uscada7 pois $oi
5re9de$inida no escopo local.
>m namespace ' um escopo de
de$inio de estruturas.
/scopo de noes .9
Soma listas de listas, recursivamente
Coloca o resultado como global
"""
'lobal soma

for item in lista:
if type(item) is list: # Se o tipo do item for lista
somalista(item)
else:
soma += item
soma = 0
somalista([[1, 2], [3, 4, 5], 6])
print soma # 21
,sar variveis globais n:o R considerada uma boa prtica de desenvolvimento, pois
tornam mais di)<cil entender o sistema, portanto R melhor evitar seu uso. E o)uscar
variveis tambRm.
00 Pacotes
Pacotes
Pacotes Tpac"agesU s:o pastas Fue s:o identi)icadas pelo interpretador pela presena de um
arFuivo com o nome W\\init\\.pyX. 5s pacotes servem como containers para mdulos.
c poss<vel importar todos os mdulos do pacote usando a declara:o fro noeFdoFpacote
iport G.
5 arFuivo W\\init\\.pyX pode estar va.io ou conter cdigo de iniciali.a:o do pacote ou
de)inir uma varivel chamada FFallFF, uma lista de mdulos do pacote ser:o importados
Fuando )or usado W`X. %em o arFuivo, o Python n:o identi)ica a pasta como um pacote
vlido.
componentes
displa).p)
lcd
oled
&sta pasta $ um pacote.
sensor.p)
termico
Identi$ica a pasta como pacote.
componentes.sensor.
componentes.sensor.termico.
componentes.display.crt.
componentes.display.oled.
<<init<<.p)
crt
componentes.display.lcd.
componentes.display.
7i#liotecas copartilhadas 01
#i2liotecas compartil*adas
- partir da vers:o .!, o Python incorporou o mdulo ctypes, Fue implementa tipos
compat<veis com os tipos usados pela linguagem " e permite evocar )un@es de bibliotecas
compartilhadas.
5 mdulo provH vrias )ormas de evocar )un@es. (un@es Fue seguem a conven:o de
chamada stdcall, como a -P2 do CindoSs, podem ser acessadas atravRs da classe !indll.
)ynaic;lin" li#rary T1LLU R a implementa:o de bibliotecas compartilhadas Fue s:o
usadas no CindoSs.
E>emplo com !indll:
# -*- coding: latin1 -*-
i"port ctypes
# Evocando a caixa de mensagens do Windows
# Os argumentos so: janela pai, mensagem,
# ttulo da janela e o tipo da janela.
# A funo retorna um inteiro, que
# corresponde a que boto foi pressionado
i = ctypes.windll.user32.MessageBoxA()one,
'Teste de DLL!', 'Mensagem', 0)
# O resultado indica qual boto foi clicado
print i
Para )un@es Fue seguem a conven:o de chamada cdecl, usada pela maioria dos
compiladores ", e>iste a classe cdll. Para as passagens de argumentos por re)erHncia R
preciso criar uma varivel Fue )unciona como um #uffer para receber os resultados. 2sso R
necessrio para receber strings, por e>emplo.
E>emplo com cdll e #uffer:
# -*- coding: latin1 -*-
i"port ctypes
# msvcrt a biblioteca com a maioria das funes
# padres da linguagens C no Windows
# O Windows coloca automaticamente
# a extenso do arquivo
clib = ctypes.cdll.msvcrt
0' 7i#liotecas copartilhadas
# Cria um buffer para receber o resultado
# a referncia para o buffer ser passada para
# a funo, que preenche o buffer com o resultado
s = ctypes.c_buffer('\000', 40)
# sscanf() uma funo que extrai valores
# de uma string conforme uma mascara
clib.sscanf('Testando sscanf!\n',
'Testando %s!\n', s)
# Mostra o resultado
print s.value
c poss<vel tambRm evocar )un@es de bibliotecas compartilhadas no Linu>:
# -*- coding: latin1 -*-
i"port ctypes
# Carrega a biblioteca padro C no Linux
# A extenso do arquivo precisa passada
# para a funo LoadLibrary()
clib = ctypes.cdll.LoadLibrary("libc.so.6")
# Cria um buffer para receber o resultado
s = ctypes.c_buffer('\000', 40)
# Evoca a funo sprintf
clib.sprintf(s, 'Testando %s\n', 'sprintf!')
# Mostra o resultado
print s.value
-travRs de bibliotecas compartilhadas R poss<vel usar cdigo desenvolvido em outras
linguagens de uma maneira simples.
7i#liotecas de terceiros 0-
#i2liotecas de terceiros
=oJe e>istem muitas bibliotecas escritas por terceiros dispon<veis para Python, compostas
por pacotes ou mdulos, Fue implementam diversos recursos alRm da biblioteca padr:o.
Ieralmente, as bibliotecas s:o distribu<das das seguintes )ormas:
Pacotes distutils.
Pacotes para gerenciadores de pacotes do %istema 5peracional.
2nstaladores.
Python Eggs.
5s pacotes usando o mdulo distutils, Fue R distribu<do com o Python, s:o muito
populares. 5s pacotes s:o distribu<dos em arFuivos compactados Tgeralmente W.tar.g.X,
W.tar.b.X ou W..ipXU. Para instalar, R necessrio descompactar o arFuivo, entrar na pasta
Fue )oi descompactada e por )im e>ecutar o comando:
python setup.py install
Nue o pacote ser instalado na pasta Wsite-pacVagesX no Python.
Ierenciadores de pacotes do %istema 5peracional, geralmente trabalham com )ormatos
prprios de pacote, como W.debX T1ebian Linu>U ou W.rpmX T6ed=at Linu>U. - )orma de
instalar os pacotes depende do gerenciador utili.ado. - grande vantagem R Fue o
gerenciador de pacotes cuida das dependHncias e atuali.a@es.
2nstaladores s:o e>ecutveis Fue instalam a biblioteca. Ieralmente s:o usados em
ambiente CindoSs e podem ser desinstalados pelo Painel de "ontrole.
Python Eggs s:o pacotes Tcom a e>tens:o W.eggXU administrados pelo easy\install,
utilitrio Fue )a. parte do proJeto setuptools
#
. %emelhante a algumas )erramentas
encontradas em outras linguagens, como o 6uby Iems, aos poucos est se tornando o
padr:o de )ato para distribui:o de bibliotecas em Python.
5 programa procura pela vers:o mais nova do pacote no PLP2
#&
TPython Pac"age Inde3U,
repositrio de pacotes Python, e tambRm procura instalar as dependHncias Fue )orem
necessrias.
# (ontes e documenta:o do proJeto em: http://peaV.telecommunity.com/1ev"enter/setuptools/.
#& Endereo: http://pypi.python.org/pypi.
0. 7i#liotecas de terceiros
Python Eggs podem ser instalados pelo comando:
easy_install nome_do_pacote
5 script easy\install R instalado na pasta WscriptsX do Python.
ErHuivos e IID 00
3r-ui&os e I4(
5s arFuivos no Python s:o representados por obJetos do tipo file
1.
, Fue o)erecem mRtodos
para diversas opera@es de arFuivos. -rFuivos podem ser abertos para leitura TYrY, Fue R o
defaultU, grava:o TYSYU ou adi:o TYaYU, em modo te>to ou binrioTYbYU.
Em Python:
sys+stdin representa a entrada padr:o.
sys+stdout representa a sa<da padr:o.
sys+stderr representa a sa<da de erro padr:o.
- entrada, sa<da e erro padr@es s:o tratados pelo Python como arFuivos abertos. -
entrada em modo de leitura e os outros em modo de grava:o.
E>emplo de escrita:
i"port sys
# Criando um objeto do tipo file
temp = file('temp.txt', 'w')
# Escrevendo no arquivo
for i in range(100):
temp.write('%03d\n' % i)
# Fechando
temp.close()
temp = file('temp.txt')
# Escrevendo no terminal
for x in temp:
sys.stdout.write(x)
#Escrever em sys.stdout envia
# otexto para a sada padro
temp.close()
- itera:o do segundo lao, o obJeto retorna uma linha do arFuivo.
E>emplo de leitura:
i"port sys
#+ - re)erHncia open aponta para file.
08 ErHuivos e IID
i"port os.path
# raw_input retorna a string digitada
fn = raw_input('Nome do arquivo: ').strip()
if not os.path.exists(fn):
print 'Tente outra vez...'
sys.exit()
# Numerando as linhas
for i, s in enumerate(file(fn)):
print i + 1, s,
c poss<vel ler todas as linhas com o mRtodo readlines<=:
# Imprime uma lista contendo linhas do arquivo
print file('temp.txt').readlines()
5s obJetos de arFuivo tambRm possuem um mRtodo see"<=, Fue permite ir para FualFuer
posi:o no arFuivo.
Sistema de ar-ui&os
5 mdulo os+path implementa vrias )uncionalidades relacionadas a sistemas de arFuivo,
tais como:
os+path+#asenae<=: retorna o componente )inal de um caminho.
os+path+dirnae<=: retorna um caminho sem o componente )inal.
os+path+e3ists<=: retorna *rue se o caminho e>iste ou &alse em caso contrrio.
os+path+getsi>e<=: retorna o tamanho do arFuivo em #ytes.
5 glo# R outro mdulo relacionado ao sistema de arFuivo:
i"port os.path
i"port glob
# Mostra uma lista de nomes de arquivos
# e seus respectivos tamanhos
for arq in sorted(glob.glob('*.py')):
print arq, os.path.getsize(arq)
- )un:o glo#+glo#<= retorna uma lista com os nomes de arFuivo Fue atendem ao critRrio
passado como parAmetro, de )orma semelhante ao comando WlsX dispon<vel nos sistemas
,82M.
ErHuivos e IID 09
3r-ui&os compactados
5 Python possui mdulos para trabalhar com vrios )ormatos de arFuivos compactados.
E>emplo de grava:o de um arFuivo W..ipX:
# -*- coding: latin1 -*-
"""
Gravando texto em um arquivo compactado
"""
i"port zipfile
texto = """
***************************************
Esse o texto que ser compactado e...
... guardado dentro de um arquivo zip.
***************************************
"""
# Cria um zip novo
zip = zipfile.ZipFile('arq.zip', 'w',
zipfile.ZIP_DEFLATED)
# Escreve uma string no zip como se fosse um arquivo
zip.writestr('texto.txt', texto)
# Fecha o zip
zip.close()
E>emplo de leitura:
# -*- coding: latin1 -*-
"""
Lendo um arquivo compactado
"""
i"port zipfile
# Abre o arquivo zip para leitura
zip = zipfile.ZipFile('arq.zip')
# Pega a lista dos arquivos compactados
arqs = zip.namelist()
for arq in arqs:
# Mostra o nome do arquivo
print 'Arquivo:', arq
08 ErHuivos e IID
# Informaes do arquivo
zipinfo = zip.getinfo(arq)
print 'Tamanho original:', zipinfo.file_size
print 'Tamanho comprimido:', zipinfo.compress_size
# Mostra o contedo do arquivo
print zip.read(arq)
%a<da:
Arquivo: texto.txt
Tamanho original: 160
Tamanho comprimido: 82
***************************************
Esse o texto que ser compactado e...
... guardado dentro de um arquivo zip.
***************************************
5 Python tambRm provH mdulos para os )ormatos g.ip, b.ip e tar, Fue s:o bastante
utili.ados em ambientes ,82M.
3r-ui&os de dados
8a biblioteca padr:o, o Python tambRm )ornece um mdulo para simpli)icar o
processamento de arFuivos no )ormato "%? T2oa %eparated ValuesU.
5 )ormato R muito simples, os dados s:o arma.enados em )orma de te>to, separados por
v<rgula, um registro por linha.
E>emplo de escrita:
i"port csv
# Dados
dt = (('temperatura', 15.0, 'C', '10:40', '2006-12-31'),
('peso', 42.5, 'kg', '10:45', '2006-12-31'))
# A escrita recebe um objeto do tipo "file"
out = csv.writer(file('dt.csv', 'w'))
# Escrevendo as tuplas no arquivo
out.writerows(dt)
-rFuivo de sa<da:
ErHuivos e IID 09
temperatura,15.0,C,10:40,2006-12-31
peso,42.5,kg,10:45,2006-12-31
E>emplo de leitura:
i"port csv
# A leitura recebe um objeto arquivo
dt = csv.reader(file('dt.csv'))
# Para cada registro do arquivo, imprima
for reg in dt:
print reg
%a<da:
['temperatura', '15.0', 'C', '10:40', '2006-12-31']
['peso', '42.5', 'kg', '10:45', '2006-12-31']
5 )ormato "%? R aceito pela maioria das planilhas e sistemas de banco de dados para
importa:o e e>porta:o de in)orma@es.
80 /3ce@es
Excees
Nuando ocorre uma )alha no programa Tcomo uma divis:o por .ero, por e>emploU em
tempo de e>ecu:o, uma e>ce:o R gerada. %e a e>ce:o n:o )or tratada, ela ser
propagada atravRs das chamadas de )un:o atR o mdulo principal do programa,
interrompendo a e>ecu:o.
print 1/0
Traceback (most recent call last):
File "<input>", line 1, in %
ZeroDivisionError: integer division or modulo by zero
- instru:o try permite o tratamento de e>ce@es no Python. %e ocorrer uma e>ce:o em
um bloco marcado com try, R poss<vel tratar a e>ce:o atravRs da instru:o e3cept. Podem
e>istir vrios e3cepts para um try.
tr*:
print 1/0
e+cept ZeroDivisionError:
print 'Erro ao tentar dividir por zero.'
# Mostra:
# Erro ao tentar dividir por zero.
%e e3cept recebe o nome da e>ce:o, s esta ser tratada. %e n:o )or passada nenhuma
e>ce:o como parAmetro, todas ser:o tratadas.
i"port traceback
# Tente receber o nome do arquivo
tr*:
fn = raw_input('Nome do arquivo: ').strip()
# Numerando as linhas
for i, s in enumerate(file(fn)):
print i + 1, s,
# Se ocorrer um erro
e+cept:
# Mostre na tela
trace = traceback.format_exc()
/3ce@es 81
# E salve num arquivo
print 'Aconteceu um erro:\n', trace
file('trace.log', 'a').write(trace)
# Encerre o programa
raise SystemExit
5 mdulo trace#ac" o)erece )un@es para manipular as mensagens de erro. - )un:o
foratFe3c retorna a sa<da da Dltima e>ce:o )ormatada em uma string.
5 tratamento de e>ce@es pode possuir um bloco else, Fue ser e>ecutado Fuando n:o
ocorrer nenhuma e>ce:o e um bloco finally, ser e>ecutado de FualFuer )orma, tendo
ocorrido uma e>ce:o ou n:o
#!
. 8ovos tipos de e>ce@es podem ser de)inidos atravRs de
herana a partir da classe /3ception.
#! - declara:o finally pode ser usada para liberar recursos Fue )oram usados no bloco try, tais como
cone>@es de banco de dados ou arFuivos abertos.
8' *epo
empo
5 Python possui dois mdulos para lidar com tempo:
tie: implementa )un@es bsicas para lidar com o tempo gerado pelo sistema
operacional.
datetie: implementa tipos de alto n<vel para lidar opera@es de data e hora.
E>emplo com time:
# -*- coding: latin-1 -*-
i"port time
# localtime() Retorna a data e hora local no formato
# de uma tupla:
# (ano, ms, dia, hora, minuto, segundo, dia da semana,
# dia do ano, horrio de vero)
print time.localtime()
# asctime() retorna a data e hora como string, conforme
# a configurao do sistema operacional
print time.asctime()
# time() retorna o tempo do sistema em segundos
ts1 = time.time()
# gmtime() converte segundos para tuplas no mesmo
# formato de localtime()
tt1 = time.gmtime(ts1)
print ts1, '=>', tt1
# Somando uma hora
tt2 = time.gmtime(ts1 + 3600.)
# mktime() converte tuplas para segundos
ts2 = time.mktime(tt2)
print ts2, '=>', tt2
# clock() retorma o tempo desde quando o programa
# iniciou, em segundos
print 'O programa levou', time.clock(), \
'segundos sendo executado at agora...'
# Contando os segundos...
for i in xrange(5):
# sleep() espera durante o nmero de segundos
# especificados
time.sleep(1)
*epo 8-
print i + 1, 'segundo(s)'
%a<da:
(2008, 5, 11, 9, 55, 57, 6, 132, 0)
Sun May 11 09:55:57 2008
1210510557.44 => (2008, 5, 11, 12, 55, 57, 6, 132, 0)
1210524957.0 => (2008, 5, 11, 13, 55, 57, 6, 132, 0)
O programa levou 1.53650813162e-006 segundos sendo executado at agora...
1 segundo(s)
2 segundo(s)
3 segundo(s)
4 segundo(s)
5 segundo(s)
Em datetie, est:o de)inidos Fuatro tipos para representar o tempo:
datetie: data e hora.
date: apenas data.
tie: apenas hora.
tiedelta: di)erena entre tempos.
E>emplo:
# -*- coding: latin-1 -*-
i"port datetime
# datetime() recebe como parmetros:
# ano, ms, dia, hora, minuto, segundo
# e retorna um objeto do tipo datetime
dt = datetime.datetime(2020, 12, 31, 23, 59, 59)
# Objetos date e time podem ser criados
# a partir de um objeto datetime
data = dt.date()
hora = dt.time()
# Quanto tempo falta para 31/12/2020
dd = dt ! dt.today()
print 'Data:', data
print 'Hora:', hora
print 'Quanto tempo falta para 31/12/2020:', \
str(dd).replace('days', 'dias')
%a<da:
8. *epo
Data: 2020-12-31
Hora: 23:59:59
Quanto tempo falta para 31/12/2020: 4616 dias, 13:22:58.857000
5s obJetos dos tipos date e datetie retornam datas em )ormato 2%5.
Introspeco 80
Introspeco
2ntrospec:o ou re)le>:o R capacidade do so)tSare de identi)icar e relatar suas prprias
estruturas internas, tais como tipos, escopo de variveis, mRtodos e atributos.
(un@es nativas do interpretador para introspec:o:
,un-.o /etorno
type(objeto) O tipo (classe) do objeto.
id(objeto) O identificador do objeto.
locals() O dicionrio de variveis locais.
globals() O dicionrio de variveis globais.
len(objeto) O tamanho do objeto.
dir(objeto) A lista de estruturas do objeto.
help(objeto) As Doc Strings do objeto.
repr(objeto) A representao do objeto.
isinstance(objeto, classe) Verdadeiro se objeto deriva da classe.
issubclass(subclasse, classe) Verdadeiro se subclasse herda classe.
5 identi)icador do obJeto R um nDmero inteiro Dnico Fue R usado pelo interpretador para
identi)icar internamente os obJetos.
E>emplo:
# -*- coding: latin1 -*-
# Colhendo algumas informaes
# dos objetos globais no programa
fro" types i"port ModuleType
&ef info(n_obj):
# Cria uma referncia ao objeto
obj = globals()[n_obj]
# Mostra informaes sobre o objeto
print 'Nome do objeto:', n_obj
print 'Identificador:', id(obj)
print 'Tipo:', type(obj)
print 'Representao:', repr(obj)
88 Introspeco
# Se for um mdulo
if isinstance(obj, ModuleType):
print 'itens:'
for item in dir(obj):
print item
print
# Mostrando as informaes
for n_obj in dir():
info(n_obj)
5 Python tambRm tem um mdulo chamado types, Fue tem as de)ini@es dos tipos bsicos
do interpretador.
-travRs da introspec:o, R poss<vel determinar os campos de uma tabela de banco de
dados, por e>emplo.
%dulo inspect
5 mdulo inspect provH um conJunto de )un@es de introspec:o prontas Fue permitem
investigar tipos , itens de cole@es, classes, )un@es, cdigo )onte e a pilha de e>ecu:o do
interpretador.
E>emplo:
# -*- coding: latin1 -*-
i"port os.path
# inspect: mdulo de introspeco "amigvel"
i"port inspect
print 'Objeto:', inspect.getmodule(os.path)
print 'Classe?', inspect.isclass(str)
# Lista todas as funes que existem em "os.path"
print 'Membros:',
for name, struct in inspect.getmembers(os.path):
if inspect.isfunction(struct):
print name,
%a<da:
Introspeco 89
Objeto: <module 'ntpath' from 'C:\Python24\lib\ntpath.pyc'>
Classe? True
Membros: abspath basename commonprefix dirname exists expanduser expandvars
getatime getctime getmtime getsize isabs isdir isfile islink ismount join lexists normcase
normpath realpath split splitdrive splitext splitunc walk
-s )un@es Fue trabalham com a pilha do interpretador devem ser usadas com cuidado,
pois R poss<vel criar re)erHncias c<clicas Tuma varivel Fue aponta para o item da pilha Fue
tem a prpria varivelU. - e>istHncia de re)erHncias a itens da pilha retarda a destrui:o
dos itens pelo coletor de li>o do interpretador.
88 /3ercAcios II
Exerccios II
#. 2mplementar um programa Fue receba um nome de arFuivo e gere estat<sticas sobre o
arFuivo TnDmero de caracteres, nDmero de linhas e nDmero de palavrasU
. 2mplementar um mdulo com duas )un@es:
atri3Fsu<Gatrices=, Fue retorna a matri. soma de matri.es de duas dimens@es.
caelFcase<s=, Fue converte nomes para "amel"ase.
&. 2mplementar uma )un:o Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
+. 2mplementar um mdulo com duas )un@es:
split<fn6 n=, Fue Fuebra o arFuivo )n em partes de n #ytes e salva com nomes
seFGenciais Tse fn O arF.t>t, ent:o arF\''#.t>t, arF\''.t>t, ... U
Join<fn6 fnlist= Fue Junte os arFuivos da lista fnlist em um arFuivo s fn.
!. "rie um script Fue:
"ompare a lista de arFuivos em duas pastas distintas.
Bostre os nomes dos arFuivos Fue tem conteDdos di)erentes e/ou Fue e>istem em
apenas uma das pastas.
E. (aa um script Fue:
Leia um arFuivo te>to.
"onte as ocorrHncias de cada palavra.
Bostre os resultados ordenados pelo nDmero de ocorrHncias.
Parte III 89
Parte III
Ieradores.
Programa:o )uncional.
E>erc<cios 222.
90 $eradores
5eradores
-s )un@es geralmente seguem o )lu>o convencional de processar, retornar valores e
encerrar. Ieradores s:o estruturas semelhantes, porRm processam e retornam um valor de
uma seFGHncia a cada chamada. 5 gerador lembra o estado do processamento entre as
chamadas, retornam o pr>imo item esperado.
5s geradores apresentam vrias vantagens em rela:o ]s )un@es convencionais:
La>y /valuation: geradores s s:o processados Fuando R realmente necessrio, sendo
assim, economi.am recursos de processamento.
6edu.em a necessidade da cria:o de listas.
Permitem trabalhar com seFGHncias ilimitadas de elementos.
Ieradores normalmente s:o evocados atravRs de um lao for. - sinta>e R semelhante a da
)un:o tradicional, s Fue a instru:o yield substitui o return. - nova cada itera:o, yield
retorna o pr>imo valor.
E>emplo:
# -*- coding: latin-1 -*-
&ef 'en(pares():
"""
Gera nmeros pares infinitamente...
"""
i = 0
while True:
i += 2
*iel& i
# Mostra cada nmero e passa para o prximo
for n in gen_pares():
print n
5utro e>emplo:
i"port os
# Encontra arquivos recursivamente
&ef fin&(path='.'):
'o gerador( )ield toma o lugar
do return.
$eradores 91
for item in os.listdir(path):
fn = os.path.normpath(os.path.join(path, item))
if os.path.isdir(fn):
for f in find(fn):
*iel& f
else:
*iel& fn
for fn in find('c:/temp'):
print fn
8a prpria linguagem e>istem vrios geradores, como o #uiltin 3range<=
18
, e o mdulo
itertools, Fue de)ine vrios geradores Dteis.
Para converter a sa<da do gerador em uma lista:
lista = list(gerador())
-ssim, todos os itens ser:o gerados de uma ve..
#E 5 gerador 3range substitui com vantagem a )un:o range e a sinta>e R a mesma.
cada itera"#o do la"o( o gerador
encontra um novo ar*uivo.
9' Prograao funcional
Pro!ramao funcional
Programa:o )uncional R um paradigma Fue trata a computa:o como uma avalia:o de
)un@es matemticas. 9ais )un@es podem ser aplicadas em seFGHncias de dados
Tgeralmente listasU.
%:o e>emplos de linguagens )uncionais: L2%P, %cheme e =asVell Testa Dltima in)luenciou o
proJeto do Python de )orma marcanteU.
-s opera@es bsicas do paradigma )uncional s:o implementadas no Python pelas )un@es
ap<=, filter<=, reduce<= e >ip<=.
Lam2da
8o Python, la#da R uma )un:o anlnima composta apenas por e>press@es. -s )un@es
la#da podem ter apenas uma linha, e podem ser atribu<das a uma varivel. (un@es
la#da s:o muito usadas em programa:o )uncional.
%inta>e:
la"b&a <lista de variveis>: <expresses >
E>emplo:
# Amplitude de um vetor 3D
amp = la"b&a x, y, z: (x ** 2 + y ** 2 + z ** 2) ** .5
print amp(1, 1, 1)
print amp(3, 4, 5)
%a<da:
1.73205080757
7.07106781187
(un@es la#da consomem menos recursos Fue as )un@es convencionais.
Prograao funcional 9-
%apeamento
5 mapeamento consiste em aplicar uma )un:o a todos os itens de uma seFGHncia,
gerando outra lista contendo os resultados e com o mesmo tamanho da lista inicial.
8o Python, o mapeamento R implementado pela )un:o ap<=.
E>emplos:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# log na base 10
fro" math i"port log10
print map(log10, nums)
# Dividindo por 3
print map(la"b&a x: x / 3, nums)
- )un:o ap<= sempre retorna uma lista.
Lista
!
(
,
-
.
6
?
Lista
!
-
@
!6
(.
,6
-@
Funo
AA(
9. Prograao funcional
'iltra!em
8a )iltragem, uma )un:o R aplicada em todos os itens de uma seFGHncia, se a )un:o
retornar um valor Fue seJa avaliado como verdadeiro, o item original )ar parte da
seFGHncia resultante.
8o Python, a )iltragem R implementada pela )un:o filter<=.
E>emplo:
# Selecionando apenas os mpares
print filter(la"b&a x: x % 2, nums)
- )un:o filter<= aceita tambRm )un@es la#da, alRm de )un@es convencionais.
Lista Lista
!
,
.
?
Funo
B (
Falso
Falso
Falso
!
(
,
-
.
6
?
Prograao funcional 90
6eduo
6edu:o signi)ica aplicar uma )un:o Fue recebe dois parAmetros, nos dois primeiros
elementos de uma seFGHncia, aplicar novamente a )un:o usando como parAmetros o
resultado do primeiro par e o terceiro elemento, seguindo assim atR o )inal da seFGHncia. 5
resultado )inal da redu:o R apenas um elemento.
E>emplos de redu:o, Fue R implementada no Python pela )un:o reduce<=:
# -*- coding: latin1 -*-
nums = range(100)
# Soma com reduce (pode concatenar strings)
print reduce(la"b&a x, y: x + y, nums)
# Soma mais simples, mas s para nmeros
print sum(nums)
# Multiplicao
print reduce(la"b&a x, y: x * y, nums)
- )un:o su<= R mais e)iciente Fue reduce<=.
Lista Cesultado
!
,
6
!+
!.
(!
(8
Funo
D )
!
(
,
-
.
6
?
98 Prograao funcional
ransposio
9ransposi:o R construir uma sRrie de seFGHncias a partir de outra sRrie de seFGHncias,
aonde a primeira nova seFGHncia contRm o primeiro elemento de cada seFGHncia original,
a segunda nova seFGHncia contRm o segundo elemento de cada seFGHncia original, atR Fue
alguma das seFGHncias originais acabe.
E>emplo de transposi:o, Fue R implementada no Python pela )un:o >ip<=:
# Uma lista com ('a', 1), ('b', 2), ...
fro" string i"port ascii_lowercase
print zip(ascii_lowercase, range(1, 100))
# Transposta de uma matriz
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print zip(*matriz)
- )un:o >ip<= sempre retorna uma lista de tuplas.
Listas
!
(
,
-
.
6
Listas
!
-
(
.
,
6
Funo
Prograao funcional 99
List Compre*ension
Em computa:o, List 2oprehension R uma constru:o eFuivalente a nota@es matemticas
do tipo:
5u seJa, % R o conJunto )ormado por > ao Fuadrado para todo > no conJunto dos nDmeros
naturais, se > )or maior ou igual a '.
%inta>e:
lista = [ <expresso> for <referncia> in <seqncia> if <condio> ]
E>emplo:
# -*- coding: latin1 -*-
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# Eleve os mpares ao quadrado
print [ x**2 for x in nums if x % 2 ]
%a<da:
[1, 9, 25, 49, 81, 121]
5 List 2oprehension R mais e)iciente do Fue usar as )un@es ap<= e filter<=.
5enerator Expression
$enerator /3pression R uma e>press:o semelhante ao List 2oprehension Fue )unciona como
um gerador.
E>emplo:
# -*- coding: latin1 -*-
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
S={x
2
xem, x20}
98 Prograao funcional
# Eleve os mpares ao quadrado
gen = ( x**2 for x in nums if x % 2 )
# Mostra os resultados
for num in gen:
print num
5 $enerator /3pression usa menos recursos do Fue o List 2oprehension eFuivalente.
/3ercAcios III 99
Exerccios III
#. 2mplementar um gerador de nDmeros primos.
. 2mplementar o gerador de nDmeros primos como uma e>press:o Tdica: use o mdulo
itertoolsU.
&. 2mplementar um gerador Fue produ.a tuplas com as cores do padr:o 6I/ T6, I e /
variam de ' a !!U usando 3range<= e uma )un:o Fue produ.a uma lista com as tuplas
6I/ usando range<=. "ompare a per)ormance.
+. 2mplementar um gerador Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
80 Parte IV
Parte IV
1ecoradores.
"lasses.
9estes automati.ados.
E>erc<cios 2?.
)ecoradores 81
0ecoradores
1ecoradores TdecoratorsU s:o )un@es Fue s:o aplicadas em outras )un@es e retornam
)un@es modi)icadas. 1ecoradores tanto podem ser usados para alterar propriedades das
)un@es TFue s:o obJetosU Fuanto para WenvolverX as )un@es, acrescentando uma camada
em torno delas com novas )uncionalidades.
- partir do Python .+, o caractere WmX pode ser usado para automati.ar o processo de
aplicar o decorador:
&ef &ecorator(f):
f.decorated = True
return f
@decorator
&ef func(arg):
return arg
"om isso, )oi criado um atributo novo na )un:o, Fue pode ser usado depois, Fuando a
)un:o )or e>ecutada.
Funo
Original
Funo
=odi$icada
def func(arg):
return arg
def decorator(f):
f.decorated = True
return f
func = decorator(func)
Decorador
O decorador $oi aplicado.
8' )ecoradores
E>emplo:
# -*- coding: latin1 -*-
# Funo decoradora
&ef &u"par's(f):
# Funo que envolver a outra
&ef func(*args):
# Mostra os argumentos passados para a funo
print args
# Retorna o resultado da funo original
return f(*args)
# Retorna a funo modificada
return func
@dumpargs
&ef "ultipl*(*nums):
m = 1
for n in nums:
m = m * n
return m
print multiply(1, 2, 3)
%a<da:
(1, 2, 3)
6
- sa<da apresenta os parAmetros Fue a )un:o decorada recebeu.
2lasses 8-
Classes
,m obJeto R uma abstra:o computacional Fue representa uma entidade, com Fualidades
TatributosU e a@es TmRtodosU Fue a entidade pode reali.ar. - classe R a estrutura bsica do
paradigma de orienta:o a obJetos. - classe representa o tipo do obJeto, Fue de)ine as
Fualidades do obJeto e o Fue ele pode )a.er.
Por e>emplo, a classe 2anino descreve as caracter<sticas e a@es dos caninos em geral,
enFuanto o obJeto 7andit representa um canino em especial.
5s atributos s:o estruturas de dados sobre o obJeto e os mRtodos s:o )un@es Fue
descrevem como o obJeto se comporta.
8o Python, novos obJetos s:o criados a partir das classes atravRs de atribui:o.
Nuando um novo obJeto R criado, o construtor da classe R e>ecutado. Em Python, o
construtor R um mRtodo especial chamado FFne!FF<=. -ps a chamada ao construtor, o
mRtodo FFinitFF<= R chamado para iniciali.ar a nova instAncia.
,m obJeto continua e>istindo na memria enFuanto e>istir pelo menos uma re)erHncia a
1anino
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
Suas
caracterEsticas.
O que ele pode
$a&er.
Fandit
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
# classe
representa
qualquer canino.
O ob;eto
representa um
canino.
Fandit G 1anino59
8. 2lasses
ele. 5 interpretador Python possui um recurso chamado coletor de li>o T$ar#age 2ollectorU
Fue limpa da memria obJetos sem re)erHncias
#$
. Nuando o obJeto R apagado, o mRtodo
especial FFdoneFF<= R evocado. (un@es ligadas ao coletor de li>o podem ser encontradas
no mdulo gc.
Em Python:
Nuase tudo R obJeto, mesmo os tipos bsicos, como nDmeros inteiros.
9ipos e classes s:o uni)icados.
5s operadores s:o na verdade chamadas para mRtodos especiais.
-s classes s:o abertas Tmenos para os tipos #uiltinsU.
BRtodos especiais s:o identi)icados por nomes no padr:o FFetodoFF<= Tdois sublinhados
no in<cio e no )inal do nomeU e de)inem como os obJetos derivados da classe se
comportar:o em situa@es particulares, como em sobrecarga de operadores.
-s classes ne! style s:o derivadas da classe o#Ject e podem utili.ar recursos novos das
classes do Python, como properties e etaclasses. -s properties s:o atributos calculados em
tempo de e>ecu:o atravRs de mRtodos, enFuanto as etaclasses s:o classes Fue geram
classes, com isso permitem personali.ar o comportamento das classes.
#$ Para apagar uma re)erHncia a um obJeto, use o comando del. %e todas as re)erHncias )orem apagadas, o
$ar#age 2ollector apagar o obJeto.
1lasse
='todos de
classe
#tributos de
classe
='todos
est:ticos
Ob;eto
='todos de
classe
#tributos de
classe
='todos
est:ticos
='todos
dinHmicos
#tributos de
ob;eto
Ob;eto G 1lasse59
O construtor ' eecutado neste
momento.
2lasses 80
%inta>e:
# -*- coding: latin1 -*-
class 0lasse(supcl1, supcl2):
"""
Isto uma classe
"""
clsvar = []
&ef ((init(((self, args):
"""
Inicializador da classe
"""
<bloco de cdigo>
&ef ((&one(((self):
"""
Destrutor da classe
"""
<bloco de cdigo>
&ef "eto&o(self, params):
"""
Mtodo de objeto
"""
<bloco de cdigo>
@classmethod
&ef cls("eto&o(cls, params):
"""
Mtodo de classe
"""
<bloco de cdigo>
@staticmethod
&ef est("eto&o(params):
"""
Mtodo esttico
"""
<bloco de cdigo>
obj = Classe()
obj.metodo()
Classe.cls_metodo()
Classe.est_metodo()
BRtodos estticos s:o aFueles Fue n:o tem liga:o com atributos do obJeto ou da classe.
88 2lasses
(uncionam como as )un@es comuns.
BRtodos de classe podem usar apenas atributos e outros mRtodos de classe. 5 argumento
cls representa a classe em si, precisa ser passado e>plicitamente como primeiro parAmetro
do mRtodo.
BRtodos de obJeto podem usar atributos e outros mRtodos do obJeto. - varivel self, Fue
representa o obJeto e tambRm precisa ser passado de )orma e>pl<cita. 5 nome self R uma
conven:o, assim como cls, podendo ser trocado por outro nome FualFuer, porRm R
considerada como boa prtica manter o nome.
E>emplo de classe:
# -*- coding: latin1 -*-
class 0ell(object):
"""
Classe para clulas de planilha
"""
&ef ((init(((self, formula='""', format='%s'):
"""
Inicializa a clula
"""
self.formula = formula
self.format = format
&ef ((repr(((self):
"""
Retorna a representao em string da clula
"""
return self.format % eval(self.formula)
print Cell('123**2')
print Cell('23*2+2')
print Cell('abs(-1.45 / 0.3)', '%2.3f')
%a<da:
15129
48
4.833
2lasses 89
5 mRtodo FFreprFF<= R usado internamente pelo comando print para obter uma
representa:o do obJeto em )orma de te>to.
88 2lasses
Classes a2ertas
8o Python, as classes Fue n:o s:o #uiltins podem ser alteradas em tempo de e>ecu:o,
devido a nature.a dinAmica da linguagem. c poss<vel acrescentar mRtodos e atributos
novos, por e>emplo. - mesma lgica se aplica aos obJetos.
E>emplo de como acrescentar um novo mRtodo:
# -*- coding: latin1 -*-
class 1ser(object):
"""Uma classe bem simples.
"""
&ef ((init(((self, name):
"""Inicializa a classe, atribuindo um nome
"""
self.name = name
# Um novo mtodo para a classe
&ef set(passwor&(self, password):
"""Troca a senha
"""
self.password = password
print 'Classe original:', dir(User)
# O novo mtodo inserido na classe
User.set_password = set_password
print 'Classe modificada:', dir(User)
user = User('guest')
user.set_password('guest')
print 'Objeto:', dir(user)
print 'Senha:', user.password
%a<da:
Classe original: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', '__weakref__']
Classe modificada: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', '__weakref__', 'set_password']
Objeto: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
2lasses 89
'__setattr__', '__str__', '__weakref__', 'name', 'password', 'set_password']
Senha: guest
- classe modi)icada passou a ter um novo mRtodo: setFpass!ord<=.
-crescentar mRtodos ou atributos em classes abertas R mais simples do Fue criar uma
nova classe atravRs de herana com os novos mRtodos ou atributos.
90 2lasses
Herana simples
=erana R um mecanismo Fue a orienta:o a obJeto provH, com obJetivo de )acilitar o
reaproveitamento de cdigo. - idRia R Fue as classes seJam constru<das )ormando uma
hierarFuia.
- nova classe pode implementar novos mRtodos e atributos e herdar mRtodos e atributos
da classe antiga TFue tambRm pode ter herdado de classes anterioresU, porRm estes
mRtodos e atributos podem substitu<dos no processo. 8a herana simples, a classe deriva
de somente uma classe J e>istente.
E>emplo de herana simples:
class 2en&ri3e(object):
&ef ((init(((self, tamanho, interface='2.0'):
self.tamanho = tamanho
self.interface = interface
1arnE3oro
"eso7 #ltura7
idade
1orrer7 #tacar7
1omer
1anino
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
Suas
caracterEsticas.
O que ele pode
$a&er.
Fandit
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
1lasse para
carnE3oros.
Ob;eto para um
canino.
1lasse para
caninos.
2lasses 91
class 4252la*er(Pendrive):
&ef ((init(((self, tamanho, interface='2.0', turner=False):
self.turner = turner
Pendrive.__init__(self, tamanho, interface)
mp3 = MP3Player(1024)
print '%s\n%s\n%s' % (mp3.tamanho, mp3.interface, mp3.turner)
%a<da:
1024
2.0
False
- classe 1P-Player herda de Pendrive o tamanho e a inter)ace.
classe +P3Pla)er $ derivada
da classe Pendrive.
9' 2lasses
Herana m,ltipla
8a herana mDltipla, a nova classe deriva de vrias classes J e>istentes. - di)erena mais
signi)icativa em rela:o ] herana simples R a ordem de resolu:o de mRtodos Tem inglHs,
1ethod Kesolution Drder- B65U, Fue segue o chamado algoritmo diamante.
8o algoritmo diamante, a resolu:o ser )eita a partir da esFuerda, descendo atR encontrar
a classe em comum entre os caminhos dentro hierarFuia. Nuando encontra a classe em
comum, passa para o caminho ] direita. -o esgotar os caminhos, o algoritmo prossegue
para a classe em comum e repete o processo.
E>emplo:
# -*- coding: latin1 -*-
class 6errestre(object):
"""
Classe de veculos terrestres
"""
se_move_em_terra = True
#n$Ebio
Ob;ect
class #n$ibio51arro7 Farco9:
#qu:tico
Farco
Ierrestre
1arro !
+
,
( -
.
Ordem de resoluo
2lasses 9-
&ef ((init(((self, velocidade=100):
"""
Inicializa o objeto
"""
self.velocidade_em_terra = velocidade
class 78uatico(object):
"""
Classe de veculos aquaticos
"""
se_move_na_agua = True
&ef ((init(((self, velocidade=5):
"""
Inicializa o objeto
"""
self.velocidade_agua = velocidade
class 0arro(Terrestre):
"""
Classe de carros
"""
rodas = 4
&ef ((init(((self, velocidade=120, pistoes=4):
"""
Inicializa o objeto
"""
self.pistoes = pistoes
Terrestre.__init__(self, velocidade=velocidade)
class 9arco(Aquatico):
"""
Classe de barcos
"""
&ef ((init(((self, velocidade=6, helices=1):
"""
Inicializa o objeto
"""
self.helices = helices
Aquatico.__init__(self, velocidade=velocidade)
class 7nfibio(Carro, Barco):
"""
Classe de anfbios
"""
&ef ((init(((self, velocidade_em_terra=80,
classe n!i,io $ derivada
de -arro e .arco.
classe .arco deriva de *uatico.
classe -arro deriva de /errestre.
9. 2lasses
velocidade_na_agua=4, pistoes=6, helices=2):
"""
Inicializa o objeto
"""
# preciso evocar o __init__ de cada classe pai
Carro.__init__(self, velocidade=velocidade_em_terra,
pistoes=pistoes)
Barco.__init__(self, velocidade=velocidade_na_agua,
helices=helices)
novo_anfibio = Anfibio()
for atr in dir(novo_anfibio):
# Se no for mtodo especial:
if not atr.startswith('__'):
print atr, '=', getattr(novo_anfibio, atr)
%a<da:
helices = 2
pistoes = 6
rodas = 4
se_move_em_terra = True
se_move_na_agua = True
velocidade_agua = 4
velocidade_em_terra = 80
8a hierarFuia de classes do e>emplo, a B65 para a classe dos an)<bios ser:
[<class '__main__.Anfibio'>,
<class '__main__.Carro'>,
<class '__main__.Terrestre'>,
<class '__main__.Barco'>,
<class '__main__.Aquatico'>,
<type 'object'>]
- herana mDltipla R um recurso Fue gera muita controvRrsia, pois seu uso pode tornar o
proJeto con)uso e obscuro.
2lasses 90
Propriedades
Propriedades TpropertiesU s:o atributos calculados em tempo de e>ecu:o. -s propriedades
s:o criadas atravRs da )un:o property.
-s vantagens de usar propriedades s:o:
?alidar a entrada do atributo.
"riar atributos apenas de leitura.
(acilitar o uso da classe
#;
.
- )acilidade de mudar de um atributo convencional para uma propriedade sem a
necessidade de alterar as aplica@es Fue utili.am a classe.
E>emplo de cdigo sem propriedades:
# get_*, set_*...
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
&ef 'et(3eloci&a&e(self):
return self.alcance / self.tempo
moab = Projetil(alcance=10000, tempo=60)
print moab.get_velocidade()
%a<da:
166
E>emplo de propriedade atravRs de decorador:
# -*- coding: latin1 -*-
# Exemplo de Property de leitura
#; -s propriedades escondem as )un@es get<= e set<= dos atributos, tornando o uso da classe mais simples.
98 2lasses
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
@property
&ef 3eloci&a&e(self):
return self.alcance / self.tempo
moab = Projetil(alcance=10000, tempo=60)
# A velocidade calculada
print moab.velocidade
%a<da:
166
E>emplo de propriedade atravRs de chamada de )un:o:
# Property de leitura & escrita
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
# Calcula a velocidade
&ef 'et3(self):
return self.alcance / self.tempo
# Calcula o tempo
&ef set3(self, v):
self.tempo = self.alcance / v
# Define a propriedade
velocidade = property(getv, setv)
2lasses 99
moab = Projetil(alcance=10000, tempo=60)
print moab.velocidade
# Muda a velocidade
moab.velocidade = 350
print moab.tempo
%a<da:
166
28
Propriedades s:o particularmente interessantes para Fuem desenvolve bibliotecas para
serem usadas por outras pessoas.
98 2lasses
So2recar!a de operadores
8o Python, o comportamento dos operadores R de)inido por mRtodos especiais, porRm
tais mRtodos s podem ser alterados nas classes abertas. Por conven:o, os mRtodos
especiais tHm nomes Fue comeam e terminam com W\\X.
E>emplo:
# A classe String deriva de str
class ;trin'(str):
&ef ((sub(((self, s):
return self.replace(s, '')
s1 = String('The Lamb Lies Down On Broadway')
s2 = 'Down '
print '"%s" - "%s" = "%s"' % (s1, s2, s1 ! s2)
%a<da:
"The Lamb Lies Down On Broadway" - "Down " = "The Lamb Lies On Broadway"
Lista de operadores e os mRtodos correspondentes:
<pera&or 4=to&o <pera-.o
+ __add__ adio
- __sub__ subtrao
* __mul__ multiplicao
** __pow__ potncia
/ __div__ diviso
// __floordiv__ diviso truncada
% __mod__ mdulo
+ __pos__ positivo
- __neg__ negativo
2lasses 99
<pera&or 4=to&o <pera-.o
< __lt__ menor que
> __gt__ maior que
<= __le__ menor ou igual a
>= __ge__ maior ou igual a
== __eq__ Igual a
!= __ne__ diferente de
<< __lshift__ deslocamento para
esquerda
>> __rshift__ deslocamento para direita
& __and__ e bit-a-bit
| __or__ ou bit-a-bit
^ __xor__ ou exclusivo bit-a-bit
~ __inv__ inverso
5bserva@es:
- subtra:o de)inida no cdigo n:o R comutativa Tda mesma )orma Fue a adi:o em
strings tambRm n:o RU
- classe str n:o R aberta, portanto n:o R poss<vel alterar o comportamento da string
padr:o do Python. PorRm a classe %tring R aberta.
- rede)ini:o de operadores conhecidos pode di)icultar a leitura do cdigo.
100 2lasses
%etaclasses
Em uma linguagem orientada a obJeto aonde TFuaseU tudo s:o obJetos e todo o obJeto tem
uma classe, R natural Fue as classes tambRm podem ser tratadas como obJetos.
Betaclasse R uma classe cuJas as instAncias s:o classes, sendo assim, a metaclasse de)ine o
comportamento das outras classes. Em Python, a classe type R uma metaclasse e pode ser
usada para criar novas metaclasses.
E>emplo de metaclasse criada a partir de type:
# -*- coding: latin1 -*-
class ;in'leton(type):
"""
Metaclasse Singleton
"""
&ef ((init(((cls, name, bases, dic):
type.__init__(cls, name, bases, dic)
# Retorna o prprio objeto na cpia
&ef ((cop*(((self):
return self
# Retorna o prprio objeto na cpia recursiva
&ef ((&eepcop*(((self, memo=)one):
return self
cls.__copy__ = __copy__
cls.__deepcopy__ = __deepcopy__
&ef ((call(((cls, *args, **kwargs):
# Chamada que cria novos objetos,
# aqui retorna sempre o mesmo
tr*:
return cls.__instance
# Se __instance no existir, ento crie...
e+cept AttributeError:
# A funo super() pesquisa na MRO
# a partir de Singleton
cls.__instance = super(Singleton,
cls).__call__(*args, **kwargs)
2lasses 101
return cls.__instance
i"port MySQLdb
class 0on(object):
"""
Classe de conexo nica
"""
# Define a metaclasse desta classe
__metaclass__ = Singleton
&ef ((init(((self):
# Cria uma conexo e um cursor
con = MySQLdb.connect(user='root')
self.db = con.cursor()
# Sempre ser usado o mesmo
# objeto de cursor
class >o'(object):
"""
Classe de log
"""
# Define a metaclasse desta classe
__metaclass__ = Singleton
&ef ((init(((self):
# Abre o arquivo de log para escrita
self.log = file('msg.log', 'w')
# Sempre ser usado o mesmo
# objeto de arquivo
&ef write(self, msg):
print msg
# Acrescenta as mensagens no arquivo
self.log.write(str(msg) + '\n')
# Conexo 1
con1 = Con()
Log().write('con1 id = %d' % id(con1))
con1.db.execute('show processlist')
Log().write(con1.db.fetchall())
# Conexo 2
10' 2lasses
con2 = Con()
Log().write('con2 id = %d' % id(con2))
con2.db.execute('show processlist')
Log().write(con2.db.fetchall())
i"port copy
# Conexo 3
con3 = copy.copy(con1)
Log().write('con3 id = %d' % id(con3))
con3.db.execute('show processlist')
Log().write(con2.db.fetchall())
%a<da e conteDdo do arFuivo Wmsg.logX:
con1 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
con2 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
con3 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
"om isso, todas as re)erHncias apontam para o mesmo obJeto.
*estes autoati>ados 10-
estes automati7ados
9estar so)tSare R uma tare)a repetitiva, demorada e tediosa. Por isso, surgiram vrias
)erramentas para automati.ar testes. E>istem dois mdulos para testes automati.ados Fue
acompanham o Python: doctest e unittest.
5 mdulo doctest usa )oc %trings presentes no cdigo para de)inir os testes do cdigo. 5
doctest procura por um trecho de te>to seJa semelhante a uma sess:o interativa de Python,
e>ecuta a mesma seFGHncia de comandos, analisa a sa<da e )a. um relatrio dos testes Fue
)alharam, com os erros encontrados.
E>emplo:
"""
fib.py
Implementa Fibonacci.
"""
&ef fib(n):
"""Fibonacci:
Se n <= 1, fib(n) = 1
Se n > 1, fib(n) = fib(n - 1) + fib(n - 2)

Exemplos de uso:

>>> fib(0)
1
>>> fib(1)
1
>>> fib(10)
89
>>> [ fib(x) for x in xrange(10) ]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> fib('')
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 19, in fib
TypeError
>>>
"""
if not type(n) is int:
raise TypeError
if n > 1:
return fib(n ! 1) + fib(n ! 2)
else:
return 1
/estes para o doctest.
10. *estes autoati>ados
&ef (&octest():
"""
Evoca o doctest.
"""

i"port doctest
doctest.testmod()
if __name__ == "__main__":
_doctest()
%e todos os testes )orem bem sucedidos, n:o haver relatrio dos testes.
E>emplo de relatrio de erros do testes Ta )oc %tring )oi alterada de propsito para gerar
um erroU:
**********************************************************************
File "fib.py", line 18, in __main__.fib
Failed example:
fib(10)
Expected:
89
Got:
100
**********************************************************************
1 items had failures:
1 of 5 in __main__.fib
***Test Failed*** 1 failures.
8o unittest, os testes s:o criados atravRs de uma subclasse da classe unittest+*est2ase. 5s
testes s:o de)inidos como mRtodos da subclasse. 5s mRtodos devem ter seus nomes
iniciando com WtestX.
5s mRtodos de teste devem evocar ao terminar um dos mRtodos:
assertF: veri)ica se uma condi:o R atingida.
assert/Hual: veri)ica se o resultado R igual ao parAmetro passado.
EssertKaises: veri)ica se a e>ce:o R a esperada.
%e houver um mRtodo chamado set4p, este ser e>ecutado antes de cada teste, assim R
poss<vel reiniciali.ar variveis e garantir Fue um teste n:o preJudiFue o outro. 5 )inal dos
testes, o unittest gera o relatrio dos testes.
E>emplo:
%s testes ser#o executados
se este m0dulo !or evocado
diretamente pelo P)thon.
*estes autoati>ados 100
"""
fibtest.py
Usa unittest para testar fib.py.
"""
i"port fib
i"port unittest
class 6est;e8uence,unctions(unittest.TestCase):

&ef set1p(self):
self.seq = range(10)
&ef test?(self):
self.assertEqual(fib.fib(0), 1)
&ef test@(self):
self.assertEqual(fib.fib(1), 1)
&ef test@?(self):
self.assertEqual(fib.fib(10), 89)
&ef testse8(self):
fibs = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

for x, y in zip(fibs, [ fib.fib(x) for x in self.seq ]):
self.assert_(x is y)
&ef testt*pe(self):
self.assertRaises(TypeError, fib.fib, '')
if __name__ == '__main__':

unittest.main()
%a<da:
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
E>emplo de relatrio com erros:
..F..
+$todos *ue de!inem os testes.
108 *estes autoati>ados
=========================================================
=============
FAIL: test10 (__main__.TestSequenceFunctions)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unittest1.py", line 22, in test10
self.assertEqual(fib.fib(10), 89)
AssertionError: 100 != 89
----------------------------------------------------------------------
Ran 5 tests in 0.000s
FAILED (failures=1)
8o relatrio, o terceiro teste )alhou, pois W)ib.)ibT#'UX retornou #'' ao invRs de ;*, como
seria o esperado.
5 unittest o)erece uma solu:o muito semelhante a bibliotecas de testes implementadas em
outras linguagens, enFuanto o doctest R mais simples de usar e se integra bem com a
documenta:o Tas sess@es do doctest podem servir como e>emplos de usoU.
/3ercAcios IV 109
Exerccios IV
#. "rie uma classe Fue modele um Fuadrado, com um atributo lado e os mRtodos: mudar
valor do lado, retornar valor do lado e calcular rea.
. "rie uma classe derivada de lista com um mRtodo retorne os elementos da lista sem
repeti:o.
&. 2mplemente uma classe 2arro com as seguintes propriedades:
,m ve<culo tem um certo consumo de combust<vel Tmedidos em Vm / litroU e uma
certa Fuantidade de combust<vel no tanFue.
5 consumo R especi)icado no construtor e o n<vel de combust<vel inicial R '.
(ornea um mRtodo over<"= Fue receba a distAncia em Fuillmetros e redu.a o
n<vel de combust<vel no tanFue de gasolina.
(ornea um mRtodo gasolina<=, Fue retorna o n<vel atual de combust<vel.
(ornea um mRtodo a#astecer<litros=, para abastecer o tanFue.
+. 2mplementar uma classe Vetor:
"om coordenadas >, y e ..
Nue suporte soma, subtra:o, produto escalar, produto vetorial.
Nue calcule o mdulo Tvalor absolutoU do vetor.
!. 2mplemente um mdulo com:
,ma classe Ponto, com coordenadas >, y e ..
,ma classe Linha, com dois pontos - e /, e Fue calcule o comprimento da linha.
,ma classe *riangulo, com dois pontos -, / e ", Fue calcule o comprimento dos
lados e a rea.
108 Parte V
Parte V
8umPy.
Ir)icos.
Processamento de imagem.
Ir)icos &1.
PersistHncia.
/anco de dados.
Ceb.
B?".
E>erc<cios ?.
?uPy 109
+umP$
8umPy
#*
R um pacote Fue inclui:
"lasse array.
"lasse atri3.
?rias )un@es au>iliares.
3rran8os
- classe array implementa um arranJo homogHneo mutvel com nDmero arbitrrio de
elementos, semelhante ] lista comum do Python, porRm mais poderosa.
i"port numpy
# Criando arranjos
print 'Arranjo criado a partir de uma lista:'
a = numpy.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
print a
# [0 1 2 3 4 5 6 7 8]
print 'Arranjo criado a partir de um intervalo:'
z = numpy.arange(0., 4.5, .5)
print z
# [ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
print 'Arranjo de 1s 2x3:'
y = numpy.ones((2, 3))
print y
# [[ 1. 1. 1.]
# [ 1. 1. 1.]]
print 'Arranjos podem gerar novos arranjos:'
# numpy.round() uma funo do numpy
# semelhante ao builtin round(), porm aceita
# arranjos como parmetro
cos = numpy.round(numpy.cos(z), 1)
print cos
# [ 1. 0.9 0.5 0.1 -0.4 -0.8 -1. -0.9 -0.7]
print 'Multiplicando cada elemento por um escalar:'
print 5 * z
# [ 0. 2.5 5. 7.5 10. 12.5 15. 17.5 20. ]
#* 5s )ontes, binrios e documenta:o podem ser encontrados em: http://numpy.scipy.org/.
110 ?uPy
print 'Somando arranjos elemento por elemento:'
print z + cos
# [ 1. 1.4 1.5 1.6 1.6 1.7 2. 2.6 3.3]
print 'Redimensionando o arranjo:'
z.shape = 3, 3
print z
# [[ 0. 0.5 1. ]
# [ 1.5 2. 2.5]
# [ 3. 3.5 4. ]]
print 'Arranjo transposto:'
print z.transpose()
# [[ 0. 1.5 3. ]
# [ 0.5 2. 3.5]
# [ 1. 2.5 4. ]]
print '"Achata" o arranjo:'
print z.flatten()
# [ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
print 'O acesso aos elementos funciona como nas listas:'
print z[1]
# [ 1.5 2. 2.5]
print 'Caso especial, diferente da lista:'
print z[1, 1]
# 2.0
# Dados sobre o arranjo
print 'Formato do arranjo:'
print z.shape
# (3, 3)
print 'Quantidade de eixos:'
print z.ndim
# 2
print 'Tipo dos dados:'
print z.dtype
# float64
%a<da completa:
Arranjo criado a partir de uma lista:
[0 1 2 3 4 5 6 7 8]
Arranjo criado a partir de um intervalo:
?uPy 111
[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
Arranjo de 1s 2x3:
[[ 1. 1. 1.]
[ 1. 1. 1.]]
Arranjos podem gerar novos arranjos:
[ 1. 0.9 0.5 0.1 -0.4 -0.8 -1. -0.9 -0.7]
Multiplicando cada elemento por um escalar:
[ 0. 2.5 5. 7.5 10. 12.5 15. 17.5 20. ]
Somando arranjos elemento por elemento:
[ 1. 1.4 1.5 1.6 1.6 1.7 2. 2.6 3.3]
Redimensionando o arranjo:
[[ 0. 0.5 1. ]
[ 1.5 2. 2.5]
[ 3. 3.5 4. ]]
Arranjo transposto:
[[ 0. 1.5 3. ]
[ 0.5 2. 3.5]
[ 1. 2.5 4. ]]
"Achata" o arranjo:
[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
O acesso aos elementos funciona como nas listas:
[ 1.5 2. 2.5]
Caso especial, diferente da lista:
2.0
Formato do arranjo:
(3, 3)
Quantidade de eixos:
2
Tipo dos dados:
float64
-o contrrio da lista, os arranJos s:o homogHneos, ou seJa, todos elementos s:o do mesmo
tipo.
%atri7es
- classe atri3 implementa opera@es de matri.es.
i"port numpy
print 'Criando uma matriz a partir de uma lista:'
l = [[3,4,5], [6, 7, 8], [9, 0, 1]]
Z = numpy.matrix(l)
print Z
# [[3 4 5]
# [6 7 8]
# [9 0 1]]
print 'Transposta da matriz:'
11' ?uPy
print Z.T
# [[3 6 9]
# [4 7 0]
# [5 8 1]]
print 'Inversa da matriz:'
print Z.I
# [[-0.23333333 0.13333333 0.1 ]
# [-2.2 1.4 -0.2 ]
# [ 2.1 -1.2 0.1 ]]
# Criando outra matriz
R = numpy.matrix([[3, 2, 1]])
print 'Multiplicando matrizes:'
print R * Z
# [[30 26 32]]
print 'Resolvendo um sistema linear:'
print numpy.linalg.solve(Z, numpy.array([0, 1, 2]))
# [ 0.33333333 1. -1. ]
%a<da:
Criando uma matriz a partir de uma lista:
[[3 4 5]
[6 7 8]
[9 0 1]]
Transposta da matriz:
[[3 6 9]
[4 7 0]
[5 8 1]]
Inversa da matriz:
[[-0.23333333 0.13333333 0.1 ]
[-2.2 1.4 -0.2 ]
[ 2.1 -1.2 0.1 ]]
Multiplicando matrizes:
[[30 26 32]]
Resolvendo um sistema linear:
[ 0.33333333 1. -1. ]
5 mdulo numpy.linalg tambRm implementa )un@es de decomposi:o de matri.es:
fro" numpy i"port *
# Matriz 3x3
A = array([(9, 4, 2), (5, 3, 1), (2, 0, 7)])
print 'Matriz A:'
?uPy 11-
print A
# Decompondo usando QR
Q, R = linalg.qr(A)
# Resultados
print 'Matriz Q:'
print Q
print 'Matriz R:'
print R
# Produto
print 'Q . R:'
print int0(dot(Q, R))
%a<da:
Matriz A:
[[9 4 2]
[5 3 1]
[2 0 7]]
Matriz Q:
[[-0.85811633 0.14841033 -0.49153915]
[-0.47673129 -0.58583024 0.65538554]
[-0.19069252 0.79672913 0.57346234]]
Matriz R:
[[-10.48808848 -4.86265921 -3.52781158]
[ 0. -1.16384941 5.28809431]
[ 0. 0. 3.68654364]]
Q . R:
[[9 4 2]
[5 3 1]
[2 0 7]]
5 8umPy serve de base para diversos mdulos, como o Batplolib, Fue implementa
gr)icos 1 e &1, e o %ciPy
'
, Fue e>pande o 8umPy com mais rotinas voltadas para a rea
cienti)ica.
' Pgina o)icial em: http://SSS.scipy.org/.
11. $rficos
5rficos
E>istem vrios pacotes de terceiros para a gera:o de gr)icos dispon<veis para Python,
sendo Fue o mais popular deles R o Pylab / Batplotlib
#
.
5 pacote tem dois mdulos principais:
atplotli#: mdulo Fue o)erece uma abstra:o orientada a obJetos aos recursos do
pacote.
pyla#: mdulo Fue o)erece uma cole:o de comandos semelhante ao Batlab, Fue R
mais adeFuado para o uso interativo.
E>emplo:
fro" pylab i"port *
ent = arange(0., 20.1, .1)
# Calcula os cossenos da entrada
sai = cos(ent)
# Plota a curva
plot(ent, sai)
# Texto para o eixo X
xlabel('entrada')
# Texto para o eixo Y
ylabel('cosseno')
# Texto no topo da figura
title('Cossenos')
# Ativa a grade
grid(True)
# Apresenta a figura resultante na tela
show()
%a<da:
# 5s )ontes, binrios e documenta:o podem ser encontrados em: http://matplotlib.source)orge.net/.
$rficos 110
5utro e>emplo:
fro" pylab i"port *
# Dados
ent1 = arange(0., 7., .1)
sai1 = cos(ent1)
sai2 = sin(ent1)
dif = sai2 ! sai1
# Divide a figura em 2 linhas e 1 coluna,
# e seleciona a parte superior
subplot(211)
# Plota a curva
# Primeira curva: ent1, sai1, 'bo:'
# Segunda curva: ent1, sai2, 'g^-'
plot(ent1, sai1, 'bo:', ent1, sai2, 'g^-')
# Cria uma legenda
legend(['Cossenos', 'Senos'])
# Seleciona a parte inferior
subplot(212)
# Desenha barras
# Eixo X: arange(len(dif)) + .5
# Eixo Y: dif
# Largura das barras: .5
# Cor: #ccbbaa
bar(arange(len(dif)) + .5, dif, .5, color='#ccbbaa')
118 $rficos
# Salva a figura
savefig('graf.png')
%a<da:
5 pacote tem )un@es para gerar gr)icos de barra, linha, dispers:o, pi..a e polar, entre
outros.
E>emplo usando atplotli#:
# -*- coding: latin1 -*-
i"port os
i"port matplotlib
fro" matplotlib.figure i"port Figure
fro" matplotlib.backends.backend_agg i"port FigureCanvasAgg
&ef pie(filename, labels, values):
"""
Gera um diagrama de Pizza e salva em arquivo.
"""
# Use a biblioteca Anti-Grain Geometry
matplotlib.use('Agg')
# Cores personalizadas
colors = ['seagreen', 'lightslategray', 'lavender',
$rficos 119
'khaki', 'burlywood', 'cornflowerblue']
# Altera as opes padro
matplotlib.rc('patch', edgecolor='#406785',
linewidth=1, antialiased=True)
# Altera as dimenses da imagem
matplotlib.rc('figure', figsize=(8., 7.))
# Inicializa a figura
fig = Figure()
fig.clear()
axes = fig.add_subplot(111)
if values:
# Diagrama
chart = axes.pie(values, colors=colors, autopct='%2.0f%%')
# Legenda
pie_legend = axes.legend(labels)
pie_legend.pad = 0.3
# Altera o tamanho da fonte
for i in xrange(len(chart[0])):
chart[!1][i].set_fontsize(12)
pie_legend.texts[0].set_fontsize(10)
else:
# Mensagem de erro
# Desliga o diagrama
axes.set_axis_off()
# Mostra a mensagem
axes.text(0.5, 0.5, 'Sem dados',
horizontalalignment='center',
verticalalignment='center',
fontsize=32, color='#6f7c8c')
# Salva a figura
canvas = FigureCanvasAgg(fig)
canvas.print_figure(filename, dpi=600)
if __name__ == '__main__':
# Testes
pie('fig1.png', [], [])
pie('fig2.png', ['A', 'B', 'C', 'D', 'E'],
[6.7, 5.6, 4.5, 3.4, 2.3])
%a<da:
118 $rficos
E>istem add ons para o Batplotlib, Fue e>pandem a biblioteca com novas )uncionalidades,
como R o caso do /asemap.
E>emplo com /asemap:
fro" mpl_toolkits.basemap i"port Basemap
fro" matplotlib i"port pyplot
fro" numpy i"port arange
# Cria um mapa usando Basemap
mapa = Basemap(projection='robin', lat_0=!20, lon_0=!50,
resolution='l', area_thresh=1e3)

# desenha a costa dos continentes
mapa.drawcoastlines(color='#777799')
# Desenha as fronteiras
mapa.drawcountries(color='#ccccee')
# Pinta os continentes
mapa.fillcontinents(color='#ddddcc')
# Desenha os meridianos
mapa.drawmeridians(arange(0, 360, 30), color='#ccccee')
# Desenha os paralelos
mapa.drawparallels(arange(!180, 180, 30), color='#ccccee')
# Desenha os limites do mapa
mapa.drawmapboundary()
# Salva a imagem
pyplot.savefig('mapa1.png', dpi=150)
$rficos 119
%a<da:
5utro e>emplo:
fro" mpl_toolkits.basemap i"port Basemap
fro" matplotlib i"port pyplot
mapa = Basemap(projection='ortho', lat_0=10, lon_0=!10,
resolution='l', area_thresh=1e3)
# Preenche o mapa com relevo
mapa.bluemarble()
mapa.drawmapboundary()
lxy = (('Rio\nde\nJaneiro', !43.11, !22.54),
('Londres', 0.07, 50.30))
# Transposta
lxy = zip(*lxy)
# Converte as coordenadas
x, y = mapa(lxy[1], lxy[2])
lxy = lxy[0], x, y
# Marca no mapa
mapa.plot(x, y, 'w^')
# Escreve os nomes
for l, x, y in zip(*lxy):
pyplot.text(x+2e5, y!6e5, l,
color='#eeeecc')
pyplot.savefig('mapa2.png', dpi=150)
%a<da:
1'0 $rficos
Para processamento de in)orma@es geore)erenciadas mais so)isticados, e>iste o proJeto
Bap%erver

, Fue R um servidor de aplica:o voltado para I2% TIeographic 2n)ormation


%ystemU Fue suporta diversas linguagens, inclusive Python.
-lRm de mdulos de terceiros, tambRm R poss<vel usar o /r5))ice.org
&
para gerar gr)icos
com o Python, atravRs da -P2 chamada Python-,85 /ridge
+
.
%ite o)icial em http://mapserver.org/.
& 1ispon<vel em: http://SSS.bro))ice.org/.
+ Bais in)orma@es em: http://udV.openo))ice.org/python/python-bridge.html.
Processaento de iage 1'1
Processamento de ima!em
Python Iaging Li#rary
!
TP2LU R uma biblioteca de processamento de imagens raster para
Python.
P2L possui mdulos Fue implementam:
(erramentas para cortar, redimensionar e mesclar imagens.
-lgoritmos de convers:o.
(iltros, tais como suavi.ar, borrar e detectar bordas.
-Justes, incluindo brilho e contraste.
5pera@es com paletas de cores.
1esenhos simples em 1.
6otinas para tratamento de imagens: eFuali.a:o, auto-contraste, de)ormar,
inverter e outras.
E>emplo de tratamento de imagem:
# -*- coding: latin-1 -*-
"""
Cria miniaturas suavizadas para cada
JPEG na pasta corrente
"""
i"port glob
# Mdulo principal do PIL
i"port Image
# Mdulo de filtros
i"port ImageFilter
# Para cada arquivo JPEG
for fn in glob.glob("*.jpg"):
# Retorna o nome do arquivo sem extenso
f = glob.os.path.splitext(fn)[0]
print 'Processando:', fn
imagem = Image.open(fn)
# Cria thumbnail (miniatura) da imagem
# de tamanho 256x256 usando antialiasing
imagem.thumbnail((256, 256), Image.ANTIALIAS)
# Filtro suaviza a imagem
! 1ocumenta:o, )ontes e binrios dispon<veis em: http://SSS.pythonSare.com/products/pil/.
1'' Processaento de iage
imagem = imagem.filter(ImageFilter.SMOOTH)
# Salva como arquivo PNG
imagem.save(f + '.png', 'PNG')
E>emplo de desenho:
# -*- coding: latin-1 -*-
"""
Cria uma imagem com vrios gradientes de cores
"""
i"port Image
# Mdulo de desenho
i"port ImageDraw
# Largura e altura
l, a = 512, 512
# Cria uma imagem nova com fundo branco
imagem = Image.new('RGBA', (l, a), 'white')
# O objeto desenho age sobre o objeto imagem
desenho = ImageDraw.Draw(imagem)
# Calcula a largura da faixa de cor
faixa = l / 256
# Desenha um gradiente de cor
for i in xrange(0, l):
# Calcula a cor da linha
rgb = (0.25 * i / faixa, 0.5 * i / faixa, i / faixa)
cor = '#%02x%02x%02x' % rgb
# Desenha uma linha colorida
# Primeiro argumento uma tupla com
# as coordenadas de inicio e fim da linha
desenho.line((0, i, l, i), fill=cor)
# Copia e cola recortes invertidos do gradiente
for i in xrange(l, l / 2, !l / 10):
# Tamanho do recorte
area = (l ! i, a ! i, i, i)
# Copia e inverte
flip = Image.FLIP_TOP_BOTTOM
recorte = imagem.crop(area).transpose(flip)
Processaento de iage 1'-
# Cola de volta na imagem original
imagem.paste(recorte, area)
# Salva como arquivo PNG
imagem.save('desenho.png', 'PNG')
-rFuivo de sa<da Wdesenho.pngX:
c poss<vel usar o 8umPy para calcular os dados da imagem e usar o P2L para gerar a
imagem real.
E>emplo com modula:o de amplitude de onda :
# -*- coding: latin1 -*-
"""
Criando uma imagem usando NumPy
"""
i"port numpy
i"port Image
&ef coor&s(xy, tam):
"""
coords(xy, tam) => x, y
Transforma as coordenadas normalizadas
para o centro da imagem de tamanho "tam"
"""
X, Y = tam
x = int((1. + xy[0]) * (X ! 1.) / 2.)
1'. Processaento de iage
y = int((1. + xy[1]) * (Y ! 1.) / 2.)
return x, y
if __name__ == '__main__':
# Dimenses
tam = 900, 600
# Cria um arranjo apenas com zeros
# com as dimenses transpostas
# "tam[::-1]" o reverso de "tam" e
# "(3,)" uma tupla para representar "(R, G, B)"
imag = numpy.zeros(tam[::!1] + (3,), numpy.uint8)
# Preenche de branco
imag.fill(255)
# Dados do eixo X
xs = numpy.arange(!1., 1., 0.00005)
# Onda moduladora
# Valor mdio, amplitude e freqncia
vmed = 0.6
amp = 0.4
fm = 2.
mod = vmed + amp * numpy.cos(fm * numpy.pi * xs)
# Freqncia da portadora
fc = 8.
# Nmero de curvas internas
ci = 32.
# Contador
i = 0
# Gera um conjunto de curvas
for delta_y in numpy.arange(1. / ci, 1. + 1. / ci,
1. / ci):
# Dados do eixo Y
ys = mod * delta_y * numpy.sin(fc * numpy.pi * xs)
# Pares x, y
xys = zip(xs, ys)
# Desenha a portadora e as curvas internas
# Para cada ponto na lista
for xy in xys:
# Coordenadas invertidas
x, y = coords(xy, tam)[::!1]
# Aplica cor a xy
Processaento de iage 1'0
imag[x, y] = (250 ! 100 * delta_y,
150 ! 100 * delta_y,
50 + 100 * delta_y)
i += 1
for x, y in zip(xs, mod):
# Desenha as envoltrias
imag[coords((x, y), tam)[::!1]] = (0, 0, 0)
imag[coords((x, !y), tam)[::!1]] = (0, 0, 0)
# Bordas superior e inferior
imag[coords((x, 1.), tam)[::!1]] = (0, 0, 0)
imag[coords((x, !1.), tam)[::!1]] = (0, 0, 0)
i += 4
for y in xs:
# Bordas laterais
imag[coords((1., y), tam)[::!1]] = (0, 0, 0)
imag[coords((!1., y), tam)[::!1]] = (0, 0, 0)
i += 2
print i, 'pontos calculados'
# Cria a imagem a partir do arranjo
imagem = Image.fromarray(imag, 'RGB')
imagem.save('curvas.png', 'PNG')
-rFuivo de sa<da Wcurvas.pngX:
5bserva@es:
- biblioteca trabalha com o conceito de bandas, Fue s:o camadas Fue comp@em a
imagem. "ada imagem pode ter vrias bandas, mas todas devem ter as mesmas
1'8 Processaento de iage
dimens@es e pro)undidade.
- origem do sistema de coordenadas R no canto superior esFuerdo.
$rficos -) 1'9
5rficos 90
?Python
E
R um pacote Fue permite criar e animar modelos simples em trHs dimens@es.
%eu obJetivo R )acilitar a cria:o rpida de simula@es e prottipos Fue n:o reFuerem
solu@es comple>as.
5 ?Python provH ilumina:o, controle de cAmera e tratamento de eventos de mouse
Trota:o e >ooU automaticamente. 5s obJetos podem ser criados interativamente no
interpretador Fue a vista tridimensional R atuali.ada de acordo.
E>emplo:
# -*- coding: latin-1 -*-
"""
Hexaedro
"""
# VPython
i"port visual
# Coordenadas para os vrtices e arestas
coords = (!3, 3)
# Cor do vrtice
cor1 = (0.9, 0.9, 1.0)
# Cor da aresta
cor2 = (0.5, 0.5, 0.6)
# Desenha esferas nos vrtices
for x in coords:
for y in coords:
for z in coords:
# pos a posio do centro da esfera
visual.sphere(pos=(x, y, z), color=cor1)
# Desenha os cilindros das arestas
for x in coords:
for z in coords:
# pos a posio do centro da base do cilindro
# radius o raio da base do cilindro
# axis o eixo do cilindro
visual.cylinder(pos=(x, 3, z), color=cor2,
radius=0.25, axis=(0, !6, 0))
E 1ocumenta:o, )ontes e binrios para instala:o em: http://SSS.vpython.org/.
1'8 $rficos -)
for y in coords:
visual.cylinder(pos=(x, y, 3), color=cor2,
radius=0.25, axis=(0, 0, !6))
for y in coords:
for z in coords:
visual.cylinder(pos=(3, y, z), color=cor2,
radius=0.25, axis=(!6, 0, 0))
7anela &1:
5s obJetos &1 do ?Python podem ser agrupados em Fuadros TfraesU, Fue podem ser
movidos e rotacionados.
c poss<vel animar os obJetos &1 usando laos. Para controlar a velocidade da anima:o, o
?Python provH a )un:o rate<=, Fue pausa anima:o pelo inverso do argumento em
segundos.
E>emplo de Fuadro e anima:o:
# -*- coding: latin-1 -*-
"""
Octaedro animado
"""
fro" visual i"port *
# Cores
azul = (0.25, 0.25, 0.50)
$rficos -) 1'9
verde = (0.25, 0.50, 0.25)
# Eixo de rotao
eixo = (0, 1, 0)
# Cria um frame alinhado com o eixo de rotao
fr = frame(axis=eixo)
# O fundo da caixa
box(pos=(0, !0.5, 0), color=azul,
size=(10.0, 0.5, 8.0))
# O bordas da caixa
box(pos=(0, !0.5, 4.0), color=azul,
size=(11.0, 1.0, 1.0))
box(pos=(0, !0.5, !4.0), color=azul,
size=(11.0, 1.0, 1.0))
box(pos=(5.0, !0.5, 0), color=azul,
size=(1.0, 1.0, 8.0))
box(pos=(!5.0, !0.5, 0), color=azul,
size=(1.0, 1.0, 8.0))
# O pio
py1 = pyramid(frame=fr, pos=(1, 0, 0), color=verde,
axis=(1, 0, 0))
py2 = pyramid(frame=fr, pos=(1, 0, 0), color=verde,
axis=(!1, 0, 0))
# O pio anda no plano y = 0
delta_x = 0.01
delta_z = 0.01
print fr.axis
while True:
# Inverte o sentido em x
if abs(fr.x) > 4.2:
delta_x = !delta_x
# Inverte o sentido em z
if abs(fr.z) > 3.1:
delta_z = !delta_z
fr.x += delta_x
fr.z += delta_z
# Rotaciona em Pi / 100 no eixo
fr.rotate(angle=pi / 100, axis=eixo)
# Espere 1 / 100 segundos
rate(250)
1-0 $rficos -)
7anela &1:
5 ?Python tem vrias limita@es. Ele n:o provH )ormas de criar e/ou manipular materiais
ou te>turas so)isticadas, nem )ormas avanadas de ilumina:o ou detec:o de colis@es.
Para modelagens mais so)isticadas, e>istem outras solu@es, como o Python 5gre
$
e o
/lender, Fue R um aplicativo de modelagem Fue usa Python como linguagem script.
$ 1ispon<vel em: http://python-ogre.org/.
PersistLncia 1-1
Persist/ncia
PersistHncia pode ser de)inida como a manuten:o do estado de uma estrutura de dados
entre e>ecu@es de uma aplica:o. - persistHncia libera o desenvolvedor de escrever
cdigo e>plicitamente para arma.enar e recuperar estruturas de dados em arFuivos e
aJuda a manter o )oco na lgica da aplica:o.
Seriali7ao
- )orma mais simples e direta de persistHncia R chamada de seriali.a:o
;
e consiste em
gravar em disco uma imagem TdupU do obJeto, Fue pode recarregada TloadU
posteriormente. 8o Python, a seriali.a:o R implementada de vrias )ormas, sendo Fue a
mais comum R atravRs do mdulo chamado pic"le.
E>emplo de seriali.a:o:
5 programa tenta recuperar o dicionrio setup usando o obJeto do arFuivo
Wsetup.pVlX.
%e conseguir, imprime o dicionrio.
%e n:o conseguir, cria um setup default e salva em Wsetup.pVlX.
i"port pickle
tr*:
setup = pickle.load(file('setup.pkl'))
print setup
e+cept:
setup = #'timeout': 10,
'server': '10.0.0.1',
'port': 80
$
pickle.dump(setup, file('setup.pkl', 'w'))
8a primeira e>ecu:o, ele cria o arFuivo. 8as posteriores, a sa<da R:
{'port': 80, 'timeout': 10, 'server': '10.0.0.1'}
Entre os mdulos da biblioteca padr:o est:o dispon<veis outros mdulos persistHncia, tais
como:
cPic"le: vers:o mais e)iciente de pic"le, porRm n:o pode ter subclasses.
shelve: )ornece uma classe de obJetos persistentes similares ao dicionrio.
; Em inglHs, seriali>ation ou arshalling.
1-' PersistLncia
E>istem frae!or"s em Python de terceiros Fue o)erecem )ormas de persistHncia com
recursos mais avanados, como o K51/.
9odas essas )ormas de persistHncia arma.enam dados em )ormas binrias, Fue n:o s:o
diretamente leg<veis por seres humanos.
Para arma.enar dados de )orma de te>to, e>istem mdulos para Python para ler e gravar
estruturas de dados em )ormatos:
7%58
*
TMava%cript D#Ject ?otationU.
L-BL
&'
TCE1L EinNt a 1ar"up LanguageU.
MBL
&#
T/3tensi#le 1ar"up LanguageU.
* Pgina do )ormato em: http://SSS.Json.org/.
&' Pgina do )ormato em: http://yaml.org/.
&# Pgina do )ormato em: http://SSS.S&.org/MBL/.
PersistLncia 1--
:(0#
5ope D#Ject )ata#ase TK51/U R um banco de dados orientado a obJeto Fue o)erece uma
)orma de persistHncia Fuase transparente para aplica@es escritas em Python e )oi
proJetado para ter pouco impacto no cdigo da aplica:o.
K51/ suporta transa@es, controle de vers:o de obJetos e pode ser conectado a outros
#ac"ends atravRs do 5ope /nterprise D#Jects TKE5U, permitindo inclusive a cria:o de
aplica@es distribu<das em diversas mFuinas conectadas por rede.
5 K51/ R um componente integrante do Kope
&
, Fue R um servidor de aplica@es
desenvolvido em Python, muito usado em 2ontent 1anageent %ystes T"B%U.
"omponentes do K51/:
)ata#ase: permite Fue a aplica:o abra cone>@es Tinter)aces para acesso aos obJetosU.
*ransaction: inter)ace Fue permite tornar as altera@es permanentes.
Persistence : )ornece a classe base Persistent.
%torage: gerencia a representa:o persistente em disco.
5/D: compartilhamento de obJeto entre di)erentes processos e mFuinas.
& 1ocumenta:o e pacotes de instala:o do Kope e produtos ligados a ele em http://SSS..ope.org/.
#plicao
persistente
JODF
JODF: Jope Ob;ect Database
Database Iransaction "ersistence
Storage JEO
1-. PersistLncia
E>emplo de uso do K51/:
# -*- coding: latin1 -*-
fro" ZODB i"port FileStorage, DB
i"port transaction
# Definindo o armazenamento do banco
storage = FileStorage.FileStorage('people.fs')
db = DB(storage)
# Conectando
conn = db.open()
# Referncia para a raz da rvore
root = conn.root()
# Um registro persistente
root['singer'] = 'Kate Bush'
# Efetuando a alterao
transaction.commit()
print root['singer'] # Kate Bush
# Mudando um atributo
root['singer'] = 'Tori Amos'
print root['singer'] # Tori Amos
# Abortando...
transaction.abort()
print root[YsingerY] _ Zate /ush
5 K51/ tem algumas limita@es Fue devem ser levadas em conta durante o proJeto da
aplica:o:
5s obJetos precisam ser Wseriali.veisX para serem arma.enados.
5bJetos mutveis reFuerem cuidados especiais.
5bJetos Wseriali.veisX s:o aFueles obJetos Fue podem ser convertidos e recuperados pelo
Pic"le. Entres os obJetos Fue n:o podem ser processados pelo Pic"le, est:o os obJetos
implementados em mdulos escritos em ", por e>emplo.
PersistLncia 1-0
;3%L
L-BL R um )ormato de seriali.a:o de dados para te>to Fue representa os dados como
combina@es de listas, dicionrios e valores escalares. 9em como principal caracter<stica
ser leg<vel por humanos.
5 proJeto do L-BL )oi muito in)luenciado pela sinta>e do Python e outras linguagens
dinAmicas. Entre outras estruturas, a especi)ica:o
&&
do L-BL de)ine Fue:
5s blocos s:o marcados por endenta:o.
Listas s:o delimitadas por colchetes ou indicadas por trao.
"haves de dicionrio s:o seguidas de dois pontos.
Listas podem ser representadas assim:
- Azul
- Branco
- Vermelho
5u:
[azul, branco, vermelho]
1icionrios s:o representados como:
cor: Branco
no"e: Bandit
raca: Labrador
PyL-BL
&+
R uma biblioteca de rotinas para gerar e processar L-BL no Python.
E>emplo de convers:o para L-BL:
i"port yaml
progs = #'Inglaterra':
#'Yes': ['Close To The Edge', 'Fragile'],
'Genesis': ['Foxtrot', 'The Nursery Crime'],
&& 1ispon<vel em: http://yaml.org/spec/#./.
&+ 1ocumenta:o e )ontes em: http://pyyaml.org/SiVi/PyL-BL.
1-8 PersistLncia
'King Crimson': ['Red', 'Discipline']$,
'Alemanha':
#'Kraftwerk': ['Radioactivity', 'Trans Europe Express']$
$
print yaml.dump(progs)
%a<da:
7le"anha:
Araftwerk: [Radioactivity, Trans Europe Express]
Bn'laterra:
Cenesis: [Foxtrot, The Nursery Crime]
Ain' 0ri"son: [Red, Discipline]
DEesD: [Close To The Edge, Fragile]
E>emplo de leitura de L-BL. -rFuivo de entrada Wpre)s.yamlX:
! "usica: rock
! cachorro:
cor: Branco
no"e: Bandit
raca: Labrador
! outros:
instru"ento: baixo
lin'ua'e": [python, ruby]
co"i&a: carne
"digo em Python:
i"port pprint
i"port yaml
# yaml.load() pode receber um arquivo aberto
# como argumento
yml = yaml.load(file('prefs.yaml'))
# pprint.pprint() mostra a estrutura de dados
# de uma forma mais organizada do que
# o print convencional
pprint.pprint(yml)
%a<da:
PersistLncia 1-9
[{'musica': 'rock'},
{'cachorro': {'cor': 'Branco', 'nome': 'Bandit', 'raca': 'Labrador'}},
{'outros': {'comida': 'carne',
'instrumento': 'baixo',
'linguagem': ['python', 'ruby']}}]
L-BL R muito prtico para ser usado em arFuivos de con)igura:o e outros casos onde os
dados podem ser manipulados diretamente por pessoas.
1-8 PersistLncia
<%L
MBL TeOtensi#le 1ar"up LanguageU R uma recomenda:o, desenvolvida pelo World Wide
Web Consortium
35
(W3C), para uma representa:o de dados em Fue o metadado R
arma.enado Junto com os dados atravRs de marcadores TtagsU.
Em termos estruturais, um arFuivo MBL representa uma hierarFuia )ormada de
elementos, Fue podem ter ou n:o atributos ou sub elementos.
"aracter<sticas principais:
c leg<vel por so)tSare.
Pode ser integrada com outras linguagens.
5 conteDdo e a )ormata:o s:o entidades distintas.
Barcadores podem ser criados sem limita:o.
Permite a cria:o de arFuivos para valida:o de estrutura.
8o e>emplo, o elemento W"achorroX possui trHs atributos: nome, raa e cor. 5 elemento
Lobo tem dois sub elementos TW"achorroX e W"oioteXU e n:o possui atributos.
&! Pgina o)icial em: http://SSS.S&.org/.
1anino
Caposa
1ac*orro
Lobo
1oiote
Kome: Fandit
Caa: Labrador
1or: Franco
#tributos
Elementos
Cai&
Lr3ore de elementos
PersistLncia 1-9
Em MBL, o cachorro R representado por:
<Cachorro cor="Branco" nome="Bandit" raca="Labrador" />
E o lobo por:
<Lobo> </Lobo>
E>istem vrios mdulos de suporte ao MBL dispon<veis para Python, inclusive na
biblioteca Fue acompanha o interpretador.
Entre os mais usados, destacam-se:
15B.
%-M.
/leent*ree.
)ocuent D#Ject 1odel T15BU R um modelo de obJeto para representa:o de MBL,
independente de plata)orma e linguagem. 5 15B )oi proJetado para permitir navega:o
n:o linear e modi)ica@es arbitrrias. Por isso, o 15B e>ige Fue o documento MBL Tou
pelo menos parte deleU esteJa carregado na memria.
-achorro
Kome: Fandit
Caa: Labrador
1or: Franco
#tributos
Iag
Elemento
Lobo
<Cachorro cor="Branco"
nome="Bandit" raca="Labrador" />
<Lobo>...</Lobo>
1.0 PersistLncia
E>emplo:
# -*- coding: latin1 -*-
# importa a implementao minidom
i"port xml.dom.minidom
# Cria o documento
doc = xml.dom.minidom.Document()
# Para ler um documento que j existe
# doc = xml.dom.minidom.parse('caninos.xml')
# Cria os elementos
root = doc.createElement('Canino')
lobo = doc.createElement('Lobo')
raposa = doc.createElement('Raposa')
coiote = doc.createElement('Coiote')
cachorro = doc.createElement('Cachorro')
# Cria os atributos
cachorro.setAttribute('nome', 'Bandit')
cachorro.setAttribute('raca', 'Labrador')
cachorro.setAttribute('cor', 'Branco')
# Cria a estrutura
doc.appendChild(root)
root.appendChild(lobo)
root.appendChild(raposa)
lobo.appendChild(coiote)
lobo.appendChild(cachorro)
# Para acrescentar texto ao elemento
# tex = doc.createTextNode('Melhor amigo do homem...')
# cachorro.appendChild(tex)
# Mostra o XML formatado
print doc.toprettyxml()
%iple EPI for O1L T%-MU R uma -P2 de anlise sinttica serial para MBL. %-M permite
apenas a leitura serial do documento MBL. %-M R mais e)iciente Fue o 15B, porRm tem
menos recursos.
E>emplo:
# -*- coding: latin1 -*-
PersistLncia 1.1
i"port xml.sax
# A classe processa o rvore XML
class Fan&ler(xml.sax.handler.ContentHandler):
&ef ((init(((self):
xml.sax.handler.ContentHandler.__init__(self)
self.prefixo = ''
# chamado quando uma novo tag encontrada
&ef startGle"ent(self, tag, attr):
self.prefixo += ' '
print self.prefixo + 'Elemento:', tag
for item in attr.items():
print self.prefixo + '- %s: %s' % item
# chamado quando texto encontrado
&ef characters(self, txt):
if txt.strip():
print self.prefixo + 'txt:', txt
# chamado quando o fim de uma tag encontrada
&ef en&Gle"ent(self, name):
self.prefixo = self.prefixo[:!2]
parser = xml.sax.make_parser()
parser.setContentHandler(Handler())
parser.parse('caninos.xml')
/leent*ree R o mais WpythlnicoX dos trHs, representando uma estrutura MBL como uma
rvore de elementos, Fue s:o tratados de )orma semelhante ]s listas, e nos Fuais os
atributos s:o chaves, similar aos dicionrios.
E>emplo de gera:o de MBL com /leent*ree:
fro" xml.etree.ElementTree i"port Element, ElementTree
root = Element('Canino')
lobo = Element('Lobo')
raposa = Element('Raposa')
coiote = Element('Coiote')
cachorro = Element('Cachorro', nome='Bandit',
raca='Labrador', cor='Branco')
1.' PersistLncia
root.append(lobo)
root.append(raposa)
lobo.append(coiote)
lobo.append(cachorro)
ElementTree(root).write('caninos.xml')
-rFuivo MBL de sa<da:
<Canino>
<Lobo>
<Coiote />
<Cachorro cor="Branco" nome="Bandit" raca="Labrador" />
</Lobo>
<Raposa />
</Canino>
E>emplo de leitura do arFuivo MBL:
fro" xml.etree.ElementTree i"port ElementTree
tree = ElementTree(file='caninos.xml')
root = tree.getroot()
# Lista os elementos abaixo do root
print root.getchildren()
# Encontra o lobo
lobo = root.find('Lobo')
# Encontra o cachorro
cachorro = lobo.find('Cachorro')
print cachorro.tag, cachorro.attrib
# Remove a raposa
root.remove(root.find('Raposa'))
print root.getchildren()
%a<da:
[<Element Lobo at ab3a58>, <Element Raposa at ab3b70>]
Cachorro {'cor': 'Branco', 'raca': 'Labrador', 'nome': 'Bandit'}
[<Element Lobo at ab3a58>]
PersistLncia 1.-
5 MBL R muito Dtil por )acilitar a interoperabilidade entre sistemas, mesmo Fue estes
seJam desenvolvidos em tecnologias di)erentes.
1.. 7anco de dados
#anco de dados
%istemas Ierenciadores de /anco de 1ados T%I/1sU s:o reconhecidos por prover uma
)orma de acesso consistente e con)ivel para in)orma@es. 8o Python, a integra:o com
%I/1s geralmente R )eita atravRs de um mdulo 1/2.
0#I
)ata#ase Interface T1/2U R uma especi)ica:o Fue descreve como deve ser o comportamento
de um mdulo de acesso a sistemas de banco de dados.
- 1/2 de)ine Fue o mdulo deve ter uma )un:o connect<=, retorna obJetos de cone>:o. -
partir do do obJeto cone>:o, R poss<vel obter um obJeto cursor, Fue permite a e>ecu:o de
sentenas %NL.
E>emplo de acesso atravRs de 1/2 Tcom By%NL
&E
U:
# -*- coding: utf-8 -*-
&E /inrios, )ontes e documenta:o podem ser encontrados em: http://source)orge.net/proJects/mysFl-
python.
Interpretador
DFI
"rograma
#s consultas so sentenas SML
e as respostas so listas de
tuplas ou dicion:rios.
SNFD
O mdulo DFI 5Database
Inter$ace9 ' um driver
especi$ico para o SNFD.
7anco de dados 1.0
i"port MySQLdb
# Cria uma conexo
con = MySQLdb.connect(db='test', user='root', passwd='')
# Cria um cursor
cur = con.cursor()
# Executa um comando SQL
cur.execute('show databases')
# Recupera o resultado
recordset = cur.fetchall()
# Mostra o resultado
for record in recordset:
print record
# Fecha a conexo
con.close()
%a<da:
('information_schema',)
('mysql',)
('test',)
5 resultado R uma lista de tuplas com as data#ases dispon<veis no servidor.
S=Lite
- partir da vers:o .!, o Python passou a incorporar em sua distribui:o um mdulo 1/2
para acessar o %NLite
&$
.
%NLite R uma biblioteca Dpen %ource escrita em linguagem ", Fue implementa um
interpretador %NL, Fue provH )uncionalidades de banco de dados, usando arFuivos, sem a
necessidade de um processo servidor separado ou de con)igura:o manual.
E>emplo:
# -*- coding: utf-8 -*-
&$ 1ocumenta:o, )ontes e binrios podem ser encontrados em: http://SSS.sFlite.org/.
1.8 7anco de dados
i"port sqlite3
# Cria uma conexo e um cursor
con = sqlite3.connect('emails.db')
cur = con.cursor()
# Cria uma tabela
sql = 'create table emails '\
'(id integer primary key, '\
'nome varchar(100), '\
'email varchar(100))'
cur.execute(sql)
# sentena SQL para inserir registros
sql = 'insert into emails values (null, ?, ?)'
# Dados
recset = [('jane doe', 'jane@nowhere.org'),
('rock', 'rock@hardplace.com')]
# Insere os registros
for rec in recset:
cur.execute(sql, rec)
# Confirma a transao
con.commit()
# Seleciona todos os registros
cur.execute('select * from emails')
# Recupera os resultados
recset = cur.fetchall()
# Mostra
for rec in recset:
print '%d: %s(%s)' % rec
# Fecha a conexo
con.close()
- vantagem mais signi)icativa de usar o %NLite R a praticidade, principalmente no uso em
aplicativos locais para des"tops, aonde usar um %I/1 convencional seria desnecessrio e
complicado de manter.
Post!reS=L
Para sistemas Fue demandam recursos mais so)isticados do %I/1, o Postgre%NL
&;
R a
&; %ite o)icial em http://SSS.postgresFl.org/ e site da comunidade brasileira em
http://SSS.postgresFl.org.br/.
7anco de dados 1.9
solu:o 5pen %ource mais completa dispon<vel.
Entre os recursos o)erecidos pelo Postgre%NL, destacam-se:
%uporte a consultas comple>as.
9ransa@es.
"ontrole de concorrHncia multi-vers:o.
9ipos de obJetos de)inidos pelo usurio.
=erana.
Vie!s.
%tored Procedures.
*riggers.
&ull te3t search.
E>istem vrios mdulos Fue provHm acesso ao Postgre%NL para o Python, como o
Pygre%NL
&*
e o Psycopg
+'
.
5 Pygre%NL o)erece duas inter)aces distintas para acesso a servidores Postgre%NL:
pgdb: mdulo compat<vel com 1/2.
pg: mdulo mais antigo, incompat<vel com 1/2.
E>emplo com pgdb:
# -*- coding: latin1 -*-
i"port pgdb
# Para bancos de dados locais (via Unix Domain Sockets)
#con = pgdb.connect(database='music')
# Via TCP/IP
con = pgdb.connect(host='tao', database='music', user='pg', password='#@!$%&')
cur = con.cursor()
# Cria uma tabela
sql = 'create table tracks '\
'(id serial primary key, '\
'track varchar(100), '\
'band varchar(100))'
cur.execute(sql)
# A interpolao usa uma notao semelhante a do Python
sql = 'insert into tracks values (default, %s, %s)'
&* %ite o)icial: http://SSS.pygresFl.org/.
+' (ontes e documenta:o em http://initd.org/.
1.8 7anco de dados
# Dados
recset = [('Kashmir', 'Led Zeppelin'),
('Starless', 'King Crimson')]
# Insere os registros
for rec in recset:
cur.execute(sql, rec)
con.commit()
# Recupera os registros
cur.execute('select * from tracks')
# Recupera os resultados
recset = cur.fetchall()
# Mostra
for rec in recset:
print rec
con.close()
%a<da:
[1, 'Kashmir', 'Led Zeppelin']
[2, 'Starless', 'King Crimson']
E>emplo com pg:
i"port pg
# Para bancos de dados locais (via Unix Domain Sockets)
#con = pg.connect('music')
# Via TCP/IP
con = pg.connect(host='tao', dbname='music', user='pg', passwd='#@!$%&')
# Realiza uma consulta no banco
qry = con.query('select * from tracks')
# Pega a lista de campos
flds = qry.listfields()
# Mostra os resultados
for rec in qry.dictresult():
for fld in flds:
print '%s: %s' % (fld, rec[fld])
print
con.close()
7anco de dados 1.9
%a<da:
id: 1
track: Kashmir
band: Led Zeppelin
id: 2
track: Starless
band: King Crimson
E>emplo usando o mdulo psycopg:
i"port psycopg2
# Para bancos de dados locais (via Unix Domain Sockets)
#con = psycopg2.connect(database='music')
# Via TCP/IP
con = psycopg2.connect(host='tao', database='music',
user='pg', password='#@!$%&')
cur = con.cursor()
sql = 'insert into tracks values (default, %s, %s)'
recset = [('Siberian Khatru', 'Yes'),
("Supper's Ready", 'Genesis')]
for rec in recset:
cur.execute(sql, rec)
con.commit()
cur.execute('select * from tracks')
recset = cur.fetchall()
for rec in recset:
print rec
con.close()
%a<da:
(1, 'Kashmir', 'Led Zeppelin')
(2, 'Starless', 'King Crimson')
(3, 'Siberian Khatru', 'Yes')
(4, "Supper's Ready", 'Genesis')
"omo o mdulo segue )ielmente a especi)ica:o 1/2, o cdigo R praticamente igual ao
e>emplo usando o mdulo pg. 5 psycopg )oi proJetado com o obJetivo de suportar
100 7anco de dados
aplica@es mais pesadas, com muitas inser@es e atuali.a@es.
9ambRm R poss<vel escrever )un@es para Postgre%NL usando Python. Para Fue isso seJa
poss<vel, R preciso habilitar o suporte ao Python no banco, atravRs do utilitrio de linha de
comando pelo administrador:
createlang plpythonu <banco>
-s linguagens Fue podem usadas pelo Postgre%NL s:o chamadas Procedural Languages
TPLU e o su)i>o WuX signi)ica untrusted.
5s tipos dos parAmetros e do retorno da )un:o devem ser de)inidos durante a cria:o da
)un:o no Postgre%NL.
E>emplo de )un:o:
create function pformat(band text, track text)
returns text
as $$
return '%s - %s' % (band, track)
$$ language plpythonu;
5 cdigo em Python )oi marcado em verde.
%a<da da )un:o TatravRs do psFlU:
music=> select pformat(track, band) from tracks;
pformat
-------------------------
Kashmir - Led Zeppelin
Starless - King Crimson
Yes - Siberian Khatru
Genesis - Supper's Ready
(4 registros)
5 ambiente de e>ecu:o de Python no Postgre%NL provH o mdulo plpy Timportado
automaticamenteU Fue R uma abstra:o para o acesso aos recursos do %I/1.
E>emplo com plpy:
create function inibands()
7anco de dados 101
returns setof text
as $$
bands = plpy.execute('select distinct band from tracks order by 1')
return [''.join(filter(lambda c: c == c.upper(), list(band['band']))) for band in bands]
$$ language plpythonu;
%a<da da )un:o TatravRs do utilitrio psFlU:
music=> select inibands();
inibands
----------
KC
LZ
Y
G
(4 registros)
(un@es Python pode ser utili.ado tanto em %tored Procedures Fuanto *riggers no
Postgre%NL.
10' 7anco de dados
%apeamento o28eto>relacional
D#Ject;Kelacional 1apper T56BU R uma camada Fue se posiciona entre o cdigo com a
lgica da aplica:o e o mdulo 1/2, com o obJetivo de redu.ir as di)iculdades geradas
pelas di)erenas entre a representa:o de obJetos Tda linguagemU e a representa:o
relacional Tdo banco de dadosU.
"om o uso de um 56B:
- aplica:o se torna independente do %I1/.
5 desenvolvedor n:o precisa usar %NL.
- lgica para gerenciamento das cone>@es R reali.ada de )orma transparente pelo
56B.
E>emplo de 56B Tcom %NL-lchemy
+#
U:
# -*- coding: latin1 -*-
# Testado com SQLAlchemy 0.44
fro" sqlalchemy i"port *
+# 1ocumenta:o e )ontes podem encontrados em: http://SSS.sFlalchemy.org/.
#s consultas so m'todos e as
respostas so ob;etos.
SNFD
O mdulo OC= desacopla a
aplicao do SNFD.
Interpretador
OC=
"rograma
DFI
7anco de dados 10-
# URL => driver://username:password@host:port/database
# No SQLite:
# sqlite:// (memria)
# sqlite:///arquivo (arquivo em disco)
db = create_engine('sqlite:///progs.db')
# Torna acessvel os metadados
metadata = MetaData(db)
# Ecoa o que SQLAlchemy est fazendo
metadata.bind.echo = True
# Tabela Prog
prog_table = Table('progs', metadata,
Column('prog_id', Integer, primary_key=True),
Column('name', String(80)))
# Cria a tabela
prog_table.create()
# Carrega a definio da tabela
prog_table = Table('progs', metadata, autoload=True)
# Insere dados
i = prog_table.insert()
i.execute(#'name': 'Yes'$, #'name': 'Genesis'$,
#'name': 'Pink Floyd'$, #'name': 'King Crimson'$)
# Seleciona
s = prog_table.select()
r = s.execute()
for row in r.fetchall():
print row
%a<da:
2008-05-04 10:50:35,068 INFO sqlalchemy.engine.base.Engine.0x..b0
CREATE TABLE progs (
prog_id INTEGER NOT NULL,
name VARCHAR(80),
PRIMARY KEY (prog_id)
)
2008-05-04 10:50:35,069 INFO sqlalchemy.engine.base.Engine.0x..b0 {}
2008-05-04 10:50:38,252 INFO sqlalchemy.engine.base.Engine.0x..b0 COMMIT
2008-05-04 10:50:38,252 INFO sqlalchemy.engine.base.Engine.0x..b0 INSERT INTO progs
(name) VALUES (?)
10. 7anco de dados
2008-05-04 10:50:38,253 INFO sqlalchemy.engine.base.Engine.0x..b0 [['Yes'], ['Genesis'],
['Pink Floyd'], ['King Crimson']]
2008-05-04 10:50:38,267 INFO sqlalchemy.engine.base.Engine.0x..b0 COMMIT
2008-05-04 10:50:38,658 INFO sqlalchemy.engine.base.Engine.0x..b0 SELECT
progs.prog_id, progs.name
FROM progs
2008-05-04 10:50:38,660 INFO sqlalchemy.engine.base.Engine.0x..b0 []
(1, u'Yes')
(2, u'Genesis')
(3, u'Pink Floyd')
(4, u'King Crimson')
-lRm dos %NL-lchemy, tambRm e>istem dispon<veis para Python o %NL5bJect
+
e 56Bs
Fue integram frae!or"s maiores, como o 1Jango.
+ 1ocumenta:o e )ontes dispon<veis em: http://SSS.sFlobJect.org/.
(e# 100
)e2
,ma aplica:o (e# R uma aplica:o cliente-servidor aonde o cliente R o #ro!ser Tcomo o
Bo.illa (ire)o>U e o protocolo utili.ado para a comunica:o com o servidor R chamado
Hyperte3t *ransfer Protocol T=99PU, tecnologias Fue servem de base para a (orld (ide (e#
TCCCU, as pginas de hiperte>to Fue )a.em parte da internet. 9ais pginas seguem as
conven@es da linguagem Hyper*e3t 1ar"up Language
.-
T=9BLU.
-s aplica@es (e# geram as pginas =9BL dinamicamente, atendendo as reFuisi@es
enviadas pelo #ro!ser. -plica@es (e#, se constru<das da )orma adeFuada, podem ser
acessadas em diversos ambientes alRm dos computadores pessoais, tais como P1-s e
celulares.
E>istem muitos frae!or"s para )acilitar o desenvolvimento de aplicativos (e# em Python,
entre eles, o "herryPy e o "herry9emplate.
+& Especi)ica@es em: http://SSS.S&.org/BarV,p/.
Ser3idor
Cequisio NEI
ou "OSI
FroOser
PII"d
Cesposta
# Qeb dinHmica ' uma $orma de
eecuo remota.
urlRparamGarg GS url5paramGarg9
108 (e#
C*err$P$
"herryPy
++
R um frae!or" para aplica@es (e# Fue publica obJetos, convertendo ,6Ls em
chamadas para os mRtodos dos obJetos publicados.
E>emplo com "herryPy:
i"port cherrypy
class /oot(object):
@cherrypy.expose
&ef in&e+(self):
return 'Hello World!'
cherrypy.quickstart(Root())
5 decorador Pe3pose indica Fuais mRtodos s:o publicados via (e#. 5 retorno do mRtodo R
uma string, Fue R enviada para o #ro!ser.
5 endereo padr:o do servidor R Whttp://localhost:;';'/X.
C*err$emplate
"herry9emplate
+!
R um mdulo de processamento de modelos TteplatesU para Python. Era
parte integrante do "herryPy, mas hoJe R distribu<do como um pacote separado.
Barcadores dispon<veis no "herry9emplate:
py;eval: avalia uma e>press:o em Python e insere o resultado TFue deve ser uma
stringU no te>to.
E>emplo:
Somatrio de 1 a 10 <py-eval="str(sum(range(1, 11)))">
py;e3ec: e>ecuta uma linha de cdigo Python.
E>emplo:
++ 1ocumenta:o e )ontes podem ser encontrados em: http://SSS.cherrypy.org/.
+! 1ocumenta:o e )ontes podem ser encontrados em: http://cherrytemplate.python-hosting.com/.
(e# 109
<py-exec="import platform">
O sistema <py-eval="platform.platform()">
py;code: e>ecuta um bloco de cdigo Python.
E>emplo:
<py-code="
import platform
sistema = platform.platform()
">
<py-eval="sistema">
py;if / py;else: )unciona como o par if / else em Python.
E>emplo:
<py-if="1 > 10">
Algo errado...
</py-if><py-else>
Correto!
</py-else>
py;for: )unciona como o lao )or em Python.
E>emplo:
<py-for="x in range(1, 11)">
<py-eval="str(x)"> ** 2 = <py-eval="str(x ** 2)"><br>
</py-for>
py;include: inclui um arFuivo e>terno no teplate.
E>emplo:
<py-include="header.html">
Corpo da pgina...
<py-include="footer.html">
-lRm de usar uma string como teplate, R poss<vel guardar o teplate em um arFuivo:
108 (e#
renderTemplate(file='index.html')
E>emplo com 2herry*eplate:
fro" cherrytemplate i"port renderTemplate
progs = ['Yes', 'Genesis', 'King Crimson']
template = '<html>\n<body>\n'\
'<py-for="prog in progs">'\
' <py-eval="prog"><br>\n'\
'</py-for>'\
'</body>\n</html>\n'
print renderTemplate(template)
%a<da =9BL:
<html>
<body>
Yes<br>
Genesis<br>
King Crimson<br>
</body>
</html>
-s sa<das geradas pelo "herry9emplate podem ser publicadas pelo "herryPy.
Cliente )e2
5 Python tambRm pode )uncionar do lado cliente, atravRs do mdulo urlli#.
E>emplo:
# -*- coding: latin1 -*-
i"port urllib
# Abre a URL e fornece um objeto semelhante
# a um arquivo convencional
url = urllib.urlopen('http://ark4n.wordpress.com/')
# L a pgina
html = url.read()
(e# 109
#html = '<a href="http://www.gnu.org/">'
found = html.find('href=', 0)
# find retorna -1 se no encontra
while found >= 0:
# O fim do link (quando as aspas acabam)
end = html.find(html[found + 5], found + 6) + 1
# Mostra o link
print html[found:end]
# Passa para o prximo link
found = html.find('href=', found + 1)
5utra solu:o cliente R o 9Sisted Ceb
+E
, Fue R parte do proJeto 9Sisted
+$
, um frae!or"
orientado a eventos voltado para protocolos de rede, incluindo =99P, %%=, 26", 2B-P e
outros.
+E Endereo: http://tSistedmatri>.com/trac/SiVi/9SistedCeb.
+$ Endereo: http://tSistedmatri>.com/trac/.
180 1V2
%VC
1odel;vie!;controller TB?"U R uma arFuitetura de so)tSare Fue divide a aplica:o em trHs
partes distintas: o modelo de dados da aplica:o, a inter)ace com o usurio e a lgica de
controle.
5 obJetivo R obter um bai>o acoplamento entre as trHs partes de )orma Fue uma altera:o
em uma parte tenha pouco Tou nenhumU impacto nas outras partes.
- cria:o da aplica:o dependente da de)ini:o de trHs componentes:
Bodelo TodelU: encapsula os dados da aplica:o e a lgica de dom<nio.
?is:o Tvie!U: recupera dados do modelo e apresenta ao usurio.
"ontrolador TcontrollerU: recebe e reage a eventos, como intera@es com o usurio e
reFuisita altera@es no modelo e na vis:o.
Embora a arFuitetura n:o determine )ormalmente a presena de um componente de
persistHncia, )ica impl<cito Fue este )a. parte do componente modelo.
5 uso mais comum para o modelo B?" R em aplica@es (e# baseadas em bancos de
dados, Fue implementam as opera@es bsicas chamadas "6,1 T2reate6 Kead6 4pdate and
1ontroller
=41: =odel 4ieO 1ontroller
=odel 4ieO
Cecupera dados e
apresenta ao
usu:rio.
Encapsula os dados
da aplicao e a
lgica de domEnio.
Cecebe e reage a
e3entos.
1V2 181
)eleteU.
E>istem vrios frae!or"s para aumentar a produtividade na cria:o de aplicativos
seguindo o B?", com recursos como:
%cripts Fue automati.am as tare)as mais comuns de desenvolvimento.
Iera:o automtica de cdigo.
,so de 56B.
,so de "%%
+;
T2ascade %tyle %heetsU.
,so de -7-M TEsynchronous Mavascript End O1LU.
Bodelos de aplica@es.
,so de introspec:o para obter in)orma@es sobre as estruturas de dados e gerar
)ormulrios com campos com as caracter<sticas correspondentes.
1iversas op@es prR-con)iguradas com defaults adeFuados para a maioria das
aplica@es.
5 frae!or" B?" mais conhecido R o 6uby 5n 6ails
+*
, Fue aJudou a populari.ar o B?"
entre os desenvolvedores.
Especi)icamente desenvolvidos em Python, e>istem os frae!or"s 1Jango
!'
e 9urboIears
!#
,
entre outros.
E>emplo:
# -*- coding: utf-8 -*-
"""
Web com operaes CRUD
"""
# CherryPy
i"port cherrypy
# CherryTemplate
i"port cherrytemplate
# SQLAlchemy
i"port sqlalchemy as sql
# Conecta ao bando
db = sql.create_engine('sqlite:///zoo.db')
+; Pgina o)icial em: http://SSS.S&.org/%tyle/"%%/.
+* Pgina o)icial em: http://SSS.rubyonrails.org/.
!' Pgina o)icial em: http://SSS.dJangoproJect.com/.
!# Pgina o)icial em: http://turbogears.org/.
18' 1V2
# Acesso aos metadados
metadata = sql.MetaData(db)
tr*:
# Carrega metadados da tabela
zoo = sql.Table('zoo', metadata, autoload=True)
e+cept:
# Define a estrutura da tabela zoo
zoo = sql.Table('zoo', metadata,
sql.Column('id', sql.Integer, primary_key=True),
sql.Column('nome', sql.String(100),
unique=True, nullable=False),
sql.Column('quantidade', sql.Integer, default=1),
sql.Column('obs', sql.String(200), default='')
)
# Cria a tabela
zoo.create()
# Os nomes das colunas
colunas = [col for col in zoo.columns.keys()]
colunas.remove('id')
class /oot(object):
"""Raiz do site"""
@cherrypy.expose
&ef in&e+(self, **args):
"""
Lista os registros
"""
msg = ''
op = args.get('op')
ident = int(args.get('ident', 0))
novo = #$
for coluna in colunas:
novo[coluna] = args.get(coluna)
if op == 'rem':
# Remove dados
rem = zoo.delete(zoo.c.id==ident)
rem.execute()
msg = 'registro removido.'
elif op == 'add':
novo = #$
1V2 18-
for coluna in colunas:
novo[coluna] = args[coluna]
tr*:
# Insere dados
ins = zoo.insert()
ins.execute(novo)
msg = 'registro adicionado.'
e+cept sql.exceptions.IntegrityError:
msg = 'registro existe.'
elif op == 'mod':
novo = #$
for coluna in colunas:
novo[coluna] = args[coluna]
tr*:
# Modifica dados
mod = zoo.update(zoo.c.id==ident)
mod.execute(novo)
msg = 'registro modificado.'
e+cept sql.exceptions.IntegrityError:
msg = 'registro existe.'
# Seleciona dados
sel = zoo.select(order_by=zoo.c.nome)
rec = sel.execute()
# Gera a pgina principal a partir do modelo "index.html"
return cherrytemplate.renderTemplate(file='index.html',
outputEncoding='utf-8')
@cherrypy.expose
&ef a&&(self):
"""
Cadastra novos registros
"""
# Gera a pgina de registro novo a partir do modelo "add.html"
return cherrytemplate.renderTemplate(file='add.html',
outputEncoding='utf-8')
@cherrypy.expose
&ef re"(self, ident):
"""
Confirma a remoo de registros
"""
18. 1V2
# Seleciona o registro
sel = zoo.select(zoo.c.id==ident)
rec = sel.execute()
res = rec.fetchone()
# Gera a pgina de confirmar excluso a partir do modelo "rem.html"
return cherrytemplate.renderTemplate(file='rem.html',
outputEncoding='utf-8')
@cherrypy.expose
&ef "o&(self, ident):
"""
Modifica registros
"""
# Seleciona o registro
sel = zoo.select(zoo.c.id==ident)
rec = sel.execute()
res = rec.fetchone()
# Gera a pgina de alterao de registro a partir do modelo "mod.html"
return cherrytemplate.renderTemplate(file='mod.html',
outputEncoding='utf-8')
# Inicia o servidor na porta 8080
cherrypy.quickstart(Root())
Bodelo Winde>.htmlX Tpgina principalU:
<py-include="header.html">
<table>
<tr>
<th></th>
<py-for="coluna in colunas">
<th><py-eval="coluna"></th>
</py-for>
<th></th>
<th></th>
</tr>
<py-for="i campos in enumerate!rec.fetchall!""">
<tr>
<th><py-eval="unicode!i # 1""></th>
<py-for="coluna in colunas">
<td><py-eval="unicode!campos$coluna%""></td>
</py-for>
<td>
<a href="/mod&ident=<py-eval="unicode!campos$'id'%"">">modificar</a>
</td><td>
<a href="/rem&ident=<py-eval="unicode!campos$'id'%"">">remover</a>
</td>
</tr>
</py-for>
1V2 180
</table>
<br />
<form action="/add" method="post">
<input type="submit" value=" adicionar " />
</form>
<p>
<py-eval="msg">
</p>
<py-include="footer.html">
Bodelo Wadd.htmlX Tpgina de )ormulrio para novos registrosU:
<py-include="header.html">
<form action="/?op=add" method="post">
<table>
<py-for="coluna in colunas">
<tr><td>
<py-eval="coluna">
</td><td>
<input type="text" size="30" name="<py-eval="coluna">" />
</td></tr>
</py-for>
</table>
<br />
<input type="submit" value=" salvar " />
</form>
<br />
[ <a href="/">voltar</a> ]
<py-include="footer.html">
Bodelo Wmod.htmlX Tpgina de )ormulrio para altera:o de registrosU:
<py-include="header.html">
<form action="/?op=mod&ident=<py-eval="unicode(res['id'])">" method="post">
<table border="0">
<py-for="coluna in colunas">
<tr><th>
<py-eval="coluna">
</th><td>
<input type="text" size="30" name="<py-eval="coluna">"
value="<py-eval="unicode(res[coluna])">" />
</td></tr>
</py-for>
</table>
<br />
<input type="submit" value=" salvar " />
</form>
<br />
[ <a href="/">voltar</a> ]
188 1V2
<py-include="footer.html">
Bodelo Wrem.htmlX Tpgina Fue pede con)irma:o para remo:o de registrosU:
<py-include="header.html">
<table border="1">
<tr>
<py-for="coluna in colunas">
<th><py-eval="coluna"></th>
</py-for>
</tr>
<tr>
<py-for="coluna in colunas">
<td><py-eval="unicode(res[coluna])"></td>
</py-for>
</tr>
</table>
<br />
<form action="/?op=rem&ident=<py-eval="unicode(res['id'])">" method="post">
<input type="submit" value=" remover " />
</form>
<br />
[ <a href="/">voltar</a> ]
<py-include="footer.html">
Bodelo Wheader.htmlX Tcabealho comum a todos os modelosU:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>Zoo</title>
<style type="text/css">
<!--
body {
margin: 10;
padding: 10;
font: 80% Verdana, Lucida, sans-serif;
color: #333366;
}
h1 {
margin: 0;
padding: 0;
font: 200% Lucida, Verdana, sans-serif;
}
a {
color: #436976;
text-decoration: none;
}
1V2 189
a:hover {
background: #c4cded;
text-decoration: underline;
}
table {
margin: 1em 0em 1em 0em;
border-collapse: collapse;
border-left: 1px solid #858ba1;
border-bottom: 1px solid #858ba1;
font: 90% Verdana, Lucida, sans-serif;
}
table th {
padding: 0em 1em 0em 1em;
border-top: 1px solid #858ba1;
border-bottom: 1px solid #858ba1;
border-right: 1px solid #858ba1;
background: #c4cded;
font-weight: normal;
}
table td {
padding: 0em 1em 0em 1em;
border-top: 1px solid #858ba1;
border-right: 1px solid #858ba1;
text-align: center;
}
form {
margin: 0;
border: none;
}
input {
border: 1px solid #858ba1;
background-color: #c4cded;
vertical-align: middle;
}
-->
</style>
</head>
<body>
<h1>Zoo</h1>
<br />
Bodelo W)ooter.htmlX TrodapR comum a todos os modelosU:
</body>
</html>
Pgina principal:
188 1V2
/3ercAcios V 189
Exerccios V
#. 2mplementar uma classe Enial com os atributos: nome, espRcie, gHnero, peso, altura e
idade. 5 obJeto derivado desta classe dever salvar seu estado em arFuivo com um
mRtodo chamado WsalvarX e recarregar o estado em um mRtodo chamado Wdes)a.erX.
. 2mplementar uma )un:o Fue )ormate uma lista de tuplas como tabela =9BL.
&. 2mplementar uma aplica:o (e# com uma sauda:o dependente do horrio Te>emplos:
W/om dia, s:o '*:''.X, W/oa tarde, s:o #&:''.X e W/oa noite, s:o &:''.XU.
+. 2mplementar uma aplica:o (e# com um )ormulrio Fue receba e>press@es Python e
retorne a e>press:o com seu resultado.
190 Parte VI
Parte VI
2nter)ace gr)ica.
9hreads.
Processamento distribu<do.
Per)ormance.
E>erc<cios ?2.
Interface $rfica 191
Interface 5rfica
-s 2nter)aces Ir)icas com ,surio TI,2, $raphic 4ser InterfaceU se populari.aram no
ambiente des"top, devido ] )acilidade de uso e a produtividade. E>istem hoJe muitas
bibliotecas dispon<veis para a constru:o de aplica@es I,2, tais como: I9Z[, N9, 9Z e
S>Cidgets.
5 I9Z[
!
TI2BP 9oolVitU R uma biblioteca Dpen %ource escrita em linguagem ".
5riginalmente concebida para ser usada pelo I2BP
!&
, R compat<vel com as plata)ormas
mais utili.adas atualmente e rica em recursos, entre eles, um construtor de inter)aces
chamado Ilade.
2nter)ace do Ilade:
5 I9Z[ R usado pelo I85BE
!+
Tambiente des"top Dpen %ourceU e por diversas aplicativos,
como os portes do Bo.illa (ire)o> e do /r5))ice.org para sistemas ,82M. 5 I9Z[ pode ser
! - pgina internet do proJeto reside em: http://SSS.gtV.org/. e os binrios para CindoSs est:o
dispon<veis em: http://gladeSin&.source)orge.net/. - vers:o para desenvolvedores instala o Ilade.
!& Endereo o)icial do proJeto: http://SSS.gimp.org/.
!+ 1ocumenta:o e )ontes em: http://SSS.gnome.org/.
19' Interface $rfica
usado no Python atravRs do pacote PyI9Z
!!
. 5s portes das bibliotecas para CindoSs
podem ser encontrados em:
PyI9Z: http://)tp.gnome.org/pub/gnome/binaries/Sin&/pygtV/
PyI5bJect: http://)tp.gnome.org/pub/gnome/binaries/Sin&/pygobJect/
Py"airo: http://)tp.gnome.org/pub/gnome/binaries/Sin&/pycairo/
3r-uitetura
2nter)aces gr)icas geralmente utili.am a met)ora do des"top, um espao em duas
dimens@es, R Fue ocupado por Janelas retangulares, Fue representam aplicativos,
propriedades ou documentos.
-s Janelas podem conter diversos tipos de controles TobJetos utili.ados para interagir com
o usurio ou para apresentar in)orma@esU e containers TobJetos Fue servem de repositrio
para cole@es de outros obJetosU.
- inter)ace gr)ica deve )icar esperando por eventos e responder de acordo. 5s eventos
podem ser resultado da intera:o do usurio, como cliFues e arrastar de mouse ou
digita:o ou de eventos de sistema, como o relgio da mFuina. - rea:o a um evento
FualFuer R de)inida atravRs de )un@es call#ac" T)un@es Fue s:o passadas como argumento
para outras rotinasU.
"ontroles mais usados:
6tulo Tla#elU: retAngulo Fue e>ibe te>to.
"ai>a de te>to Tte3t #o3U: rea de edi:o de te>to.
/ot:o T#uttonU: rea Fue pode ser ativada interativamente.
/ot:o de rdio Tradio #uttonU: tipo especial de bot:o, com o Fual s:o )ormados
grupos aonde apenas um pode ser apertado de cada ve..
/ot:o de veri)ica:o Tchec" #uttonU: bot:o Fue pode ser marcado e desmarcado.
/arras de rolagem Tscroll #arsU: controles desli.antes hori.ontais ou verticais, usados
para intervalos de valores numRricos.
/ot:o giratrio Tspin #uttonU: cai>a de te>to com dois bot@es com setas ao lado Fue
incrementam e decrementam o nDmero na cai>a.
/arra de status Tstatus #arU: barra para e>ibi:o de mensagens, geralmente na parte
in)erior da Janela.
2magem TiageU: rea para e>ibi:o de imagens.
"ontroles podem ter aceleradores Tteclas de atalhoU associados a eles.
!! - pgina na internet do PyI9Z R http://SSS.pygtV.org/.
Interface $rfica 19-
2ontainers mais usados:
/arra de menu Tenu #arU: sistema de menus, geralmente na parte superior da
Janela.
(i>o Tfi3edU: os obJetos )icam )i>ados nas mesmas posi@es.
9abela Tta#leU: cole:o de compartimentos para )i>ar os obJetos, distribu<dos em
linhas e colunas.
"ai>a hori.ontal Thori>ontal #o3U: semelhante ] tabela, porRm apenas com uma linha.
"ai>a vertical Tvertical #o3U: semelhante ] tabela, porRm apenas com uma coluna.
"aderno Tnote#oo"U: vrias reas Fue podem ser visuali.adas uma cada ve. Fuando
selecionadas atravRs de abas, geralmente na parte superior.
/arra de )erramentas Ttool #arU: rea com bot@es para acesso rpido aos principais
recursos do aplicativo.
Para lidar com eventos de tempo, as inter)aces gr)icas implementam um recurso
chamado tempori.ador TtierU Fue evoca a )un:o call#ac" depois de um certo tempo
programado.
Construindo interfaces
Embora seJa poss<vel criar inter)aces inteiramente usando cdigo, R mais produtivo
construir a inter)ace em um so)tSare apropriado. 5 Ilade gera arFuivos MBL com
e>tens:o W.gladeX, Fue podem ser lidos por programas Fue usam I9Z[, automati.ando o
processo de criar inter)aces.
6oteiro bsico para construir uma inter)ace:
8o Ilade:
"rie uma Janela usando algum dos modelos dispon<veis em W8<veis %uperioresX.
"rie containers para arma.enar os controles.
"rie os controles.
"rie os manipuladores para os sinais necessrios.
%alve o arFuivo com a e>tens:o W.gladeX.
8o Python:
2mporte os pacotes necessrios.
,se o I9Z para interpretar o arFuivo MBL do Ilade.
"rie rotinas para serem usadas como )un@es call#ac".
-ssocie as rotinas com os manipuladores correspondes Fue )oram criados no Ilade,
atravRs do mRtodo signalFautoconnect<=.
-tive o lao para processar eventos com gt"+ain<=.
19. Interface $rfica
E>emplo TrelgioU:
8o Ilade:
"liFue em WJanelaX em W8<veis %uperioresX.
8as propriedades da Janela:
Bude W8omeX para WmainX em WIeralX.
Bude W6edimensionvelX para W%imX.
Bude WPosi:o da JanelaX para W"entrali.arX.
Bude W?is<velX para W%imX em W"omumX.
Bude o manipulador para Won\main\destroyX do sinal WdestroyX de
WItV5bJectX em W%inaisX.
"liFue em W"ai>a verticalX em W"ontainersX, depois cliFue dentro da Janela e
escolha o nDmero de itens igual a &.
"liFue em W/arra de menuX em W"ontainersX, depois cliFue dentro do espao va.io
superior e delete os itens WEditarX e W?erX.
"liFue em W/arra de statusX em W"ontrole e E>ibi:oX e depois cliFue dentro do
espao va.io in)erior.
Bude o nome da barra de status para Wsts\dataX em WIeralX.
"liFue em W6tuloX em W"ontrole e E>ibi:oX e depois cliFue dentro do espao
va.io central.
8as propriedades do rtulo, mude W8omeX para Wlbl\horaX e W6tuloX para va.io
em WIeralX, W%olicita:o de larguraX para W&''X e W%olicita:o de alturaX para
W#!'X em W"omumX.
8o W2nspetorX Tlista em )orma de rvore com todos itensU, delete:
Wimagemenuitem#X.
WimagemenuitemX.
Wimagemenuitem&X.
Wimagemenuitem+X.
Wseparatormenuitem#X.
8o W2nspetorX:
locali.e Wimagemenuitem!X e mude o manipulador em W%inaisX do sinal
WactivateX para Won\imagemenuitem!\activateX de WItVBenu2temX.
locali.e Wimagemenuitem#'X e mude o manipulador em W%inaisX do sinal
WactivateX para Won\imagemenuitem#'\activateX de WItVBenu2temX.
%alve o arFuivo como Wrelogio.gladeX.
7anela principal do relgio:
Interface $rfica 190
"digo em Python:
# -*- coding: latin1 -*-
"""
Um relgio com GTK.
"""
i"port datetime
# GTK e outros mdulos associados
i"port gtk
i"port gtk.glade
i"port gobject
i"port pango
class /elo'io(object):
"""
Implementa a janela principal do programa.
"""
&ef ((init(((self):
"""
Inicializa a classe.
"""
# Carrega a interface
self.tree = gtk.glade.XML('relogio.glade', 'main')
# Liga os eventos
callbacks = #
'on_main_destroy': self.on_main_destroy,
'on_imagemenuitem5_activate': self.on_main_destroy,
'on_imagemenuitem10_activate': self.on_imagemenuitem10_activate
$
self.tree.signal_autoconnect(callbacks)
198 Interface $rfica
# Coloca um ttulo na janela
self.tree.get_widget('main').set_title('Relgio')
# O rtulo que reber a hora
self.hora = self.tree.get_widget('lbl_hora')
# A barra de status que reber a data
self.data = self.tree.get_widget('sts_data')
print dir(self.data)
# Muda a fonte do rtulo
self.hora.modify_font(pango.FontDescription('verdana 28'))
# Um temporizador para manter a hora atualizada
self.timer = gobject.timeout_add(1000, self.on_timer)
&ef on(i"a'e"enuite"@?(acti3ate(self, widget):
"""
Cria a janela de "Sobre".
"""
# Caixa de dialogo
dialog = gtk.MessageDialog(parent=self.tree.get_widget('main'),
flags=gtk.DIALOG_MODAL H gtk.DIALOG_DESTROY_WITH_PARENT,
type=gtk.MESSAGE_OTHER, buttons=gtk.BUTTONS_OK,
message_format='Primeiro exemplo usando GTK.')
dialog.set_title('Sobre')
dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
# Exibe a caixa
dialog.run()
dialog.destroy()
return
&ef on(ti"er(self):
"""
Rotina para o temporizador.
"""
# Pega a hora do sistema
hora = datetime.datetime.now().time().isoformat().split('.')[0]
# Muda o texto do rtulo
self.hora.set_text(hora)
# Pega a data do sistema em formato ISO
data = datetime.datetime.now().date().isoformat()
data = 'Data: ' + '/'.join(data.split('-')[::!1])
# Coloca a data na barra de status
self.data.push(0, data)
Interface $rfica 199
# Verdadeiro faz com que o temporizador rode de novo
return True
&ef on("ain(&estro*(self, widget):
"""
Termina o programa.
"""
raise SystemExit
if __name__ == "__main__":
# Inicia a GUI
relogio = Relogio()
gtk.main()
-rFuivo Wrelogio.gladeX:
<%xml version="1.0" encoding="UTF-8" standalone="no"%>
<!I<06E2G glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.3 on Sat May 03 14:06:18 2008 -->
<glade-interface>
<widget class="GtkWindow" id="main">
<property name="visible">True</property>
<property name="resizable">False</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
<signal name="destroy" handler="on_main_destroy"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
<widget class="GtkMenuBar" id="menubar1">
<property name="visible">True</property>
<child>
<widget class="GtkMenuItem" id="menuitem1">
<property name="visible">True</property>
<property name="label" translatable="yes">_Arquivo</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="menu1">
<property name="visible">True</property>
<child>
<widget class="GtkImageMenuItem" id="imagemenuitem5">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-quit</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_imagemenuitem5_activate"/>
198 Interface $rfica
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkMenuItem" id="menuitem4">
<property name="visible">True</property>
<property name="label" translatable="yes">Aj_uda</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="menu3">
<property name="visible">True</property>
<child>
<widget class="GtkImageMenuItem" id="imagemenuitem10">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-about</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_imagemenuitem10_activate"/>
</widget>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="lbl_hora">
<property name="width_request">300</property>
<property name="height_request">150</property>
<property name="visible">True</property>
<property name="xpad">5</property>
<property name="ypad">5</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkStatusbar" id="sts_data">
<property name="visible">True</property>
<property name="spacing">2</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
Interface $rfica 199
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
E>emplo Trodando programasU:
8o Ilade:
"rie uma Janela com o nome WmainX com o manipulador Won\main\destroyX para o
sinal WdestroyX.
"rie um container )i>o para receber os controles.
"rie uma cai>a de te>to chamada Wntr\cmdX. Esta cai>a receber comandos para
serem e>ecutados.
"rie um bot:o de veri)ica:o chamado WchV\shellX, com o te>to W7anela de te>toX.
%e o bot:o estiver marcado, o comando ser e>ecutado em uma Janela de te>to.
"rie um bot:o chamado Wbtn\rodarX com o manipulador Won\btn\)echar\clicVedX
para o sinal WclicVedX. Nuando clicado, o comando da cai>a de te>to R e>ecutado.
"rie um bot:o chamado Wbtn\)echarX com o manipulador Won\btn\)echar\clicVedX
para o sinal WclicVedX. Nuando clicado, o programa termina.
7anela principal:
"digo em Python:
# -*- coding: utf-8 -*-
"""
Rodando programas com GTK.
"""
i"port subprocess
i"port gtk
i"port gtk.glade
i"port gobject
i"port pango
180 Interface $rfica
class G+ec(object):
"""
Janela principal.
"""
&ef ((init(((self):
"""
Inicializa a classe.
"""
# Carrega a interface
self.tree = gtk.glade.XML('cmd.glade', 'main')
# Liga os eventos
callbacks = #
'on_main_destroy': self.on_main_destroy,
'on_btn_fechar_clicked': self.on_main_destroy,
'on_btn_rodar_clicked': self.on_btn_rodar_clicked
$
self.tree.signal_autoconnect(callbacks)
&ef on(btn(ro&ar(clicke&(self, widget):
"""
Roda o comando.
"""
ntr_cmd = self.tree.get_widget('ntr_cmd')
chk_shell = self.tree.get_widget('chk_shell')
cmd = ntr_cmd.get_text()
if cmd:
# chk_shell.state 1 se chk_shell estiver marcado
if chk_shell.state:
cmd = 'cmd start cmd /c ' + cmd
subprocess.Popen(args=cmd)
else:
# Caixa de dialogo
dialog = gtk.MessageDialog(parent=self.tree.get_widget('main'),
flags=gtk.DIALOG_MODAL H gtk.DIALOG_DESTROY_WITH_PARENT,
type=gtk.MESSAGE_OTHER, buttons=gtk.BUTTONS_OK,
message_format='Digite um comando.')
dialog.set_title('Mensagem')
dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
# Exibe a caixa
dialog.run()
dialog.destroy()
Interface $rfica 181
return True
&ef on("ain(&estro*(self, widget):
"""
Termina o programa.
"""
raise SystemExit
if __name__ == "__main__":
# Inicia a GUI
exe = Exec()
gtk.main()
5 arFuivo Wcmd.gladeX:
<%xml version="1.0" encoding="UTF-8" standalone="no"%>
<!I<06E2G glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.3 on Tue May 27 23:44:03 2008 -->
<glade-interface>
<widget class="GtkWindow" id="main">
<property name="width_request">380</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="title" translatable="yes">Entre com um comando...</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
<signal name="destroy" handler="on_main_destroy"/>
<child>
<widget class="GtkFixed" id="fixed1">
<property name="width_request">380</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="btn_rodar">
<property name="width_request">100</property>
<property name="height_request">29</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">_Rodar</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_btn_rodar_clicked"/>
</widget>
<packing>
18' Interface $rfica
<property name="x">167</property>
<property name="y">61</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="btn_fechar">
<property name="width_request">100</property>
<property name="height_request">29</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">_Fechar</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<signal name="clicked" handler="on_btn_fechar_clicked"/>
</widget>
<packing>
<property name="x">272</property>
<property name="y">61</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="ntr_cmd">
<property name="width_request">365</property>
<property name="height_request">29</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
<packing>
<property name="x">9</property>
<property name="y">14</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="chk_shell">
<property name="width_request">136</property>
<property name="height_request">29</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">_Janela de texto</property>
<property name="use_underline">True</property>
<property name="response_id">0</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="x">11</property>
<property name="y">59</property>
</packing>
</child>
</widget>
</child>
</widget>
Interface $rfica 18-
</glade-interface>
-lRm do Ilade, tambRm e>iste o Iaspacho
!E
, outro construtor de inter)aces Fue tambRm
gera arFuivos MBL no padr:o do Ilade.
(uncionalidades associadas a inter)ace gr)ica podem ser obtidas usando outros mdulos,
como o py%ystray
!$
, Fue implementa a )uncionalidade Fue permite Fue o aplicativo use a
bandeJa de sistema no CindoSs.
!E 1ispon<vel em: http://ga.pacho.sicem.bi./.
!$ Endereo na internet: http://datavibe.net/nessiene/pysystray/.
18. *hreads
*reads
,ma thread R uma linha de e>ecu:o Fue compartilha sua rea de memria com outras
linhas, ao contrrio do processo tradicional, Fue possui apenas uma linha com rea de
memria prpria.
5 uso de threads o)erece algumas vantagens em rela:o aos processos convencionais:
"onsomem menos recursos de mFuina.
Podem ser criadas e destru<das mais rapidamente.
Podem ser chaveadas mais rapidamente.
Podem se comunicar com outras threads de )orma mais )cil.
c comum utili.ar threads para:
Processamento paralelo, em casos como atender vrias cone>@es em processos
servidores.
E>ecutar opera@es de 2/5 ass<ncronas, por e>emplo: enFuanto o usurio continua
interagindo com a inter)ace enFuanto a aplica:o envia um documento para a
impressora.
5pera@es de 2/5 em paralelo.
"rocesso
I*read !
I*read (
I*read ,
I*read !
Iempo
I*read -
*hreads 180
Em Python, o mdulo da biblioteca padr:o threading provH classes de alto n<vel de
abstra:o e usa o mdulo thread, Fue implementa as rotinas de bai>o n<vel e Fue
geralmente n:o R usado diretamente.
E>emplo com o mdulo threading:
# -*- coding: latin1 -*-
"""
Exemplo de uso de threads
"""
i"port os
i"port time
i"port threading
class 4onitor(threading.Thread):
"""
Classe de monitoramento usando threads
"""
&ef ((init(((self, ip):
"""
Construtor da thread
"""
# Atributos para a thread
self.ip = ip
self.status = )one
# Inicializador da classe Thread
threading.Thread.__init__(self)
&ef run(self):
"""
Cdigo que ser executado pela thread
"""
# Execute o ping
ping = os.popen('ping -n 1 %s' % self.ip).read()
if 'Esgotado' in ping:
self.status = False
else:
self.status = True
if __name__ == '__main__':
# Crie uma lista com um objeto de thread para cada IP
monitores = []
for i in range(1, 11):
ip = '10.10.10.%d' % i
188 *hreads
monitores.append(Monitor(ip))
# Execute as Threads
for monitor in monitores:
monitor.start()
# A thread principal continua enquanto
# as outras threads executam o ping
# para os endereos da lista
# Verifique a cada segundo
# se as threads acabaram
ping = True
while ping:
ping = False
for monitor in monitores:
if monitor.status == )one:
ping = True
break

time.sleep(1)
# Imprima os resultados no final
for monitor in monitores:
if monitor.status:
print '%s no ar' % monitor.ip
else:
print '%s fora do ar' % monitor.ip
%a<da:
10.10.10.1 no ar
10.10.10.2 no ar
10.10.10.3 no ar
10.10.10.4 fora do ar
10.10.10.5 no ar
10.10.10.6 fora do ar
10.10.10.7 no ar
10.10.10.8 no ar
10.10.10.9 no ar
10.10.10.10 no ar
c importante observar Fue, Fuando o processo morre, todas as suas threads terminam.
Processaento distri#uAdo 189
Processamento distri2udo
Ieralmente a solu:o para problemas Fue reFuerem muita potHncia computacional R a
utili.a:o de mFuinas mais poderosas, porRm esta solu:o R limitada em termos de
escalabilidade. ,ma alternativa R dividir os processos da aplica:o entre vrias mFuinas
Fue se comunicam atravRs de uma rede, )ormando um cluster ou um grid.
- di)erena bsica entre cluster e grid R Fue o primeiro tem como premissa de proJeto ser
um ambiente controlado, homogHneo e previs<vel, enFuanto o segundo R geralmente
heterogHneo, n:o controlado e imprevis<vel. ,m cluster R um ambiente planeJado
especi)icamente para processamento distribu<do, com mFuinas dedicadas em um lugar
adeFuado. ,m grid se caracteri.a pelo uso de esta@es de trabalho Fue podem estar em
FualFuer lugar.
5s modelos mais comuns de cluster:
computacional.
de recursos.
de aplica:o ou h<brido.
5 modelo computacional tem como obJetivo usar processadores e memria dos
PEbrido
# F
1 D
1omputacional
# F
1 D
O ser3idor $a& o
escalonamento das
tare$as para as estaes.
Mualquer m:quina pode
atuar como cliente e
ser3idor.
188 Processaento distri#uAdo
eFuipamentos envolvidos para obter mais potHncia computacional. - implementa:o
geralmente utili.a um sistema escalonador de )ilas TetaschedulerU, Fue reali.a o
agendamento das tare)as a serem processados pelos ns TmFuinas Fue comp@em o
modeloU, com isso a opera:o tende a ser cont<nua, com intera:o redu.ida com os
usurios. ,m e>emplo conhecido R o %E92mhome
!;
.
5 cluster de recursos R usado para arma.enar in)orma@es em um grupo de computadores,
tanto para obter mais per)ormance de recupera:o de dados Fuanto para e>pandir a
capacidade de arma.enamento. Este modelo pode ser usado para prover in)ra-estrutura
para aplica@es ou para atender reFuisi@es )eitas de )orma interativa por usurios. Entre
os servios Fue podem operar desta )orma est:o os %istemas Ierenciadores de /anco de
1ados T%I/1U, como o By%NL "luster
!*
.
5 modelo h<brido R basicamente uma aplica:o proJetada especi)icamente para )uncionar
em vrias mFuinas ao mesmo tempo. -o invRs de prover recursos diretamente, a
aplica:o utili.a os eFuipamentos para suportar suas prprias )uncionalidades. "om isso,
a in)ra-estrutura R utili.ada de )orma Fuase transparente pelos usurios Fue usam a
aplica:o interativamente. 9odos os ns rodam o aplicativo e podem operar como
servidores e clientes. 5 e>emplo mais comum de arFuitetura h<brida s:o os sistemas de
!; Pgina do proJeto em: http://setiathome.berVeley.edu/.
!* Endereo na internet: http://SSS.mysFl.com/products/database/cluster/.
1lientes
Cecursos
# F
1 D
1lientes $a&em
requisies ao cluster...
... e qualquer m:quina
do cluster pode atuar
como ser3idor.
E F
N P
Processaento distri#uAdo 189
compartilhamento de arFuivos Tfile sharingU Fue usam comunica:o Peer *o Peer TPPU.
2ndependente do modelo utili.ado. sistemas distribu<dos devem atender a Fuatro
reFuisitos bsicos:
"omunica:o: as mFuinas envolvidas devem se comunicar de )orma permitir a
troca de in)orma@es entre elas.
Betadados: os dados sobre o processamento precisam se mantidos de )orma
adeFuada.
"ontrole: os processos devem ser gerenciados e monitorados.
%egurana: o sigilo, integridade e disponibilidade devem estar protegidos.
E>istem diversas tecnologias voltadas para o desenvolvimento de aplica@es distribu<das,
tais como: MBL-6P"
E'
, Ceb %ervices, obJetos distribu<dos, BP2 e outras.
E' Especi)ica:o em http://SSS.>mlrpc.com/.
190 Processaento distri#uAdo
(28etos distri2udos
- premissa bsica da tecnologia de obJetos distribu<dos R tornar obJetos dispon<veis para
Fue seus mRtodos possam ser evocados remotamente a partir de outras mFuinas ou
mesmo por outros processos na mesma mFuina, usando a pilha de protocolos de rede
9"P/2P para isso.
E>istem diversas solu@es para estes casos, porRm utili.ar obJetos distribu<dos o)erece
vrias vantagens em rela:o a outras solu@es Fue implementam )uncionalidades
semelhantes, tal como o protocolo MBL-6P":
%implicidade para implementa:o.
5culta as camadas de comunica:o.
%uporte a estruturas de dados nativas Tcontanto Fue seJam seriali.veisU.
/oa per)ormance.
Baturidade da solu:o.
PCthon Keote D#Jects TPL65
E#
U R um frae!or" para aplica@es distribu<das Fue permite
publicar obJetos via 9"P/2P. 8a mFuina servidora, o PL65 publica o obJeto, cuidando de
detalhes como: protocolo, controle de sess:o, autentica:o, controle de concorrHncia e
E# 1ocumenta:o e )ontes dispon<veis em: http://pyro.source)orge.net/.
Cede
1liente
Interpretador
"rograma
FrameOorT
Ser3idor
Interpretador
Ob;eto
FrameOorT
Processaento distri#uAdo 191
outros.
E>emplo de servidor:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
i"port Pyro.core
class Iist(Pyro.core.ObjBase):
&ef calc(self, n):
return n**n
if __name__ == '__main__':
# Inicia a thread do servidor
Pyro.core.initServer()
# Cria o servidor
daemon = Pyro.core.Daemon()
# Publica o objeto
uri = daemon.connect(Dist(),'dist')
# Coloca o servidor em estado operacional
daemon.requestLoop()
8a mFuina cliente, o programa usa o PL65 para evocar rotinas do servidor e recebe os
resultados, da mesma )orma Fue um mRtodo de um obJeto local.
E>emplo de cliente:
# -*- coding: utf-8 -*-
i"port Pyro.core
# Cria um objeto local para acessar o objeto remoto
proxy = Pyro.core.getProxyForURI('PYROLOC://127.0.0.1/dist')
# Evoca um mtodo do objeto remoto
print proxy.calc(1000)
5s mRtodos publicados atravRs do PL65 n:o podem ser identi)icados por introspec:o
pelo cliente.
-lasse de o,1etos distri,u2dos.
19' Processaento distri#uAdo
Embora o PL65 resolva problemas de concorrHncia de comunica:o com os clientes Fue
est:o acessando o mesmo servidor Tcada cone>:o roda em uma thread separadaU, )ica por
conta do desenvolvedor Tou de outros frae!or"s Fue a aplica:o utili.eU resolver Fuest@es
de concorrHncia por outros recursos, como arFuivos ou cone>@es de banco de dados
E
, por
e>emplo. c poss<vel autenticar as cone>@es atravRs da cria:o de obJetos da classe
Validator, Fue podem veri)icar credenciais, endereos 2P e outros itens.
E Problemas de concorrHncia de cone>@es de banco de dados podem ser tratados de )orma transparente
com a utili.a:o de 56Bs Fue implementam esta )uncionalidade ou pelo pacote 1/,tils
Thttp://SSS.SebSare)orpython.org/1/,tilsU, Fue )a. parte do proJeto CebSare )or Python
Thttp://SSS.SebSare)orpython.org/U.
Perforance 19-
Performance
5 Python provH algumas )erramentas para avaliar per)ormance e locali.ar gargalos na
aplica:o. Entre estas )erramentas est:o os mdulos cProfile e tieit.
5 mdulo cProfile
8-
)a. uma anlise detalhada de per)ormance, resultado das chamadas de
)un:o, retornos de )un:o e e>ce@es.
E>emplo:
# -*- coding: latin1 -*-
i"port cProfile
&ef r'b@():
"""
Funo usando range()
"""
rgbs = []
for r in range(256):
for g in range(256):
for b in range(256):
rgbs.append('#%02x%02x%02x' % (r, g, b))
return rgbs
&ef r'bJ():
"""
Funo usando xrange()
"""
rgbs = []
for r in xrange(256):
for g in xrange(256):
for b in xrange(256):
rgbs.append('#%02x%02x%02x' % (r, g, b))
return rgbs
&ef r'b5():
"""
Gerador usando xrange()
"""
for r in xrange(256):
for g in xrange(256):
for b in xrange(256):
*iel& '#%02x%02x%02x' % (r, g, b)
&ef r'bK():
E& 5 mdulo cProfile Tdispon<vel no Python .! em dianteU R uma vers:o otimi.ada do mdulo profile, Fue
tem a mesma )uncionalidade.
19. Perforance
"""
Funo usando uma lista vrias vezes
"""
rgbs = []
ints = range(256)
for r in ints:
for g in ints:
for b in ints:
rgbs.append('#%02x%02x%02x' % (r, g, b))
return rgbs
&ef r'bL():
"""
Gerador usando apenas uma lista
"""
for i in range(256 ** 3):
*iel& '#%06x' % i
&ef r'bM():
"""
Gerador usando xrange() uma vez
"""
for i in xrange(256 ** 3):
*iel& '#%06x' % i
# Benchmarks
print 'rgb1:'
cProfile.run('rgb1()')
print 'rgb2:'
cProfile.run('rgb2()')
print 'rgb3:'
cProfile.run('list(rgb3())')
print 'rgb4:'
cProfile.run('rgb4()')
print 'rgb5:'
cProfile.run('list(rgb5())')
print 'rgb6:'
cProfile.run('list(rgb6())')
%a<da:
rgb1:
16843012 function calls in 54.197 CPU seconds
Ordered by: standard name
Perforance 190
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.633 0.633 54.197 54.197 <string>:1(<module>)
1 49.203 49.203 53.564 53.564 rgbs.py:5(rgb1)
16777216 4.176 0.000 4.176 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
65793 0.186 0.000 0.186 0.000 {range}
rgb2:
16777219 function calls in 53.640 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.624 0.624 53.640 53.640 <string>:1(<module>)
1 49.010 49.010 53.016 53.016 rgbs.py:16(rgb2)
16777216 4.006 0.000 4.006 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
rgb3:
16777219 function calls in 52.317 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 6.251 6.251 52.317 52.317 <string>:1(<module>)
16777217 46.066 0.000 46.066 0.000 rgbs.py:27(rgb3)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
rgb4:
16777220 function calls in 53.618 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.624 0.624 53.618 53.618 <string>:1(<module>)
1 48.952 48.952 52.994 52.994 rgbs.py:36(rgb4)
16777216 4.042 0.000 4.042 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {range}
rgb5:
16777220 function calls in 32.209 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 6.110 6.110 32.209 32.209 <string>:1(<module>)
198 Perforance
16777217 25.636 0.000 26.099 0.000 rgbs.py:48(rgb5)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.463 0.463 0.463 0.463 {range}
rgb6:
16777219 function calls in 30.431 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 6.066 6.066 30.431 30.431 <string>:1(<module>)
16777217 24.365 0.000 24.365 0.000 rgbs.py:55(rgb6)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
5 relatrio do cProfile mostra no inicio as duas in)orma@es mais importantes: o tempo de
"P, consumido em segundos e a Fuantidade de chamadas de )un:o. -s outras linhas
mostram os detalhes por )un:o, incluindo o tempo total e por chamada.
-s cinco rotinas do e>emplo tHm a mesma )uncionalidade: geram uma escala de cores
6I/. PorRm, o tempo de e>ecu:o R di)erente.
-nalisando os resultados:
/otina 6ipo 6e"po >a-os +/ran'e()
rgb1() Funo 54.197 3 range()
rgb2() Funo 53.640 3 xrange()
rgb3() Gerador 52.317 3 xrange()
rgb4() Funo 53.618 3 range()
rgb5() Gerador 32.209 1 range()
rgb6() Gerador 30.431 1 xrange()
(atores observados Fue pesaram no desempenho:
- comple>idade do algoritmo.
Ieradores apresentaram melhores resultados do as )un@es tradicionais.
5 gerador 3range<= consomem menos recursos do Fue a )un:o range<=.
5 gerador rg#8<=, Fue usa apenas um lao e 3range<=, R bem mais e)iciente Fue as outras
rotinas.
5utro e>emplo:
Perforance 199
# -*- coding: latin1 -*-
i"port cProfile
&ef fib@(n):
"""
Fibonacci calculado de forma recursiva.
"""
if n > 1:
return fib1(n ! 1) + fib1(n ! 2)
else:
return 1
&ef fibJ(n):
"""
Fibonacci calculado por um loop.
"""
if n > 1:
# O dicionrio guarda os resultados
fibs = #0:1, 1:1$
for i in xrange(2, n + 1):
fibs[i] = fibs[i ! 1] + fibs[i ! 2]
return fibs[n]
else:
return 1
print 'fib1'
cProfile.run('[fib1(x) for x in xrange(1, 31)]')
print 'fib2'
cProfile.run('[fib2(x) for x in xrange(1, 31)]')
%a<da:
fib1
7049124 function calls (32 primitive calls) in 21.844 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 21.844 21.844 <string>:1(<module>)
7049122/30 21.844 0.000 21.844 0.728 fibs.py:4(fib1)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
fib2
32 function calls in 0.001 CPU seconds
Ordered by: standard name
198 Perforance
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.001 0.001 <string>:1(<module>)
30 0.001 0.000 0.001 0.000 fibs.py:13(fib2)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
- per)ormance do clculo da sRrie de (ibonacci usando um lao Fue preenche um
dicionrio R muito mais e)iciente do Fue a vers:o usando recurs:o, Fue )a. muitas
chamadas de )un:o.
5 mdulo tieit serve para )a.er #enchar" de peFuenos trechos de cdigo
E+
. 5 mdulo )oi
proJetado para evitar as )alhas mais comuns Fue a)etam programas usados para )a.er
#enchar"s.
E>emplo:
i"port timeit
# Lista dos quadrados de 1 a 1000
cod = '''s = []
for i in xrange(1, 1001):
s.append(i ** 2)
'''
print timeit.Timer(cod).timeit()
# Com Generator Expression
cod = 'list(x ** 2 for x in xrange(1, 1001))'
print timeit.Timer(cod).timeit()
# Com List Comprehesion
cod = '[x ** 2 for x in xrange(1, 1001)]'
print timeit.Timer(cod).timeit()
%a<da:
559.372637987
406.465490103
326.330293894
5 List 2oprehension R mais e)iciente do Fue o lao tradicional.
5utra )orma de melhorar a per)ormance de uma aplica:o R usando o Psyco, Fue R uma
E+ 5 mdulo cProfile n:o R apropriado para avaliar peFuenos trechos de cdigo. 5 mdulo tieit R mais
adeFuado pois e>ecuta o cdigo vrias ve.es durante a avalia:o.
% c0digo $ passado como texto.
Perforance 199
espRcie de Must In 2opiler T729U. 1urante a e>ecu:o, ele tenta otimi.ar o cdigo da
aplica:o e, por isso, o mdulo deve ser importado antes do cdigo a ser otimi.ado To
inicio do mdulo principal da aplica:o R um lugar adeFuadoU.
E>emplo Tcom o Dltimo trecho de cdigo avaliado no e>emplo anteriorU:
i"port psyco
# Tente otimizar tudo
psyco.full()
i"port timeit
# Lista dos quadrados de 1 a 1000
cod = '[x ** 2 for x in xrange(1, 1001)]'
print timeit.Timer(cod).timeit()
%a<da:
127.678481102
5 cdigo )oi e>ecutado mais de duas ve.es mais rpido do Fue antes. Para isso, )oi
necessrio apenas acrescentar duas linhas de cdigo.
PorRm, o Psyco deve ser usado com alguns cuidados, pois em alguns casos ele pode n:o
conseguir otimi.ar ou atR piorar a per)ormance
E!
. -s )un@es ap<= e filter<= devem ser
evitadas e mdulos escritos em ", como o re Te>press@es regularesU devem ser marcados
com a )un:o cannotcopile<= para Fue o Psyco os ignore. 5 mdulo )ornece )ormas de
otimi.ar apenas determinadas partes do cdigo da aplica:o, tal como a )un:o profile<=,
Fue s otimi.a as partes mais pesadas do aplicativo, e uma )un:o log<= Fue analisa a
aplica:o, para contornar estas situa@es.
-lgumas dicas sobre otimi.a:o:
Bantenha o cdigo simples.
5timi.e apenas o cdigo aonde a per)ormance da aplica:o R realmente cr<tica.
,se )erramentas para identi)icar os gargalos no cdigo.
Evite )un@es recursivas.
,se os recursos nativos da linguagem. -s listas e dicionrios do Python s:o muito
otimi.ados.
E! E>istem algumas )un@es em Fue o Psyco tem o e)eito de redu.ir a velocidade do programa, pois o
prprio Psyco consome "P, tambRm. -lRm disso, o Psyco tambRm )a. com Fue a aplica:o consuma mais
memria.
'00 Perforance
,se List 2oprehensions ao invRs de laos para processar listas usando e>press@es
simples.
Evite )un@es dentro de laos. (un@es podem receber e devolver listas.
,se geradores ao invRs de )un@es para grandes seFGHncias de dados.
Perforance '01
Empacotamento e distri2uio de aplicaes
Ieralmente R bem mais simples distribuir aplica@es na )orma de binrio, em Fue basta
rodar um e>ecutvel para iniciar a aplica:o, Fue instalar todas as dependHncias
necessrias em cada mFuina aonde se deseJa e>ecutar a aplica:o.
E>istem vrios so)tSares Fue permitem gerar e>ecutveis a partir de um programa )eito
em Python, como o Pye>e
EE
e c>\(ree.e
E$
.
5 Pye>e s )unciona na plata)orma CindoSs, porRm possui muitos recursos, podendo
gerar e>ecutveis com inter)ace de te>to, gr)icos, servios Tprogramas Fue rodam sem
interven:o do usurio, de )orma semelhante aos daeons nos sistemas ,82MU e servidores
"5B TarFuitetura de componentes da Bicroso)tU.
5 c>\(ree.e R portvel, podendo rodar em ambientes ,82M, porRm R bem menos verstil
Fue o Pye>e.
Para usar o Pye>e, R preciso criar um script, Fue normalmente se chama Wsetup.pyX, Fue
EE 1ocumenta:o, )ontes e binrios de instala:o podem ser encontrados em: http://SSS.pye>e.org/.
E$ 1ocumenta:o, )ontes e binrios de instala:o para vrias plata)ormas podem ser encontrados em:
http://starship.python.net/creS/atuining/c>\(ree.e/.
Fontes
5A.p)9
F)tecode
5A.p)c U A.p)o9
Fin:rios
Interpretador e
depend%ncias
1ompilao Empacotamento
Instalador
Fin:rios
'0' Perforance
di. ao Pye>e o Fue R necessrio para gerar o e>ecutvel.
E>emplo de Wsetup.pyX:
# -*- coding: latin1 -*-
"""
Exemplo de uso do py2exe
"""
fro" distutils.core i"port setup
i"port py2exe
setup(name = 'SIM - Sistema Interativo de Msica',
service = ['simservice'],
console = ['sim.py', 'simimport.py'],
windows = ['simgtk.py'],
options = #'py2exe': #
'optimize': 2,
'includes': ['atk', 'gobject', 'gtk','gtk.glade',
'pango', 'cairo', 'pangocairo']
$$,
data_files=[('',['janela.glade', 'sim.ico'])],
description = 'Primeira Verso...',
version = '1.0')
8o e>emplo, temos um sistema Fue R composto por dois utilitrios de linha comando, um
aplicativo com inter)ace gr)ica e um servio. 5 aplicativo com I,2 depende do I9Z[
para )uncionar e )oi desenvolvido usando Ilade.
Entre os parAmetros do Pye>e, os mais usuais s:o:
nae: nome da aplica:o.
service: lista de servios.
console: lista de programas com inter)ace de te>to.
!indo!s: lista de programas com inter)ace gr)ica.
optionsQNpy'e3eNR: dicionrio com op@es Fue alteram o comportamento do Pye>e:
optii>e: ' Totimi.a:o desativada, #ytecode padr:oU, # Totimi.a:o ativada, eFuivale
ao parAmetro W-5X do interpretadorU ou Totimi.a:o com remo:o de )oc %trings
ativada, eFuivale ao parAmetro W-55X do interpretadorU
includes: lista de mdulos Fue ser:o inclu<dos como dependHncias. Ieralmente, o
Py'e3e detecta as dependHncias sem necessidade de usar esta op:o.
dataFfiles: outros arFuivos Fue )a.em parte da aplica:o, tais como imagens, <cones e
arFuivos de con)igura:o.
description: comentrio.
version: vers:o da aplica:o, como string.
Para gerar o e>ecutvel, o comando R:
Perforance '0-
python setup.py py2exe
5 Pye>e criar duas pastas:
#uild: arFuivos temporrios.
dist: arFuivos para distribui:o.
Entre os arFuivos para distribui:o, WS*>popen.e>eX R necessrio apenas para as vers@es
antigas do CindoSs T*! e *;U e pode ser removido sem problemas em vers@es mais
recentes.
Pela linha de comando tambRm R poss<vel passar algumas op@es interessantes, como o
parAmetro W-b#X, para gerar menos arFuivos para a distribui:o.
5 c>\(ree.e R um utilitrio de linha de comando.
FreezePython -OO -c sim.py
- op:o W-cX )a. com Fue o #ytecode seJa comprimido no )ormato >ip.
FreezePython -OO --include-modules=atk,cairo,pango,pangocairo simgtk.py
- op:o W--include-modulesX, permite passar uma lista de mdulos Fue ser:o inclu<dos na
distribui:o.
9anto o Pye>e Fuanto o c>\(ree.e n:o s:o compiladores. 5 Fue eles )a.em R empacotar
os #ytecodes da aplica:o, suas dependHncias e o interpretador em si em Tpelo menosU um
arFuivo e>ecutvel Te arFuivos au>iliaresU Fue n:o dependem do ambiente aonde )oram
gerados. "om isso, a distribui:o do aplicativo se torna bem mais simples. Entretanto, n:o
h ganho de per)ormance em gerar e>ecutveis, tirando na carga da aplica:o para a
memria em alguns casos.
Eles tambRm n:o geram programas de instala:o. Para isso, R necessrio o uso de um
so)tSare espec<)ico. 5s instaladores s:o gerados por aplicativos Fue se encarregam de
automati.ar tare)as comuns do processo de instala:o. %:o e>emplos de so)tSares dessa
categoria: 2nno %etup
E;
e 8%2%
E*
.
E; 1ocumenta:o e binrios de instala:o dispon<veis em: http://SSS.Jrso)tSare.org/isin)o.php.
E* Endereo do proJeto: http://nsis.source)orge.net/Bain\Page.
'0. /3ercAcios VI
Exerccios VI
#. 2mplementar um mdulo com uma )un:o tri#onacci<n= Fue retorne uma lista de n
nDmeros de 9ribonacci, aonde n R o parAmetro da )un:o. (aa testes da )un:o caso o
mdulo seJa e>ecutado como principal.
. 2mplementar:
um servidor Fue publiFue um obJeto distribu<do e este evoFue a )un:o tri#onacci.
um cliente Fue use o obJeto distribu<do para calcular a seFGHncia de 9ribonacci.
EpLndices '00
3p/ndices
2ntegra:o com /lender.
2ntegra:o com /r5))ice.org.
2ntegra:o com Linguagem ".
2ntegra:o com .8E9.
6espostas dos e>erc<cios.
'08 EpLndices
Inte!rao com #lender
Python pode ser usado como linguagem script em vrias aplica@es para automati.ar
tare)as e/ou adicionar novas )uncionalidades. Entre elas, est o /lender
$'
, Fue R um
so)tSare de modelagem &1 de cdigo aberto, Fue pode gerar anima@es e tambRm pode
ser usado como $ae /ngine Tin)raestrutura especiali.ada para cria:o de Jogos para
computadorU.
8o /lender, uma cena R composta por obJetos, Fue precisam ser )i>ados em posi@es e
conectados a cena. %e o obJeto n:o estiver conectado a cena, ele R eliminado ao )im do
processamento. 8ormalmente, uma cena contRm pelo menos uma )onte de lu., uma
cAmera e eshes Tmalhas Fue representam os obJetos &1U, Fue podem usar vrios materiais
e estes podem ter vrias te>turas. 9e>turas s:o imagens bidimensionais Tprocedurais ou
rasterU Fue podem ser usadas nos materiais aplicados as super)<cies dos obJetos, alterando
vrias propriedades, tais como re)le>:o, translucHncia, colora:o e enrugamento T#upU da
super)<cie.
,ma malha R um conJunto de pontos TvRrticesU, interligados por linhas TarestasU Fue
)ormam super)<cies T)acesU de um obJeto.
$' 1ocumenta:o, )ontes e binrios podem ser encontrados em: http://SSS.blender.org/.
EpLndices '09
"om Python R poss<vel acessar todas essas estruturas do /lender atravRs de mdulos:
7lender: permite abrir arFuivos, salvar e outras )un@es correlatas.
D#Ject: opera@es com obJetos &1.
1aterials: manipula:o de materiais.
*e3tures: manipula:o de te>turas.
(orld: manipula:o do ambiente da cena.
(lu>o para a cria:o de um cenrio &1 no /lender:
E>emplo de cdigo para a cria:o de uma cena:
i"port math
i"port Blender
# Pega a cena atual
cena = Blender.Scene.GetCurrent()
# Elementos da cena "default"
camera = Blender.Object.Get()[0]
cubo = Blender.Object.Get()[1]
lamp = Blender.Object.Get()[2]
Cria
estruturas
Materiais
Cria
Materiais
Cria
Texturas
Aplica
Texturas
Texturas
Estruturas
Aplica
Materiais
Renderiza
Aplica
Estruturas
Cria cena
Imagem
final
Cena
'08 EpLndices
# Move a camera
camera.setLocation(8., !8., 4.)
camera.setEuler(math.radians(70), 0.,
math.radians(45))
# Muda a lente
camera.data.lens = 25
# Remove da cena o objeto "default"
cena.objects.unlink(cubo)
# Altera a intensidade da luz
lamp.data.energy = 0.8
# E a cor
lamp.data.col = (1., 1., 0.9)
# Cria outra fonte de luz
lamp1 = Blender.Lamp.New('Lamp')
lamp1.energy = 0.7
lamp1.col = (0.9, 1., 1.)
_lamp1 = Blender.Object.New('Lamp')
# Muda o lugar da fonte (default = 0.0, 0.0, 0.0)
_lamp1.setLocation(6., !6., 6.)
# "Prende" a fonte de luz na cena
_lamp1.link(lamp1)
cena.objects.link(_lamp1)
# Cria outra fonte de luz
lamp2 = Blender.Lamp.New('Lamp')
lamp2.energy = 0.7
lamp1.col = (1., 0.9, 1.)
_lamp2 = Blender.Object.New('Lamp')
_lamp2.setLocation(!6., !6., 6.)
_lamp2.link(lamp2)
cena.objects.link(_lamp2)
# Cria um material
material1 = Blender.Material.New('newMat1')
material1.rgbCol = [.25, .25, .32]
material1.setAlpha(1.)
# Cria uma textura
textura1 = Blender.Texture.Get()[0]
textura1.setType('Clouds')
textura1.noiseType = 'soft'
textura1.noiseBasis = Blender.Texture.Noise['VORONOICRACKLE']
# Coloca no material
material1.setTexture(0, textura1)
mtex1 = material1.getTextures()[0]
mtex1.col = (.18, .18, .22)
EpLndices '09
mtex1.mtNor = 1
mtex1.neg = True
mtex1.texco = Blender.Texture.TexCo['GLOB']
material1.mode += Blender.Material.Modes['RAYMIRROR']
material1.rayMirr = 0.3
material1.glossMir = 0.6
# Cria o piso
mesh = Blender.Mesh.Primitives.Plane(40.)
piso = cena.objects.new(mesh,'Mesh')
# Rotaciona o piso
piso.setEuler(0., 0., math.radians(45))
# Coloca o material no piso
piso.setMaterials([material1])
piso.colbits = 1
# Cria outro material
material2 = Blender.Material.New('newMat2')
material2.rgbCol = [.68, .76, .77]
material2.setAlpha(1.)
material2.mode += Blender.Material.Modes['RAYMIRROR']
material2.rayMirr = 0.2
material2.glossMir = 0.8
# Coloca textura no outro material
material2.setTexture(0, textura1)
mtex2 = material2.getTextures()[0]
mtex2.col = (.22, .22, .32)
mtex2.mtNor = 1
mtex2.neg = True
mtex2.texco = Blender.Texture.TexCo['GLOB']
# Cria objetos na cena
&ef ob:eto(local, tam, mat, prim=Blender.Mesh.Primitives.Cube):
mesh = prim()
obj = cena.objects.new(mesh, 'Mesh')
obj.setLocation(*local)
obj.size = tam
obj.setMaterials(mat)
obj.colbits = 1
return obj
mat = [material2]
# Cria colunas no fundo
for i in xrange(16):
# Topo da primeira fileira
local = (i ! 8., 8., 2.5)
tam = (.25, .25, .1)
'10 EpLndices
objeto(local, tam, mat)
# Base da primeira fileira
local = (i ! 8., 8., 0.)
objeto(local, tam, mat)
# Corpo da primeira fileira
prim = Blender.Mesh.Primitives.Cylinder
tam = .2, .2, .25

for k in xrange(10):
local = (i ! 8., 8., .25 * k)
objeto(local, tam, mat, prim)
# Topo da segunda fileira
local = (!8., i ! 8., 2.5)
tam = (.25, .25, .1)
objeto(local, tam, mat)
# Base da segunda fileira
local = (!8., i ! 8., 0.)
objeto(local, tam, mat)
# Corpo da segunda fileira
tam = .2, .2, .25

for k in xrange(10):
local = (!8., i ! 8., .25 * k)
objeto(local, tam, mat, prim)
# Aqueduto
local = (!8., i ! 8., 3.)
tam = (.5, .5, .5)
objeto(local, tam, mat)
local = (i ! 8., 8., 3.)
objeto(local, tam, mat)
# Cria colunas em cima do piso
for i in (!3, 3):
for j in range(!2, 4):
# Topo das fileiras X
local = (i, j, 2.5)
tam = (.25, .25, .1)
objeto(local, tam, mat)
# Topo das fileiras Y
local = (j, i, 2.5)
objeto(local, tam, mat)
# Base das fileiras X
EpLndices '11
local = (i, j, .5)
objeto(local, tam, mat)
# Base das fileiras Y
local = (j, i, .5)
objeto(local, tam, mat)
tam = (.2, .2, .25)
# Corpo das fileiras X
for k in xrange(10):
local = (i, j, .25 * k)
objeto(local, tam, mat, prim)
# Corpo das fileiras Y
for k in xrange(10):
local = (j, i, .25 * k)
objeto(local, tam, mat, prim)
# Cria escada
for i in xrange(4):
local = (0., 0., i / 16.)
tam = (2. + (8. ! i) / 4.,2. + (8. ! i) / 4., .25)
objeto(local, tam, mat)
# Cria teto
for i in xrange(35):
local = (0., 0., 2.7 + i / 60.)
tam = (3.5 , 3.5 * ( 1. ! i / 35.), .1)
objeto(local, tam, mat)
# Pega o "mundo"
world = Blender.World.Get()[0]
# Modo "blend" no fundo
world.skytype = 1
# Atualiza a cena
cena.update()
%a<da Trenderi.ada atravRs da cAmera padr:oU:
'1' EpLndices
Para e>ecutar cdigo Python dentro do /lender, R s carregar o programa na Janela de
editor de te>to do /lender e usar a op:o de e>ecu:o no menu.
EpLndices '1-
Inte!rao com #r(ffice?or!
/r5))ice.org R um conhecido pacote de automa:o de escritrios de cdigo aberto, Fue
inclui editor de te>tos, planilha e outros aplicativos. -lRm disso, o /r5))ice.org tambRm
possui:
%uporte ao Python como linguagem de macro, permitindo a automati.a:o de
tare)as e a constru:o de e>tens@es Tadd onsU.
,m servio para atender cone>@es, atravRs de uma -P2 chamada ,85 T4niversal
?et!or" D#JectsU, acess<vel atravRs do Python, entre outras linguagens.
E>emplo de gera:o de relatrio em P1( atravRs do editor de te>to TCriterU, atravRs da
Python ,85 /ridge:
# -*- coding: latin1 -*-
# Para iniciar o BrOffice.org como servidor:
# swriter.exe -headless
# "-accept=pipe,name=py;urp;StarOffice.ServiceManager"
i"port os
i"port uno
fro" com.sun.star.beans i"port PropertyValue
# Dados...
mus = [('Artista', 'Faixa'),
('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'),
('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\'s Ready')]
rows = len(mus)
cols = len(mus[0])
# Inicio do "Boiler Plate"...
# Contexto de componente local
loc = uno.getComponentContext()
# Para resolver URLs
res = loc.ServiceManager.createInstanceWithContext(
'com.sun.star.bridge.UnoUrlResolver', loc)
# Contexto para a URL
con = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')
# Documento corrente
desktop = con.ServiceManager.createInstanceWithContext(
'com.sun.star.frame.Desktop', con)
# Fim do "Boiler Plate"...
'1. EpLndices
# Cria um documento novo no Writer
doc = desktop.loadComponentFromURL('private:factory/swriter',
'_blank', 0, ())
# Cursor de texto
cursor = doc.Text.createTextCursor()
# Muda propriedades
cursor.setPropertyValue('CharFontName', 'Verdana')
cursor.setPropertyValue('CharHeight', 20)
cursor.setPropertyValue('CharWeight', 180)
doc.Text.insertString(cursor, 'Msicas favoritas\n', 0)
# Cria tabela
tab = doc.createInstance('com.sun.star.text.TextTable')
tab.initialize(rows, cols)
doc.Text.insertTextContent(cursor, tab, 0)
# Preenche a tabela
for row in xrange(rows):
for col in xrange(cols):
cel = chr(ord('A') + col) + str(row + 1)
tab.getCellByName(cel).setString(mus[row][col])
# Propriedades para exportar o documento
props = []
p = PropertyValue()
p.Name = 'Overwrite'
p.Value = True # Sobrescreve o documento anterior
props.append(p)
p = PropertyValue()
p.Name = 'FilterName'
p.Value = 'writer_pdf_Export' # Writer para PDF
props.append(p)
# URL de destino
url = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))
# Salva o documento como PDF
doc.storeToURL(url, tuple(props))
# Fecha o documento
doc.close(True)
%a<da Tno arFuivo P1(U:
EpLndices '10
- -P2 do /r5))ice.org R bastante completa e simpli)ica vrias atividades Fue s:o lugar
comum em programas para ambiente des"top.
'18 EpLndices
Inte!rao com Lin!ua!em C
c poss<vel integrar Python e " nos dois sentidos:
Python OP " TPython )a. chamadas a um mdulo compilado em "U.
" OP Python T" evoca o interpretador Python em modo e#eddedU.
P$t*on @A C
5 mdulo escrito em " deve utili.ar as estruturas do Python TFue est:o de)inidas na -P2
de inter)aceU para se comunicar com o interpretador Python.
E>emplo:
// Arquivo: mymodule.c
// Python.h define as estruturas do Python em C
#include <Python.h>
// No Python, mesmo os erros sao objetos
static PyObject *MyModuleErrorN
// Chamando a funcao "system" em C
static PyObject *
mymodule_system(PyObject *self, PyObject *args)
#
const char *commandN
int stsN
// "PyArg_ParseTuple" desempacota a tupla de parametros
// "s" significa que ele deve identificar uma string
if (OPyArg_ParseTuple(args, "s", Pcommand))
// retornando NULL gera uma excessao
// caso falte parametros
return NULLN
// chamando "system":
sts = system(command)N
// "Py_BuildValue" gera objetos que o Python conhece
// "i" significa inteiro
return Py_BuildValue("i", sts)N
$
// Tabela que o Python consulta para resolver
// os metodos do modulo e pode ser usado
// tambem para gerar a documentacao
// por instrospeccao: dir(), help(),...
static PyMethodDef MyModuleMethods[] = #
EpLndices '19
#"system", mymodule_system, METH_VARARGS,
"Executa comandos externos."$,
// Fim da tabela:
#NULL, NULL, 0, NULL$
$N
// inicializacao do modulo:
PyMODINIT_FUNC
initmymodule(3oi&)
#
// O modulo tambem e' um objeto
PyObject *mN
// "Py_InitModule" precisa do nome do modulo e da
// tabela de metodos
m = Py_InitModule("mymodule", MyModuleMethods)N
// Erros...
MyModuleError = PyErr_NewException("mymodule.error",
NULL, NULL)N
// "Py_INCREF" incrementa o numero de referencias do objeto
Py_INCREF(MyModuleError)N
// "PyModule_AddObject" adiciona um objeto ao modulo
PyModule_AddObject(m, "error", MyModuleError)N
$
-o invRs de compilar o mdulo manualmente, use o Python para automati.ar o processo.
Primeiro, crie o script:
# Arquivo: setup.py
fro" distutils.core i"port setup, Extension
mymodule = Extension('mymodule', sources = ['mymodule.c'])
setup(name = 'MyPackage', version = '1.0',
description = 'My Package',
ext_modules = [mymodule])
E para compilar:
python setup.py build
5 binrio compilado ser gerado dentro da pasta WbuildX. 5 mdulo pode ser usado como
FualFuer outro mdulo no Python TatravRs de iportU.
'18 EpLndices
C @A P$t*on
5 inverso tambRm R poss<vel. ,m programa escrito em " pode evocar o interpretador
Python seguindo trHs passos:
2niciali.ar o interpretador.
2nteragir TFue pode ser )eito de diversas )ormasU.
(inali.ar o interpretador.
E>emplo:
// Arquivo: py_call.c
// Python.h com as definicoes para
// interagir com o interpretador
#include <Python.h>
int main()
#
// Inicializa interpretador Python
Py_Initialize()N
// Executando codigo Python
PyRun_SimpleString("import os\n"
"for f in os.listdir('.'):\n"
" if os.path.isfile(f):\n"
" print f, ':', os.path.getsize(f)\n")N
// Finaliza interpretador Python
Py_Finalize()N
return 0N
$
Para compilar, R preciso passar a locali.a:o das headers e li#raries do Python para o
compilador ":
gcc -I/usr/include/python2.5 \
-L/usr/lib/python2.5/config \
-lpython2.5 -opy_call py_call.c
5bserva@es:
Esta -P2 )a. parte do "Python Tporte do Python escrito em "U.
E>istem )erramentas para automati.ar o processo para gerar inter)aces para
sistemas maiores: %C2I, /oost.Python e %2P.
EpLndices '19
Inte!rao com ?+E
2ronPython
$#
R a implementa:o do interpretador Python na linguagem "_. Embora o
proJeto tenha como obJetivo a compatibilidade com "Python, e>istem algumas di)erenas
entre elas. - principal vantagem do 2ronPython em rela:o ao "Python R a integra:o com
componentes baseados no frae!or" .8E9.
5 .8E9 R uma in)ra-estrutura de so)tSare criada pela Bicroso)t para a cria:o e e>ecu:o
de aplica@es. - parte principal do .8E9 R o 2oon Language Kuntie T"L6U, Fue provH
uma sRrie recursos aos programas, como gerenciamento de memria para as aplica@es.
-lRm disso, h um vasto conJunto de bibliotecas de componentes prontos para uso. -s
instru@es das linguagens de programa:o s:o tradu.idas para interediate language T2LU
reconhecida pelo "L6, permitindo Fue vrias linguagens seJam usadas.
1entro dos recursos dispon<veis no frae!or", e>iste o )ynaic Language Kuntie T1L6U,
Fue implementa os servios necessrios para linguagens dinAmicas. 5 2ronPython )a. uso
desses servios.
$# (ontes, binrios, e>emplos, documenta:o e outras in)orma@es podem ser encontrados em:
http://SSS.codeple>.com/CiVi/?ieS.asp>oProJect8ameO2ronPython.
Fontes
")t*on
SEmbolos
Lr3ore
sint:tica
1LC
1ompilao
Ob;etos
Iron")t*on
Nerador IL
''0 EpLndices
Para evocar o modo interativo do 2ronPython:
ipy
Para e>ecutar um programa:
ipy prog.py
-s bibliotecas do "Python podem ser usadas dentro do 2ronPython, desde Fue as vers@es
seJam compat<veis.
E>emplo:
i"port sys
sys.path.append(r'c:\python25\lib')
i"port os
print os.listdir('.')
E>emplo usando um componente .8E9:
fro" System.Diagnostics i"port Process
Process.Start('http://www.w3c.org/')
- )un:o %tart ir evocar o #ro!ser para abrir a ,6L.
5s obJetos .8E9 podem ser usados ao invRs dos #uiltins do Python:
i"port System
fro" System.Collections i"port Hashtable
hash = Hashtable()
hash['baixo'] = '4 cordas'
hash['guitarra'] = '6 cordas'
for item in hash:
print item.Key, '=>', item.Value
- classe Hashta#le tem )uncionalidade semelhante ao dicionrio do Python.
2ntegra:o com outros componentes .8E9 adicionais, como o (indo!s &ors, Fue
crescenta no P3/4%'P/4.
EpLndices ''1
implementa a inter)ace gr)ica, R )eita atravRs do mdulo clr. -ps a importa:o do
mdulo, o 2ronPython passa a usar os tipos do .8E9, ao invRs da biblioteca padr:o do
Python.
E>emplo com (indo!s &ors:
# -*- coding: utf-8 -*-
i"port clr
# Adiciona referncias para esses componentes
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
# Importa os componentes
fro" System.Windows.Forms i"port *
fro" System.Drawing i"port *
# Cria uma janela
frm = Form(Width=200, Height=200)
# Coloca ttulo na janela
frm.Text = 'Mini calculadora Python'
# Cria texto
lbl = Label(Text='Entre com a expresso:',
Left=20, Top=20, Width=140)
# Adiciona a janela
frm.Controls.Add(lbl)
# Cria caixa de texto
txt = TextBox(Left=20, Top=60, Width=140)
# Adiciona a janela
frm.Controls.Add(txt)
# Funo para o boto
&ef on(btn(click(*args):

tr*:
r = repr(eval(txt.Text))
MessageBox.Show(txt.Text + '=' + r, 'Resultado')
e+cept:
MessageBox.Show('No foi possvel avaliar: ' + \
txt.Text, 'Erro')
# Cria boto
btn = Button(Text='Calcular!', Left=20, Top=100, Width=60)
btn.Click += on_btn_click
# Adiciona a janela
frm.Controls.Add(btn)
''' EpLndices
# Mostra a janela
frm.Show()
# Aplicao entra no loop de eventos,
# esperando pela interao do usurio
Application.Run(frm)
2nter)ace do programa:
5 mais comum R usar herana para especiali.ar a Janela, em uma solu:o mais orientada a
obJetos, encapsulando o cdigo da cria:o e manipula:o dos controles.- segunda vers:o
do programa usa herana e inclui um componente de layout: &lo!LayoutPanel.
# -*- coding: utf-8 -*-
"""
Mini calculadora Python
"""
i"port clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
fro" System.Windows.Forms i"port *
fro" System.Drawing i"port *
class Qanela(Form):
"""
EpLndices ''-
Janela principal
"""
&ef ((init(((self):
"""
Inicializa a janela
"""

self.Width=200
self.Height=200
self.Text = 'Mini calculadora Python'
self.lbl = Label(Text='Entre com a expresso:')
self.txt = TextBox()
self.btn = Button(Text='Calcular!')
self.btn.Click += self.on_btn_click
# Layout automtico para os controles
self.panel = FlowLayoutPanel(Dock = DockStyle.Fill)
self.panel.Controls.Add(self.lbl)
self.panel.Controls.Add(self.txt)
self.panel.Controls.Add(self.btn)
self.Controls.Add(self.panel)
self.Show()
Application.Run(self)
&ef on(btn(click(self, *args):
"""
Acontece quando o boto pressionado
"""

tr*:
r = repr(eval(self.txt.Text))
MessageBox.Show(self.txt.Text + ' = ' + r, 'Resultado')
e+cept:
MessageBox.Show('No foi possvel avaliar: ' + \
self.txt.Text, 'Erro')
if __name__ == '__main__':
janela = Janela()
5 2ronPython pode ser usado com o Bono
$
, Fue uma implementa:o Dpen %ource da
especi)ica:o do .8E9. 5 Bono apresenta a vantagem de ser portvel, suportando outras
plata)ormas alRm do CindoSs, porRm n:o implementa todos os componentes do .8E9
$ Endereo do proJeto: http://SSS.mono-proJect.com/Bain\Page.
''. EpLndices
Tcomo o (indo!s &orsU. E>iste tambRm uma 21E para o 2ronPython, chamada
2ronPython %tudio
$&
.
$& 1ispon<vel em: http://SSS.codeple>.com/2ronPython%tudio.
EpLndices ''0
6espostas dos exerccios I
#. 2mplementar duas )un@es:
,ma Fue converta temperatura em graus 2elsius para &ahrenheit+
5utra Fue converta temperatura em graus &ahrenheit para 2elsius.
Lembrando Fue:
%olu:o:
&ef celsius(fahrenheit(c=0):
# round(n, d) => arredonda n em d casas decimais
return round(9. * c / 5. + 32., 2)
&ef fahrenheit(celsius(f=0):

return round(5. * (f ! 32.) / 9., 2)
# Testes
print celsius_fahrenheit(123.0)
print fahrenheit_celsius(253.4)
. 2mplementar uma )un:o Fue retorne verdadeiro se o nDmero )or primo T)also caso
contrrioU. 9estar de # a #''.
%olu:o:
# -*- coding: latin1 -*-
# Testa se o nmero primo
&ef is(pri"e(n):
if n < 2:
return False
for i in range(2, n):
if not n % i:
return False
else:
return True
F=
9
5
C32
''8 EpLndices
# Para x de 1 a 100
for x in range(1, 101):
if is_prime(x):
print x
&. 2mplementar uma )un:o Fue receba uma lista de listas de comprimentos FuaisFuer e
retorne uma lista de uma dimens:o.
%olu:o:
&ef flatten(it):
"""
"Achata" listas...
"""
# Se for uma lista
if isinstance(it, list):
ls = []
# Para cada item da lista
for item in it:
# Evoca flatten() recursivamente
ls = ls + flatten(item)
return ls
else:
return [it]
# Teste
l = [[1, [2]], [3, 4], [[5, 6], 7]]
print flatten(l)
# imprime: [1, 2, 3, 4, 5, 6, 7]
+. 2mplementar uma )un:o Fue receba um dicionrio e retorne a soma, a mRdia e a
varia:o dos valores.
%olu:o:
# -*- coding: latin1 -*-
&ef stat(dic):
# Soma
s = sum(dic.values())
EpLndices ''9
# Mdia
med = s / len(dic.values())
# Variao
var = max(dic.values()) ! min(dic.values())
return s, med, var
!. Escreva uma )un:o Fue:
6eceba uma )rase como parAmetro.
6etorne uma nova )rase com cada palavra com as letras invertidas.
%olu:o:
&ef re3erse@(t):
"""
Usando um loop convencional.
"""
r = t.split()
for i in xrange(len(r)):
r[i] = r[i][::!1]
return ' '.join(r)
&ef re3erseJ(t):
"""
Usando Generator Expression.
"""
return ' '.join(s[::!1] for s in t.split())
# Testes
f = 'The quick brown fox jumps over the lazy dog'
print reverse1(f)
print reverse2(f)
# mostra: "ehT kciuq nworb xof spmuj revo eht yzal god"
E. "rie uma )un:o Fue:
6eceba uma lista de tuplas TdadosU, um inteiro Tchave, .ero por padr:o igualU e um
booleano Treverso, )also por padr:oU.
6etorne dados ordenados pelo item indicado pela chave e em ordem decrescente se
reverso )or verdadeiro.
%olu:o:
''8 EpLndices
&ef or&(tab(dados, chave=0, reverso=False):
# Rotina para comparar as tuplas em sort()
&ef (or&(x, y):
return x[chave] ! y[chave]
dados.sort(_ord, reverse=reverso)
return dados
# Testes
t = [(1, 2, 0), (3, 1, 5), (0, 3, 3)]
print ord_tab(t)
print ord_tab(t, 1)
print ord_tab(t, 2)
# Mostra:
# [(0, 3, 3), (1, 2, 0), (3, 1, 5)]
# [(3, 1, 5), (1, 2, 0), (0, 3, 3)]
# [(1, 2, 0), (0, 3, 3), (3, 1, 5)]
EpLndices ''9
6espostas dos exerccios II
#. 2mplementar um programa Fue receba um nome de arFuivo e gere estat<sticas sobre o
arFuivo TnDmero de caracteres, nDmero de linhas e nDmero de palavrasU
%olu:o #:
TEconomi.ando memriaU
# -*- coding: latin1 -*-
filename = raw_input('Nome do arquivo: ')
in_file = file(filename)
c, w, l = 0, 0, 0
# Para cada linha do arquivo
for line in in_file:
# Soma 1 ao nmero de linhas
l += 1
# Soma o tamanho da linha ao nmero de caracteres
c += len(line)
# Soma a quantidade de palavra
w += len(line.split())
in_file.close()
print 'Bytes: %d, palavras: %d, linhas: %s' % (c, w, l)
%olu:o :
TEconomi.ando cdigoU
# -*- coding: latin1 -*-
filename = raw_input('Nome do arquivo: ')
# L o arquivo inteiro para uma string
chars = file(filename).read()
c = len(chars)
w = len(chars.split())
'-0 EpLndices
# Soma o nmero de caracteres de nova linha
l = chars.count('\n')
print 'Bytes: %d, palavras: %d, linhas: %s' % (c, w, l)
. 2mplementar um mdulo com duas )un@es:
atri3Fsu<Gatrices=, Fue retorna a matri. soma de matri.es de duas dimens@es.
caelFcase<s=, Fue converte nomes para "amel"ase.
%olu:o:
# -*- coding: latin1 -*-
&ef "atri+(su"(*matrices):
"""
Soma matrizes de duas dimenses.
"""
# Pegue a primeira matriz
mat = matrices[0]
# Para cada matriz da segunda em diante
for matrix in matrices[1:]:
# Para cada linha da matriz
for x, row in enumerate(matrix):
# Para cada elemento da linha
for y, col in enumerate(row):
# Some na matriz de resposta
mat[x][y] += col
return mat
&ef ca"el(case(s):
"""
Formata strings DestaForma.
"""
return ''.join(s.title().split())
if __name__ == '__main__':
# Testes
print matrix_sum([[1, 2], [3, 4]], [[5, 6], [7, 8]])
print camel_case('close to the edge')
&. 2mplementar uma )un:o Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
EpLndices '-1
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
%cript para gerar os dados de teste:
# -*- coding: latin1 -*-
# Importa o mdulo para gerar
# nmeros randmicos
i"port random
# Abre o arquivo
csv = file('test.csv', 'w')
for i in xrange(100):
r = []
for i in xrange(10):
# random.randrange() escolhe nmeros
# dentro de um intervalo. A sintaxe
# a mesma da funo range()
r.append('%04d' %random.randrange(1000))
csv.write(','.join(r) + '\n')
# Fecha o arquivo
csv.close()
%olu:o:
# -*- coding: latin1 -*-
&ef loa&(cs3(fn):
tr*:
# L todas as linhas do arquivo
lines = file(fn).readlines()
new_lines = []
for line in lines:
new_line = line.strip()
# Se houver caracteres na linha
if new_line:
# Quebra nas vrgulas, converte para tupla e
# acrescenta na sada
new_lines.append(tuple(new_line.split(',')))
'-' EpLndices
return new_lines
# Tratamento de exceo
e+cept:
print 'Ocorreu um erro ao ler o arquivo', fn
raise SystemExit
+. 2mplementar um mdulo com duas )un@es:
split<fn6 n=, Fue Fuebra o arFuivo )n em partes de n #ytes e salva com nomes
seFGenciais Tse fn O arF.t>t, ent:o arF\''#.t>t, arF\''.t>t, ... U
Join<fn6 fnlist= Fue Junte os arFuivos da lista fnlist em um arFuivo s fn.
%olu:o:
# -*- coding: latin1 -*-
"""
breaker.py
"""
# Quebra o arquivo em fatias de n bytes
&ef split(fn, n):
bytes = list(file(fn, 'rb').read())
name, ext = fn.split('.')
num = 1
while bytes:
out = ''.join(bytes[:n])
&el bytes[:n]
newfn = '%s_%3d.%s' % (name, num, ext)
file(newfn, 'wb').write(out)
num += 1
# Junta as fatias em um arquivo
&ef :oin(fn, fnlist):
out = ''
for f in fnlist:
out += file(f, 'rb').read()
file(fn, 'wb').write(out)
if __name__ == '__main__':
# Teste
i"port glob
split('breaker.py', 20)
JoinTYbreaVer.pyY, sortedTglob.globTYbreaVer\`.pyYUUU
EpLndices '--
!. "rie um script Fue:
"ompare a lista de arFuivos em duas pastas distintas.
Bostre os nomes dos arFuivos Fue tem conteDdos di)erentes e/ou Fue e>istem em
apenas uma das pastas.
%olu:o:
# -*- coding: latin1 -*-
i"port os
# Nomes das pastas
pst1 = 'teste1'
pst2 = 'teste2'
# Lista o contedo das pastas
lst1 = os.listdir(pst1)
lst2 = os.listdir(pst2)
for fl in lst1:

if fl in lst2:
# L os arquivos e compara:
if file(os.path.join(pst1, fl)).read() <> \
file(os.path.join(pst2, fl)).read():
print fl, 'diferente'
# O arquivo no est na segunda pasta
else:
print fl, 'apenas em', pst1
for fl in lst2:
# O arquivo no est na primeira pasta
if not fl in lst1:
print fl, 'apenas em', pst2
E. (aa um script Fue:
Leia um arFuivo te>to.
"onte as ocorrHncias de cada palavra.
Bostre os resultados ordenados pelo nDmero de ocorrHncias.
%olu:o:
# -*- coding: latin1 -*-
'-. EpLndices
i"port string
# L o arquivo
texto = file('note.txt').read()
texto_limpo = ''
# Limpa o texto
for car in texto:
if not car in string.punctuation:
texto_limpo += car
# Separa as palavras
palavras = texto_limpo.split()
# Conta
resp = #$
for palavra in palavras:
resp[palavra] = resp.get(palavra, 0) + 1
saida = resp.items()
# Ordena
&ef c"p(x, y):
return x[!1] ! y[!1]
saida.sort(cmp=cmp, reverse=True)
# Imprime
for k, v in saida:
print k, '=>', v
EpLndices '-0
6espostas dos exerccios III
#. 2mplementar um gerador de nDmeros primos.
%olu:o:
# -*- coding: latin1 -*-
# Verifica se o nmero primo
&ef is(pri"e(n):
if n < 2:
return False
for i in xrange(2, n):
if not n % i:
return False
else:
return True
# Gerador de nmeros primos
&ef pri"e('en():
i = 1
while True:
if is_prime(i): *iel& i
i += 1
# Teste: 100 primeiros primos
prime_iter = prime_gen()
for i in range(100):
print prime_iter.next()
. 2mplementar o gerador de nDmeros primos como uma e>press:o Tdica: use o mdulo
itertoolsU.
%olu:o:
# -*- coding: latin1 -*-
fro" itertools i"port count
# Verifica se o nmero primo
&ef is(pri"e(n):
'-8 EpLndices
if n < 2:
return False
for i in xrange(2, n):
if not n % i:
return False
else:
return True
# Generator Expression
primes = (i for i in count() if is_prime(i))
# Teste: 100 primeiros primos
for i in range(100):
print primes.next()
&. 2mplementar um gerador Fue produ.a tuplas com as cores do padr:o 6I/ T6, I e /
variam de ' a !!U usando 3range<= e uma )un:o Fue produ.a uma lista com as tuplas
6I/ usando range<=. "ompare a per)ormance.
%olu:o:
# -*- coding: latin1 -*-
&ef r'b(lst():
rgb = []
for r in range(256):
for g in range(256):
for b in range(256):
rgb.append((r, g, b))
return rgb
&ef r'b('en():
for r in xrange(256):
for g in xrange(256):
for b in xrange(256):
*iel& (r, g, b)
i"port time
tt = time.time()
l = rgb_lst()
print time.time() ! tt
tt = time.time()
EpLndices '-9
for color in rgb_gen(): pass
print time.time() ! tt
+. 2mplementar um gerador Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
%olu:o:
# -*- coding: latin1 -*-
&ef loa&(cs3(fn):
tr*:
for line in file(fn):
new_line = line.strip()
if new_line:
*iel& tuple(new_line.split(','))
e+cept:
print 'Ocorreu um erro ao ler o arquivo', fn
raise SystemExit
# Teste
for line in load_csv('teste.csv'):
print line
'-8 EpLndices
6espostas dos exerccios IV
#. "rie uma classe Fue modele um Fuadrado, com um atributo lado e os mRtodos: mudar
valor do lado, retornar valor do lado e calcular rea.
%olu:o:
# -*- coding: latin1 -*-
class ;8uare(object):
"""
Classe que modela um quadrado.
"""
&ef ((init(((self, side=1):
self.side = side
&ef 'et(si&e(self):
return self.side

&ef set(si&e(self, side):
self.side = side

&ef 'et(area(self):
# A rea o quadrado do lado
return self.side ** 2
# Testes
square = Square(2)
square.set_side(3)
print square.get_area()
. "rie uma classe derivada de lista com um mRtodo retorne os elementos da lista sem
repeti:o.
%olu:o:
# -*- coding: latin1 -*-
class >ist(list):
&ef uni8ue(self):
"""
EpLndices '-9
Retorna a lista sem repeties.
"""
res = []
for item in self:
if item not in res:
res.append(item)
return res
# Teste
l = List([1, 1, 2, 2, 2, 3, 3])
print l.unique()
&. 2mplemente uma classe 2arro com as seguintes propriedades:
,m ve<culo tem um certo consumo de combust<vel Tmedidos em Vm / litroU e uma
certa Fuantidade de combust<vel no tanFue.
5 consumo R especi)icado no construtor e o n<vel de combust<vel inicial R '.
(ornea um mRtodo over<"= Fue receba a distAncia em Fuillmetros e redu.a o
n<vel de combust<vel no tanFue de gasolina.
(ornea um mRtodo gasolina<=, Fue retorna o n<vel atual de combust<vel.
(ornea um mRtodo a#astecer<litros=, para abastecer o tanFue.
%olu:o:
# -*- coding: latin1 -*-
class 0arro(object):
"""
Classe que calcula o consumo de um carro.
"""
tanque = 0
&ef ((init(((self, consumo):
self.consumo = consumo
&ef "o3er(self, km):
gasto = self.consumo * km
if self.tanque > gasto:
self.tanque = self.tanque ! gasto
else:
'.0 EpLndices
self.tanque = 0
&ef abastecer(self, litros):
self.tanque = self.tanque + litros
&ef 'asolina(self):
return self.tanque
# Teste
carro = Carro(consumo=5)
carro.abastecer(litros=220)
carro.mover(km=20)
print carro.gasolina()
+. 2mplementar uma classe Vetor:
"om coordenadas >, y e ..
Nue suporte soma, subtra:o, produto escalar, produto vetorial.
Nue calcule o mdulo Tvalor absolutoU do vetor.
%olu:o:
# -*- coding: latin1 -*-
i"port math
class Retor(object):
&ef ((init(((self, x, y, z):
self.x = float(x)
self.y = float(y)
self.z = float(z)
&ef ((repr(((self):
return 'Vetor(x=%.1f, y=%.1f, z=%.1f)' % (self.x, self.y, self.z)

&ef ((a&&(((self, v):
x = self.x + v.x
y = self.y + v.y
z = self.z + v.z
return Vetor(x, y, z)
&ef ((sub(((self, v):
EpLndices '.1
x = self.x ! v.x
y = self.y ! v.y
z = self.z ! v.z
return Vetor(x, y, z)
&ef ((abs(((self):
tmp = self.x ** 2 + self.y ** 2 + self.z ** 2
return math.sqrt(tmp)
&ef (("ul(((self, v):
if isinstance(v, Vetor):
x = self.y * v.z ! v.y * self.z
y = self.z * v.x ! v.z * self.x
z = self.x * v.y ! v.x * self.y
else:
x = self.x * float(v)
y = self.y * float(v)
z = self.z * float(v)
return Vetor(x, y, z)
vetor = Vetor(1, 2, 3)
print abs(vetor)
print Vetor(4.5, 5, 6) + vetor
print Vetor(4.5, 5, 6) ! vetor
print Vetor(4.5, 5, 6) * vetor
print Vetor(4.5, 5, 6) * 5
!. 2mplemente um mdulo com:
,ma classe Ponto, com coordenadas >, y e ..
,ma classe Linha, com dois pontos - e /, e Fue calcule o comprimento da linha.
,ma classe *riangulo, com dois pontos -, / e ", Fue calcule o comprimento dos
lados e a rea.
%olu:o:
class 2onto(object):

&ef ((init(((self, x, y, z):
# Coordenadas
self.x = float(x)
self.y = float(y)
self.z = float(z)

&ef ((repr(((self):
'.' EpLndices

return '(%2.1f, %2.1f, %2.1f)' % \
(self.x, self.y, self.z)
class >inha(object):

&ef ((init(((self, a, b):
# Pontos
self.a = a
self.b = b
&ef co"p(self):

x = self.b.x ! self.a.x
y = self.b.y ! self.a.y
z = self.b.z ! self.a.z

return round((x ** 2 + y ** 2 + z ** 2)\
** .5, 1)

&ef ((repr(((self):

return '%s => %s' % \
(self.a, self.b)
class 6rian'ulo(object):

&ef ((init(((self, a, b, c):

# Vertices
self.a = a
self.b = b
self.c = c

# Lados
self.ab = Linha(a, b)
self.bc = Linha(b, c)
self.ca = Linha(c, a)
&ef area(self):
# Comprimento dos lados
ab = self.ab.comp()
bc = self.bc.comp()
ca = self.ca.comp()
# Semiperimetro
p = (ab + bc + ca) / 2.
# Teorema de Heron
return round((p * (p ! ab) * (p ! bc) \
EpLndices '.-
* (p ! ca)) ** .5, 1)

&ef ((repr(((self):

return '%s => %s => %s)' % \
(self.a, self.b, self.c)
# Testes
a = Ponto(2, 3, 1)
b = Ponto(5, 1, 4)
c = Ponto(4, 2, 5)
l = Linha(a, b)
t = Triangulo(a, b, c)
print 'Ponto A:', a
print 'Ponto B:', b
print 'Ponto C:', c
print 'Linha:', l
print 'Comprimento:', l.comp()
print 'Triangulo:', t
print 'Area:', t.area()
# Mostra:
# Ponto A: (2.0, 3.0, 1.0)
# Ponto B: (5.0, 1.0, 4.0)
# Ponto C: (4.0, 2.0, 5.0)
# Linha: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0)
# Comprimento: 4.7
# Triangulo: (2.0, 3.0, 1.0) => (5.0, 1.0, 4.0) => (4.0, 2.0, 5.0))
# Area: 3.9
'.. EpLndices
6espostas dos exerccios V
#. 2mplementar uma classe Enial com os atributos: nome, espRcie, gHnero, peso, altura e
idade. 5 obJeto derivado desta classe dever salvar seu estado em arFuivo com um
mRtodo chamado WsalvarX e recarregar o estado em um mRtodo chamado Wdes)a.erX.
%olu:o:
# -*- coding: latin1 -*-
i"port pickle
class 7ni"al(object):
"""
Classe que representa um animal.
"""
attrs = ['nome', 'especie', 'genero', 'peso', 'altura', 'idade']
&ef ((init(((self, **args):
# Crie os atributos no objeto a partir da lista
# Os atributos tem None como valor default
for attr in self.attrs:
setattr(self, attr, args.get(attr, )one))

&ef ((repr(((self):
dic_attrs = #$
for attr in self.attrs:
dic_attrs[attr] = getattr(self, attr)
return 'Animal: %s' % str(dic_attrs)
&ef sal3ar(self):
"""
Salva os dados do animal.
"""
dic_attrs = #$
for attr in self.attrs:
dic_attrs[attr] = getattr(self, attr)
pickle.dump(dic_attrs, file('a.pkl', 'w'))
&ef &esfaSer(self):
"""
Restaura os ltimos dados salvos.
"""
EpLndices '.0
attrs = pickle.load(file('a.pkl'))
for attr in attrs:
setattr(self, attr, attrs[attr])
# Teste
gato = Animal(nome='Tinker', especie='Gato', genero='m',
peso=6, altura=0.30, idade=4)
gato.salvar()
gato.idade = 5
print gato
gato.desfazer()
print gato
. 2mplementar uma )un:o Fue )ormate uma lista de tuplas como tabela =9BL.
%olu:o:
# -*- coding: latin1 -*-
# O mdulo StringIO implementa uma classe
# de strings que se comportam como arquivos
i"port StringIO
&ef table(for"at(dataset):
"""
Classe que representa um animal.
"""
out = StringIO.StringIO()
out.write('<table>')
for row in dataset:
out.write('<tr>')
for col in row:
out.write('<td>%s</td>' % col)
out.write('</tr>')
out.write('</table>')
out.seek(0)
return out.read()
&. 2mplementar uma aplica:o (e# com uma sauda:o dependente do horrio Te>emplos:
W/om dia, s:o '*:''.X, W/oa tarde, s:o #&:''.X e W/oa noite, s:o &:''.XU.
%olu:o:
'.8 EpLndices
# -*- coding: latin1 -*-
i"port time
i"port cherrypy
class /oot(object):
"""
Raiz do site.
"""
@cherrypy.expose
&ef in&e+(self):
"""
Exibe a saudao conforme o horrio do sistema.
"""
# L a hora do sistema
hour = '%02d:%02d' % time.localtime()[3:5]
if '06:00' < hour <= '12:00':
salute = 'Bom dia'
elif '12:00' < hour <= '18:00':
salute = 'Boa tarde'
else:
salute = 'Boa noite'
# Retorna a mensagem para o browser
return '%s, so %s.' % (salute, hour)
cherrypy.quickstart(Root())
+. 2mplementar uma aplica:o (e# com um )ormulrio Fue receba e>press@es Python e
retorne a e>press:o com seu resultado.
%olu:o:
# -*- coding: latin1 -*-
i"port traceback
i"port cherrypy
class /oot(object):
# Modelo para a pgina HTML
template = '''
<html><body>
<form action="/">
<input type="text" name="exp" value="%s" />
<input type="submit" value="enviar">
EpLndices '.9
<pre>%s</pre>
</body></html>'''
@cherrypy.expose
&ef in&e+(self, exp=''):
out = ''
if exp:
# Tente avaliar a expresso
tr*:
out = eval(exp)
# Se der errado, mostre a mensagem do erro
e+cept:
out = traceback.format_exc()
return self.template % (exp, out)
cherrypy.quickstart(Root())
'.8 EpLndices
6espostas dos exerccios VI
#. 2mplementar um mdulo com uma )un:o tri#onacci<n= Fue retorne uma lista de n
nDmeros de 9ribonacci, aonde n R o parAmetro da )un:o. (aa testes da )un:o caso o
mdulo seJa e>ecutado como principal.
%olu:o:
# -*- coding: latin1 -*-
&ef tribonacci(n):
"""
Retorna uma lista com n elementos de Tribonacci.

>>> t = [1, 1, 2, 4, 7, 13, 24, 44, 81, 149, \
274, 504, 927, 1705, 3136, 5768, 10609, 19513, \
35890, 66012, 121415, 223317]
>>> t == tribonacci(22)
True
>>> tribonacci('22')
Traceback (most recent call last):
File "pyro_server.py", line 26, in <module>
print Dist().tribonacci('22')
File "pyro_server.py", line 14, in tribonacci
raise TypeError
TypeError
"""
if type(n) is not int:
raise TypeError
# Os 3 primeiros elementos da seqncia
t = [1, 1, 2]
if n < 4:
return t[:n]
for i in range(3, n):

# Soma os 3 elementos finais
t.append(sum(t[!3:]))

return t
&ef (&octest():
"""
Evoca o doctest.
"""

i"port doctest
EpLndices '.9
doctest.testmod()
if __name__ == "__main__":
_doctest()
. 2mplementar:
um servidor Fue publiFue um obJeto distribu<do e este evoFue a )un:o tri#onacci.
um cliente Fue use o obJeto distribu<do para calcular a seFGHncia de 9ribonacci.
%olu:o:
%ervidor:
# -*- coding: latin1 -*-
i"port Pyro.core
# Importa o mdulo com a funo
i"port trib
class Iist(Pyro.core.ObjBase):
@staticmethod
&ef tribonacci(n):
return trib.tribonacci(n)
if __name__ == '__main__':
# Define a porta TCP/IP usada pelo Pyro
Pyro.config.PYRO_PORT = 8888

# Define o limite de cliente ao mesmo tempo
Pyro.config.PYRO_MAXCONNECTIONS = 2000

Pyro.core.initServer()

# norange=1 faz com que o Pyro sempre use a mesma porta
daemon = Pyro.core.Daemon(norange = 1)
# Define o limite de tempo
daemon.setTimeout(300)
uri = daemon.connect(Dist(),'dist')
daemon.requestLoop()
"liente:
'00 EpLndices
# -*- coding: latin1 -*-
i"port Pyro.core
# URL com a porta
url = 'PYROLOC://127.0.0.1:8888/dist'
proxy = Pyro.core.getProxyForURI(url)
# Teste com at dez elementos
for i in range(10):
print i + 1, '=>', proxy.tribonacci(i + 1)
%a<da:
Pyro Client Initialized. Using Pyro V3.7
1 => [1]
2 => [1, 1]
3 => [1, 1, 2]
4 => [1, 1, 2, 4]
5 => [1, 1, 2, 4, 7]
6 => [1, 1, 2, 4, 7, 13]
7 => [1, 1, 2, 4, 7, 13, 24]
8 => [1, 1, 2, 4, 7, 13, 24, 44]
9 => [1, 1, 2, 4, 7, 13, 24, 44, 81]
10 => [1, 1, 2, 4, 7, 13, 24, 44, 81, 149]
Sndice reissivo '01
Bndice remissi&o
-rFuivos...........................................................................................................................................!&
-rranJos...........................................................................................................................................#'E
/anco de dados...........................................................................................................#&&, #++p., #+$
/ibliotecas de terceiros....................................................................................................................!#
/lender...................................................................................................................................;, #$pp.
/r5))ice.org................................................................................................................................;, ##$
/ytecode............................................................................................................................................#'
"herryPy.................................................................................................................................#!#, #!E
"herry9emplate.............................................................................................................#!#, #!&, #!E
"lasses........................................................................................................;'p., ;!pp., ;*, *#, *!, *$
"omentrios )uncionais..................................................................................................................#!
"ontrole de )lu>o.............................................................................................................................#;
"Python...............................................................................................................................................*
1/2........................................................................................................................................#++p., #+$
1ecoradores......................................................................................................................................$;
1icionrios....................................................................................................................................&p.
1oc %trings..............................................................................................................&$, +', +&, E, #''
1ucV 9yping.....................................................................................................................................#'
Element9ree........................................................................................................................#&*, #+#p.
Empacotamento.............................................................................................................................#*E
E>ce@es.........................................................................................................................................!$p.
(alse...................................................................................................................................................&E
(erramentas......................................................................................................................................#
(un@es........................................................................................................................................$, &$
Ienerator E>pression..................................................................................................................$+p.
Ieradores..........................................................................................................................................E$
I2BP....................................................................................................................................................;
Ilade............................................................................................................................#EE, #E;p., #$+
Ir)icos...........................................................................................................................................###
I9Z[........................................................................................................................................#EE, #E;
=erana.......................................................................................................................................;$, ;*
=istrico..............................................................................................................................................;
21E.....................................................................................................................................................#
2nter)ace gr)ica..........................................................................................................................#EEp.
2ntrospec:o..................................................................................................................................Ep.
2ronPython........................................................................................................................'+pp., ';
Laos..................................................................................................................................................'
Lambda.............................................................................................................................................E*
'0' Sndice reissivo
La.y Evaluation...............................................................................................................................E$
Linguagem "...............................................................................................................................''p.
List "omprehension.....................................................................................................................$+p.
Listas..............................................................................................................................................*p.
Bapeamento obJeto-relacional....................................................................................................#+$
Batplotlib.......................................................................................................................................###
Batri.es...........................................................................................................................................#';
Betaclasses.................................................................................................................................;#, *$
BRtodos de classe............................................................................................................................;&
BRtodos de obJeto............................................................................................................................;&
BRtodos estticos.............................................................................................................................;
Bodelagem &1...............................................................................................................................#+
Bodo interativo...............................................................................................................................#'
Bdulos..........................................................................................................................+&pp., +;, !#
B?".............................................................................................................................................#!!p.
8amespace..................................................................................................................................+&, +E
8one..................................................................................................................................................&E
8Dmeros...........................................................................................................................................+
8umPy.................................................................................................................................#'E, #'*p.
5bJetos.....................................................................................................................................;'p., *$
5bJetos distribu<dos......................................................................................................................#;!
5peradores lgicos..........................................................................................................................#*
56B.........................................................................................................................................#+$, #!E
Per)ormance................................................................................................................#;!, #;;, #*&p.
Perl.......................................................................................................................................................;
PersistHncia.......................................................................................................................#&#pp., #!!
P2L....................................................................................................................................................##;
Postgre%NL.........................................................................................................................................;
Processamento de imagem...........................................................................................................##;
Processamento distribu<do...........................................................................................................#;
Programa:o )uncional...................................................................................................................E*
Propriedades....................................................................................................................................*
Psyco............................................................................................................................................#*&p.
Pye>e........................................................................................................................................#*Epp.
Py15"..............................................................................................................................................+'
PL65.........................................................................................................................................#;!pp.
Pythonic............................................................................................................................................#&
6e)le>:o.............................................................................................................................................E
6uby.....................................................................................................................................................;
%eriali.a:o.............................................................................................................................#&#, #&!
%hell..............................................................................................................................................#'pp.
Sndice reissivo '0-
%inta>e..............................................................................................................#!, #;, #, *p., &, &$
%obrecarga de operadores........................................................................................................;#, *!
%NLite......................................................................................................................................#+!, #+;
%trings........................................................................................................................!pp., &, &$, +'
9empo................................................................................................................................................!*
9estes automati.ados....................................................................................................................#''
9hreads......................................................................................................................................#$*pp.
9ipagem dinAmica.......................................................................................................................;, #'
9ipos..................................................................................................................................................#'
2mutveis..........................................................................................................................&, !, &'
Butveis.....................................................................................................................&, ;pp., &
9rue....................................................................................................................................................&E
9uplas..........................................................................................................................................&'pp.
,npythonic.......................................................................................................................................#&
?ers@es................................................................................................................................................*
?Python..................................................................................................................................#+, #$
Ceb...........................................................................................................................#&;, #!'p., #!!p.
MBL...........................................................................................................................#&, #&;pp., #!E
L-BL................................................................................................................................#&, #&!pp.
K51/.........................................................................................................................................#&pp.
.8E9...........................................................................................................................'', '+pp., ';

Vous aimerez peut-être aussi