Você está na página 1de 255

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., ';
Livros Grtis
( http://www.livrosgratis.com.br )

Milhares de Livros para Download:

Baixar livros de Administrao
Baixar livros de Agronomia
Baixar livros de Arquitetura
Baixar livros de Artes
Baixar livros de Astronomia
Baixar livros de Biologia Geral
Baixar livros de Cincia da Computao
Baixar livros de Cincia da Informao
Baixar livros de Cincia Poltica
Baixar livros de Cincias da Sade
Baixar livros de Comunicao
Baixar livros do Conselho Nacional de Educao - CNE
Baixar livros de Defesa civil
Baixar livros de Direito
Baixar livros de Direitos humanos
Baixar livros de Economia
Baixar livros de Economia Domstica
Baixar livros de Educao
Baixar livros de Educao - Trnsito
Baixar livros de Educao Fsica
Baixar livros de Engenharia Aeroespacial
Baixar livros de Farmcia
Baixar livros de Filosofia
Baixar livros de Fsica
Baixar livros de Geocincias
Baixar livros de Geografia
Baixar livros de Histria
Baixar livros de Lnguas
Baixar livros de Literatura
Baixar livros de Literatura de Cordel
Baixar livros de Literatura Infantil
Baixar livros de Matemtica
Baixar livros de Medicina
Baixar livros de Medicina Veterinria
Baixar livros de Meio Ambiente
Baixar livros de Meteorologia
Baixar Monografias e TCC
Baixar livros Multidisciplinar
Baixar livros de Msica
Baixar livros de Psicologia
Baixar livros de Qumica
Baixar livros de Sade Coletiva
Baixar livros de Servio Social
Baixar livros de Sociologia
Baixar livros de Teologia
Baixar livros de Trabalho
Baixar livros de Turismo

Você também pode gostar