python_para_desenvolvedores_-_2a_edicao_-_luiz_eduardo_borges.pdf
TRANSCRIPT
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 1/359
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 2/359
Licença
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 rasil. !araver uma c"pia desta licença# visite http$%%creativecommons.or&%licenses%b'-nc-sa%2.5%br% ou envie uma carta para Creative Commons# ()( *econd *treet#*uite +,,# *an rancisco# Caliornia /0(,5# U*A.
Site oficial
A edição mais recente está dispon1vel no ormato ! em$
http$%%ar30n.4ordpress.com%p'thon%
Capa
ma&em utili6ada na capa 7Steampython8$
http$%%ar30n.deviantart.com%art%*teamp'thon-(5,9,:((9
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 3/359
Luiz Eduardo Borges
Python para Desenvolvedores
2ª edição
Rio de Janeiro
Edição do Autor
2010
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 4/359
!'thon para esenvolvedores % Lui6 Eduardo or&es;io de <aneiro# Edição do Autor# 2,(,
*N /)9-95-/,/05(-(-:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 5/359
Agradecimentos
=ostaria de a&radecer a minha esposa e aos meus pais# pela paci>ncia ?uetiveram durante o processo de criação desta obra.
Al@m deles# tamb@m &ostaria de a&radecer a todos ?ue apoiaram e audarama divul&ar o livro.
Sobre o autor
Lui6 Eduardo or&es @ en&enheiro e analista de sistemas# com p"s-&raduaçãoem Computação =ráica pela Universidade do Estado do ;io de <aneiro
7UE;<8. Atua a ?uase duas d@cadas na área de inormática# sob diversasormas.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 6/359
Sumário
!arte (,
!reácio da primeira edição ((!reácio da se&unda edição (2ntrodução (+
Caracter1sticas (+Bist"rico (0ersDes (0Eecutando pro&ramas (0Fipa&em dinGmica (5Compilação e interpretação (:Hodo interativo ()erramentas (9Cultura 2,
*intae 22locos 2+Ibetos 25
Controle de luo 2:Laços 29
or 29Jhile 2/
Fipos +(NKmeros +2Feto +0Listas 0,
Fuplas 02Iutros tipos de se?u>ncias 00
icionários 05erdadeiro# also e nulo 0/Iperadores booleanos 5,
unçDes 52ocumentação 59Eerc1cios :,!arte :(H"dulos :2Escopo de nomes ::
!acotes :9iblioteca padrão :/
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 7/359
Hatemática :/Ar?uivos e %I )2
*istemas de ar?uivo )0Ar?uivos temporários )5
Ar?uivos compactados ):Ar?uivos de dados ))*istema operacional )9Fempo 9,EpressDes re&ulares 9+
ibliotecas de terceiros 95EceçDes 9)ntrospecção /,
nspect /(
Eerc1cios /+!arte /0=eradores /5!ro&ramação uncional /)
Lambda /)Hapeamento /9iltra&em //;edução (,,
Fransposição (,2List Comprehension (,+=enerator Epression (,0
Eerc1cios (,5!arte (,:ecoradores (,)Classes (,/
Classes abertas ((0Berança simples (()Berança mKltipla (2,!ropriedades (20*obrecar&a de operadores (2)
ColeçDes (29Hetaclasses (+0
Classes base abstratas (+:ecoradores de classe (+/Festes automati6ados (0(
Eerc1cios (05!arte (0:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 8/359
Fhreads (0)!ersist>ncia (5(
*eriali6ação (5(I (52
MAHL (50 <*IN (5)HL (59
IH (:,*A (:(ElementFree (:2
anco de dados (:5 (::H'*OL (::
*OLite (:)irebird (:/!ost&re*OL (),Hapeamento obeto-relacional ())
Jeb (9,Cherr'!' (9(Cherr'Femplate (9(Cliente Jeb (90
HC (95Eerc1cios (/5!arte (/:!rocessamento num@rico (/)
Num!' (/)Arranos (/)Hatri6es 2,,
*ci!' 2,2Hatplotlib 2,0
nterace =ráica 2((Ar?uitetura 2((!'=FP 2(+4!'thon 225!'Ot 2+2
Computação =ráica 2+9Hatri6es versus vetores 2+9
!rocessamento de ima&em 20(
*= 20)*=i& 20/
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 9/359
ma&ens em tr>s dimensDes 252!'thon 250!'Ipen=L 2:,
!rocessamento distribu1do 2:9
Ibetos distribu1dos 2)(!erormance 2)0Empacotamento e distribuição 29+Eerc1cios 29)Ap>ndices 299nte&ração com aplicativos 29/lender 2/,
=ame en&ine 2//=H! +,+
n3scape +,)rIice.or& +(2nte&ração com outras lin&ua&ens +()
ibliotecas compartilhadas +()!'thon -Q C +(/C -Q !'thon +2(
nte&ração com .NEF +2+;espostas dos eerc1cios +2/
;espostas dos eerc1cios +++;espostas dos eerc1cios +0,;espostas dos eerc1cios +0+;espostas dos eerc1cios +5,;espostas dos eerc1cios +50Rndice remissivo +5)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 10/359
10 Parte I
Parte IEsta parte trata de conceitos básicos sobre a lin&ua&em de pro&ramação!'thon# incluindo sintae# tipos# estruturas de controle# unçDes edocumentação.
ConteKdo$
▪ !reácio da primeira edição .
▪ !reácio da se&unda edição.▪ ntrodução .▪ *intae .▪ Controle de luo .▪ Laços .▪ Fipos .▪ unçDes .▪ ocumentação .▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 11/359
Prefácio da primeira edição 11
Prefácio da primeira edição
As lin&ua&ens dinGmicas eram vistas no passado apenas como lin&ua&ensscript # usadas para automati6ar pe?uenas tareas# por@m# com o passar dotempo# elas cresceram# amadureceram e con?uistaram seu espaço nomercado# a ponto de chamar a atenção dos &randes ornecedores detecnolo&ia.
ários atores contribu1ram para esta mudança# tais como a internet# osot4are de c"di&o aberto e as metodolo&ias á&eis de desenvolvimento.
A internet viabili6ou o compartilhamento de inormaçDes de uma orma semprecedentes na hist"ria# ?ue tornou poss1vel o crescimento do sot4are dec"di&o aberto. As lin&ua&ens dinGmicas &eralmente são c"di&o aberto ecompartilham as mesmas uncionalidades e em al&uns casos# os mesmosobetivos.
A produtividade e epressividade das lin&ua&ens dinGmicas se encaiampereitamente com as metodolo&ias á&eis# ?ue nasceram do desenvolvimento
de sot4are de c"di&o aberto e deendem um eno?ue mais pra&mático noprocesso de criação e manutenção de sot4are do ?ue as metodolo&ias maistradicionais.
Entre as lin&ua&ens dinGmicas# o !'thon se destaca como uma das maispopulares e poderosas. Eiste uma comunidade movimentada de usuários dalin&ua&em no mundo# o ?ue se relete em listas ativas de discussão e muitaserramentas dispon1veis em c"di&o aberto.
Aprender uma nova lin&ua&em de pro&ramação si&niica aprender a pensarde outra orma. E aprender uma lin&ua&em dinGmica representa umamudança de paradi&ma ainda mais orte para a?uelas pessoas ?ue passaramanos desenvolvendo em lin&ua&ens estáticas.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 12/359
12 Prefácio da segunda edição
Prefácio da segunda edição
;evisada e ampliada# esta edição tra6 al&umas novidades# como a inclusão devários recursos interessantes ?ue oram incorporados na versão 2.: do!'thon.
ários assuntos á abordados na edição anterior oram epandidos# incluindo$orientação a obetos# rotinas matemáticas# interace &ráica# computação&ráica# acesso a bancos de dados e inte&ração com aplicativos de c"di&oaberto.
Al@m disso# a ormatação passou por al&umas mudanças# visando acilitar aleitura em monitores e a impressão.
Entretanto# a maior parte das mudanças vieram com a revisão do teto# ?uea&ora se tornou compat1vel com a nova orto&raia# tarea acilitada pelo usodo rIice.or& e suas erramentas. árias partes do teto oram ampliadas#cap1tulos mudaram de ordem# novos eemplos e dia&ramas oramacrescentados# com o obetivo de melhorar o encadeamento dos assuntos
abordados.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 13/359
Introdução 13
Introdução
!'thon(
@ uma lin&ua&em de alt1ssimo n1vel 7em in&l>s# Very High Lee!Language8 orientada a obeto# de tipa&em dinGmica e orte# interpretada einterativa.
Caractersticas
I !'thon possui uma sintae clara e concisa# ?ue avorece a le&ibilidade doc"di&o onte# tornando a lin&ua&em mais produtiva.
A lin&ua&em inclui diversas estruturas de alto n1vel 7listas# dicionários# data %hora# compleos e outras8 e uma vasta coleção de m"dulos prontos para uso#al@m de frame"or#s de terceiros ?ue podem ser adicionados. Famb@m possuirecursos encontrados em outras lin&ua&ens modernas# tais como$ &eradores#introspecção# persist>ncia# metaclasses e unidades de teste. Hultiparadi&ma#a lin&ua&em suporta pro&ramação modular e uncional# al@m da orientação aobetos. Hesmo os tipos básicos no !'thon são obetos. A lin&ua&em @interpretada atrav@s de $ytecode pela má?uina virtual !'thon# tornando oc"di&o portável. Com isso @ poss1vel compilar aplicaçDes em uma plataorma
e rodar em outros sistemas ou eecutar direto do c"di&o onte.
!'thon @ um sot4are de c"di&o aberto 7com licença compat1vel com a%enera! Pu$!ic License 7=!L8# por@m menos restritiva# permitindo ?ue o!'thon sea inclusive incorporado em produtos proprietários8. Aespeciicação da lin&ua&em @ mantida pela Python Soft"are &oundation2 7!*8.
Al@m de ser utili6ado como lin&ua&em principal no desenvolvimento de
sistemas# o !'thon tamb@m @ muito utili6ado como lin&ua&em script emvários sot4ares# permitindo automati6ar tareas e adicionar novasuncionalidades# entre eles$ rIice.or&# !ost&re*OL# lender# =H! en3scape.
S poss1vel inte&rar o !'thon a outras lin&ua&ens# como a Lin&ua&em C eortran. Em termos &erais# a lin&ua&em apresenta muitas similaridades com
( !á&ina oicial$ http$%%444.p'thon.or&%.
2 Endereço na internet da !*$ http$%%444.p'thon.or&%ps%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 14/359
1' Introdução
outras lin&ua&ens dinGmicas# como !erl e ;ub'.
!ist"rico
A lin&ua&em oi criada em (//, por =uido van ;ossum# no nstitutoNacional de !es?uisa para Hatemática e Ci>ncia da Computação da Bolanda7CJ8 e tinha ori&inalmente oco em usuários como 1sicos e en&enheiros. I!'thon oi concebido a partir de outra lin&ua&em eistente na @poca#chamada AC.
Boe# a lin&ua&em @ bem aceita na industria por empresas de alta tecnolo&ia#tais como$
▪ =oo&le 7aplicaçDes (e$8.▪ Mahoo 7aplicaçDes (e$8.▪ Hicrosot 7ron!'thon$ !'thon para .NEF8.▪ No3ia 7dispon1vel para as linhas recentes de celulares e !As8.▪ isne' 7animaçDes +8.
#ers$es
A implementação oicial do !'thon @ mantida pela !* e escrita em C# e por
isso# @ tamb@m conhecida como C!'thon. A versão estável mais recente estádispon1vel para do"n!oad no endereço$
http$%%444.p'thon.or&%do4nload%
!ara a plataorma Jindo4s# basta eecutar o instalador. !ara outrasplataormas# como em sistemas Linu# &eralmente o !'thon á a6 parte dosistema# por@m em al&uns casos pode ser necessário compilar e instalar o
interpretador a partir dos ar?uivos onte.
Eistem tamb@m implementaçDes de !'thon para .NEF 7ron!'thon8# <H7<'thon8 e em !'thon 7!'!'8.
%&ecutando programas
Eemplo de pro&rama em !'thon$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 15/359
Introdução 1)
# Uma lista de instrumentos musicaisinstrumentos = ['Baixo', 'Bateria', 'Guitarra']
# Para cada nome na lista de instrumentosfor instrumento in instrumentos:
# mostre o nome do instrumento musical print instrumento
*a1da$
Baixo
BateriaGuitarra
No eemplo# Tinstrumentos @ uma lista contendo os itens Taio# Tateriae T=uitarra. <á Tinstrumento @ um nome ?ue corresponde a cada um dositens da lista# conorme o laço @ eecutado.
Is ar?uivos onte são identiicados &eralmente pela etensão T.p' e podem
ser eecutados diretamente pelo interpretador$
python apl.py
Assim o pro&rama Tapl.p' será eecutado. No Jindo4s# as etensDes dear?uivo T.p'# T.p'4# T.p'c e T.p'o são associadas ao !'thonautomaticamente durante a instalação# então @ s" clicar no ar?uivo paraeecutar. Is ar?uivos T.p'4 são eecutados com uma versão alternativa do
interpretador ?ue não abre a anela de console.'ipagem din(mica
!'thon utili6a tipa&em dinGmica# o ?ue si&niica ?ue o tipo de uma variável @inerido pelo interpretador em tempo de eecução 7isto @ conhecido como*uc# +yping8. No momento em ?ue uma variável @ criada atrav@s deatribuição# o interpretador deine um tipo para a variável# com as operaçDes?ue podem ser aplicadas.
O caractere “#” indica que o
resto da linha é um comentário.
O caractere “#” indica que o
resto da linha é um comentário.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 16/359
1, Introdução
A tipa&em do !'thon @ orte# ou sea# o interpretador veriica se as operaçDessão válidas e não a6 coerçDes automáticas entre tipos incompat1veis+. !arareali6ar a operação entre tipos não compat1veis# @ necessário converter
eplicitamente o tipo da variável ou variáveis antes da operação.
Compilação e interpretação
I c"di&o onte @ tradu6ido pelo !'thon para $ytecode # ?ue @ um ormato binário com instruçDes para o interpretador. I $ytecode @ multiplataorma epode ser distribu1do e eecutado sem onte ori&inal.
!or padrão# o interpretador compila o c"di&o e arma6ena o $ytecode em disco#para ?ue a pr"ima ve6 ?ue o eecutar# não precise compilar novamente opro&rama# redu6indo o tempo de car&a na eecução. *e os ar?uivos ontesorem alterados# o interpretador se encarre&ará de re&erar o $ytecodeautomaticamente# mesmo utili6ando o she!! interativo. Ouando um pro&ramaou um m"dulo @ evocado# o interpretador reali6a a análise do c"di&o#converte para s1mbolos# compila 7se não houver $ytecode atuali6ado em disco8
+ Em !'thon# coerçDes são reali6adas automaticamente apenas entre tipos ?ue são
claramente relacionados# como inteiro e inteiro lon&o.
Código fonte(.py)
!m"olos #r$ore sintática
%ytecode(.pyc & .pyo)
%inários
'nstaladores'nterpretador
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 17/359
Introdução 1-
e eecuta na má?uina virtual !'thon.
I $ytecode @ arma6enado em ar?uivos com etensão T.p'c 7$ytecode normal8
ou T.p'o 7$ytecode otimi6ado8. I $ytecode tamb@m pode ser empacotado unto com o interpretador em um eecutável# para acilitar a distribuição daaplicação# eliminando a necessidade de instalar !'thon em cada computador.
)odo interativo
I interpretador !'thon pode ser usado de orma interativa# na ?ual as linhasde c"di&o são di&itadas em um prompt 7linha de comando8 semelhante aoshe!! do sistema operacional.
!ara evocar o modo interativo basta eecutar o interpretador 7se ele estiver no path8$
python
Ele estará pronto para receber comandos ap"s o sur&imento do sinal deespera TQQQ na tela$
Python 2.6.4 (r264:77!6" o$ % 2!!&" %:2!:47)G** 4.4.+ on linux2,ype -help-" -copyriht-" -credits- or -license- /or more in/ormation.000
No Jindo4s# o modo interativo está dispon1vel tamb@m atrav@s do 1coneT!'thon 7command line8.
I modo interativo @ uma caracter1stica dierencial da lin&ua&em# pois @poss1vel testar e modiicar trechos de c"di&o antes da inclusão do c"di&o empro&ramas# a6er etração e conversão de dados ou mesmo analisar o estadodos obetos ?ue estão em mem"ria# entre outras possibilidades.
Al@m do modo interativo tradicional do !'thon# eistem outros pro&ramas?ue uncionam como alternativas# com interaces mais soisticadas 7como o
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 18/359
1. Introdução
!'Crust08$
*erramentas
Eistem muitas erramentas de desenvolvimento para !'thon# como Es#editores e she!!s 7?ue aproveitam da capacidade interativa do !'thon8.
Integrated *ee!opment /nironments 7Es8 são pacotes de sot4are inte&ramvárias erramentas de desenvolvimento em um ambiente consistente# com oobetivo de aumentar a produtividade do desenvolvedor. =eralmente# asEs incluem recursos como synta high!ight 7c"di&o onte colori6adoconorme a sintae da lin&ua&em8# nave&adores de c"di&o# she!! inte&rado e
code comp!etion 7o editor apresenta durante a di&itação ormas poss1veis decompletar o teto ?ue ele conse&ue identiicar8.
Entre as Es ?ue suportam !'thon# encontram-se$▪ !'*cripter5.▪ *!E: 7*taniVs !'thon Editor8.
0 !'Crust a6 parte do proeto 4!'thon 7http$%%444.4p'thon.or&%8.5 ispon1vel em http$%%code.&oo&le.com%p%p'scripter%.
: Endereço$ http$%%p'thonide.blo&spot.com%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 19/359
Introdução 1
▪ Eric).▪ !'ev9 7 p!ugin para a E Eclipse8.
Eistem tamb@m editores de teto especiali6ados em c"di&o de pro&ramação#
?ue possuem uncionalidades como colori6ação de sintae# eportação paraoutros ormatos e conversão de codiicação de teto.
Esses editores suportam diversas lin&ua&ens de pro&ramação# dentre elas o!'thon$
▪ *ciFE/.▪ NotepadWW(,.
She!! @ o nome dado aos ambientes interativos para eecução de comandos#?ue podem ser usados para testar pe?uenas porçDes de c"di&o e paraatividades como data crunching 7etração de inormaçDes de interesse demassas de dados e a subse?uente tradução para outros ormatos8.
Al@m do pr"prio She!! padrão do !'thon# eistem os outros dispon1veis$
) *ite$ http$%%eric-ide.p'thon-proects.or&%.9 ispon1vel em http$%%p'dev.or&%./ *ite$ http$%%444.scintilla.or&%*ciFE.html.
(, o4nload de ontes e binários em$ http$%%notepad-plus.sourceor&e.net%br%site.htm.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 20/359
20 Introdução
▪ !'Crust 7&ráico8.▪ p'thon 7teto8.
Is empacotadores são utilitários ?ue são usados para construir eecutáveis?ue en&lobam o $ytecode # o interpretador e outras depend>ncias# permitindo?ue o aplicativo rode em má?uinas sem !'thon instalado# o ?ue acilita adistribuição de pro&ramas.
Entre empacotadores eitos para !'thon# estão dispon1veis$▪ !'2ee 7apenas para Jindo4s8.▪ cXree6e 7portável8.
&rame"or#s são coleçDes de componentes de sot4are 7bibliotecas# utilitários eoutros8 ?ue oram proetados para serem utili6ados por outros sistemas.
Al&uns frame"or#s dispon1veis mais conhecidos$▪ Jeb$ an&o# Furbo=ears# ope e 4eb2p'.▪ nterace &ráica$ 4!'thon# !'=FP e !'Ot.▪ !rocessamento cientiico$ Num!' e *ci!'.▪ !rocessamento de ima&ens$ !L.▪ 2$ Hatplotlib e *=i&.▪ +$ isual !'thon# !'Ipen=L e !'thon I&re.▪ Hapeamento obeto-relacional$ *OLAlchem' e *OLIbect.
Cultura
I nome !'thon oi tirado por =uido van ;ossum do pro&rama da F britGnica onty Python &!ying 4ircus # e eistem várias reer>ncias nadocumentação da lin&ua&em ao pro&rama# como# por eemplo# o reposit"rio
oicial de pacotes do !'thon se chamava 4heese Shop # ?ue era o nome de umdos ?uadros do pro&rama. Atualmente# o nome do reposit"rio @ PythonPac#age Inde11 7!M!8.
A comunidade de usuários de !'thon criou al&umas epressDes para sereerir aos assuntos relacionados Y lin&ua&em. Neste ar&ão# o termo Pythonic@ usado para indicar ?ue al&o @ compat1vel com as premissas de proeto do!'thon# e 5npythonic si&niica o oposto. <á o usuário da lin&ua&em @ chamado
(( Endereço$ http$%%p'pi.p'thon.or&%p'pi.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 21/359
Introdução 21
de Pythonist.
As metas do proeto oram resumidas por Fim !eters em um teto chamado
6en of Python7 ?ue está dispon1vel no pr"prio !'thon atrav@s do comando$
import this
I teto enati6a a postura pra&mática do 8eneo!ent *ictator for Life 7L8#como =uido @ conhecido na comunidade !'thon.
!ropostas para melhoria da lin&ua&em são chamadas de !E!s 7Python
/nhancement Proposa!s8# ?ue tamb@m servem de reer>ncia para novosrecursos a serem implementados na lin&ua&em.
Al@m do site oicial# outras boas ontes de inormação sobre a lin&ua&em são$!'thonrasil(2 # o site da comunidade !'thon no rasil# com bastanteinormação em portu&u>s# e !'thon Coo3boo3(+ # site ?ue arma6enaTreceitas$ pe?uenas porçDes de c"di&o para reali6ar tareas espec1icas.
(2 Endereço$ http$%%444.p'thon.or&.br%.
(+ Endereço$ http$%%aspn.activestate.com%A*!N%!'thon%Coo3boo3%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 22/359
22 Sintae
Sinta&e
Um pro&rama eito em !'thon @ constitu1do de linhas# ?ue podem continuarnas linhas se&uintes# pelo uso do caractere de barra invertida 7Z8 ao inal dalinha ou par>nteses# colchetes ou chaves# em epressDes ?ue utili6am taiscaracteres.
I caractere 9 marca o inicio de comentário. Oual?uer teto depois do [ serái&norado at@ o im da linha # com eceção dos comentários uncionais.
Comentários uncionais são usados para$▪ alterar a codiicação do ar?uivo onte do pro&rama acrescentando um
comentário com o teto T[-\- codin&$ ]encodin&Q -\[- no inicio doar?uivo# no ?ual ]encodin&Q @ a codiicação do ar?uivo 7&eralmente!atin1 ou utf.8. Alterar a codiicação @ necessário para suportarcaracteres ?ue não a6em parte da lin&ua&em in&lesa# no c"di&o ontedo pro&rama.
▪ deinir o interpretador ?ue será utili6ado para rodar o pro&rama emsistemas UN# atrav@s de um comentário começando com T[^ no
inicio do ar?uivo# ?ue indica o caminho para o interpretador7&eralmente a linha de comentário será al&o como T[^%usr%bin%envp'thon8.
Eemplo de comentários uncionais$
#1usr3inen$ python# 5 codin: latin 5
# Uma linha de cdio ue mostra o resultado de 7 $e8es %print 7 * %
*a1da$
2
Eemplos de linhas ?uebradas$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 23/359
Sintae 23
# 5 codin: latin 5# Uma linha ue3rada por contra3arra
a = 7 * % + 9 / 2
# Uma lista (ue3rada por $rula3 = ['a', '3', 'c','d', 'e']
# Uma chamada de /un;<o (ue3rada por $rulac = rane(,)
# imprime todos na telaprint a, 3, c
*a1da$
2% )'a'" '3'" 'c'" 'd'" 'e'+ )" 2" %" 4" " 6" 7" =" &" !+
I comando print insere espaços entre as epressDes ?ue orem recebidas
como parGmetro e um caractere de nova linha no inal# a não ser ?ue elereceba uma v1r&ula no im da lista parGmetros.
+locos
Em !'thon# os blocos de c"di&o são delimitados pelo uso de endentação# ?uedeve ser constante no bloco de c"di&o# por@m @ considerada uma boa práticamanter a consist>ncia no proeto todo e evitar a mistura tabulaçDes eespaços(0.
A linha anterior ao bloco sempre termina com dois pontos 7$8 e representauma estrutura de controle da lin&ua&em ou uma declaração de uma novaestrutura 7uma unção# por eemplo8.
(0 A recomendação oicial de estilo de codiicação 7http$%%444.p'thon.or&%dev%peps%pep-,,,9%8 @ usar ?uatro espaços para endentação e esta convenção @ amplamente aceita
pelos desenvolvedores.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 24/359
2' Sintae
Eemplo$
# Para i na lista 2%4" 64" %7=" 7&=:for i in [2%4, 64, %7=, 7&=]:
# >e o resto di$idindo por % /or iual a 8ero: if i % % == !:
# ?mprime... print i, ' % @', i / %
*a1da$
2%4 % @ 7=64 % @ 2=%7= % @ 267&= % @ 266
I operador T_ calcula o m"dulo 7resto da divisão8.
rograma
'nstru*es
+nquanto condi,o- ois pontos o"rigatórios
e condi,o-
'nstru*es
en,o-
'nstru*es
'nstru*es
'nicio de um "loco
/im dos dois "locos
Outro "loco
/im do programa
'nstru*es 'nicio do programa
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 25/359
Sintae 2)
,b-etos
!'thon @ uma lin&ua&em orientada a obeto# sendo assim as estruturas de
dados possuem atributos 7os dados em si8 e m@todos 7rotinas associadas aosdados8. Fanto os atributos ?uanto os m@todos são acessados usando ponto 7.8.
!ara mostrar um atributo$
print o3Aeto.atri3uto
!ara eecutar um m@todo$
o3Aeto.metodo(arumentos)
Hesmo um m@todo sem ar&umentos precisa de par>nteses$
o3Aeto.metodo()
I ponto tamb@m @ usado para acessar estruturas de m"dulos ?ue oramimportados pelo pro&rama.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 26/359
2, 4ontro!e de f!uo
Controle de flu&o
S muito comum em um pro&rama ?ue certos conuntos de instruçDes seameecutados de orma condicional# em casos como validar entradas de dados#por eemplo.
*intae$
if condi;<o0: 3loco de cdio0elif condi;<o0:
3loco de cdio0elif condi;<o0: 3loco de cdio0else: 3loco de cdio0
Na ?ual$▪ ]condiçãoQ$ sentença ?ue possa ser avaliada como verdadeira ou alsa.▪ ]bloco de c"di&oQ$ se?u>ncia de linhas de comando.▪ As clausulas e!if e e!se são opcionais e podem eistir vários e!ifs para o
mesmo if # por@m apenas um e!se ao inal.▪ !ar>nteses s" são necessários para evitar ambi&uidades.
Eemplo$
temp = int(raCDinput('Entre com a temperatura: '))
if temp < !: print '*onelando...'elif ! <= temp <= 2!: print 'Frio'elif 2 <= temp <= 2: print 'ormal'elif 26 <= temp <= %: print 'uente'else: print 'Huito uente1'
Eemplo de sa1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 27/359
4ontro!e de f!uo 2-
Entre com a temperatura: 2%ormal
Na ?ual TEntre com a temperatura$ @ a mensa&em indicando ?ue opro&rama espera pela di&itação# T2+ @ a entrada di&itada e TNormal @ aresposta do pro&rama.
*e o bloco de c"di&o or composto de apenas uma linha# ele pode ser escritoap"s os dois pontos$
if temp < !: print '*onelando...'
A partir da versão 2.5# o !'thon suporta a epressão$
$ariI$el0 = $alor 0 if condi;<o0 else $alor 20
Na ?ual ]variávelQ receberá ]valor (Q se ]condiçãoQ or verdadeira e ]valor
2Q caso contrário.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 28/359
2. Laços
Laços
Laços 7!oops8 são estruturas de repetição# &eralmente usados para processarcoleçDes de dados# tais como linhas de um ar?uivo ou re&istros de um bancode dados# ?ue precisam ser processados por um mesmo bloco de c"di&o.
*or
S a estrutura de repetição mais usada no !'thon. A instrução aceita não s"se?u>ncias estáticas# mas tamb@m se?u>ncias &eradas por iteradores.teradores são estruturas ?ue permitem iteraçDes# ou sea# acesso aos itens de
uma coleção de elementos# de orma se?uencial.
urante a eecução de um laço for # a reer>ncia aponta para um elemento dase?u>ncia. A cada iteração# a reer>ncia @ atuali6ada# para ?ue o bloco dec"di&o do for processe o elemento correspondente.
A clausula $rea# interrompe o laço e continue passa para a pr"ima iteração. Ic"di&o dentro do e!se @ eecutado ao inal do laço# a não ser ?ue o laço tenha
sido interrompido por $rea#.
0ista
1 aponta para 2.
2
3
4
5
6
7
...
1
rimeiraitera,o
8 refer9nciafoi atuali:ada.
0ista
2
3
4
5
5
7
...
1
egundaitera,o
1 é apenas umarefer9ncia.
1 aponta para 3.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 29/359
Laços 2
*intae$
for <re/erJncia> in <seuJncia>: <3loco de cdio> continue breakelse: <3loco de cdio>
Eemplo$
# >oma de ! a &&s = !for x in rane(, !!): s = s + xprint s
*a1da$
4&!
A unção range:m7 n7 p; # @ muito Ktil em laços# pois retorna uma lista deinteiros# começando em m e menores ?ue n # em passos de comprimento p #?ue podem ser usados como se?u>ncia para o laço.
.hile
Eecuta um bloco de c"di&o atendendo a uma condição.
*intae$
while <condi;<o>: <3loco de cdio>
continue breakelse: <3loco de cdio>
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 30/359
30 Laços
I bloco de c"di&o dentro do laço "hi!e @ repetido en?uanto a condição dolaço estiver sendo avaliada como verdadeira.
Eemplo$
# >oma de ! a &&s = !x =
while x < !!: s = s + x x = x + print s
I laço "hi!e @ ade?uado ?uando não há como determinar ?uantas iteraçDesvão ocorrer e não há uma se?u>ncia a se&uir.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 31/359
+ipos 31
'ipos
ariáveis no interpretador !'thon são criadas atrav@s da atribuição edestru1das pelo coletor de lio 7 gar$age co!ector8# ?uando não eistem maisreer>ncias a elas.
Is nomes das variáveis devem começar com letra 7sem acentuação8 ousublinhado 7X8 e se&uido por letras 7sem acentuação8# d1&itos ou sublinhados7X8# sendo ?ue maiKsculas e minKsculas são consideradas dierentes.
Eistem vários tipos simples de dados pr@-deinidos no !'thon# tais como$▪ NKmeros 7inteiros# reais# compleos# ... 8.▪ Feto.
Al@m disso# eistem tipos ?ue uncionam como coleçDes. Is principais são$▪ Lista.▪ Fupla.▪ icionário.
Is tipos no !'thon podem ser$▪ Hutáveis$ permitem ?ue os conteKdos das variáveis seam alterados.▪ mutáveis$ não permitem ?ue os conteKdos das variáveis seam
alterados.
Em !'thon# os nomes de variáveis são reer>ncias# ?ue podem ser alteradasem tempos de eecução.
Is tipos e rotinas mais comuns estão implementados na orma de $ui!tins # ousea# eles estão sempre dispon1veis em tempo de eecução# sem a necessidadede importar nenhuma biblioteca.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 32/359
32 +ipos
/0meros
!'thon oerece al&uns tipos num@ricos na orma de $ui!tins$▪ nteiro 7int8$ i ` (▪ ;eal de ponto lutuante 7 f!oat8$ ` +.(0▪ Compleo 7comp!e8$ c ` + W 0
Al@m dos nKmeros inteiros convencionais# eistem tamb@m os inteiroslon&os# ?ue tem dimensão arbitrária e são limitados pela mem"ria dispon1vel.As conversDes entre inteiro e lon&o são reali6adas de orma automática. Aunção $ui!tin int:; pode ser usada para converter outros tipos para inteiro#
incluindo mudanças de base.
Eemplo$
# 5 codin: latin 5
# *on$ertendo de real para inteiroprint 'int(%.4 @', int(%.4)
# *on$ertendo de inteiro para realprint '/loat( @', /loat()
# *alculo entre inteiro e real resulta em realprint '.! 2 K % @ ', .! / 2 + %
# ?nteiros em outra 3aseprint -int('2!'" = @-, int('2!', =) # 3ase =print -int('2!'" 6 @-, int('2!', 6) # 3ase 6
# Lpera;Mes com nNmeros complexos
c = % + 4Aprint 'c @', cprint 'Parte real:', c.realprint 'Parte imainIria:', c.imaprint '*onAuado:', c.conAuate()
*a1da$
int(%.4 @ %
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 33/359
+ipos 33
/loat( @ .!.! 2 K % @ .int('2!'" = @ 6
int('2!'" 6 @ %2c @ (%K4AParte real: %.!Parte imainIria: 4.!*onAuado: (%4A
Is nKmeros reais tamb@m podem ser representados em notação cientiica#por eemplo$ (.2e22.
I !'thon tem uma s@rie de operadores deinidos para manipular nKmeros#atrav@s de cálculos aritm@ticos# operaçDes l"&icas 7?ue testam se umadetermina condição @ verdadeira ou alsa8 ou processamento bit-a-bit 7em?ue os nKmeros são tratados na orma binária8.
IperaçDes aritm@ticas$▪ *oma 7W8.▪ ierença 7-8.▪
Hultiplicação 7\8.▪ ivisão 7%8$ entre dois inteiros unciona i&ual Y divisão inteira. Emoutros casos# o resultado @ real.
▪ ivisão inteira 7%%8$ o resultado @ truncado para o inteiro imediatamenteinerior# mesmo ?uando aplicado em nKmeros reais# por@m neste casoo resultado será real tamb@m.
▪ H"dulo 7_8$ retorna o resto da divisão.▪ !ot>ncia 7\\8$ pode ser usada para calcular a rai6# atrav@s de epoentes
racionários 7eemplo$ (,, \\ ,.58.▪ !ositivo 7W8.▪ Ne&ativo 7-8.
IperaçDes l"&icas$▪ Henor 7]8.▪ Haior 7Q8.▪ Henor ou i&ual 7]`8.▪ Haior ou i&ual 7Q`8.
▪ &ual 7``8.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 34/359
3' +ipos
▪ ierente 7^`8.
IperaçDes bit-a-bit$
▪ eslocamento para es?uerda 7]]8.▪ eslocamento para direita 7QQ8.▪ E bit-a-bit 78.▪ Iu bit-a-bit 78.▪ Iu eclusivo bit-a-bit 78.▪ nversão 78.
urante as operaçDes# os nKmeros serão convertidos de orma ade?uada7eemplo$ 7(.5W08 W + resulta em 0.5W08.
Al@m dos operadores# tamb@m eistem al&umas unçDes $ui!tin para lidarcom tipos num@ricos$ a$s:; # ?ue retorna o valor absoluto do nKmero# oct:; # ?ueconverte para octal# he:; # ?ue converte para headecimal# po":; # ?ue elevaum nKmero por outro e round:; # ?ue retorna um nKmero real com oarredondamento especiicado.
'e&to
As strings no !'thon são $uitins para arma6enar teto. Como são imutáveis#não @ poss1vel adicionar# remover ou mesmo modiicar al&um caractere deuma string. !ara reali6ar essas operaçDes# o !'thon precisa criar um novastring.
Fipos$▪ String padrão$ s ` VLed eppelinV▪ String unicode$ u ` uVr3V
A string padrão pode ser convertida para unicode atrav@s da unção unicode:;.
A iniciali6ação de strings pode ser$▪ Com aspas simples ou duplas.▪ Em várias linhas consecutivas# desde ?ue sea entre tr>s aspas simples
ou duplas.
▪ *em epansão de caracteres 7eemplo$ s ` rVZnV# em ?ue s conterá os
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 35/359
+ipos 3)
caracteres TZ e Tn8.
IperaçDes com strings$
# 5 codin: latin 5
s = '*amel'
# *oncatena;<oprint ',he ' + s + ' run aCay1'
# ?nterpola;<oprint 'tamanho de Os @0 Od' % (s, len(s))
# >trin tratada como seuJnciafor ch in s: print ch
# >trins s<o o3Aetosif s.startsCith('*'): print s.upper()
# o ue acontecerIprint % * s# % 5 s Q consistente com s K s K s
Iperador T_ @ usado para a6er interpolação de strings. A interpolação @mais eiciente no uso de mem"ria do ?ue a concatenação convencional.
*1mbolos usados na interpolação$▪ _s$ string.▪ _d$ inteiro.▪ _o$ octal.▪ _$ heacimal.▪ _$ real.▪ _e$ real eponencial.▪ __$ sinal de percenta&em.
Is s1mbolos podem ser usados para apresentar nKmeros em diversosormatos.
Eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 36/359
3, +ipos
# 5 codin: latin 5
# Reros a esuerdaprint 'Sora s<o O!2d:O!2d.' % (6, %!)
# Teal (nNmero aps o ponto controla as casas decimaisprint 'Percentaem: O./OO" Exponencial:O.2e' % (.%%%, !.!!%4)
# Lctal e hexadecimalprint 'ecimal: Od" Lctal: Oo" Vexadecimal: Ox' % (!, !, !)
*a1da$
Sora s<o 6:%!.Percentaem: .%O" Exponencial:%.4e!%ecimal: !" Lctal: 2" Vexadecimal: a
A partir da versão 2.:# está dispon1vel outra orma de interpolação al@m dooperador T_# o m@todo de string e a unção chamados format:;.
Eemplos$
# 5 codin: latin 5
musicos = [('Pae', 'uitarrista', 'Wed Reppelin'),('Fripp', 'uitarrista', 'Xin *rimson')]
# ParYmetros identi/icados pela ordemms = 'Z![ Q Z[ do Z2['
for nome, /uncao, 3anda in musicos:
print(ms./ormat(nome, /uncao, 3anda))
# ParYmetros identi/icados pelo nomems = 'Zsaudacao[" s<o Zhora:!2d[:Zminuto:!2d['
print ms./ormat(saudacao='Bom dia', hora=7, minuto=%!)
# Fun;<o 3uiltin /ormat(print 'Pi @', /ormat(%.4&, '.%e')
*a1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 37/359
+ipos 3-
Pae Q uitarrista do Wed ReppelinFripp Q uitarrista do Xin *rimson
Bom dia" s<o !7:%!Pi @ %.42eK!!
A unção format:; pode ser usada para ormatar apenas um dado de cada ve6.
atias 7s!ices8 de strings podem ser obtidas colocando 1ndices entre colchetesap"s a string.
Is 1ndices no !'thon$▪ Começam em 6ero.▪ Contam a partir do im se orem ne&ativos.▪ !odem ser deinidos como trechos# na orma finicio$im W ($intervalog.
*e não or deinido o inicio# será considerado como 6ero. *e não ordeinido o im W (# será considerado o tamanho do obeto. I intervalo7entre os caracteres8# se não or deinido# será (.
S poss1vel inverter strings usando um intervalo ne&ativo$
/atiando strings
tring s
y t h o n
; 2 3 4 5 6
s<;=
Caracteres
osi*es
s<-3= s<3-= s<>2=
y thon n
+1press*es
/atias
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 38/359
3. +ipos
print 'Python'[::!]# Hostra: nohtyP
árias unçDes para tratar com teto estão implementadas no m"dulo string.
# 5 codin: latin 5
# importando o mdulo strini"port strin
# L al/a3eto
a = strin.asciiDletters
# Todando o al/a3eto um caractere para a esuerda3 = a[:] + a[!]
# S /un;<o ma\etrans( cria uma ta3ela de tradu;<o# entre os caracteres das duas strins ue ela# rece3eu como parYmetro.# Ls caracteres ausentes nas ta3elas ser<o# copiados para a sada.ta3 = strin.ma\etrans(a, 3)
# S mensaem...ms = '''Esse texto serI tradu8ido..]ai /icar 3em estranho.'''# S /un;<o translate( usa a ta3ela de tradu;<o# criada pela ma\etrans( para tradu8ir uma strinprint strin.translate(ms, ta3)
*a1da$
Ftt/ u/yup t/sI us3e$SAep..^3A Ad3s c/n /tus3oip.
I m"dulo tamb@m implementa um tipo chamado +emp!ate # ?ue @ um modelode string ?ue pode ser preenchido atrav@s de um dicionário. Isidentiicadores são inciados por cirão 78 e podem ser cercados por chaves#para evitar conusDes.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 39/359
+ipos 3
Eemplo$
# 5 codin: latin 5
# importando o mdulo strini"port strin
# *ria uma strin templatest = strin.,emplate('_a$iso aconteceu em _uando')
# Preenche o modelo com um dicionIrios = st.su3stitute(#'a$iso': 'Falta de eletricidade', 'uando': '!% de S3ril de 2!!2'$)
# Hostra:# Falta de eletricidade aconteceu em !% de S3ril de 2!!2print s
S poss1vel usar strin&s mutáveis no !'thon# atrav@s do m"dulo 5serString #?ue deine o tipo uta$!eString$
# 5 codin: latin 5
# importando o mdulo User>trini"port User>trin
s = User>trin.Huta3le>trin('Python')s[!] = 'p'
print s # mostra -python-
Strings mutáveis são menos eicientes do ?ue strings imutáveis# pois são mais
compleas 7em termos de estrutura8# o ?ue se relete em maior consumo derecursos 7C!U e mem"ria8.
As strin&s unicode podem convertidas para strin&s convencionais atrav@s dom@todo decode:; e o caminho inverso pode ser eito pelo m@todo encode:;.
Eemplo$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 40/359
'0 +ipos
[ *trin& unicodeu = u'V`s\er `'# *on$ertendo para strs = u.encode('latin')print s, '@0', type(s)
# >trin strs = 'V`s\er `'u = s.decode('latin')
print repr(u), '@0', type(u)
*a1da$
V`s\er ` @0 type 'str'0u'V9x/cs\er 9x/c' @0 type 'unicode'0
!ara usar os dois m@todos# @ necessário passar como ar&umento a codiicaçãocompat1vel# as mais utili6adas com a l1n&ua portu&uesa são Tlatin( e Tut9.
Listas
Listas são coleçDes hetero&>neas de obetos# ?ue podem ser de ?ual?uer tipo#inclusive outras listas.
As listas no !'thon são mutáveis# podendo ser alteradas a ?ual?uermomento. Listas podem ser atiadas da mesma orma ?ue as strings # mascomo as listas são mutáveis# @ poss1vel a6er atribuiçDes a itens da lista.
*intae$
lista @ [a" 3" ..." 8]
IperaçDes comuns com listas$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 41/359
+ipos '1
# Uma no$a lista: Brit Pros dos anos 7!pros = ['es', 'Genesis', 'Pin\ Floyd', 'EWP']
# ]arrendo a lista inteirafor pro in pros: print pro
# ,rocando o Nltimo elementopros[!] = 'Xin *rimson'
# ?ncluindopros.append('*amel')
# Temo$endopros.remo$e('Pin\ Floyd')
# Lrdena a listapros.sort()
# ?n$erte a listapros.re$erse()
# ?mprime numeradofor i, pro in enumerate(pros):
print i + , '@0', pro
# ?mprime do seundo item em dianteprint pros[:]
*a1da$
esGenesis
Pin\ FloydEWP @0 es2 @0 Xin *rimson% @0 Genesis4 @0 *amel)'Xin *rimson'" 'Genesis'" '*amel'+
A unção enumerate:; retorna uma tupla de dois elementos a cada iteração$ umnKmero se?uencial e um item da se?u>ncia correspondente.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 42/359
'2 +ipos
A lista possui o m@todo pop:; ?ue acilita a implementação de ilas e pilhas$
# 5 codin: latin 5
lista = ['S', 'B', '*']print 'lista:', lista
# S lista $a8ia Q a$aliada como /alsawhile lista:
# Em /ilas" o primeiro item Q o primeiro a sair # pop(! remo$e e retorna o primeiro item print '>aiu', lista.pop(!), '" /altam', len(lista)
# Hais itens na listalista += ['', 'E', 'F']print 'lista:', lista
while lista:
# Em pilhas" o primeiro item Q o Nltimo a sair # pop( remo$e e retorna o Nltimo item print '>aiu', lista.pop(), '" /altam', len(lista)
*a1da$
lista: )'S'" 'B'" '*'+>aiu S " /altam 2>aiu B " /altam >aiu * " /altam !lista: )''" 'E'" 'F'+>aiu F " /altam 2>aiu E " /altam
>aiu " /altam !
As operaçDes de ordenação 7sort8 e inversão 7reerse8 são reali6adas na pr"prialista# sendo assim# não &eram novas listas.
'uplas
*emelhantes as listas# por@m são imutáveis$ não se pode acrescentar# apa&arou a6er atribuiçDes aos itens.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 43/359
+ipos '3
*intae$
tupla @ (a" 3" ..." 8)
Is par>nteses são opcionais.
!articularidade$ tupla com apenas um elemento @ representada como$
t @ (")
Is elementos de uma tupla podem ser reerenciados da mesma orma ?ue oselementos de uma lista$
primeiroDelemento @ tupla[!]
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 mutáveis# esses elementos não podem
sorer atribuição# pois isto modiicaria a reer>ncia ao obeto.
Eemplo 7usando o modo interativo8$
>>> t = ([, 2], 4)>>> t[!].append(%)>>> t([, 2, %], 4)>>> t[!] = [, 2, %]
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 44/359
'' +ipos
,race3ac\ (most recent call last): File -input0-, line , in ,ypeError: o3Aect does not support item assinment>>>
As tuplas são mais eicientes do ?ue as listas convencionais# pois consomemmenos recursos computacionais 7mem"ria8# por serem estruturas maissimples# tal como as strings imutáveis em relação Ys strings mutáveis.
,utros tipos de se1u2ncias
I !'thon prov> entre os $ui!tins tamb@m$▪ set$ se?u>ncia mutável un1voca 7sem repetiçDes8 não ordenada.▪ fro<enset$ se?u>ncia imutável un1voca não ordenada.
Is dois tipos implementam operaçDes de conuntos# tais como$ união#interseção e dierença.
Eemplo$
# 5 codin: latin 5
# *onAuntos de dadoss = set(rane(%))s2 = set(rane(!, 7, !))s% = set(rane(2, !, 2))
# Exi3e os dadosprint 's:', s, '9ns2:', s2, '9ns%:', s%
# Uni<o
ss2 = s.union(s2)print 'Uni<o de s e s2:', ss2
# i/eren;aprint 'i/eren;a com s%:', ss2.di//erence(s%)
# ?nterse;<oprint '?nterse;<o com s%:', ss2.intersection(s%)
# ,esta se um set inclui outroif s.issuperset([, 2]):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 45/359
+ipos ')
print 's inclui e 2'
# ,esta se n<o existe elementos em comumif s.isdisAoint(s2): print 's e s2 n<o tem elementos em comum'
*a1da$
s: set()!" " 2+s2: set()=" &" !+s%: set()=" 2" 4" 6+Uni<o de s e s2: set()!" " 2" =" &" !+
i/eren;a com s%: set()!" " !" &+?nterse;<o com s%: set()=" 2+s inclui e 2s e s2 n<o tem elementos em comum
Ouando uma lista @ convertida para set # as repetiçDes são descartadas.
Na versão 2.:# tamb@m está dispon1vel um tipo $ui!tin de lista mutável decaracteres# chamado $ytearray.
Dicionários
Um dicionário @ uma lista de associaçDes compostas por uma chave Knica eestruturas correspondentes. icionários são mutáveis# tais como as listas.
A chave precisa ser de um tipo imutável# &eralmente são usadas strings # mastamb@m podem ser tuplas ou tipos num@ricos. <á os itens dos dicionáriospodem ser tanto mutáveis ?uanto imutáveis. I dicionário do !'thon não
ornece &arantia de ?ue as chaves estarão ordenadas.
*intae$
dicionario = #'a': a, '3': 3, ..., '8': 8$
Estrutura$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 46/359
', +ipos
Eemplo de dicionário$
dic = #'nome': '>hirley Hanson', '3anda': 'Gar3ae'$
Acessando elementos$
print dic['nome']
Adicionando elementos$
dic['al3um'] = ']ersion 2.!'
Apa&ando um elemento do dicionário$
&el dic['al3um']
Ibtendo os itens# chaves e valores$
Cha$es
Fractal
{?/ractal?: ?'/?, ?alheta?: ?@erde?, ?0imites?: (75;, 5A;), (;, ;): (53, 46)}
@alores
IFS
Palheta Verde
Limites (640, 480)
(0, 0) (42, 35)
Elementosimt!"eis
#$%etos&ais&er
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 47/359
+ipos '-
itens = dic.items()cha$es = dic.\eys()
$alores = dic.$alues()
Eemplos com dicionários$
# Pros e seus al3unspros = #'es': ['*lose ,o ,he Ede', 'Fraile'], 'Genesis': ['Foxtrot', ',he ursery *rime'], 'EWP': ['Brain >alad >urery']$
# Hais prospros['Xin *rimson'] = ['Ted', 'iscipline']
# items( retorna uma lista de# tuplas com a cha$e e o $alorfor pro, al3uns in pros.items(): print pro, '@0', al3uns
# >e ti$er 'EWP'" deletaif pros.hasD\ey('EWP'): &el pros['EWP']
*a1da$
es @0 )'*lose ,o ,he Ede'" 'Fraile'+EWP @0 )'Brain >alad >urery'+Genesis @0 )'Foxtrot'" ',he ursery *rime'+Xin *rimson @0 )'Ted'" 'iscipline'+
Eemplo de matri6 esparsa$
# 5 codin: latin 5
# Hatri8 esparsa implementada# com dicionIrio
# Hatri8 esparsa Q uma estrutura# ue s arma8ena os $alores ue# existem na matri8
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 48/359
'. +ipos
dim = 6, 2mat = #$
# ,uplas s<o imutI$eis# *ada tupla representa# uma posi;<o na matri8mat[%, 7] = %mat[4, 6] = mat[6, %] = 7mat[, 4] = 6mat[2, &] = 4mat[, !] = &
for lin in rane(dim[!]): for col in rane(dim[]): # HQtodo et(cha$e" $alor # retorna o $alor da cha$e # no dicionIrio ou se a cha$e # n<o existir" retorna o # seundo arumento print mat.et((lin, col), !), print
*a1da$
! ! ! ! ! ! ! ! ! ! ! !& ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! 4 ! !! ! ! ! ! ! ! % ! ! ! !! ! ! ! ! ! ! ! ! ! !! ! ! ! 6 ! ! ! ! ! ! !
=erando a matri6 esparsa$
# 5 codin: latin 5
# Hatri8 em /orma de strinmatri8 = '''! ! ! ! ! ! ! ! ! ! ! !& ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! 4 ! !! ! ! ! ! ! ! % ! ! ! !! ! ! ! ! ! ! ! ! ! !
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 49/359
+ipos '
! ! ! ! 6 ! ! ! ! ! ! !'''
mat = #$
# ue3ra a matri8 em linhasfor lin, linha in enumerate(matri8.splitlines()):
# ue3ra a linha em colunas for col, coluna in enumerate(linha.split()):
coluna = int(coluna) # *oloca a coluna no resultado" # se /or di/erente de 8ero if coluna:
mat[lin, col] = coluna
print mat# >ome um nas dimensMes pois a contaem come;a em 8eroprint ',amanho da matri8 completa:', (lin + ) * (col + )print ',amanho da matri8 esparsa:', len(mat)
*a1da$
Z(" 4: 6" (%" 7: %" (" !: &" (4" 6: " (2" &: 4[,amanho da matri8 completa: 72,amanho da matri8 esparsa:
A matri6 esparsa @ uma boa solução de processamento para estruturas em?ue a maioria dos itens permanecem va6ios# como planilhas# por eemplo.
#erdadeiro3 falso e nulo
Em !'thon# o tipo booleano 7$oo!8 @ uma especiali6ação do tipo inteiro 7int8. Iverdadeiro @ chamado +rue e @ i&ual a (# en?uanto o also @ chamado &a!se e @i&ual a 6ero.
Is se&uintes valores são considerados alsos$▪ &a!se 7also8.▪ =one 7nulo8.▪ , 76ero8.▪ VV 7string va6ia8.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 50/359
)0 +ipos
▪ fg 7lista va6ia8.▪ 78 7tupla va6ia8.▪ j 7dicionário va6io8.▪ Iutras estruturas com o tamanho i&ual a 6ero.
*ão considerados verdadeiros todos os outros obetos ora dessa lista.
I obeto =one # ?ue @ do tipo =one+ype # do !'thon representa o nulo e @avaliado como also pelo interpretador.
,peradores booleanos
Com operadores l"&icos @ poss1vel construir condiçDes mais compleas paracontrolar desvios condicionais e laços.
Is operadores booleanos no !'thon são$ and # or # not # is e in.▪ and$ retorna um valor verdadeiro se e somente se receber duas
epressDes ?ue orem verdadeiras.▪ or$ retorna um valor also se e somente se receber duas epressDes ?ue
orem alsas.▪
not$ retorna also se receber uma epressão verdadeira e vice-versa.▪ is$ retorna verdadeiro se receber duas reer>ncias ao mesmo obeto ealso em caso contrário.
▪ in$ retorna verdadeiro se receber um item e uma lista e o item ocorreruma ou mais ve6es na lista e also em caso contrário.
I calculo do valor resultante na operação and ocorre da se&uinte orma$ se aprimeira epressão or verdadeira# o resultado será a se&unda epressão#senão será a primeira. <á para o operador or # se a primeira epressão or alsa#
o resultado será a se&unda epressão# senão será a primeira. !ara os outrosoperadores# o retorno será do tipo $oo! 7+rue ou &a!se8.
Eemplos$
print ! an& % # Hostra !print 2 an& % # Hostra %
print ! or % # Hostra %
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 51/359
+ipos )1
print 2 or % # Hostra 2
print not ! # Hostra ,rueprint not 2 # Hostra Falseprint 2 in (2, %) # Hostra ,rueprint 2 is % # Hostra False
Al@m dos operadores booleanos# eistem as unçDes a!!:; # ?ue retornaverdadeiro ?uando todos os itens orem verdadeiros na se?u>ncia usadacomo parGmetro# e any:; # ?ue retorna verdadeiro se al&um item o or.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 52/359
)2 &unç>es
*unç$es
unçDes são blocos de c"di&o identiicados por um nome# ?ue podem receberparGmetros pr@-determinados.
No !'thon# as unçDes$▪ !odem retornar ou não obetos.▪ Aceitam *oc Strings.▪ Aceitam parGmetros opcionais 7com defau!ts8. *e não or passado o
parGmetro será i&ual ao defau!t deinido na unção.▪ Aceitam ?ue os parGmetros seam passados com nome. Neste caso# a
ordem em ?ue os parGmetros oram passados não importa.▪ Fem namespace pr"prio 7escopo local8# e por isso podem ouscar
deiniçDes de escopo &lobal.▪ !odem ter suas propriedades alteradas 7&eralmente por decoradores8.
*oc Strings são strings ?ue estão associadas a uma estrutura do !'thon. NasunçDes# as *oc Strings são colocadas dentro do corpo da unção# &eralmenteno começo. I obetivo das *oc Strings @ servir de documentação para a?uela
estrutura.
*intae$
&ef func(parametro, parametro2@padrao): ---oc >trin --- 3loco de cdio0 return $alor
Is parGmetros com defau!t devem icar ap"s os ?ue não tem defau!t.
Eemplo 7atorial com recursão8$
# Fatorial implementado de /orma recursi$a
&ef fatorial(num):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 53/359
&unç>es )3
if num <= : return else:
return(num * /atorial(num ' ))
# ,estando /atorial(print /atorial()
*a1da$
2!
Eemplo 7atorial sem recursão8$
&ef fatorial(n):
n = n if n > else A = for i in rane(, n + ): A = A * i return A
# ,estando...for i in rane(, 6): print i, '0', /atorial(i)
*a1da$
0 2 0 2
% 0 64 0 24 0 2!
Eemplo 7s@rie de ibonacci com recursão8$
&ef fib(n): ---Fi3onacci: /i3(n @ /i3(n K /i3(n 2 se n 0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 54/359
)' &unç>es
/i3(n @ se n @ --- if n > :
return /i3(n ! ) + /i3(n ! 2) else: return
# Hostrar Fi3onacci de a for i in [, 2, %, 4, ]: print i, '@0', /i3(i)
Eemplo 7s@rie de ibonacci sem recursão8$
&ef fib(n): ---Fi3onacci: /i3(n @ /i3(n K /i3(n 2 se n 0 /i3(n @ se n @ ---
# ois primeiros $alores l = [, ]
# *alculando os outros
for i in rane(2, n + ): l.append(l[i !] + l[i ! 2])
return l[n]
# Hostrar Fi3onacci de a for i in [, 2, %, 4, ]: print i, '@0', /i3(i)
*a1da$
@0 2 @0 2% @0 %4 @0 @0 =
Eemplo 7conversão de ;=8$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 55/359
&unç>es ))
# 5 codin: latin 5
&ef rbht"l(r=!, =!, 3=!):
---*on$erte T" G" B em #TTGGBB---
return '#O!2xO!2xO!2x' % (r, , 3)
&ef ht"lrb(color='#!!!!!!'): ---*on$erte #TTGGBB em T" G" B---
if color.startsCith('#'): color = color[:]
r = int(color[:2], 6) = int(color[2:4], 6)
3 = int(color[4:], 6)
return r, , 3 # Uma seuJncia
print r3Dhtml(2!!, 2!!, 2)print r3Dhtml(3=2!!, =2!!, r=2) # L ue hou$eprint htmlDr3('#c=c=//')
*a1da$
#c=c=// #//c=c=(2!!" 2!!" 2
IbservaçDes$▪ Is ar&umentos com padrão devem vir por Kltimo# depois dos
ar&umentos sem padrão.▪ I valor do padrão para um parGmetro @ calculado ?uando a unção @
deinida.▪ Is ar&umentos passados sem identiicador são recebidos pela unção
na orma de uma lista.▪ Is ar&umentos passados com identiicador são recebidos pela unção
na orma de um dicionário.▪ Is parGmetros passados com identiicador na chamada da unção
devem vir no im da lista de parGmetros.
Eemplo de como receber todos parGmetros$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 56/359
), &unç>es
# 5 codin: latin 5
# 5ars arumentos sem nome (lista# 55\ars arumentos com nome (dicionIrio
&ef func(*ars, **\ars): print ars print \ars
/unc('peso', !, unidade='\')
*a1da$
('peso'" !Z'unidade': '\'[
No eemplo# #args receberá os ar&umentos nomeados e args receberá osoutros.
I interpretador tem deinidas al&umas unçDes $ui!tin # incluindo sorted:; # ?ue
ordena se?u>ncias# e cmp:; # ?ue a6 comparaçDes entre dois ar&umentos eretorna -( se o primeiro elemento or maior # , 76ero8 se orem i&uais ou ( se oKltimo or maior. Essa unção @ usada pela rotina de ordenação# umcomportamento ?ue pode ser modiicado.
Eemplo$
# 5 codin: latin 5
dados = [(4, %), (, ), (7, 2), (&, !)]
# *omparando pelo Nltimo elemento&ef c"p(x, y): return cmp(x[!], y[!])
print 'Wista:', dados
# Lrdena usando Dcmp(print 'Lrdenada:', sorted(dados, Dcmp)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 57/359
&unç>es )-
*a1da$
Wista: )(4" %" (" " (7" 2" (&" !+Lrdenada: )(&" !" (" " (7" 2" (4" %+
I !'thon tamb@m possui como $ui!tin a unção ea!:; # ?ue avalia c"di&o7onte ou obeto8 retornando o valor.
Eemplo$
print e$al('2. 2 K %.%')
*a1da$
&.%
Com isso @ poss1vel montar c"di&o para ser passado para o interpretador
durante a eecução de um pro&rama. Esse recurso deve ser usado comcuidado# pois c"di&o montados a partir de entradas do sistema abrir brechasde se&urança.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 58/359
). *ocumentação
Documentação
!'IC @ a erramenta de documentação(5
do !'thon. Ela pode ser utili6adatanto para acessar a documentação dos m"dulos ?ue acompanham o !'thon#?uanto a documentação dos m"dulos de terceiros.
No Jindo4s# acesse o 1cone THodule ocs para a documentação da biblioteca padrão e T!'thon Hanuals para consultar o tutorial# reer>ncias eoutros documentos mais etensos.
!ara utili6ar o !'IC no Linu$
pydoc .modulo.py
!ara eibir a documentação de Tmodulo.p' no diret"rio atual.
No Linu# a documentação das bibliotecas pode ser vista atrav@s do $ro"serusando o comando$
pydoc p =!!!
No endereço http$%%localhost$9,,,%.
!ara rodar a versão &ráica do !'IC eecute$
pydoc
I !'IC utili6a as *oc Strings dos m"dulos para &erar a documentação.
Al@m disso# @ poss1vel ainda consultar a documentação no pr"priointerpretador# atrav@s da unção he!p:;.
Eemplo$
(5 A documentação do !'thon tamb@m está dispon1vel em$ http$%%444.p'thon.or&%doc%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 59/359
*ocumentação )
help(list)
Hostra a documentação para a lista do !'thon.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 60/359
,0 /erc?cios I
%&erccios I
(. mplementar duas unçDes$▪ Uma ?ue converta temperatura em &raus 4e!sius para &ahrenheit@▪ Iutra ?ue converta temperatura em &raus &ahrenheit para 4e!sius.
Lembrando ?ue$
2. mplementar uma unção ?ue retorne verdadeiro se o nKmero or primo7also caso contrário8. Festar de ( a (,,.
+. mplementar uma unção ?ue receba uma lista de listas de comprimentos?uais?uer e retorne uma lista de uma dimensão.
0. mplementar uma unção ?ue receba um dicionário e retorne a soma# am@dia e a variação dos valores.
5. Escreva uma unção ?ue$▪ ;eceba uma rase como parGmetro.▪ ;etorne uma nova rase com cada palavra com as letras invertidas.
:. Crie uma unção ?ue$▪ ;eceba uma lista de tuplas 7dados8# um inteiro 7chave# 6ero por padrão
i&ual8 e um booleano 7reverso# also por padrão8.▪ ;etorne dados ordenados pelo item indicado pela chave e em ordem
decrescente se reverso or verdadeiro.
F =9
5⋅C 32
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 61/359
Parte II ,1
Parte IIEsta parte trata de m"dulos e pacotes# destacando al&uns dos mais relevantes?ue estão presentes na biblioteca padrão da lin&ua&em# instalação de
bibliotecas de terceiros# eceçDes e introspecção.
ConteKdo$▪ H"dulos .▪ Escopo de nomes .
▪ !acotes .▪ iblioteca padrão .▪ ibliotecas de terceiros.▪ EceçDes .▪ ntrospecção .▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 62/359
,2 Adu!os
)"dulos
!ara o !'thon# m"dulos são ar?uivos onte ?ue podem importados para umpro&rama. !odem conter ?ual?uer estrutura do !'thon e são eecutados?uando importados(:. Eles são compilados ?uando importados pela primeirave6 e arma6enados em ar?uivo 7com etensão T.p'c ou T.p'o8# possuemnamespace pr"prio e aceitam *oc Strings. *ão obetos Sing!eton 7@ carre&adasomente uma instGncia em mem"ria# ?ue ica dispon1vel de orma &lobal parao pro&rama8.
Is m"dulos são locali6ados pelo interpretador atrav@s da lista de pastasPB+HC=PD+H 7sys@path8# ?ue normalmente inclui a pasta corrente emprimeiro lu&ar.
Is m"dulos são carre&ados atrav@s da instrução import. esta orma# ao usaral&uma estrutura do m"dulo# @ necessário identiicar o m"dulo. sto @chamado de importação a$so!uta.
(: Caso sea necessário eecutar de novo o m"dulo durante a eecução da aplicação# ele terá
?ue carre&ado outra ve6 atrav@s da unção re!oad:;.
BBmainBB
/un,o
sys.path
sys.e1it()
ódulo principal em e1ecu,o.
sys
path
e1it
ódulo sys (import sys)
path é uma lista.
exit é uma fun,o.
/un,o definida em __main__.
Chamando exit de sys.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 63/359
Adu!os ,3
i"port osprint os.name
Famb@m poss1vel importar m"dulos de orma relativa$
fro" os i"port nameprint name
I caractere T\ pode ser usado para importar tudo ?ue está deinido nom"dulo$
fro" os i"port 5print name
!or evitar problemas# como a ouscação de variáveis# a importação absoluta @considerada uma prática de pro&ramação melhor do ?ue a importaçãorelativa.
Eemplo de m"dulo$
# 5 codin: latin 5# Srui$o calc.py
# Fun;<o de/inida no mdulo&ef "e&ia(lista):
return /loat(sum(lista)) / len(lista)
Eemplo de uso do m"dulo$
# 5 codin: latin 5
# ?mporta o mdulo calci"port calc
l = [2%, 4, %, 77, 2, %4]
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 64/359
,' Adu!os
# *hamada a /un;<o de/inida em calcprint calc.media(l)
*a1da$
%=.
I m"dulo principal de um pro&rama tem a variável EEnameEE i&ual YTXXmainXX# então @ poss1vel testar se o m"dulo @ o principal usando$
if DDnameDD == -DDmainDD-: # Sui o cdio s serI executado # se este /or o mdulo principal # e n<o uando ele /or importado por outro prorama
Com isso @ ácil transormar um pro&rama em um m"dulo.
Iutro eemplo de m"dulo$
# 5 codin: latin 5---modutils @0 rotinas utilitIrias para mdulos---
i"port os.pathi"port sysi"port lo3
&ef fin&(txt): ---encontra mdulos ue tem o nome contendo o parYmetro ---
resp = []
for path in sys.path: mods = lo3.lo3('Os5.py' % path)
for mod in mods:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 65/359
Adu!os ,)
if txt in os.path.3asename(mod): resp.append(mod)
return resp
Eemplo de uso do m"dulo$
fro" os.path i"port etsi8e, etmtimefro" time i"port localtime, asctime
i"port modutils
mods = modutils./ind('xml')
for mod in mods:
tm = asctime(localtime(etmtime(mod))) \3 = etsi8e(mod) / !24 print 'Os: (Od \3ytes" Os' % (mod, \3, tm)
Eemplo de sa1da$
c:9python269li39xmlli3.py: (%4 \3ytes" ^ed >ep %! !!:%:6 2!!&c:9python269li39xmlrpcli3.py: (4= \3ytes" Hon >ep != !&:=:%2 2!!=
ividir pro&ramas em m"dulos acilita o reaproveitamento e locali6ação dealhas no c"di&o.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 66/359
,, /scopo de nomes
%scopo de nomes
I escopo de nomes em !'thon @ mantido atrav@s de =amespaces7 ?ue sãodicionários ?ue relacionam os nomes dos obetos 7reer>ncias8 e os obetos emsi.
Normalmente# os nomes estão deinidos em dois dicionários# ?ue podem serconsultados atrav@s das unçDes !oca!s:; e g!o$a!s:;. Estes dicionários sãoatuali6ados dinamicamente em tempo de eecução().
ariáveis &lobais podem ser ouscadas por variáveis locais 7pois o escopolocal @ consultado antes do escopo &lobal8. !ara evitar isso# @ preciso declarara variável como &lobal no escopo local.
Eemplo$
() Embora os dicionários retornados por !oca!s:; e g!o$a!s:; possam ser alterados
diretamente# isso deve ser evitado# pois pode ter eeitos indeseáveis.
ódulo
/un,o
@arB2
@arB3
@arB4
@arB4
@arB5
+stas s,o $ariá$eis glo"ais.
+stas s,o $ariá$eis locais.
@arB4 foi ofuscadaD pois foi(re)definida no escopo local.
Em namespace é um escopo dedefini,o de estruturas.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 67/359
/scopo de nomes ,-
&ef so"alista(lista): --- >oma listas de listas" recursi$amente
*oloca o resultado como lo3al --- lobal soma
for item in lista: if type(item) is list: # >e o tipo do item /or lista somalista(item) else: soma += item
soma = !
somalista([[, 2], [%, 4, ], 6])
print soma # 2
Usar variáveis &lobais não @ considerada uma boa prática dedesenvolvimento# pois tornam mais di1cil entender o sistema# portanto @melhor evitar seu uso. E ouscar variáveis tamb@m.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 68/359
,. Pacotes
Pacotes
!acotes 7 pac#ages8 são pastas ?ue são identiicadas pelo interpretador pelapresença de um ar?uivo com o nome TXXinitXX.p'. Is pacotes uncionamcomo coleçDes para or&ani6ar m"dulos de orma hierár?uica.
S poss1vel importar todos os m"dulos do pacote usando a declaração fromnomeEdoEpacote import F .
I ar?uivo TXXinitXX.p' pode estar va6io ou conter c"di&o de iniciali6ação do
pacote ou deinir uma variável chamada EEa!!EE # uma lista de m"dulos dopacote serão importados ?uando or usado T\. *em o ar?uivo# o !'thon nãoidentiica a pasta como um pacote válido.
componentes
display.py
lcd
oled
+sta pasta é um pacote.
sensor.pytermico
'dentifica a pasta como pacote.
componentes.sensor .componentes.sensor.termico.
componentes.display.crt .
componentes.display.oled .
BBinitBB.py
crt
componentes.display.lcd .
componentes.display .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 69/359
8i$!ioteca padrão ,
+iblioteca padrão
S comum di6er ?ue o !'thon vem com Tbaterias inclusas# em reer>ncia avasta biblioteca de m"dulos e pacotes ?ue @ distribu1da com o interpretador.
Al&uns m"dulos importantes da biblioteca padrão$▪ Hatemática$ math # cmath # decima! e random.▪ *istema$ os # g!o$ # shuti!s e su$process.▪ +hreads$ threading.▪ !ersist>ncia$ pic#!e e cPic#!e.▪ HL$ m!@dom # m!@sa e e!ement+ree 7a partir da versão 2.58.▪ Coni&uração$ 4onfigParser e optparse.▪ Fempo$ time e datetime.▪ Iutros$ sys # !ogging # trace$ac# # types e timeit.
)atemática
Al@m dos tipos num@ricos $ui!tins do interpretador# na biblioteca padrão do!'thon eistem vários m"dulos dedicados a implementar outros tipos eoperaçDes matemáticas.
I m"dulo math deine unçDes lo&ar1tmicas# de eponenciação#tri&onom@tricas# hiperb"licas e conversDes an&ulares# entre outras. <á om"dulo cmath # implementa unçDes similares# por@m eitas para processarnKmeros compleos.
Eemplo$
# 5 codin: latin 5
# Hdulo para matemIticai"port math
# Hdulo para matemItica (de complexosi"port cmath
# *omplexosfor cpx in [%A, . + A, !2 ! 2A]:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 70/359
-0 8i$!ioteca padrão
# *on$ers<o para coordenadas polares plr = cmath.polar(cpx) print '*omplexo:', cpx
print 'Forma polar:', plr, '(em radianos' print 'Smplitude:', a3s(cpx) print 'bnulo:', math.derees(plr[]), '(raus'
*a1da$
*omplexo: %AForma polar: (%.!" .7!7&6%267&4=&66 (em radianosSmplitude: %.!
bnulo: &!.! (raus*omplexo: (.KAForma polar: (.=!2776%77%&&4=" !.==!!26!%4767 (em radianosSmplitude: .=!2776%77%bnulo: %%.6&!!6726 (raus*omplexo: (22AForma polar: (2.=2=42724746&!%" 2.%6&44&!&2%44= (em radianosSmplitude: 2.=2=427247bnulo: %.! (raus
I m"dulo random tra6 unçDes para a &eração de nKmeros aleat"rios.
Eemplos$
# 5 codin: latin 5
i"port randomi"port strin
# Escolha uma letraprint random.choice(strin.asciiDuppercase)
# Escolha um nNmero de a !print random.randrane(, )
# Escolha um /loat no inter$alo de ! a print random.random()
*a1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 71/359
8i$!ioteca padrão -1
?4!.6=!727!2
Na biblioteca padrão ainda eiste o m"dulo decima! # ?ue deine operaçDescom nKmeros reais com precisão ia.
Eemplo$
t = .for i in rane(!):
t = t ! !.
print 'Float:', t
t = ecimal('.')for i in rane(!): t = t ! ecimal('!.')
print 'ecimal:', t
*a1da$
Float: .!26&62&77=eecimal: !.!
Com este m"dulo# @ poss1vel redu6ir a introdução de erros dearredondamento ori&inados da aritm@tica de ponto lutuante.
Na versão 2.:# tamb@m está dispon1vel o m"dulo fractions # ?ue trata denKmeros racionais.
Eemplo$
# 5 codin: latin 5
fro" /ractions i"port Fraction
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 72/359
-2 8i$!ioteca padrão
# ,rJs /ra;Mes/ = Fraction('2%')/2 = Fraction(%, 4)
/% = Fraction('.2')print -Fraction('2%' @-, /print -Fraction('%" 4' @-, /2print -Fraction('.2' @-, /%
# >omaprint /, 'K', /2, '@', / + /2print /2, 'K', /%, '@', /2 + /%
*a1da$
Fraction('2%' @ 2%Fraction('%" 4' @ %4Fraction('.2' @ 42% K %4 @ 2%4 K 4 @
As raçDes podem ser iniciali6adas de várias ormas$ como string # como umpar de inteiros ou como um nKmero real. I m"dulo tamb@m possui umaunção chamada gcd:; # ?ue calcula o maior divisor comum 7HC8 entre doisinteiros.
Ar1uivos e I4,
Is ar?uivos no !'thon são representados por obetos do tipo fi!e1. # ?ueoerecem m@todos para diversas operaçDes de ar?uivos. Ar?uivos podem serabertos para leitura 7VrV# ?ue @ o defau!t8# &ravação 7V4V8 ou adição 7VaV8# emmodo teto ou binário7VbV8.
Em !'thon$▪ sys@stdin representa a entrada padrão.▪ sys@stdout representa a sa1da padrão.▪ sys@stderr representa a sa1da de erro padrão.
A entrada# sa1da e erro padrDes são tratados pelo !'thon como ar?uivos
(9 A reer>ncia open aponta para fi!e.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 73/359
8i$!ioteca padrão -3
abertos. A entrada em modo de leitura e os outros em modo de &ravação.
Eemplo de escrita$
i"port sys
# *riando um o3Aeto do tipo /iletemp = open('temp.txt', 'C')
# Escre$endo no arui$ofor i in rane(!!): temp.Crite('O!%d9n' % i)
# Fechandotemp.close()
temp = open('temp.txt')
# Escre$endo no terminalfor x in temp: # Escre$er em sys.stdout en$ia # o texto para a sada padr<o sys.stdout.Crite(x)
temp.close()
A cada iteração no se&undo laço# o obeto retorna uma linha do ar?uivo decada ve6.
Eemplo de leitura$
i"port sysi"port os.path
# raCDinput( retorna a strin diitada/n = raCDinput('ome do arui$o: ').strip()
if not os.path.exists(/n): print ',ente outra $e8...' sys.exit()
# umerando as linhasfor i, s in enumerate(open(/n)):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 74/359
-' 8i$!ioteca padrão
print i + , s,
S poss1vel ler todas as linhas com o m@todo read!ines:;$
# ?mprime uma lista contendo linhas do arui$oprint open('temp.txt').readlines()
Is obetos do tipo ar?uivo tamb@m possuem um m@todo see#:; # ?ue permiteir para ?ual?uer posição no ar?uivo.
Na versão 2.:# está dispon1vel o m"dulo io # ?ue implementa de ormaseparada as operaçDes de ar?uivo e as rotinas de manipulação de teto.
Sistemas de ar1uivo
Is sistemas operacionais modernos arma6enam os ar?uivos em estruturashierár?uicas chamadas sistemas de ar?uivo 7 fi!e systems8.
árias uncionalidades relacionadas a sistemas de ar?uivo estão
implementadas no m"dulo os@path # tais como$▪ os@path@$asename:;$ retorna o componente inal de um caminho.▪ os@path@dirname:;$ retorna um caminho sem o componente inal.▪ os@path@eists:;$ retorna +rue se o caminho eiste ou &a!se em caso
contrário.▪ os@path@getsi<e:;$ retorna o tamanho do ar?uivo em $ytes.
I g!o$ @ outro m"dulo relacionado ao sistema de ar?uivo$
i"port os.pathi"port lo3
# Hostra uma lista de nomes de arui$os# e seus respecti$os tamanhosfor ar in sorted(lo3.lo3('5.py')): print ar, os.path.etsi8e(ar)
A unção g!o$@g!o$:; retorna uma lista com os nomes de ar?uivo ?ue atendem
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 75/359
8i$!ioteca padrão -)
ao crit@rio passado como parGmetro# de orma semelhante ao comando Tlsdispon1vel nos sistemas UN.
Ar1uivos temporários
I m"dulo os implementa al&umas unçDes para acilitar a criação de ar?uivostemporários# liberando o desenvolvedor de al&umas preocupaçDes# tais como$
▪ Evitar colisDes com nomes de ar?uivos ?ue estão em uso.▪ dentiicar a área apropriada do sistema de ar?uivos para temporários
7?ue varia conorme o sistema operacional8.▪ Epor a aplicação a riscos 7a área de temporários @ utili6ada por outros
processos8.
Eemplo$
# 5 codin: latin 5
i"port os
texto = ',este'# cria um arui$o temporIriotemp = os.tmp/ile()
# Escre$e no arui$o temporIriotemp.Crite(',este')
# ]olta para o inicio do arui$otemp.see\(!)
# Hostra o conteNdo do arui$oprint temp.read()
# Fecha o arui$o
temp.close()
*a1da$
,este
Eiste tamb@m a unção tempnam:; # ?ue retorna um nome válido para ar?uivotemporário# incluindo um caminho ?ue respeite as convençDes do sistema
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 76/359
-, 8i$!ioteca padrão
operacional. !or@m# ica por conta do desenvolvedor &arantir ?ue a rotinasea usada de orma a não comprometer a se&urança da aplicação.
Ar1uivos compactados
I !'thon possui m"dulos para trabalhar com vários ormatos de ar?uivoscompactados.
Eemplo de &ravação de um ar?uivo T.6ip$
# 5 codin: latin 5---
Gra$ando texto em um arui$o compactado---
i"port 8ip/ile
texto = ---555555555555555555555555555555555555555Esse Q o texto ue serI compactado e...... uardado dentro de um arui$o 8ip.555555555555555555555555555555555555555---
# *ria um 8ip no$o8ip = 8ip/ile.RipFile('ar.8ip', 'C', 8ip/ile.R?PDEFWS,E)
# Escre$e uma strin no 8ip como se /osse um arui$o8ip.Critestr('texto.txt', texto)
# Fecha o 8ip8ip.close()
Eemplo de leitura$
# 5 codin: latin 5---Wendo um arui$o compactado---
i"port 8ip/ile
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 77/359
8i$!ioteca padrão --
# S3re o arui$o 8ip para leitura8ip = 8ip/ile.RipFile('ar.8ip')
# Pea a lista dos arui$os compactadosars = 8ip.namelist()
for ar in ars: # Hostra o nome do arui$o print 'Srui$o:', ar
# Peando as in/orma;Mes do arui$o 8ipin/o = 8ip.etin/o(ar) print ',amanho oriinal:', 8ipin/o./ileDsi8e print ',amanho comprimido:', 8ipin/o.compressDsi8e
# Hostra o conteNdo do arui$o print 8ip.read(ar)
*a1da$
Srui$o: texto.txt,amanho oriinal: 6!,amanho comprimido: =2
555555555555555555555555555555555555555Esse Q o texto ue serI compactado e...... uardado dentro de um arui$o 8ip.555555555555555555555555555555555555555
I !'thon tamb@m prov> m"dulos para os ormatos &6ip# b6ip2 e tar# ?ue são bastante utili6ados em ambientes UN.
Ar1uivos de dados
Na biblioteca padrão# o !'thon tamb@m ornece um m"dulo para simpliicaro processamento de ar?uivos no ormato C* 74omma Separated Va!ues8.
No ormato C*# os dados são arma6enados em orma de teto# separadospor v1r&ula# um re&istro por linha.
Eemplo de escrita$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 78/359
-. 8i$!ioteca padrão
i"port cs$
# ados
dt = (('temperatura', .!, '*', '!:4!', '2!!62%'), ('peso', 42., '\', '!:4', '2!!62%'))
# S rotina de escrita rece3e um o3Aeto do tipo /ileout = cs$.Criter(/ile('dt.cs$', 'C'))
# Escre$endo as tuplas no arui$oout.CriteroCs(dt)
Ar?uivo de sa1da$
temperatura".!"*"!:4!"2!!62%peso"42."\"!:4"2!!62%
Eemplo de leitura$
i"port cs$
# S rotina de leitura rece3e um o3Aeto arui$odt = cs$.reader(/ile('dt.cs$'))
# Para cada reistro do arui$o" imprimafor re in dt: print re
*a1da$
)'temperatura'" '.!'" '*'" '!:4!'" '2!!62%'+)'peso'" '42.'" '\'" '!:4'" '2!!62%'+
I ormato C* @ aceito pela maioria das planilhas e sistemas de banco dedados para importação e eportação de inormaçDes.
Sistema operacional
Al@m do sistema de ar?uivos# os m"dulos da biblioteca padrão tamb@m
ornecem acesso a outros serviços providos pelo sistema operacional.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 79/359
8i$!ioteca padrão -
Eemplo$
# 5 codin: ut/= 5
i"port osi"port sysi"port plat/orm
&ef ui&(): --- uid( 0 retorna a identi/ica;<o do usuIrio corrente ou one se n<o /or poss$el identi/icar ---
# ]ariI$eis de am3iente para cada # sistema operacional us = #'^indoCs': 'U>ETSHE', 'Winux': 'U>ET'$
u = us.et(plat/orm.system()) return os.en$iron.et(u)
print 'UsuIrio:', uid()print 'plata/orma:', plat/orm.plat/orm()print 'iretrio corrente:', os.path.a3spath(os.curdir)exep, exe/ = os.path.split(sys.executa3le)print 'ExecutI$el:', exe/ print 'iretrio do executI$el:', exep
*a1da$
UsuIrio: lplata/orma: Winux2.6.%6enericx=6D64CithU3untu&.!\armic
iretrio corrente: homelExecutI$el: pythoniretrio do executI$el: usr3in
Eemplo de eecução de processo$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 80/359
.0 8i$!ioteca padrão
i"port sysfro" su3process i"port Popen, P?PE
# pincmd = 'pin c '# o ^indoCsif sys.plat/orm == 'Cin%2': cmd = 'pin n '
# Wocal s para testarhost = '27.!.!.'
# *omunica;<o com outro processo"# um pipe com o stdout do comando
py = Popen(cmd + host, stdout=P?PE)
# Hostra a sada do comandoprint py.stdout.read()
I m"dulo su$process prov> uma orma &en@rica de eecução de processos# naunção Popen:; # ?ue permite a comunicação com o processo atrav@s pipes dosistema operacional.
'empo
I !'thon possui dois m"dulos para lidar com tempo$▪ time$ implementa unçDes ?ue permitem utili6ar o tempo &erado pelo
sistema.▪ datetime$ implementa tipos de alto n1vel para reali6ar operaçDes de data
e hora.
Eemplo com time$
# 5 codin: latin 5
i"port time
# localtime( Tetorna a data e hora local no /ormato# de uma estrutura chamada structDtime" ue Q uma# cole;<o com os itens: ano" mJs" dia" hora" minuto"# seundo" dia da semana" dia do ano e horIrio de $er<oprint time.localtime()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 81/359
8i$!ioteca padrão .1
# asctime( retorna a data e hora como strin" con/orme# a con/iura;<o do sistema operacionalprint time.asctime()
# time( retorna o tempo do sistema em seundosts = time.time()
# mtime( con$erte seundos para structDtimett = time.mtime(ts)print ts, '0', tt
# >omando uma horatt2 = time.mtime(ts + %6!!.)
# m\time( con$erte structDtime para seundosts2 = time.m\time(tt2)print ts2, '0', tt2
# cloc\( retorma o tempo desde uando o prorama# iniciou" em seundosprint 'L prorama le$ou', time.cloc\(), 9 'seundos atQ aora...'
# *ontando os seundos...
for i in xrane():
# sleep( espera durante o nNmero de seundos # especi/icados como parYmetro time.sleep() print i + , 'seundo(s'
*a1da$
time.structDtime(tmDyear@2!!" tmDmon@" tmDmday@6" tmDhour@="tmDmin@7" tmDsec@&" tmDCday@" tmDyday@6" tmDisdst@>at an 6 =:!7:& 2!!26%67247&.6 0 time.structDtime(tmDyear@2!!" tmDmon@"tmDmday@6" tmDhour@2!" tmDmin@7" tmDsec@&" tmDCday@"tmDyday@6" tmDisdst@!26%6=6=7&.! 0 time.structDtime(tmDyear@2!!" tmDmon@"tmDmday@6" tmDhour@2" tmDmin@7" tmDsec@&" tmDCday@"tmDyday@6" tmDisdst@!L prorama le$ou .466666=2&e!6 seundos atQ aora... seundo(s
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 82/359
.2 8i$!ioteca padrão
2 seundo(s% seundo(s4 seundo(s
seundo(s
Em datetime # estão deinidos ?uatro tipos para representar o tempo$▪ datetime$ data e hora.▪ date$ apenas data.▪ time$ apenas hora.▪ timede!ta$ dierença entre tempos.
Eemplo$
# 5 codin: latin 5
i"port datetime
# datetime( rece3e como parYmetros:# ano" mJs" dia" hora" minuto" seundo# e retorna um o3Aeto do tipo datetimedt = datetime.datetime(2!2!, 2, %, 2%, &, &)
# L3Aetos date e time podem ser criados# a partir de um o3Aeto datetimedata = dt.date()hora = dt.time()
# uanto tempo /alta para %22!2!dd = dt ! dt.today()
print 'ata:', dataprint 'Vora:', hora
print 'uanto tempo /alta para %22!2!:', 9 str(dd).replace('days', 'dias')
*a1da$
ata: 2!2!2%Vora: 2%:&:&uanto tempo /alta para %22!2!: 466 dias" %:22:=.=7!!!
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 83/359
8i$!ioteca padrão .3
Is obetos dos tipos date e datetime retornam datas em ormato *I.
%&press$es regulares
Epressão re&ular @ uma maneira de identiicar padrDes em se?u>ncias decaracteres. No !'thon# o m"dulo re prov> um analisador sintático ?uepermite o uso de tais epressDes. Is padrDes deinidos atrav@s de caracteres?ue tem si&niicado especial para o analisador.
!rincipais caracteres$▪ !onto 7.8$ Em modo padrão# si&niica ?ual?uer caractere# menos o de
nova linha.▪ Circunleo 78$ Em modo padrão# si&niica inicio da string.▪ Cirão 78$ Em modo padrão# si&niica im da string.▪ Contra-barra 7Z8$ Caractere de escape# permite usar caracteres especiais
como se ossem comuns.▪ Colchetes 7fg8$ Oual?uer caractere dos listados entre os colchetes.▪ Asterisco 7\8$ ero ou mais ocorr>ncias da epressão anterior.▪ Hais 7W8$ Uma ou mais ocorr>ncias da epressão anterior.▪ nterro&ação 7k8$ ero ou uma ocorr>ncia da epressão anterior.
▪ Chaves 7nj8$ n ocorr>ncias da epressão anterior.▪ arra vertical 78$ Tou l"&ico.▪ !arenteses 7788$ elimitam um &rupo de epressDes.▪ Zd$ 1&ito. E?uivale a f,-/g.▪ Z$ Não d1&ito. E?uivale a f,-/g.▪ Zs$ Oual?uer caractere de espaçamento 7f ZtZnZrZZvg8.▪ Z*$ Oual?uer caractere ?ue não sea de espaçamento.7f ZtZnZrZZvg8.▪ Z4$ Caractere alanum@rico ou sublinhado 7fa-6A-,-/Xg8.▪ ZJ$ Caractere ?ue não sea alanum@rico ou sublinhado 7fa-6A-,-
/Xg8.
Eemplos$
# 5 codin: latin 5
i"port re
# *ompilando a express<o reular
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 84/359
.' 8i$!ioteca padrão
# Usando compile( a express<o reular /ica compilada# e pode ser usada mais de uma $e8rex = re.compile('9CK')
# Encontra todas as ocorrJncias ue atendam a express<o3andas = 'es" Genesis *amel'print 3andas, '0', rex./indall(3andas)
# ?denti/ica as ocorrJncias de BAr\ (e suas $aria;Mes3Aor\ = re.compile(')B3+A)o+r\')for m in ('BAr\', '3Ar\', 'Bior\', 'BAor\', '3Aor\'):
# match( locali8a ocorrJncias no inicio da strin # para locali8ar em ualuer parte da strin" use search(
print m, '0', 3ool(3Aor\.match(m))
# >u3stituindo textotexto = 'S prxima /aixa Q >tairCay to Vea$en'print texto, '0', re. su3(')>s+tairCay ),t+o )Vh+ea$en', ',he To$er', texto)
# i$idindo texto3andas = ',ool" Porcupine ,ree e ?'print 3andas, '0', re.split('"9sKe9sK', 3andas)
*a1da$
es" Genesis *amel 0 )'es'" 'Genesis'" '*amel'+BAr\ 0 ,rue3Ar\ 0 ,rueBior\ 0 FalseBAor\ 0 ,rue3Aor\ 0 ,rueS prxima /aixa Q >tairCay to Vea$en 0 S prxima /aixa Q ,he To$er
,ool" Porcupine ,ree e ? 0 )',ool" Porcupine ,ree'" '?'+
I comportamento das unçDes desse m"dulo pode ser alterado por opçDes#para tratar as strings como unicode # por eemplo.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 85/359
8i$!iotecas de terceiros .)
+ibliotecas de terceiros
Eistem muitas bibliotecas escritas por terceiros dispon1veis para !'thon#compostas por pacotes ou m"dulos# ?ue implementam diversos recursosal@m da biblioteca padrão.
=eralmente# as bibliotecas são distribu1das das se&uintes ormas$▪ !acotes distuti!s.▪ !acotes para &erenciadores de pacotes do *istema Iperacional.▪ nstaladores.▪ !'thon E&&s.
Is pacotes usando o m"dulo distuti!s # ?ue @ distribu1do com o !'thon# sãomuito populares. Is pacotes são distribu1dos em ar?uivos compactados7&eralmente T.tar.&6# T.tar.b62 ou T.6ip8. !ara instalar# @ necessáriodescompactar o ar?uivo# entrar na pasta ?ue oi descompactada e por imeecutar o comando$
python setup.py install
Oue o pacote será instalado na pasta Tsite-pac3a&es no !'thon.
=erenciadores de pacotes do *istema Iperacional# &eralmente trabalham comormatos pr"prios de pacote# como T.deb 7ebian Linu8 ou T.rpm 7;edBatLinu8. A orma de instalar os pacotes depende do &erenciador utili6ado. A&rande vanta&em @ ?ue o &erenciador de pacotes cuida das depend>ncias eatuali6açDes.
!ro&ramas instaladores são nada mais ?ue eecutáveis ?ue instalam a biblioteca. =eralmente são usados em ambiente Jindo4s e podem serdesinstalados pelo !ainel de Controle.
!'thon E&& @ um ormato de pacote 7com a etensão T.e&&8 ?ue @administrado pelo eas'Xinstall# utilitário ?ue a6 parte do proeto setuptools(/.*emelhante a al&umas erramentas encontradas em outras lin&ua&ens# como
(/ ontes e documentação em$ http$%%pea3.telecommunit'.com%evCenter%setuptools%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 86/359
., 8i$!iotecas de terceiros
o ;ub' =ems# aos poucos está se tornando o padrão de ato para distribuiçãode bibliotecas em !'thon.
I pro&rama procura pela versão mais nova do pacote no !M!2, 7PythonPac#age Inde8# reposit"rio de pacotes !'thon# e tamb@m procura instalar asdepend>ncias ?ue orem necessárias.
!acotes !'thon E&&s podem ser instalados pelo comando$
easyDinstall nomeDdoDpacote
I script eas'Xinstall @ instalado na pasta Tscripts do !'thon.
2, Endereço$ http$%%p'pi.p'thon.or&%p'pi.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 87/359
/ceç>es .-
%&ceç$es
Ouando ocorre uma alha no pro&rama 7como uma divisão por 6ero# poreemplo8 em tempo de eecução# uma eceção @ &erada. *e a eceção não ortratada# ela será propa&ada atrav@s das chamadas de unção at@ o m"duloprincipal do pro&rama# interrompendo a eecução.
print /!
,race3ac\ (most recent call last): File -input0-, line , in Reroi$isionError: inteer di$ision or modulo 3y 8ero
A instrução try permite o tratamento de eceçDes no !'thon. *e ocorrer umaeceção em um bloco marcado com try # @ poss1vel tratar a eceção atrav@s dainstrução ecept. !odem eistir vários blocos ecept para o mesmo bloco try.
tr: print /!
ecept Reroi$isionError: print 'Erro ao tentar di$idir por 8ero.'
*a1da$
Erro ao tentar di$idir por 8ero.
*e ecept recebe o nome da eceção# s" esta será tratada. *e não or passada
nenhuma eceção como parGmetro# todas serão tratadas.
Eemplo$
i"port trace3ac\
# ,ente rece3er o nome do arui$otr: /n = raCDinput('ome do arui$o: ').strip()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 88/359
.. /ceç>es
# umerando as linhas for i, s in enumerate(/ile(/n)):
print i + , s,
# >e ocorrer um erroecept:
# Hostre na tela trace = trace3ac\./ormatDexc()
# E sal$e num arui$o print 'Sconteceu um erro:9n', trace /ile('trace.lo', 'a').Crite(trace)
# Encerre o prorama raise >ystemExit
I m"dulo trace$ac# oerece unçDes para manipular as mensa&ens de erro. Aunção formatEec retorna a sa1da da Kltima eceção ormatada em uma string.
I tratamento de eceçDes pode possuir um bloco e!se # ?ue será eecutado?uando não ocorrer nenhuma eceção e um bloco fina!!y # será eecutado de?ual?uer orma# tendo ocorrido uma eceção ou não2(. Novos tipos deeceçDes podem ser deinidos atrav@s de herança a partir da classe /ception.
A partir da versão 2.:# está dispon1vel a instrução 4ith# ?ue pode substituir acombinação tr' % inall' em várias situaçDes. Com 4ith# podemos deinir umobeto ?ue será usado durante a eecução do bloco. I obeto precisa suportaro protocolo de &erenciamento de conteto# o ?ue si&niica ?ue ele devepossuir um m@todo EEenterEE:; # ?ue @ eecutado no inicio do bloco# e outro
chamado EEeitEE:; # ?ue @ evocado ao inal do bloco.
Eemplo$
# 5 codin: latin 5
2( A declaração fina!!y pode ser usada para liberar recursos ?ue oram usados no bloco try #
tais como coneDes de banco de dados ou ar?uivos abertos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 89/359
/ceç>es .
i"port random
# *ria um arui$o com 2 nNmeros randfmicoswith /ile('temp.txt', 'C') as temp: for y in rane(): for x in rane(): # -print 00 - ra$a a sada do comando no arui$o indicado print >> temp, 'O.2/' % random.random(), print >> temp
# Exi3e o conteNdo do arui$owith /ile('temp.txt') as temp: for i in temp: print i,
# Fora dos 3locos" o arui$o estI /echado# ?sso era uma exce;<o ]alueError: ?L operation on closed /ileprint >> temp
Eemplo de sa1da$
!.6 !.!& !.& !.&4 !.!.4 !.! !.== !.6 !.&
!.4& !.4 !.2& !.72 !.42!.44 !.7 !.47 !.62 !.7%!.% !.66 !.=7 !.6! !.%,race3ac\ (most recent call last: File -Ct!.py-" line " in module0 print 00 temp]alueError: ?L operation on closed /ile
Como o ar?uivo oi echado ao inal do bloco# a tentativa de &ravação &erauma eceção.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 90/359
0 Introspecção
Introspecção
ntrospecção ou releão @ capacidade do sot4are de identiicar e relatarsuas pr"prias estruturas internas# tais como tipos# escopo de variáveis#m@todos e atributos.
unçDes nativas do interpretador para introspecção$
un-o etorno
type(o3Aeto) L tipo (classe do o3Aeto
id(o3Aeto) L identi/icador do o3Aeto
locals() L dicionIrio de $ariI$eis locais
lo3als() L dicionIrio de $ariI$eis lo3ais
$ars(o3Aeto) L dicionIrio de sm3olos do o3Aeto
len(o3Aeto) L tamanho do o3Aeto
dir(o3Aeto) S lista de estruturas do o3Aeto
help(o3Aeto) Ss Doc Strings do o3Aeto
repr(o3Aeto) S representa;<o do o3Aeto
isinstance(o3Aeto, classe) ]erdadeiro se o3Aeto deri$a da classe
issu3class(su3classe, classe) ]erdadeiro se su3classe herda classe
I identiicador do obeto @ um nKmero inteiro Knico ?ue @ usado pelointerpretador para identiicar internamente os obetos.
Eemplo$
# 5 codin: latin 5
# *olhendo alumas in/orma;Mes# dos o3Aetos lo3ais no prorama
fro" types i"port Hodule,ype
&ef info(nDo3A):
# *ria uma re/erJncia ao o3Aeto o3A = lo3als()[nDo3A]
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 91/359
Introspecção 1
# Hostra in/orma;Mes so3re o o3Aeto print 'ome do o3Aeto:', nDo3A
print '?denti/icador:', id(o3A) print ',ipo:', type(o3A) print 'Tepresenta;<o:', repr(o3A)
# >e /or um mdulo if isinstance(o3A, Hodule,ype): print 'itens:' for item in dir(o3A): print item print
# Hostrando as in/orma;Mesfor nDo3A in dir(): in/o(nDo3A)
I !'thon tamb@m tem um m"dulo chamado types # ?ue tem as deiniçDes dostipos básicos do interpretador.
Eemplo$
# 5 codin: latin 5
i"port types
s = ''if isinstance(s, types.>trin,ype): print 's Q uma strin.'
Atrav@s da introspecção# @ poss1vel determinar os campos de uma tabela de
banco de dados# por eemplo.
Inspect
I m"dulo inspect prov> um conunto de unçDes de alto n1vel paraintrospecção ?ue permitem investi&ar tipos # itens de coleçDes# classes#unçDes# c"di&o onte e a pilha de eecução do interpretador.
Eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 92/359
2 Introspecção
# 5 codin: latin 5
i"port os.path# inspect: mdulo de introspec;<o -amiI$el-i"port inspect
print 'L3Aeto:'" inspect.etmodule(os.path)
print '*lasse'" inspect.isclass(str)
# Wista todas as /un;Mes ue existem em -os.path-
print 'Hem3ros:',
for name, struct in inspect.etmem3ers(os.path):
if inspect.is/unction(struct): print name"
*a1da$
L3Aeto: module 'ntpath' /rom 'c:9python269li39ntpath.pyc'0
*lasse ,rueHem3ros: a3spath 3asename commonpre/ix dirname exists expanduserexpand$ars etatime etctime etmtime etsi8e isa3s isdir is/ile islin\ismount Aoin lexists normcase normpath realpath relpath split splitdri$esplitext splitunc Cal\
As unçDes ?ue trabalham com a pilha do interpretador devem ser usadascom cuidado# pois @ poss1vel criar reer>ncias c1clicas 7uma variável ?ueaponta para o item da pilha ?ue tem a pr"pria variável8. A eist>ncia de
reer>ncias a itens da pilha retarda a destruição dos itens pelo coletor de liodo interpretador.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 93/359
/erc?cios II 3
%&erccios II
(. mplementar um pro&rama ?ue receba um nome de ar?uivo e &ereestat1sticas sobre o ar?uivo 7nKmero de caracteres# nKmero de linhas enKmero de palavras8
2. mplementar um m"dulo com duas unçDes$▪ matriEsum:Fmatrices; # ?ue retorna a matri6 soma de matri6es de duas
dimensDes.▪ came!Ecase:s; # ?ue converte nomes para CamelCase.
+. mplementar uma unção ?ue leia um ar?uivo e retorne uma lista de tuplascom os dados 7o separador de campo do ar?uivo @ v1r&ula8# eliminando aslinhas va6ias. Caso ocorra al&um problema# imprima uma mensa&em deaviso e encerre o pro&rama.
0. mplementar um m"dulo com duas unçDes$▪ sp!it:fn7 n; # ?ue ?uebra o ar?uivo n em partes de n $ytes e salva com
nomes se?uenciais 7se fn ` ar?.tt# então ar?X,,(.tt# ar?X,,2.tt# ... 8
▪ Goin:fn7 fn!ist; ?ue unte os ar?uivos da lista fn!ist em um ar?uivo s" fn.
5. Crie um script ?ue$▪ Compare a lista de ar?uivos em duas pastas distintas.▪ Hostre os nomes dos ar?uivos ?ue tem conteKdos dierentes e%ou ?ue
eistem em apenas uma das pastas.
:. aça um script ?ue$▪ Leia um ar?uivo teto.▪ Conte as ocorr>ncias de cada palavra.▪ Hostre os resultados ordenados pelo nKmero de ocorr>ncias.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 94/359
' Parte III
Parte IIIEsta parte @ dividida em dois assuntos$ &eradores# uma tecnolo&ia cada ve6mais presente na lin&ua&em# e pro&ramação uncional.
ConteKdo$▪ =eradores .▪ !ro&ramação uncional.▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 95/359
%eradores )
5eradores
As unçDes &eralmente se&uem o luo convencional de processar# retornarvalores e encerrar. =eradores uncionam de orma similar# por@m lembram oestado do processamento entre as chamadas# permanecendo em mem"ria eretornando o pr"imo item esperado ?uando ativados.
Is &eradores apresentam várias vanta&ens em relação Ys unçDesconvencionais$
▪ La<y /a!uation$ &eradores s" são processados ?uando @ realmentenecessário# sendo assim# economi6am recursos de processamento.
▪ ;edu6em a necessidade da criação de listas.▪ !ermitem trabalhar com se?u>ncias ilimitadas de elementos.
=eradores &eralmente são evocados atrav@s de um laço for. A sintae @semelhante a da unção tradicional# s" ?ue a instrução yie!d substitui o return.A nova cada iteração# yie!d retorna o pr"imo valor.
Eemplo$
# 5 codin: latin 5
&ef enpares(): --- Gera nNmeros pares in/initamente... ---
i = !
while ,rue:
i += 2 iel& i
# Hostra cada nNmero e passa para o prximofor n in enDpares(): print n
Iutro eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 96/359
, %eradores
# 5 codin: latin 5
i"port os
# Encontra arui$os recursi$amente&ef fin&(path='.'):
for item in os.listdir(path): /n = os.path.normpath(os.path. Aoin(path, item))
if os.path.isdir(/n):
for / in /ind(/n): iel& /
else: iel& /n
# S cada itera;<o" o erador de$ol$e# um no$o nome de arui$ofor /n in /ind('c:temp'): print /n
Eistem vários &eradores ?ue a6em parte da pr"pria lin&ua&em# como o
$ui!tin range:;22. Al@m disso# no m"dulo itertoo!s # estão deinidos vários&eradores Kteis.
!ara converter a sa1da do &erador em uma lista$
lista @ list(erador())
Assim# todos os itens serão &erados de uma ve6.
22 I &erador range:; pode substituir a unção range:; na maioria dos casos e a sintae @ a
mesma# com a vanta&em de economi6ar mem"ria.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 97/359
Programação funciona! -
Programação funcional
!ro&ramação uncional @ um paradi&ma ?ue trata a computação como umaavaliação de unçDes matemáticas. Fais unçDes podem ser aplicadas emse?u>ncias de dados 7&eralmente listas8. *ão eemplos de lin&ua&ensuncionais$ L*!# *cheme e Bas3ell 7esta Kltima inluenciou o proeto do!'thon de orma marcante8.
As operaçDes básicas do paradi&ma uncional são implementadas no !'thonpelas unçDes $ui!tin map:; # fi!ter:; # reduce:; e <ip:;.
Lambda
No !'thon# !am$da @ uma unção annima composta apenas por epressDes.As unçDes !am$da podem ter apenas uma linha# e podem ser atribu1das auma variável. unçDes !am$da são muito usadas em pro&ramação uncional.
*intae$
la"b&a <lista de $ariI$eis>: <expressMes >
Eemplo$
# Smplitude de um $etor %amp = la"b&a x, y, 8: (x ** 2 + y ** 2 + 8 ** 2) ** .
print amp(, , )print amp(%, 4, )
*a1da$
.7%2!!=!777.!7!67==7
unçDes !am$da consomem menos recursos computacionais ?ue as unçDesconvencionais# por@m são mais limitados.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 98/359
. Programação funciona!
)apeamento
I mapeamento consiste em aplicar uma unção a todos os itens de umase?u>ncia# &erando outra lista contendo os resultados e com o mesmotamanho da lista inicial.
No !'thon# o mapeamento @ implementado pela unção map:;.
Eemplos$
nums = [, 2, %, 4, , 6, 7, =, &, !, , 2]
# lo na 3ase !fro" math i"port lo!print map(lo!, nums)
# i$idindo por %print map(la"b&a x: x / %, nums)
A unção map:; sempre retorna uma lista.
0ista
2
3
4
5
6
7
F
0ista
2
5
G
27
36
47
5G
/un,o1HH3
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 99/359
Programação funciona!
*iltragem
Na iltra&em# uma unção @ aplicada em todos os itens de uma se?u>ncia# se aunção retornar um valor ?ue sea avaliado como verdadeiro# o item ori&inalará parte da se?u>ncia resultante.
No !'thon# a iltra&em @ implementada pela unção fi!ter:;.
Eemplo$
# >elecionando apenas os mparesprint /ilter(la"b&a x: x % 2, nums)
A unção fi!ter:; aceita tamb@m unçDes !am$da # al@m de unçDesconvencionais.
0ista 0ista
2
4
6
F
/un,o1 I 3
/also
/also
/also
2
3
4
5
6
7
F
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 100/359
100 Programação funciona!
6edução
;edução si&niica aplicar uma unção ?ue recebe dois parGmetros# nos doisprimeiros elementos de uma se?u>ncia# aplicar novamente a unção usandocomo parGmetros o resultado do primeiro par e o terceiro elemento# se&uindoassim at@ o inal da se?u>ncia. I resultado inal da redução @ apenas umelemento.
Eemplos de redução# ?ue @ implementada no !'thon pela unção reduce:;$
# 5 codin: latin 5nums @ rane(!!)
# >oma com reduce (pode concatenar strinsprint reduce(la"b&a x, y: x + y, nums)
# >oma mais simples" mas s para nNmerosprint sum(nums
*a1da$
0ista Jesultado
2
4
7
2;
26
32
3A
/un,o1 K y
2
3
4
5
6
7
F
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 101/359
Programação funciona! 101
4&!4&!
A unção reduce:; pode ser usada para calcular atorial$
# *alcula o /atorial de n&ef fat(n): return reduce(la"b&a x, y: x * y, rane(, n))
print /at(6)
*a1da$
2!
A partir da versão 2.:# o m"dulo math tra6 uma unção ?ue calcula atorialchamada factoria!:;.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 102/359
102 Programação funciona!
'ransposição
Fransposição @ construir uma s@rie de se?u>ncias a partir de outra s@rie dese?u>ncias# aonde a primeira nova se?u>ncia cont@m o primeiro elemento decada se?u>ncia ori&inal# a se&unda nova se?u>ncia cont@m o se&undoelemento de cada se?u>ncia ori&inal# at@ ?ue al&uma das se?u>nciasori&inais acabe.
Eemplo de transposição# ?ue @ implementada no !'thon pela unção <ip:;$
# Uma lista com ('a'" " ('3'" 2" ...fro" strin i"port asciiDloCercaseprint 8ip(asciiDloCercase, rane(, !!))
# ,ransposta de uma matri8matri8 = [[, 2, %], [4, , 6], [7, =, &]]print 8ip(*matri8)
A unção <ip:; sempre retorna uma lista de tuplas.
0istas
2
3
4
5
6
7
0istas
2
5
3
6
4
7
/un,o
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 103/359
Programação funciona! 103
List Comprehension
Em computação# List 4omprehension @ uma construção ?ue e?uivale a umanotação matemática do tipo$
Iu sea# * @ o conunto ormado por ao ?uadrado para todo no conuntodos nKmeros naturais# se or maior ou i&ual a 2,.
*intae$
lista @ [ express<o0 for re/erJncia0 in seuJncia0 if condi;<o0 ]
Eemplo$
# 5 codin: latin 5
nums = [, 2, %, 4, , 6, 7, =, &, !, , 2]
# Ele$e os mpares ao uadradoprint [ x**2 for x in nums if x % 2 ]
*a1da$
)" &" 2" 4&" =" 2+
List 4omprehension @ mais eiciente do ?ue usar as unçDes map:; e fi!ter:; tantoem termos de uso de processador ?uanto em consumo de mem"ria.
S ={x2∀ x emℕ , x20}
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 104/359
10' Programação funciona!
5enerator %&pression
%enerator /pression @ uma epressão ?ue se assemelha ao List 4omprehension #por@m unciona como um &erador.
Eemplo$
# 5 codin: latin 5
nums = [, 2, %, 4, , 6, 7, =, &, !, , 2]
# Ele$e os mpares ao uadradoen = ( x**2 for x in nums if x % 2 )
# Hostra os resultadosfor num in en: print num
Iutro eemplo$
# Uma lista de tuplas (artista" /aixa:
instrumentais = [('Xin *rimson', 'Fracture'), ('Hetallica','*all o/ Xtulu'), ('es', 'Hood /or a ay'), ('Pin\ Floyd', 'Lne o/ ,his ays'), ('Tush', 'R')]
# Filtra e ordena apenas as /aixas de artistas anteriores a letra print sorted(/aixa[!] + ' ' + /aixa[!] for /aixa in instrumentais if /aixa[!].upper() < '')
*a1da$
)'*all o/ Xtulu Hetallica'" 'Fracture Xin *rimson'+
%enerator /pression usa menos recursos do ?ue o List 4omprehensione?uivalente# pois os itens são &erados um de cada ve6# apenas ?uandonecessário# economi6ando principalmente mem"ria.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 105/359
/erc?cios III 10)
%&erccios III
(. mplementar um &erador de nKmeros primos.
2. mplementar o &erador de nKmeros primos como uma epressão 7dica$ useo m"dulo itertoo!s8.
+. mplementar um &erador ?ue produ6a tuplas com as cores do padrão ;=7;# = e variam de , a 2558 usando range:; e uma unção ?ue produ6a umalista com as tuplas ;= usando range:;. Compare a perormance.
0. mplementar um &erador ?ue leia um ar?uivo e retorne uma lista de tuplascom os dados 7o separador de campo do ar?uivo @ v1r&ula8# eliminando aslinhas va6ias. Caso ocorra al&um problema# imprima uma mensa&em deaviso e encerre o pro&rama.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 106/359
10, Parte IV
Parte IVEsta parte se concentra principalmente na orientação a obetos# e tamb@maborda decoradores e testes automati6ados.
ConteKdo$▪ ecoradores .▪ Classes .▪ Berança simples .
▪ Berança mKltipla .▪ !ropriedades .▪ *obrecar&a de operadores.▪ Hetaclasses .▪ ecoradores de classe.▪ Festes automati6ados.▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 107/359
*ecoradores 10-
Decoradores
ecoradores 7decorators8 são unçDes ?ue são aplicadas em outras unçDes eretornam unçDes modiicadas. ecoradores tanto podem ser usados paracriar ou alterar caracter1sticas das unçDes 7?ue são obetos8 ?uanto paraTenvolver as unçDes# acrescentando uma camada em torno delas com novasuncionalidades.
A partir do !'thon 2.0# o caractere T pode ser usado para automati6ar oprocesso de aplicação do decorador$
&ef &ecorator(/ ): / .decorated = ,rue return /
gdecorator&ef func(ar): return ar
Com isso# oi criado um atributo novo na unção# ?ue pode ser usado depois#
/un,o
Original
/un,oodificada
f func(arg): r turn arg
f corator(f ): f .decorated = True r turn f
func = decorator(func)
ecorador
O decorador foi aplicado.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 108/359
10. *ecoradores
?uando a unção or eecutada.
Eemplo$
# 5 codin: latin 5
# Fun;<o decoradora&ef &u"pars(/ ):
# Fun;<o ue en$ol$erI a outra &ef func(*ars):
# Hostra os arumentos passados para a /un;<o
print ars
# Tetorna o resultado da /un;<o oriinal return / (*ars)
# Tetorna a /un;<o modi/icada return /unc
gdumpars&ef "ultipl(*nums):
m = for n in nums: m = m * n return m
print multiply(, 2, %)
*a1da$
(" 2" %6
A sa1da apresenta os parGmetros ?ue a unção decorada recebeu.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 109/359
4!asses 10
Classes
Ibetos são abstraçDes computacionais ?ue representam entidades# com suas?ualidades 7atributos8 e açDes 7m@todos8 ?ue estas podem reali6ar. A classe @a estrutura básica do paradi&ma de orientação a obetos# ?ue representa o tipodo obeto# um modelo a partir do ?ual os obetos serão criados.
!or eemplo# a classe 4anino descreve as caracter1sticas e açDes dos caninosem &eral# en?uanto o obeto 8andit representa um canino em particular.
Is atributos são estruturas de dados ?ue arma6enam inormaçDes sobre oobeto e os m@todos são unçDes associadas ao obeto# ?ue descrevem como oobeto se comporta.
No !'thon# novos obetos são criados a partir das classes atrav@s deatribuição. I obeto @ uma instGncia da classe# ?ue possui caracter1sticaspr"prias. Ouando um novo obeto @ criado# o construtor da classe @eecutado. Em !'thon# o construtor @ um m@todo especial# chamadoEEne"EE:;. Ap"s a chamada ao construtor# o m@todo EEinitEE:; @ chamado
Canino
esoD 8lturaDidadeD Jaa
CorrerD 8tacarDComerD 0atir
uascaracter!sticas.
O que ele podefa:er.
%andit
esoD 8lturaDidadeD Jaa
CorrerD 8tacarDComerD 0atir
8 classerepresenta
qualquer canino.
O o"Letorepresenta um
canino.
%andit M Canino()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 110/359
110 4!asses
para iniciali6ar a nova instGncia.
Um obeto continua eistindo na mem"ria en?uanto eistir pelo menos uma
reer>ncia a ele. I interpretador !'thon possui um recurso chamado coletorde lio 7%ar$age 4o!!ector8 ?ue limpa da mem"ria obetos sem reer>ncias2+.Ouando o obeto @ apa&ado# o m@todo especial EEdoneEE:; @ evocado. unçDesli&adas ao coletor de lio podem ser encontradas no m"dulo gc.
Em !'thon$▪ Ouase tudo @ obeto# mesmo os tipos básicos# como nKmeros inteiros.▪ Fipos e classes são uniicados.▪ Is operadores são na verdade chamadas para m@todos especiais.▪ As classes são abertas 7menos para os tipos $ui!tins8.
H@todos especiais são identiicados por nomes no padrão EEmetodoEE:; 7doissublinhados no in1cio e no inal do nome8 e deinem como os obetosderivados da classe se comportarão em situaçDes particulares# como emsobrecar&a de operadores.
2+ !ara apa&ar uma reer>ncia a um obeto# use o comando de!. *e todas as reer>ncias
orem apa&adas# o %ar$age 4o!!ector apa&ará o obeto.
Classe
étodos declasse
8tri"utos declasse
étodosestáticos
O"Leto
étodos declasse
8tri"utos de
classe
étodosestáticos
étodosdinNmicos
8tri"utos deo"Leto
O"Leto M Classe()
O construtor é e1ecutado nestemomento.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 111/359
4!asses 111
No !'thon# eistem dois tipos de classes# chamadas o!d sty!e e ne" sty!e. Asclasses ne" sty!e são derivadas da classe o$Gect e podem utili6ar recursos
novos das classes do !'thon# como properties e metac!asses. As properties sãoatributos calculados em tempo de eecução atrav@s de m@todos# en?uanto asmetac!asses são classes ?ue &eram classes# com isso permitem personali6ar ocomportamento das classes. As classes o!d sty!e são uma herança das versDesanti&as do !'thon# mantidas para &arantir compatibilidade com c"di&ole&ado.
*intae$
# 5 codin: latin 5
class 0lasse(supcl, supcl2): --- ?sto Q uma classe --- cls$ar = []
&ef init (sel/ , ars):
--- ?niciali8ador da classe --- <3loco de cdio>
&ef &one (sel/ ): --- estrutor da classe --- <3loco de cdio>
&ef "eto&o(sel/ , params): --- HQtodo de o3Aeto --- <3loco de cdio>
gclassmethod &ef cls"eto&o(cls, params): --- HQtodo de classe ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 112/359
112 4!asses
<3loco de cdio>
gstaticmethod
&ef est"eto&o(params): --- HQtodo estItico --- <3loco de cdio>
o3A = *lasse()o3A.metodo()
*lasse.clsDmetodo()
*lasse.estDmetodo()
H@todos de obeto podem usar atributos e outros m@todos do obeto. Avariável se!f # ?ue representa o obeto e tamb@m precisa ser passado de ormaepl1cita. I nome se!f @ uma convenção# assim como c!s # podendo ser trocadopor outro nome ?ual?uer# por@m @ considerada como boa prática manter onome.
H@todos de classe podem usar apenas atributos e outros m@todos de classe. Iar&umento c!s representa a classe em si# precisa ser passado eplicitamentecomo primeiro parGmetro do m@todo.
H@todos estáticos são a?ueles ?ue não tem li&ação com atributos do obeto ouda classe. uncionam como as unçDes comuns.
Eemplo de classe$
# 5 codin: latin 5
class 0ell(o3Aect): --- *lasse para cQlulas de planilha ---
&ef init (sel/ , /ormula='--', /ormat='Os'): ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 113/359
4!asses 113
?niciali8a a cQlula ---
sel/ ./ormula = /ormula sel/ ./ormat = /ormat
&ef repr (sel/ ): --- Tetorna a representa;<o em strin da cQlula ---
return sel/ ./ormat % e$al(sel/ ./ormula)
print *ell('2%552')print *ell('2%52K2')print *ell('a3s(.4 !.%', 'O2.%/')
*a1da$
2&4=4.=%%
I m@todo EEreprEE:; @ usado internamente pelo comando print para obteruma representação do obeto em orma de teto.
Em !'thon# não eistem variáveis e m@todos privados 7?ue s" podem seracessados a partir do pr"prio obeto8. Ao inv@s disso# @ usada uma convenção#usar um nome ?ue comece com sublinhado 7X8# deve ser considerado parte daimplementação interna do obeto e sueito a mudanças sem aviso pr@vio.
Al@m disso# a lin&ua&em oerece uma uncionalidade chamada =ame ang!ing # ?ue acrescenta na rente de nomes ?ue iniciam com doissublinhados 7XX8# um sublinhado e o nome da classe.
Eemplo$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 114/359
11' 4!asses
class 0alc:
&ef init (sel/ , /ormula, **$ars):
sel/ ./ormula = /ormula sel/ .$ars = $ars
sel/ . DDrecalc()
&ef recalc(sel/ ):
sel/ . DDres = e$al(sel/ ./ormula, sel/ .$ars)
&ef repr (sel/ ):
sel/ . DDrecalc() return str(sel/ . DDres)
/ormula = '25x K %5y K 8552'calc = *alc(/ormula, x=2, y=%, 8=)
print '/rmula:', calc./ormulaprint 'x @', calc.$ars['x'],'0 calc @', calc
calc.$ars['x'] = 4print 'x @', calc.$ars['x'],'0 calc @', calcprint dir(calc)
*a1da$
/rmula: 25x K %5y K 8552x @ 2 0 calc @ 4x @ 4 0 calc @ =
)'D*alcDDrecalc'" 'D*alcDDres'" 'DDdocDD'" 'DDinitDD'" 'DDmoduleDD'" 'DDreprDD'"'/ormula'" '$ars'+
I m@todo EEreca!c:; aparece como E4a!cEEreca!c:; e o atributo EEres comoE4a!cEEres para ora do obeto.
Classes abertas
No !'thon# as classes ?ue não são $ui!tins podem ser alteradas em tempo de
eecução# devido a nature6a dinGmica da lin&ua&em. S poss1vel acrescentar
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 115/359
4!asses 11)
m@todos e atributos novos# por eemplo. A mesma l"&ica se aplica aosobetos.
Eemplo de como acrescentar um novo m@todo$
# 5 codin: latin 5
class 1ser(o3Aect): ---Uma classe 3em simples. --- &ef init (sel/ , name): ---?niciali8a a classe" atri3uindo um nome
--- sel/ .name = name
# Um no$o mQtodo para a classe&ef setpasswor&(sel/ , passCord): ---,roca a senha --- sel/ .passCord = passCord
print '*lasse oriinal:', dir(User)
# L no$o mQtodo Q inserido na classeUser.setDpassCord = setDpassCordprint '*lasse modi/icada:', dir(User)
user = User('uest')user.setDpassCord('uest')
print 'L3Aeto:', dir(user)print '>enha:', user.passCord
*a1da$
*lasse oriinal: )'DDclassDD'" 'DDdelattrDD'" 'DDdictDD'" 'DDdocDD'"'DDetattri3uteDD'" 'DDhashDD'" 'DDinitDD'" 'DDmoduleDD'" 'DDneCDD'"'DDreduceDD'" 'DDreduceDexDD'" 'DDreprDD'" 'DDsetattrDD'" 'DDstrDD'"'DDCea\re/DD'+*lasse modi/icada: )'DDclassDD'" 'DDdelattrDD'" 'DDdictDD'" 'DDdocDD'"'DDetattri3uteDD'" 'DDhashDD'" 'DDinitDD'" 'DDmoduleDD'" 'DDneCDD'"'DDreduceDD'" 'DDreduceDexDD'" 'DDreprDD'" 'DDsetattrDD'" 'DDstrDD'"'DDCea\re/DD'" 'setDpassCord'+
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 116/359
11, 4!asses
L3Aeto: )'DDclassDD'" 'DDdelattrDD'" 'DDdictDD'" 'DDdocDD'" 'DDetattri3uteDD'"'DDhashDD'" 'DDinitDD'" 'DDmoduleDD'" 'DDneCDD'" 'DDreduceDD'"'DDreduceDexDD'" 'DDreprDD'" 'DDsetattrDD'" 'DDstrDD'" 'DDCea\re/DD'" 'name'"
'passCord'" 'setDpassCord'+>enha: uest
A classe modiicada passou a ter um novo m@todo$ setEpass"ord:;.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 117/359
Herança simp!es 11-
!erança simples
Berança @ um mecanismo ?ue a orientação a obeto prov># com obetivo deacilitar o reaproveitamento de c"di&o. A ideia @ ?ue as classes seamconstru1das ormando uma hierar?uia.
A nova classe pode implementar novos m@todos e atributos e herdar m@todose atributos da classe anti&a 7?ue tamb@m pode ter herdado de classesanteriores8# por@m estes m@todos e atributos podem substitu1dos na novaclasse.
A orma comum de herança @ chamada de herança simples# na ?ual a novaclasse @ derivada de apenas uma classe á eistente# por@m @ poss1vel criarvárias classes derivadas# criando uma hierar?uia de classes.
!ara locali6ar os m@todos e atributos# a hierar?uia @ se&uida de baio paracima# de orma similar a busca nos namespaces local e &lobal.
Carn!$oro
esoD 8lturaDidade
CorrerD 8tacarDComer
Canino
esoD 8lturaDidadeD Jaa
CorrerD 8tacarDComerD 0atir
uascaracter!sticas
O que ele podefa:er
%andit
esoD 8lturaDidadeD Jaa
CorrerD 8tacarDComerD 0atir
Classe paracarn!$oros.
O"Leto para umcanino.
Classe paracaninos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 118/359
11. Herança simp!es
Eemplo de herança simples$
class 2en&ri3e(o3Aect):
&ef init (sel/ , tamanho, inter/ace='2.!'):
sel/ .tamanho = tamanho sel/ .inter/ace = inter/ace
class 4252laer(Pendri$e):
&ef init (sel/ , tamanho, inter/ace='2.!', turner=False):
sel/ .turner = turner Pendri$e. DDinitDD(sel/ , tamanho, inter/ace)
mp% = HP%Player(!24)
print 'Os9nOs9nOs' % (mp%.tamanho, mp%.inter/ace, mp%.turner)
*a1da$
8 classe MP3Player é deri$ada
da classe Pendrive.
8 classe MP3Player é deri$ada
da classe Pendrive.
Classe 8ntiga
étodos
8tri"utos
Classe o$a
étodosantigos
étodosredefinidos
étodosno$os
8tri"utosantigos
8tri"utosredefinidos
8tri"utosno$os
class o$a(8ntiga)-
Jedefini,o e&ou cria,o demétodos e&ou atri"utos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 119/359
Herança simp!es 11
!242.!
False
A classe P3P!ayer herda de Pendrie o tamanho e a interace.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 120/359
120 Herança m!tip!a
!erança m0ltipla
Na herança mKltipla# a nova classe deriva de duas ou mais classes áeistentes.
Eemplo$
# 5 codin: latin 5
class 6errestre(o3Aect): --- *lasse de $eculos terrestres --- seDmo$eDemDterra = ,rue
&ef init (sel/ , $elocidade=!!): --- ?niciali8a o o3Aeto --- sel/ .$elocidadeDemDterra = $elocidade
class 78uatico(o3Aect): --- *lasse de $eculos auaticos --- seDmo$eDnaDaua = ,rue
&ef init (sel/ , $elocidade=): --- ?niciali8a o o3Aeto --- sel/ .$elocidadeDaua = $elocidade
class 0arro(,errestre): --- *lasse de carros --- rodas = 4
&ef init (sel/ , $elocidade=2!, pistoes=4): ---
8 classe Carro deri$a de Terrestre.8 classe Carro deri$a de Terrestre.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 121/359
Herança m!tip!a 121
?niciali8a o o3Aeto --- sel/ .pistoes = pistoes
,errestre. DDinitDD(sel/ , $elocidade=$elocidade)
class 9arco(Suatico): --- *lasse de 3arcos --- &ef init (sel/ , $elocidade=6, helices=): --- ?niciali8a o o3Aeto ---
sel/ .helices = helices Suatico. DDinitDD(sel/ , $elocidade=$elocidade)
class 7nfibio(*arro, Barco): --- *lasse de an/3ios --- &ef init (sel/ , $elocidadeDemDterra==!, $elocidadeDnaDaua=4, pistoes=6, helices=2): ---
?niciali8a o o3Aeto --- # preciso e$ocar o DDinitDD de cada classe pai *arro. DDinitDD(sel/ , $elocidade=$elocidadeDemDterra, pistoes=pistoes) Barco. DDinitDD(sel/ , $elocidade=$elocidadeDnaDaua, helices=helices)
no$oDan/i3io = Sn/i3io()
for atr in dir(no$oDan/i3io):
# >e n<o /or mQtodo especial: if not atr.startsCith('DD'): print atr, '@', etattr(no$oDan/i3io, atr)
*a1da$
helices @ 2
8 classe Anfibio é deri$ada
de Carro e Barco.
8 classe Anfibio é deri$ada
de Carro e Barco.
8 classe Barco deri$a de Aquatico.8 classe Barco deri$a de Aquatico.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 122/359
122 Herança m!tip!a
pistoes @ 6rodas @ 4seDmo$eDemDterra @ ,rue
seDmo$eDnaDaua @ ,rue$elocidadeDaua @ 4$elocidadeDemDterra @ =!
A dierença mais si&niicativa em relação Y herança simples @ a ordem deresolução de m@todos 7em in&l>s# ethod eso!ution Crder- H;I8.
Nas classes o!d sty!e # a resolução começa pela classe mais a es?uerda e desce
at@ o im da hierar?uia e depois passa para o ramo a direita.
<á nas classes ne" sty!e # a resolução @ eita a partir da es?uerda# descendo at@encontrar a classe em comum entre os caminhos dentro hierar?uia. Ouando @encontrada uma classe em comum# a procura passa para o caminho Y direita.Ao es&otar os caminhos# o al&oritmo prosse&ue para a classe em comum erepete o processo.
Na hierar?uia de classes do eemplo# a H;I para a classe dos an1bios será$
8
2
;
4
3 5
6
Ordem deresolu,o
% C
+
/
8
2
;
5
3 6
4
% C
+
/
Old
style
eP
style
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 123/359
Herança m!tip!a 123
)class 'DDmainDD.Sn/i3io'0"class 'DDmainDD.*arro'0"
class 'DDmainDD.,errestre'0"class 'DDmainDD.Barco'0"class 'DDmainDD.Suatico'0"type 'o3Aect'0+
A herança mKltipla @ um recurso ?ue &era muita controv@rsia# pois seu usopode tornar o proeto conuso e obscuro.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 124/359
12' Propriedades
Propriedades
!ropriedades 7 properties8 são atributos calculados em tempo de eecução. Aspropriedades são criadas atrav@s da unção % decorador property.
I uso de propriedades permite$▪ alidar a entrada do atributo.▪ Criar atributos apenas de leitura.▪ *impliicar o uso da classe20.▪ Hudar de um atributo convencional para uma propriedade sem a
necessidade de alterar as aplicaçDes ?ue utili6am a classe.
Eemplo de c"di&o sem propriedades$
# etD5" setD5...
class 2roetil(o3Aect):
&ef init (sel/ , alcance, tempo):
sel/ .alcance = alcance sel/ .tempo = tempo
&ef et3eloci&a&e(sel/ ):
return sel/ .alcance / sel/ .tempo
moa3 = ProAetil(alcance=!!!!, tempo=6!)
print moa3.etD$elocidade()
*a1da$
66
Eemplo de propriedade atrav@s de decorador$
20 As propriedades disarçam as unçDes get:; e set:; dos atributos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 125/359
Propriedades 12)
# 5 codin: latin 5# Exemplo de property de leitura
class 2roetil(o3Aect):
&ef init (sel/ , alcance, tempo):
sel/ .alcance = alcance sel/ .tempo = tempo
gproperty &ef 3eloci&a&e(sel/ ):
return sel/ .alcance / sel/ .tempo
moa3 = ProAetil(alcance=!!!!, tempo=6!)
# S $elocidade Q calculadaprint moa3.$elocidade
*a1da$
66
Eemplo de propriedade atrav@s de chamada de unção$
# Property de leitura e escrita
class 2roetil(o3Aect):
&ef init (sel/ , alcance, tempo):
sel/ .alcance = alcance sel/ .tempo = tempo
# *alcula a $elocidade &ef et3(sel/ ):
return sel/ .alcance / sel/ .tempo
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 126/359
12, Propriedades
# *alcula o tempo &ef set3(sel/ , $):
sel/ .tempo = sel/ .alcance / $
# e/ine a propriedade $elocidade = property(et$, set$)
moa3 = ProAetil(alcance=!!!!, tempo=6!)print moa3.$elocidade
# Huda a $elocidade
moa3.$elocidade = %!print moa3.tempo
*a1da$
662=
!ropriedades são particularmente interessantes para ?uem desenvolve bibliotecas para serem usadas por outras pessoas.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 127/359
So$recarga de operadores 12-
Sobrecarga de operadores
No !'thon# o comportamento dos operadores @ deinido por m@todosespeciais# por@m tais m@todos s" podem ser alterados nas classes abertas. !orconvenção# os m@todos especiais t>m nomes ?ue começam e terminam comTXX.
Lista de operadores e os m@todos correspondentes$
;pera&or 4to&o ;pera-o
K DDaddDD adi;<o
DDsu3DD su3tra;<o
5 DDmulDD multiplica;<o
DDdi$DD di$is<o
DD/loordi$DD di$is<o inteira
O DDmodDD mdulo
55 DDpoCDD potJncia
K DDposDD positi$o
DDneDD neati$o
DDltDD menor ue
0 DDtDD maior ue
@ DDleDD menor ou iual a
0@ DDeDD maior ou iual a
@@ DDeDD ?ual a
1@ DDneDD di/erente de
DDlshi/tDD deslocamento paraesuerda
00 DDrshi/tDD deslocamento paradireita
DDandDD e 3ita3it
DDorDD ou 3ita3it
j DDxorDD ou exclusi$o 3ita3it
k DDin$DD in$ers<o
Eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 128/359
12. So$recarga de operadores
# S classe >trin deri$a de strclass trin(str):
&ef sub (sel/ , s):
return sel/ .replace(s, '')
s = >trin(',he Wam3 Wies oCn Ln BroadCay')s2 = 'oCn '
print '-Os- -Os- @ -Os-' % (s, s2, s ! s2)
*a1da$
-,he Wam3 Wies oCn Ln BroadCay- -oCn - @ -,he Wam3 Wies LnBroadCay-
IbservaçDes$▪ A subtração deinida no c"di&o não @ comutativa 7da mesma orma ?ue
a adição em strings tamb@m não @8
▪ A classe str não @ aberta# portanto não @ poss1vel alterar ocomportamento da string padrão do !'thon. !or@m a classe String @aberta.
▪ A redeinição de operadores conhecidos pode diicultar a leitura doc"di&o.
Coleç$es
Al@m de m@todos especiais para obetos escalares# eistem tamb@m m@todos
especiais para lidar com obetos ?ue uncionam como coleçDes 7da mesmaorma ?ue as listas e os dicionários8# possibilitando o acesso aos itens ?uea6em parte da coleção.
Eemplo$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 129/359
So$recarga de operadores 12
class 4at(o3Aect): --- Hatri8 esparsa
---
&ef init (sel/ ): --- ?nicia a matri8 ---
sel/ .itens = [] sel/ .de/ault = !
&ef etite" (sel/ , xy):
--- Tetorna o item para e ou de/ault caso contrIrio ---
i = sel/ .index(xy) if i is one: return sel/ .de/ault
return sel/ .itens[i][!]
&ef setite" (sel/ , xy, data=!): --- *ria no$o item na matri8 ---
i = sel/ .index(xy) if not i is one: sel/ .itens.pop(i) sel/ .itens.append((xy, data))
&ef &elite" (sel/ , xy):
--- Temo$e um item da matri8 ---
i = sel/ .index(xy) if i is one: return sel/ .de/ault return sel/ .itens.pop(i)
&ef etslice (sel/ , x, x2): ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 130/359
130 So$recarga de operadores
>eleciona linhas da matri8
---
r = [] for x in xrane(x, x2 + ): r.append(sel/ .roC(x))
return r
&ef in&e(sel/ , xy):
i = ! for item in sel/ .itens:
if xy == item[!]: return i i += else: return one
&ef &i"(sel/ ): --- Tetorna as dimensMes atuais da matri8 --- x = y = !
for xy, data in sel/ .itens: if xy[!] > x: x = xy[!] if xy[] > y: y = xy[]
return x, y
&ef kes(sel/ ): --- Tetorna as coordenadas preenchidas ---
return [xy for xy, data in sel/ .itens]
&ef 3alues(sel/ ): --- Tetorna os $alores preenchidos ---
return [data for xy, data in sel/ .itens]
&ef row(sel/ , x): ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 131/359
So$recarga de operadores 131
Tetorna a linha especi/icada ---
, = sel/ .dim() r = [] for y in xrane(, + ): r.append(sel/ [x,y])
return r
&ef col(sel/ , y): --- Tetorna a coluna especi/icada ---
, = sel/ .dim() r = [] for x in xrane(, + ): r.append(sel/ [x,y])
return r
&ef su"(sel/ ): --- *alcula o somatrio
--- return sum(sel/ .$alues())
&ef a3(sel/ ): --- *alcula a mQdia ---
, = sel/ .dim() return sel/ .sum() / ( * )
&ef repr (sel/ ): --- Tetorna uma representa;<o do o3Aeto como texto ---
r = 'im: Os9n' % repr(sel/ .dim()) , = sel/ .dim()
for x in xrane(, + ): for y in xrane(, + ): r += ' Os @ O%./' % (repr((x, y)),
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 132/359
132 So$recarga de operadores
/loat(sel/ . DDetitemDD((x, y)))) r += '9n' return r
if DDnameDD == 'DDmainDD':
mat = Hat() print '2 itens preenchidos:' mat[, 2] = %.4 mat[%, 4] = 4. print mat
print ',roca e remo;<o:'
&el mat[%, 4] mat[, 2] = .4 print mat
print 'Preenchendo a % coluna:' for i in xrane(, 4): mat[i + , %] = i print mat
print '% coluna:', mat.col(%) print 'Fatia com 2 a % linha', mat[2:%]
print '>omatrio:', mat.sum(), 'HQdia', mat.a$()
*a1da$
2 itens preenchidos:im: (%" 4 (" @ !.! (" 2 @ %. (" % @ !.! (" 4 @ !.! (2" @ !.! (2" 2 @ !.! (2" % @ !.! (2" 4 @ !.! (%" @ !.! (%" 2 @ !.! (%" % @ !.! (%" 4 @ 4.
,roca e remo;<o:im: (" 2 (" @ !.! (" 2 @ .4
Preenchendo a % coluna:im: (4" % (" @ !.! (" 2 @ .4 (" % @ !.! (2" @ !.! (2" 2 @ !.! (2" % @ .! (%" @ !.! (%" 2 @ !.! (%" % @ 2.! (4" @ !.! (4" 2 @ !.! (4" % @ %.!
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 133/359
So$recarga de operadores 133
% coluna: )!" " 2" %+Fatia com 2 a % linha ))!" !" +" )!" !" 2++
>omatrio: .4 HQdia !.&
A matri6 esparsa cresce ou diminui conorme os 1ndices dos elementos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 134/359
13' etac!asses
)etaclasses
Em uma lin&ua&em orientada a obeto aonde 7?uase8 tudo são obetos e todoo obeto tem uma classe# @ natural ?ue as classes tamb@m seam tratadas comoobetos.
Hetaclasse @ uma classe cuas as instGncias são classes# sendo assim# ametaclasse deine o comportamento das classes derivadas a partir dela. Em!'thon# a classe type @ uma metaclasse e pode ser usada para criar novasmetaclasses.
Eemplo de metaclasse criada a partir de type$
# 5 codin: latin 5
class inleton(type): --- Hetaclasse >inleton ---
&ef init (cls, name, 3ases, dic):
type. DDinitDD(cls, name, 3ases, dic)
# Tetorna o prprio o3Aeto na cpia &ef cop (sel/ ): return sel/
# Tetorna o prprio o3Aeto na cpia recursi$a &ef &eepcop (sel/ , memo=one): return sel/
cls. DDcopyDD = DDcopyDD cls. DDdeepcopyDD = DDdeepcopyDD
&ef call (cls, *ars, **\Cars):
# *hamada ue cria no$os o3Aetos" # aui retorna sempre o mesmo tr: return cls. DDinstance
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 135/359
etac!asses 13)
# >e DDinstance n<o existir" ent<o crie... ecept Sttri3uteError:
# S /un;<o super( pesuisa na HTL # a partir de >inleton cls. DDinstance = super(>inleton, cls). DDcallDD(*ars, **\Cars) return cls. DDinstance
i"port Hy>Wd3
class 0on(o3Aect):
--- *lasse de conex<o Nnica ---
# e/ine a metaclasse desta classe DDmetaclassDD = >inleton
&ef init (sel/ ):
# *ria uma conex<o e um cursor con = Hy>Wd3.connect(user='root')
sel/ .d3 = con.cursor() # >empre serI usado o mesmo # o3Aeto de cursor
class ?o(o3Aect): --- *lasse de lo ---
# e/ine a metaclasse desta classe
DDmetaclassDD = >inleton
&ef init (sel/ ):
# S3re o arui$o de lo para escrita sel/ .lo = /ile('ms.lo', 'C') # >empre serI usado o mesmo # o3Aeto de arui$o
&ef write(sel/ , ms):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 136/359
13, etac!asses
print ms # Screscenta as mensaens no arui$o sel/ .lo.Crite(str(ms) + '9n')
# *onex<o con = *on()Wo().Crite('con id @ Od' % id(con))con.d3.execute('shoC processlist')Wo().Crite(con.d3./etchall())
# *onex<o 2con2 = *on()Wo().Crite('con2 id @ Od' % id(con2))
con2.d3.execute('shoC processlist')Wo().Crite(con2.d3./etchall())
i"port copy
# *onex<o %con% = copy.copy(con)Wo().Crite('con% id @ Od' % id(con%))con%.d3.execute('shoC processlist')Wo().Crite(con2.d3./etchall())
*a1da e conteKdo do ar?uivo Tms&.lo&$
con id @ !%2264((2!W" 'root'" 'localhost:2'" one" 'uery'" !W" one" 'shoC processlist'"con2 id @ !%2264((2!W" 'root'" 'localhost:2'" one" 'uery'" !W" one" 'shoC processlist'"con% id @ !%2264((2!W" 'root'" 'localhost:2'" one" 'uery'" !W" one" 'shoC processlist'"
Com isso# todas as reer>ncias apontam para o mesmo obeto# e o recurso 7aconeão de banco de dados8 @ reaproveitado.
Classes base abstratas
A partir da versão 2.:# o !'thon passou a suportar D$stract 8ase 4!asses # ?uesão metaclasses ?ue permitem orçar a implementação de determinadosm@todos e atributos das classes e subclasses derivadas.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 137/359
etac!asses 13-
I m"dulo abc deine a metaclasse D84eta e os decoradores a$stractmethod ea$stractproperty ?ue identiicam os m@todos e propriedades ?ue devem serimplementadas.
# 5 codin: latin 5
fro" a3c i"port SB*Heta, a3stractmethod
class a3e(o3Aect):
DDmetaclassDD = SB*Heta
ga3stractmethod &ef "o3er(sel/ , x!, x, $):
# >em implementa;<o pass
class @eppelin(a$e):
&ef "o3er(sel/ , x!, x, $): ---
S partir da posi;<o inicial e /inal e da $elocidade calcula o tempo da $iaem --- d = x ! x! t = $ * d return t
class Ao3ercraft(a$e):
# Esta classe n<o implementa o mQtodo mo$er(
pass
8 = Reppelin()
# L3Aeto ue n<o implementa o mQtodo a3strato# ?sso causa uma exce;<o ,ypeErrorh = Vo$ercra/t()
*a1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 138/359
13. etac!asses
,race3ac\ (most recent call last: File -a3!.py-" line %=" in module0 h @ Vo$ercra/t(
,ypeError: *an't instantiate a3stract class Vo$ercra/t Cith a3stract methodsmo$er
A avaliação da eist>ncia dos m@todos abstratos ocorre durante o processo decriação de obetos a partir da classe# por@m esta não leva em conta osparGmetros dos m@todos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 139/359
*ecoradores de c!asse 13
Decoradores de classe
A partir da versão 2.:# os decoradores podem ser aplicados em classes.
Eemplo$
# 5 codin: latin 5
i"port time
&ef loer(cls): ---
Fun;<o decoradora de classes ---
class ?oe&(cls): --- *lasse deri$ada ue mostra os parYmetros de iniciali8a;<o ---
&ef init (sel/ , *ars, **\ars):
print 'Vora:', time.asctime()
print '*lasse:', repr(cls) print 'ars:', ars print '\ars:', \ars
# Executa a iniciali8a;<o da classe antia cls. DDinitDD(sel/ , *ars, **\ars)
# Tetorna a no$a classe return Woed
gloerclass 4usica(o3Aect):
&ef init (sel/ , nome, artista, al3um):
sel/ .nome = nome sel/ .artista = artista sel/ .al3um = al3um
m = Husica('Vand o/ oom', 'Blac\ >a33ath', al3um='Paranoid')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 140/359
1'0 *ecoradores de c!asse
*a1da$
Vora: Hon an !4 2%:&:4 2!!*lasse: class 'DDmainDD.Husica'0ars: ('Vand o/ oom'" 'Blac\ >a33ath'\ars: Z'al3um': 'Paranoid'[
Com isso# o decorador mudou o comportamento da classe.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 141/359
+estes automati<ados 1'1
'estes automati7ados
A atividade de testar sot4are @ uma tarea repetitiva# demorada e tediosa.!or isso# sur&iram várias erramentas para automati6ar testes. Eistem doism"dulos para testes automati6ados ?ue acompanham o !'thon$ doctest eunittest.
I m"dulo doctest usa as *oc Strings ?ue estão presentes no c"di&o paradeinir os testes do c"di&o. A unção testmod:; do doctest procura por umtrecho de teto sea semelhante a uma sessão interativa de !'thon# eecuta amesma se?u>ncia de comandos# analisa a sa1da e a6 um relat"rio dos testes
?ue alharam# com os erros encontrados.
Eemplo$
---/i3.py
?mplementa Fi3onacci.---
&ef fib(n): ---Fi3onacci: >e n @ " /i3(n @ >e n 0 " /i3(n @ /i3(n K /i3(n 2
Exemplos de uso:
000 /i3(! 000 /i3(
000 /i3(! =& 000 ) /i3(x /or x in xrane(! + )" " 2" %" " =" %" 2" %4" + 000 /i3('' ,race3ac\ (most recent call last: File -input0-" line " in File -input0-" line &" in /i3 ,ypeError 000
Qestes definidos para o doctest .Qestes definidos para o doctest .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 142/359
1'2 +estes automati<ados
--- if not type(n) is int: raise ,ypeError
if n > : return /i3(n ! ) + /i3(n ! 2) else: return
&ef &octest(): --- E$oca o doctest. ---
i"port doctest doctest.testmod()
if DDnameDD == -DDmainDD-:
Ddoctest()
*e todos os testes orem bem sucedidos# não haverá relat"rio dos testes.
Eemplo de relat"rio de erros dos testes 7a *oc String oi alterada deprop"sito para &erar um erro8$
5555555555555555555555555555555555555555555555555555555555555File -/i3.py-" line =" in DDmainDD./i3Failed example: /i3(!Expected: =&Got:
!!5555555555555555555555555555555555555555555555555555555555555 items had /ailures: o/ in DDmainDD./i3555,est Failed555 /ailures.
Usando o m"dulo unittest # os testes são criados atrav@s de uma subclasse daclasse unittest@+est4ase. Is testes são deinidos como m@todos da subclasse.Is m@todos precisam ter seus nomes iniciando com Ttest para ?ue seam
identiicados como rotinas de teste.
Os testes ser,o e1ecutados se este módulo
for e$ocado diretamente pelo (ython.
Os testes ser,o e1ecutados se este módulo
for e$ocado diretamente pelo (ython.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 143/359
+estes automati<ados 1'3
Is m@todos de teste devem evocar ao terminar um dos m@todos$▪ assertE$ veriica se uma condição @ atin&ida.▪ assert/Jua!$ veriica se o resultado @ i&ual ao parGmetro passado.▪ Dssertaises$ veriica se a eceção @ a esperada.
*e houver um m@todo chamado set5p # este será eecutado antes de cadateste# assim @ poss1vel reiniciali6ar variáveis e &arantir ?ue um teste nãopreudi?ue o outro. I inal dos testes# o unittest &era o relat"rio com osresultados encontrados.
Eemplo$
---/i3test.py
Usa unittest para testar /i3.py.---
i"port /i3i"port unittest
class 6este8uenceunctions(unittest.,est*ase):
&ef set1p(sel/ ): sel/ .se = rane(!)
&ef testB(sel/ ): sel/ .assertEual(/i3./i3(!), )
&ef testC(sel/ ): sel/ .assertEual(/i3./i3(), )
&ef testCB(sel/ ): sel/ .assertEual(/i3./i3(!), =&)
&ef testse8(sel/ ): /i3s = [, , 2, %, , =, %, 2, %4, ]
for x, y in 8ip(/i3s, [ /i3./i3(x) for x in sel/ .se ]): sel/ .assertD(x is y)
&ef testtpe(sel/ ):
Cétodos que definem os testes.Cétodos que definem os testes.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 144/359
1'' +estes automati<ados
sel/ .assertTaises(,ypeError, /i3./i3, '')
if DDnameDD == 'DDmainDD':
unittest.main()
*a1da$
.....Tan tests in !.!!!s
LX
Eemplo de relat"rio com erros$
..F..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FS?W: test! (DDmainDD.,est>euenceFunctions
,race3ac\ (most recent call last: File -unittest.py-" line 22" in test! sel/.assertEual(/i3./i3(!" =&SssertionError: !! 1@ =&
Tan tests in !.!!!s
FS?WE (/ailures@
No relat"rio# o terceiro teste alhou# pois Tib.ib7(,8 retornou (,, ao inv@s de9/# como seria o esperado.
I unittest oerece uma solução muito semelhante a bibliotecas de testesimplementadas em outras lin&ua&ens# en?uanto o doctest @ mais simples deusar e se inte&ra bem com a documentação 7as sessDes do doctest podemservir como eemplos de uso8.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 145/359
/erc?cios IV 1')
%&erccios I#
(. Crie uma classe ?ue modele um ?uadrado# com um atributo lado e osm@todos$ mudar valor do lado# retornar valor do lado e calcular área.
2. Crie uma classe derivada de lista com um m@todo retorne os elementos dalista sem repetição.
+. mplemente uma classe 4arro com as se&uintes propriedades$▪ Um ve1culo tem um certo consumo de combust1vel 7medidos em 3m %
litro8 e uma certa ?uantidade de combust1vel no tan?ue.▪ I consumo @ especiicado no construtor e o n1vel de combust1vel inicial
@ ,.▪ orneça um m@todo moer:#m; ?ue receba a distGncia em ?uilmetros e
redu6a o n1vel de combust1vel no tan?ue de &asolina.▪ orneça um m@todo gaso!ina:; # ?ue retorna o n1vel atual de
combust1vel.▪ orneça um m@todo a$astecer:!itros; # para abastecer o tan?ue.
0. mplementar uma classe Vetor$▪ Com coordenadas # ' e 6.▪ Oue suporte soma# subtração# produto escalar e produto vetorial.▪ Oue calcule o m"dulo 7valor absoluto8 do vetor.
5. mplemente um m"dulo com$▪ Uma classe Ponto # com coordenadas # ' e 6.▪ Uma classe Linha # com dois pontos A e # e ?ue calcule o comprimento
da linha.▪ Uma classe +riangu!o # com dois pontos A# e C# ?ue calcule o
comprimento dos lados e a área.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 146/359
1', Parte V
Parte VEsta parte cobre diversas tecnolo&ias ?ue os aplicativos hoe tem a disposição$principalmente para lidar com arma6enamento e troca de inormaçDes$ acessoa banco de dados# persist>ncia# HL e Jeb. Al@m desses t"picos# temos o usode threads e a ar?uitetura HC.
ConteKdo$▪ Fhreads .
▪ !ersist>ncia.▪ HL .▪ anco de dados .▪ Jeb .▪ HC .▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 147/359
+hreads 1'-
'hreads
Uma thread @ uma linha de eecução ?ue compartilha sua área de mem"riacom outras linhas# ao contrário do processo tradicional# ?ue possui apenasuma linha com área de mem"ria pr"pria.
I uso de threads oerece al&umas vanta&ens em relação aos processosconvencionais$
▪ Consomem menos recursos de má?uina.▪ !odem ser criadas e destru1das mais rapidamente.
▪ !odem ser chaveadas mais rapidamente.▪ !odem se comunicar com outras threads de orma mais ácil.
S comum utili6ar threads para$▪ !rocessamento paralelo# em casos como atender várias coneDes em
processos servidores.▪ Eecutar operaçDes de %I ass1ncronas# por eemplo$ en?uanto o
usuário continua intera&indo com a interace en?uanto a aplicaçãoenvia um documento para a impressora.
rocesso
Qhread 2
Qhread 3
Qhread 4
Qhread 2
Qempo
Qhread 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 148/359
1'. +hreads
▪ IperaçDes de %I em paralelo.
Em !'thon# o m"dulo da biblioteca padrão threading prov> classes de alto
n1vel de abstração e usa o m"dulo thread # ?ue implementa as rotinas de baion1vel e &eralmente não @ usado diretamente.
Eemplo com o m"dulo threading$
# 5 codin: latin 5---Exemplo de uso de threads---
i"port osi"port timei"port threadin
class 4onitor(threadin.,hread): --- *lasse de monitoramento usando threads --- &ef init (sel/ , ip):
--- *onstrutor da thread --- # Stri3utos para a thread sel/ .ip = ip sel/ .status = one
# ?niciali8ador da classe ,hread threadin.,hread. DDinitDD(sel/ )
&ef run(sel/ ):
--- *dio ue serI executado pela thread --- # Execute o pin pin = os.popen('pin n Os' % sel/ .ip).read()
if 'Esotado' in pin: sel/ .status = False else: sel/ .status = ,rue
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 149/359
+hreads 1'
if DDnameDD == 'DDmainDD':
# *rie uma lista com um o3Aeto de thread para cada ?P monitores = [] for i in rane(, ):
ip = '!.!.!.Od' % i monitores.append(Honitor(ip))
# Execute as ,hreads for monitor in monitores: monitor.start()
# S thread principal continua enuanto # as outras threads executam o pin # para os endere;os da lista
# ]eri/iue a cada seundo # se as threads aca3aram pin = ,rue
while pin: pin = False
for monitor in monitores: if monitor.status == one: pin = ,rue break
time.sleep()
# ?mprima os resultados no /inal for monitor in monitores:
if monitor.status:
print 'Os no ar' % monitor.ip else: print 'Os /ora do ar' % monitor.ip
*a1da$
!.!.!. no ar!.!.!.2 no ar!.!.!.% no ar
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 150/359
1)0 +hreads
!.!.!.4 /ora do ar!.!.!. no ar!.!.!.6 /ora do ar
!.!.!.7 no ar!.!.!.= no ar!.!.!.& no ar!.!.!.! no ar
S importante observar ?ue# ?uando o processo morre# todas as suas threadsterminam.
Na versão 2.:# está dispon1vel tamb@m o m"dulo mu!tiprocessing # ?ue
implementa classes para a criação de processos e a comunicação entre eles.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 151/359
PersistKncia 1)1
Persist2ncia
!ersist>ncia pode ser deinida como a manutenção do estado de umaestrutura de dados entre eecuçDes de uma aplicação. A persist>ncia libera odesenvolvedor de escrever c"di&o eplicitamente para arma6enar e recuperarestruturas de dados em ar?uivos e auda a manter o oco na l"&ica daaplicação.
Seriali7ação
A orma mais simples e direta de persist>ncia @ chamada de seriali6ação25 e
consiste em &ravar em disco uma ima&em 7dump8 do obeto# ?ue pode serrecarre&ada 7!oad8 posteriormente. No !'thon# a seriali6ação @ implementadade várias ormas# sendo ?ue a mais comum @ atrav@s do m"dulo chamado
pic#!e.
Eemplo de seriali6ação$▪ I pro&rama tenta recuperar o dicionário setup usando o obeto do
ar?uivo Tsetup.p3l.▪ *e conse&uir# imprime o dicionário.▪ *e não conse&uir# cria um setup defau!t e salva em Tsetup.p3l.
i"port pic\le
tr: setup = pic\le.load(/ile('setup.p\l')) print setup
ecept: setup = #'timeout': !,
'ser$er': '!.!.!.', 'port': =! $ pic\le.dump(setup, /ile('setup.p\l', 'C'))
Na primeira eecução# ele cria o ar?uivo. Nas posteriores# a sa1da @$
25 Em in&l>s# seria!i<ation ou marsha!!ing.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 152/359
1)2 PersistKncia
Z'port': =!" 'timeout': !" 'ser$er': '!.!.!.'[
Entre os m"dulos da biblioteca padrão estão dispon1veis outros m"dulospersist>ncia# tais como$
▪ cPic#!e$ versão mais eiciente de pic#!e # por@m não pode ter subclasses.▪ she!e$ ornece uma classe de obetos persistentes similares ao
dicionário.
Eistem frame"or#s em !'thon de terceiros ?ue oerecem ormas depersist>ncia com recursos mais avançados# como o I.
Fodas essas ormas de persist>ncia arma6enam dados em ormas binárias#?ue não são diretamente le&1veis por seres humanos.
!ara arma6enar dados em orma de teto# eistem m"dulos para !'thon paraler e &ravar estruturas de dados em ormatos$
▪ <*IN2: 7 aaScript C$Gect =otation8.▪ MAHL2) 7BDL DinMt a ar#up Language8.▪ HL29 7/tensi$!e ar#up Language8.
8,D+
6ope C$Gect *ata$ase 7I8 @ um banco de dados orientado a obeto ?ueoerece uma orma de persist>ncia ?uase transparente para aplicaçDes escritasem !'thon e oi proetado para ter pouco impacto no c"di&o da aplicação.
I suporta transaçDes# controle de versão de obetos e pode ser conectadoa outros $ac#ends atrav@s do 6ope /nterprise C$Gects 7EI8# permitindo
inclusive a criação de aplicaçDes distribu1das em diversas má?uinasconectadas por rede.
I I @ um componente inte&rante do ope2/ # ?ue @ um servidor de
2: !á&ina do ormato em$ http$%%444.son.or&%.2) !á&ina do ormato em$ http$%%'aml.or&%.29 !á&ina do ormato em$ http$%%444.4+.or&%HL%.2/ ocumentação e pacotes de instalação do ope e produtos li&ados a ele em
http$%%444.6ope.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 153/359
PersistKncia 1)3
aplicaçDes desenvolvido em !'thon# muito usado em 4ontent anagementSystems 7CH*8.
Componentes do I$▪ *ata$ase$ permite ?ue a aplicação aça coneDes 7interaces para acesso
aos obetos8.▪ +ransaction$ interace ?ue permite tornar as alteraçDes permanentes.▪ Persistence $ ornece a classe base !ersistent.▪ Storage$ &erencia a representação persistente em disco.▪ 6/C$ compartilhamento de obeto entre dierentes processos e
má?uinas.
Eemplo de uso do I$
# 5 codin: latin 5
fro" RLB i"port File>torae, Bi"port transaction
# e/inindo o arma8enamento do 3anco
8plica,opersistente
RO%
RO%- Rope O"Lect ata"ase
ata"ase Qransactionersistence
torageR+O
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 154/359
1)' PersistKncia
storae = File>torae.File>torae('people./s')d3 = B(storae)
# *onectandoconn = d3.open()
# Te/erJncia para a rai8 da Ir$oreroot = conn.root()
# Um reistro persistenteroot['siner'] = 'Xate Bush'
# E/etuando a altera;<otransaction.commit()
print root['siner'] # Xate Bush
# Hudando um itemroot['siner'] = ',ori Smos'print root['siner'] # ,ori Smos
# S3ortando...transaction.a3ort()
# L item $oltou ao ue era antes da transa;<oprint root['siner'] # Xate Bush
I I tem al&umas limitaçDes ?ue devem ser levadas em conta durante oproeto da aplicação$
▪ Is obetos precisam ser Tseriali6áveis para serem arma6enados.▪ Ibetos mutáveis re?uerem cuidados especiais.
Ibetos Tseriali6áveis são a?ueles obetos ?ue podem ser convertidos erecuperados pelo Pic#!e. Entres os obetos ?ue não podem ser processados
pelo Pic#!e # estão a?ueles implementados em m"dulos escritos em C# poreemplo.
9A)L
MAHL @ um ormato de seriali6ação de dados para teto ?ue representa osdados como combinaçDes de listas# dicionários e valores escalares. Fem comoprincipal caracter1stica ser le&1vel por humanos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 155/359
PersistKncia 1))
I proeto do MAHL oi muito inluenciado pela sintae do !'thon e outraslin&ua&ens dinGmicas. Entre outras estruturas# a especiicação+, do MAHLdeine ?ue$
▪ Is blocos são marcados por endentação.▪ Listas são delimitadas por colchetes ou indicadas por traço.▪ Chaves de dicionário são se&uidas de dois pontos.
Listas podem ser representadas assim$
S8ul Branco ]ermelho
Iu$
)a8ul" 3ranco" $ermelho+
icionários são representados como$
cor: Brancono"e: Banditraca: Wa3rador
!'MAHL+( @ um m"dulo de rotinas para &erar e processar MAHL no !'thon.
Eemplo de conversão para MAHL$
i"port yaml
pros = #'?nlaterra': #'es': ['*lose ,o ,he Ede', 'Fraile'], 'Genesis': ['Foxtrot', ',he ursery *rime'], 'Xin *rimson': ['Ted', 'iscipline']$, 'Slemanha': #'Xra/tCer\': ['Tadioacti$ity', ',rans Europe Express']$
+, ispon1vel em$ http$%%'aml.or&%spec%(.2%.
+( ocumentação e ontes em$ http$%%p''aml.or&%4i3i%!'MAHL.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 156/359
1), PersistKncia
$
print yaml.dump(pros)
*a1da$
7le"anha: Draftwerk: )Tadioacti$ity" ,rans Europe Express+Enlaterra: Fenesis: )Foxtrot" ,he ursery *rime+ Din 0ri"son: )Ted" iscipline+ GHesG: )*lose ,o ,he Ede" Fraile+
Eemplo de leitura de MAHL. Ar?uivo de entrada Tpres.'aml$
! "usica: roc\! cachorro: cor: Branco no"e: Bandit raca: Wa3rador! outros:
instru"ento: 3aixo linuae": )python" ru3y+ co"i&a: carne
C"di&o em !'thon$
i"port pprinti"port yaml
# yaml.load( pode rece3er um arui$o a3erto# como arumentoyml = yaml.load(/ile('pre/s.yaml'))
# pprint.pprint( mostra a estrutura de dados# de uma /orma mais orani8ada do ue# o print con$encionalpprint.pprint(yml)
*a1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 157/359
PersistKncia 1)-
)Z'musica': 'roc\'[" Z'cachorro': Z'cor': 'Branco'" 'nome': 'Bandit'" 'raca': 'Wa3rador'[[" Z'outros': Z'comida': 'carne'"
'instrumento': '3aixo'" 'linuaem': )'python'" 'ru3y'+[[+
MAHL @ muito prático para ser usado em ar?uivos de coni&uração e outroscasos onde os dados podem ser manipulados diretamente por pessoas.
:S,/
A partir versão 2.:# oi incorporado a biblioteca do !'thon um m"dulo de
suporte ao <*IN 7 aaScript C$Gect =otation8. I ormato apresenta muitassimilaridades com o MAHL e tem o mesmo prop"sito.
Eemplo$
i"port Ason
des\top = #'aruitetura': 'pc', 'cpus': 2, 'hds': [2!, 27!]$
print Ason.dumps(des\top)
*a1da$
Z-hds-: )2!" 27!+" -aruitetura-: -pc-" -cpus-: 2[
I <*IN usa a sintae do <ava*cript para representar os dados e @ suportadoem várias lin&ua&ens.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 158/359
1). NL
;)L
HL+2
7eNtensi$!e ar#up Language8 @ uma especiicação# desenvolvida peloWorld Wide Web Consortium
33 (W3C), para uma representação de dados em ?ue ometadado @ arma6enado unto com os dados atrav@s de marcadores 7tags8.
Em termos estruturais# um documento HL representa uma hierar?uiaormada de elementos# ?ue podem ter ou não atributos ou subelementos.
Caracter1sticas principais$▪ S le&1vel por sot4are.▪ !ode ser inte&rada com outras lin&ua&ens.▪ ConteKdo e ormato são entidades distintas.▪ Harcadores podem ser criados sem limitação.▪ !ermite a criação de ar?uivos para validação de estrutura.
No eemplo# o elemento TCachorro possui tr>s atributos$ nome# raça e cor. Ielemento Lobo tem dois subelementos 7TCachorro e TCoiote8 e não possui
+2 !á&ina oicial em http$%%444.4+.or&%HL%.
++ Endereço na nternet$ http$%%444.4+.or&%.
Canino
Japosa
Cachorro
0o"o
Coiote
ome- %anditJaa- 0a"rador
Cor- %ranco8tri"utos
+lementos
Jai:
#r$ore de elementos
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 159/359
NL 1)
atributos.
Em HL# o cachorro @ representado por$
*achorro cor@-Branco- nome@-Bandit- raca@-Wa3rador- 0
E o lobo por$
Wo3o0 Wo3o0
Eistem vários m"dulos dispon1veis para !'thon com suporte ao HL#inclusive na biblioteca ?ue acompanha o interpretador.
Entre as A!s mais usados# destacam-se$▪ IH.▪ *A.▪ /!ement+ree.
Cachorro
ome- %andit
Jaa- 0a"radorCor- %ranco
8tri"utos
Qag
+lemento
0o"o
<Cachorro cor="Branco" nome="Bandit" raca="Labrador" />
<Lobo>...</Lobo>
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 160/359
1,0 NL
D,)
*ocument C$Gect ode! 7IH8 @ um modelo de obeto para representação de
HL# independente de plataorma e lin&ua&em. I IH oi proetado parapermitir nave&ação não linear e modiicaçDes arbitrárias. !or isso# o IHei&e ?ue o documento HL 7ou pelo menos parte dele8 estea carre&ado namem"ria.
Eemplo$
# 5 codin: latin 5
# importa a implementa;<o minidomi"port xml.dom.minidom
# *ria o documentodoc = xml.dom.minidom.ocument()
# Para ler um documento ue AI existe# doc @ xml.dom.minidom.parse('caninos.xml'
# *ria os elementosroot = doc.createElement('*anino')
lo3o = doc.createElement('Wo3o')raposa = doc.createElement('Taposa')coiote = doc.createElement('*oiote')cachorro = doc.createElement('*achorro')
# *ria os atri3utoscachorro.setSttri3ute('nome', 'Bandit')cachorro.setSttri3ute('raca', 'Wa3rador')cachorro.setSttri3ute('cor', 'Branco')
# *ria a estrutura
doc.append*hild(root)root.append*hild(lo3o)root.append*hild(raposa)lo3o.append*hild(coiote)lo3o.append*hild(cachorro)
# Para acrescentar texto ao elemento# tex @ doc.create,extode('Helhor amio do homem...'# cachorro.append*hild(tex
# Hostra o HW /ormatado
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 161/359
NL 1,1
print doc.toprettyxml()
*a1da$
xml $ersion@-.!- 0*anino0 Wo3o0 *oiote0 *achorro cor@-Branco- nome@-Bandit- raca@-Wa3rador-0 Wo3o0 Taposa0*anino0
I m"dulo minidom @ uma implementação do IH mais simples e ?ue re?uermenos mem"ria.
SA;
Simp!e DPI for NL 7*A8 @ uma A! de análise sintática serial para HL.*A permite apenas a leitura serial do documento HL. *A consome
menos mem"ria ?ue o IH# por@m tem menos recursos.
Eemplo$
# 5 codin: latin 5
i"port xml.sax
# S classe processa a Ir$ore HW
class Aan&ler(xml.sax.handler.*ontentVandler):
&ef init (sel/ ):
xml.sax.handler.*ontentVandler. DDinitDD(sel/ ) sel/ .pre/ixo = ''
# chamado uando uma no$o ta Q encontrada &ef startIle"ent(sel/ , ta, attr):
sel/ .pre/ixo += ' '
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 162/359
1,2 NL
print sel/ .pre/ixo + 'Elemento:', ta for item in attr.items(): print sel/ .pre/ixo + ' Os: Os' % item
# chamado uando texto Q encontrado &ef characters(sel/ , txt):
if txt.strip(): print sel/ .pre/ixo + 'txt:', txt
# chamado uando o /im de uma ta Q encontrada &ef en&Ile"ent(sel/ , name):
sel/ .pre/ixo = sel/ .pre/ixo[:!2]
parser = xml.sax.ma\eDparser()parser.set*ontentVandler(Vandler())parser.parse('caninos.xml')
*a1da$
Elemento: *anino
Elemento: Wo3o Elemento: *oiote Elemento: *achorro cor: Branco raca: Wa3rador nome: Bandit Elemento: Taposa
Com o *A não @ necessário tra6er o documento inteiro para a mem"ria.
%lement'ree
/!ement+ree @ o mais Tp'thnico dos tr>s# representando uma estrutura HLcomo uma árvore de elementos# ?ue são tratados de orma semelhante Yslistas# e nos ?uais os atributos são chaves# similar aos dicionários.
Eemplo de &eração de HL com /!ement+ree$
fro" xml.etree.Element,ree i"port Element, Element,ree
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 163/359
NL 1,3
root = Element('*anino')lo3o = Element('Wo3o')
raposa = Element('Taposa')coiote = Element('*oiote')cachorro = Element('*achorro', nome='Bandit', raca='Wa3rador', cor='Branco')
root.append(lo3o)root.append(raposa)lo3o.append(coiote)lo3o.append(cachorro)
Element,ree(root).Crite('caninos.xml')
Ar?uivo HL de sa1da$
*anino0 Wo3o0 *oiote 0 *achorro cor@-Branco- nome@-Bandit- raca@-Wa3rador- 0 Wo3o0 Taposa 0
*anino0
Eemplo de leitura do ar?uivo HL$
fro" xml.etree.Element,ree i"port Element,ree
tree = Element,ree(/ile='caninos.xml')root = tree.etroot()
# Wista os elementos a3aixo do rootprint root.etchildren()
# Encontra o lo3olo3o = root./ind('Wo3o')
# Encontra o cachorrocachorro = lo3o./ind('*achorro')print cachorro.ta, cachorro.attri3
# Temo$e a raposa
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 164/359
1,' NL
root.remo$e(root./ind('Taposa'))print root.etchildren()
*a1da$
)Element Wo3o at a3%a=0" Element Taposa at a3%37!0+*achorro Z'cor': 'Branco'" 'raca': 'Wa3rador'" 'nome': 'Bandit'[)Element Wo3o at a3%a=0+
I HL @ muito Ktil por acilitar a interoperabilidade entre sistemas# mesmo
?ue estes seam desenvolvidos em tecnolo&ias dierentes.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 165/359
8anco de dados 1,)
+anco de dados
*istemas =erenciadores de anco de ados 7*=s8 são reconhecidos porprover uma orma de acesso consistente e coniável para inormaçDes.
A maioria dos *= atuais são baseados no modelo relacional# no ?ual asinormaçDes são representadas na orma de tabelas. =eralmente# estas tabelaspodem ser consultadas atrav@s de uma lin&ua&em especiali6ada para isso#chamada *OL 7Structured Ouery Language8.
=eralmente# os *=s utili6am a ar?uitetura cliente-servidor. Is aplicativosusam a A! cliente para poder se comunicar com o servidor# ?ue @ oresponsável por receber as consultas dos clientes# interpretar as sentenças*OL e recuperar os dados com um tempo de resposta ade?uado.
!ara a6er isso# o servidor precisa reali6ar uma s@rie de outras tareas# taiscomo$ veriicar credenciais# controlar o acesso# &erenciar coneDes de rede#manter a inte&ridade dos dados# otimi6ar as consultas e resolver ?uestDes deconcorr>ncia.
er$idor
rocesso
8rqui$os8rqui$os8rqui$os
Cliente
8' Cliente
8plicati$o
Jederocesso
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 166/359
1,, 8anco de dados
No !'thon# a inte&ração com *=s @ eita na maioria dos casos atrav@s deum m"dulo .# ?ue usa a A! cliente para se comunicar com o banco de
dados.
D+I
*ata$ase Interface 78 @ uma especiicação ?ue descreve como deve ser ocomportamento de um m"dulo de acesso a sistemas de banco de dados.
A deine ?ue o m"dulo deve ter uma unção connect:; # retorna obetos de
coneão. A partir do do obeto coneão# @ poss1vel obter um obeto cursor#?ue permite a eecução de sentenças *OL e a recuperação dos dados 7umalista de tuplas com os resultados# por defau!t8.
)yS<L
I H'*OL @ um *= cliente-servidor reconhecido pelo bom desempenho e @ bastante usado como $ac#end para aplicaçDes (e$.
'nterpretador
%'
rograma
8s consultas s,o sentenas S0
e as respostas s,o listas detuplas ou dicionários.
T%
O módulo %' (atabase
!nterface) é um driver especificopara o T%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 167/359
8anco de dados 1,-
Eemplo de acesso atrav@s de com H'*OL+0$
# 5 codin: ut/= 5
i"port Hy>Wd3
# *ria uma conex<ocon = Hy>Wd3.connect(d3='test', user='root', passCd='')
# *ria um cursorcur = con.cursor()
# Executa um comando >Wcur.execute('shoC data3ases')
# Tecupera o resultadorecordset = cur./etchall()
# Hostra o resultadofor record in recordset: print record
# Fecha a conex<ocon.close()
*a1da$
('in/ormationDschema'"('mysl'"('test'"
I resultado @ composto por uma lista de tuplas com as data$ases dispon1veisno servidor.
S<Lite
A partir da versão 2.5# o !'thon passou a incorporar em sua distribuição umm"dulo para acessar o *OLite+5.
+0 inários# ontes e documentação podem ser encontrados em$http$%%sourceor&e.net%proects%m's?l-p'thon.
+5 ocumentação# ontes e binários podem ser encontrados em$ http$%%444.s?lite.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 168/359
1,. 8anco de dados
*OLite @ uma biblioteca Cpen Source escrita em lin&ua&em C# ?ue implementaum interpretador *OL# e prov> uncionalidades de banco de dados# usandoar?uivos# sem a necessidade de um processo servidor separado ou de
coni&uração manual.
Eemplo$
# 5 codin: ut/= 5
i"port slite%
# *ria uma conex<o e um cursor
con = slite%.connect('emails.d3')cur = con.cursor()
# *ria uma ta3elasl = 'create ta3le emails '9 '(id inteer primary \ey" '9 'nome $archar(!!" '9 'email $archar(!!'cur.execute(sl)
# senten;a >W para inserir reistros
sl = 'insert into emails $alues (null" " '# adosrecset = [('Aane doe', 'AanegnoChere.or'), ('roc\', 'roc\ghardplace.com')]
# ?nsere os reistrosfor rec in recset: cur.execute(sl, rec)
# *on/irma a transa;<ocon.commit()
# >eleciona todos os reistroscur.execute('select 5 /rom emails')
# Tecupera os resultadosrecset = cur./etchall()
# Hostrafor rec in recset: print 'Od: Os(Os' % rec
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 169/359
8anco de dados 1,
# Fecha a conex<ocon.close()
A vanta&em mais si&niicativa de usar o *OLite @ a praticidade#principalmente no uso em aplicativos locais para des#tops # aonde usar um*= convencional seria desnecessário e complicado de manter.
*irebird
irebird+: @ um *= cliente-servidor leve# por@m com muitos recursos.
!ro&ramas em !'thon podem se comunicar com ele atrav@s do drier Pnterbas+).
Eemplo$
# 5 codin: latin 5
i"port \inter3asd3
#Para criar a 3ase# isl u sysd3a p xxxx# create data3ase '9temp9cds./d3'## conecta o Fire3irdcon = \inter3asd3.connect(dsn='localhost:tempcds./d3', user='sysd3a', passCord='xxxx')
# *ria um o3Aeto cursorcur = con.cursor()
sl = -create ta3le cds(-9 -nome $archar(2!"-9 -artista $archar(2!"-9 -ano inteer"-9 -/aixas inteer"-9 -primary \ey(nome" artista" ano-
# *ria uma ta3ela
+: ispon1vel em$ http$%%444.irebirds?l.or&%.
+) ltima versão$ http$%%444.irebirds?l.or&%inde.phpkop`develsub`p'thon.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 170/359
1-0 8anco de dados
cur.execute(sl)
# Gra$a as modi/ica;Mes
con.commit()
dados = [ ('?]', 'Wed Reppelin', &7, =), ('Renyatt Hondatta', ',he Police', &=!, ), ('LX *omputer', 'Tadiohead', &&7, 2), ('?n S3sentia', 'Porcupine ,ree', 2!!2, 2), ]
# ?nsere os reistros e /a8 a interpola;<oinsert = -insert into cds-9
-(nome" artista" ano" /aixas $alues (" " " -cur.executemany(insert, dados)con.commit()
# *onsulta os reistroscur.execute(-select 5 /rom cds order 3y ano-)
# Tecupera os resuldadosfor re in cur./etchall(): # Formata e imprime print ' '. Aoin(str(i) for i in re)
*a1da$
?] Wed Reppelin &7 =Renyatt Hondatta ,he Police &=! LX *omputer Tadiohead &&7 2?n S3sentia Porcupine ,ree 2!!2 2
Como o irebird não re?uer muita pot>ncia e nem muito esorço paraadministração# ele pode ser usado tanto como servidor# ?uanto serempacotado unto com um aplicativo des#top.
PostgreS<L
!ara sistemas ?ue demandam recursos mais soisticados do *=# o!ost&re*OL+9 @ a solução Cpen Source mais completa dispon1vel. I sot4are
+9 *ite oicial em http$%%444.post&res?l.or&% e site da comunidade brasileira em
http$%%444.post&res?l.or&.br%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 171/359
8anco de dados 1-1
se&ue a ar?uitetura cliente-servidor e @ distribu1do sob a licença *.
Entre os recursos oerecidos pelo !ost&re*OL# destacam-se$▪ *uporte a consultas compleas.▪ FransaçDes.▪ Controle de concorr>ncia multi-versão.▪ Fipos de obetos deinidos pelo usuário.▪ Berança.▪ Vie"s.▪ Stored Procedures.▪ +riggers.
▪ &u!! tet search.
Eistem vários m"dulos ?ue prov>m acesso ao !ost&re*OL para o !'thon#como o !'&re*OL+/ e o !s'cop&0,.
I !'&re*OL oerece duas interaces distintas para acesso a servidores!ost&re*OL$
▪ pgd$$ m"dulo compat1vel com .▪ pg$ m"dulo mais anti&o# incompat1vel com .
Eemplo com pgd$$
# 5 codin: latin 5
i"port pd3
# Para 3ancos de dados locais ($ia Unix omain >oc\ets#con @ pd3.connect(data3ase@'music'
# ]ia ,*P?Pcon = pd3.connect(host='tao', data3ase='music', user='p',passCord='#g1_O')cur = con.cursor()
# *ria uma ta3elasl = 'create ta3le trac\s '9
+/ *ite oicial$ http$%%444.p'&res?l.or&%.
0, ontes e documentação em http$%%initd.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 172/359
1-2 8anco de dados
'(id serial primary \ey" '9 'trac\ $archar(!!" '9 '3and $archar(!!'
cur.execute(sl)
# S interpola;<o usa uma nota;<o semelhante a do Pythonsl = 'insert into trac\s $alues (de/ault" Os" Os'
# adosrecset = [('Xashmir', 'Wed Reppelin'), ('>tarless', 'Xin *rimson')]
# ?nsere os reistrosfor rec in recset:
cur.execute(sl, rec)
con.commit()
# Tecupera os reistroscur.execute('select 5 /rom trac\s')
# Tecupera os resultadosrecset = cur./etchall()# Hostrafor rec in recset:
print rec
con.close()
*a1da$
)" 'Xashmir'" 'Wed Reppelin'+)2" '>tarless'" 'Xin *rimson'+
Eemplo com pg$
i"port p# Para 3ancos de dados locais ($ia Unix omain >oc\ets#con @ p.connect('music'
# ]ia ,*P?Pcon = p.connect(host='tao', d3name='music', user='p', passCd='#g1_O')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 173/359
8anco de dados 1-3
# Teali8a uma consulta no 3ancory = con.uery('select 5 /rom trac\s')
# Pea a lista de campos/lds = ry.list/ields()
# Hostra os resultadosfor rec in ry.dictresult(): for /ld in /lds: print 'Os: Os' % (/ld, rec[/ld]) print
con.close()
*a1da$
id: trac\: Xashmir3and: Wed Reppelin
id: 2trac\: >tarless
3and: Xin *rimson
Eemplo usando o !s'cop&$
i"port psycop2
# Para 3ancos de dados locais ($ia Unix omain >oc\ets#con @ psycop2.connect(data3ase@'music'
# ]ia ,*P?Pcon = psycop2.connect(host='tao', data3ase='music', user='p', passCord='#g1_O')cur = con.cursor()
sl = 'insert into trac\s $alues (de/ault" Os" Os'recset = [('>i3erian Xhatru', 'es'), (->upper's Teady-, 'Genesis')]for rec in recset: cur.execute(sl, rec)con.commit()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 174/359
1-' 8anco de dados
cur.execute('select 5 /rom trac\s')recset = cur./etchall()
for rec in recset: print rec
con.close()
*a1da$
(" 'Xashmir'" 'Wed Reppelin'(2" '>tarless'" 'Xin *rimson'
(%" '>i3erian Xhatru'" 'es'(4" ->upper's Teady-" 'Genesis'
Como o m"dulo se&ue ielmente a especiicação # o c"di&o @ praticamentei&ual ao eemplo usando o m"dulo pg. I !s'cop& oi proetado com oobetivo de suportar aplicaçDes mais pesadas# com muitas inserçDes eatuali6açDes.
Famb@m @ poss1vel escrever unçDes para !ost&re*OL usando !'thon. !ara?ue isso sea poss1vel# @ preciso habilitar o suporte ao !'thon no banco#atrav@s do utilitário de linha de comando pelo administrador$
createlan plpythonu 3anco0
As lin&ua&ens ?ue podem usadas pelo !ost&re*OL são chamadas Procedura!Languages 7!L8 e o suio Tu si&niica untrusted.
Is tipos dos parGmetros e do retorno da unção devem ser deinidos durantea criação da unção no !ost&re*OL.
Eemplo de unção$
create /unction p/ormat(3and text" trac\ text returns textas __
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 175/359
8anco de dados 1-)
return 'Os Os' O (3and" trac\__ lanuae plpythonu
I c"di&o em !'thon oi marcado em verde.
*a1da da unção 7atrav@s do ps?l8$
music@0 select p/ormat(trac\" 3and /rom trac\s p/ormat Xashmir Wed Reppelin
>tarless Xin *rimson es >i3erian Xhatru Genesis >upper's Teady(4 reistros
I ambiente de eecução de !'thon no !ost&re*OL prov> o m"dulo plp'7importado automaticamente8 ?ue @ uma abstração para o acesso aos recursosdo *=.
Eemplo com plp'$
create /unction ini3ands( returns seto/ textas __ 3ands @ plpy.execute('select distinct 3and /rom trac\s order 3y ' return )''.Aoin(/ilter(lam3da c: c @@ c.upper(" list(3and)'3and'+ /or 3andin 3ands+__ lanuae plpythonu
*a1da da unção 7atrav@s do utilitário ps?l8$
music@0 select ini3ands( ini3ands X* WR G
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 176/359
1-, 8anco de dados
(4 reistros
unçDes escritas em !'thon podem ser utili6adas tanto em Stored Procedures?uanto +riggers no !ost&re*OL.
Eistem vários proetos ?ue ampliam os recursos do !ost&re*OL# como o!ost=is0( # ?ue prov> suporte a inormaçDes espaciais# usadas em =*7%eographic Information Systems8.
0( *ite$ http$%%post&is.reractions.net%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 177/359
8anco de dados 1--
)apeamento ob-eto=relacional
C$Gecte!ationa! apper 7I;H8 @ uma camada ?ue se posiciona entre oc"di&o com a l"&ica da aplicação e o m"dulo # com o obetivo de redu6iras diiculdades &eradas pelas dierenças entre a representação de obetos 7dalin&ua&em8 e a representação relacional 7do banco de dados8.
Com o uso de um I;H$▪ A aplicação se torna independente do *=.▪ I desenvolvedor não precisa usar *OL diretamente.▪
A l"&ica para &erenciamento das coneDes @ reali6ada de ormatransparente pelo I;H.
Eemplo de I;H 7com *OLAlchem'028$
# 5 codin: latin 5
# ,estado com >WSlchemy !..7
02 ocumentação e ontes podem encontrados em$ http$%%444.s?lalchem'.or&%.
8s consultas s,o métodos e asrespostas s,o o"Letos.
T%
O módulo OJ desacopla aaplica,o do T%.
'nterpretador
OJ
rograma
%'
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 178/359
1-. 8anco de dados
fro" slalchemy i"port *
# UTW @0 dri$er:username:passCordghost:portdata3ase
# o >Wite:# slite: (memria# slite:arui$o (arui$o em discod3 = createDenine('slite:pros.d3')
# ,orna acess$el os metadadosmetadata = Hetaata(d3)
# Ecoa o ue >WSlchemy estI /a8endometadata.3ind.echo = ,rue
# ,a3ela ProproDta3le = ,a3le('pros', metadata, *olumn('proDid', ?nteer, primaryD\ey=,rue), *olumn('name', >trin(=!)))
# *ria a ta3elaproDta3le.create()
# *arrea a de/ini;<o da ta3elaproDta3le = ,a3le('pros', metadata, autoload=,rue)
# ?nsere dadosi = proDta3le.insert()i.execute(#'name': 'es'$, #'name': 'Genesis'$, #'name': 'Pin\ Floyd'$, #'name': 'Xin *rimson'$)
# >elecionas = proDta3le.select()r = s.execute()
for roC in r./etchall(): print roC
*a1da$
2!!!6 !=:7:"6% ?FL slalchemy.enine.3ase.Enine.!x...a/!*TES,E ,SBWE pros (
proDid ?,EGET L, UWW"name ]ST*VST(=!"PT?HST XE (proDid
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 179/359
8anco de dados 1-
2!!!6 !=:7:"6% ?FL slalchemy.enine.3ase.Enine.!x...a/! (
2!!!6 !=:7:"272 ?FL slalchemy.enine.3ase.Enine.!x...a/!*LHH?,2!!!6 !=:7:"272 ?FL slalchemy.enine.3ase.Enine.!x...a/!?>ET, ?,L pros (name ]SWUE> (2!!!6 !=:7:"272 ?FL slalchemy.enine.3ase.Enine.!x...a/!))'es'+" )'Genesis'+" )'Pin\ Floyd'+" )'Xin *rimson'++2!!!6 !=:7:"272 ?FL slalchemy.enine.3ase.Enine.!x...a/!*LHH?,2!!!6 !=:7:"%6 ?FL slalchemy.enine.3ase.Enine.!x...a/!>EWE*, pros.proDid" pros.nameFTLH pros
2!!!6 !=:7:"%6 ?FL slalchemy.enine.3ase.Enine.!x...a/! )+(" u'es'(2" u'Genesis'(%" u'Pin\ Floyd'(4" u'Xin *rimson'
Al@m dos *OLAlchem'# tamb@m eistem dispon1veis para !'thon o*OLIbect0+ e I;Hs ?ue inte&ram frame"or#s maiores# como o an&o.
0+ ocumentação e ontes dispon1veis em$ http$%%444.s?lobect.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 180/359
1.0 (e$
.eb
Uma aplicação (e$ @ uma aplicação cliente-servidor aonde o cliente @ o$ro"ser 7como o Ho6illa ireo8 e o protocolo utili6ado para a comunicaçãocom o servidor @ chamado Hypertet +ransfer Protoco! 7BFF!8# tecnolo&ias ?ueservem de base para a (or!d (ide (e$ 7JJJ8# as pá&inas de hiperteto ?uea6em parte da internet. Fais pá&inas se&uem as convençDes da lin&ua&emHyper+et ar#up Language'' 7BFHL8.
As aplicaçDes (e$ &eram as pá&inas BFHL dinamicamente# atendendo as
re?uisiçDes enviadas pelo $ro"ser. *e constru1das da orma ade?uada# estasaplicaçDes podem ser acessadas em vários ambientes dierentes# decomputadores pessoais# at@ !As e celulares.
Eistem muitos frame"or#s para acilitar o desenvolvimento de aplicativos(e$ em !'thon# entre eles# o Cherr'!' e o Cherr'Femplate.
00 EspeciicaçDes em$ http$%%444.4+.or&%Har3Up%.
er$idor
Jequisi,o T+Qou OQ
%roPser
UQQd
Jesposta
8 Ve" dinNmica é uma forma de
e1ecu,o remota.
urlWparamMarg MX url(paramMarg)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 181/359
(e$ 1.1
CherryPy
Cherr'!'05 @ um frame"or# para aplicaçDes (e$ ?ue publica obetos#
convertendo U;Ls em chamadas para os m@todos dos obetos publicados.Com o Cherr'!'# o pro&rama passa a se comportar como um servidor (e$ #respondendo a re?uisiçDes =EF e !I*F.
Eemplo com Cherr'!'$
i"port cherrypy
class oot(o3Aect):
gcherrypy.expose &ef in&e(sel/ ):
return 'Vello ^orld1'
cherrypy.uic\start(Toot())
I decorador epose indica ?uais m@todos são publicados via (e$. I retorno
do m@todo @ uma string # ?ue @ enviada para o $ro"ser.
I endereço padrão do servidor @ Thttp$%%localhost$9,9,%.
Cherry'emplate
Cherr'Femplate0: @ um m"dulo de processamento de modelos 7temp!ates8para !'thon. Era parte inte&rante do Cherr'!'# mas hoe @ distribu1do comoum pacote separado.
Harcadores dispon1veis no Cherr'Femplate$
▪ pyea!$ avalia uma epressão em !'thon e insere o resultado 7?ue deveser uma string8 no teto.
05 ocumentação e ontes podem ser encontrados em$ http$%%444.cherr'p'.or&%.0: ocumentação e ontes podem ser encontrados em$ http$%%cherr'template.p'thon-
hostin&.com%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 182/359
1.2 (e$
Eemplo$
>omatrio de a ! Q pye$al@-str(sum(rane(" -0
▪ pyeec$ eecuta uma linha de c"di&o !'thon.
Eemplo$
pyexec@-import plat/orm-0L sistema Q pye$al@-plat/orm.plat/orm(-0
▪ pycode$ eecuta um bloco de c"di&o !'thon.
Eemplo$
pycode@-import plat/ormsistema @ plat/orm.plat/orm(-0pye$al@-sistema-0
▪ pyif % pye!se$ unciona como o par if % e!se em !'thon.
Eemplo$
pyi/@- 0 !-0 Slo errado...pyi/0pyelse0
*orreto1pyelse0
▪ pyfor$ unciona como o laço or em !'thon.
Eemplo$
py/or@-x in rane(" -0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 183/359
(e$ 1.3
pye$al@-str(x-0 55 2 @ pye$al@-str(x 55 2-03r0py/or0
▪ pyinc!ude$ inclui um ar?uivo eterno no temp!ate.
Eemplo$
[email protected]*orpo da pIina...pyinclude@-/ooter.html-0
Al@m de usar uma string como temp!ate # @ poss1vel &uardar o temp!ate em umar?uivo$
render,emplate(/ile='index.html')
Eemplo com 4herry+emp!ate$
fro" cherrytemplate i"port render,emplate
pros = ['es', 'Genesis', 'Xin *rimson']
template = 'html09n3ody09n'9 'py/or@-pro in pros-0'9 ' pye$al@-pro-03r09n'9 'py/or0'9 '3ody09nhtml09n'
print render,emplate(template)
*a1da BFHL$
html03ody0 es3r0 Genesis3r0 Xin *rimson3r03ody0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 184/359
1.' (e$
html0
As sa1das &eradas pelo Cherr'Femplate podem ser publicadas peloCherr'!'.
Cliente .eb
I !'thon tamb@m pode uncionar do lado cliente# atrav@s do m"dulo ur!!i$.
Eemplo$
# 5 codin: latin 5
i"port urlli3
# S3re a UTW e /ornece um o3Aeto semelhante# a um arui$o con$encionalurl = urlli3.urlopen('http:ar\4n.Cordpress.com')
# WJ a pIinahtml = url.read()
#html @ 'a hre/@-http:CCC.nu.or-0'/ound = html./ind('hre/@', !)
# /ind retorna se n<o encontrawhile /ound >= !:
# L /im do lin\ (uando as aspas aca3am end = html./ind(html[/ound + ], /ound + 6) +
# Hostra o lin\ print html[/ound:end]
# Passa para o prximo lin\ /ound = html./ind('hre/@', /ound + )
Iutra solução cliente @ o F4isted Jeb0) # ?ue @ parte do proeto F4isted09 # um frame"or# orientado a eventos voltado para protocolos de rede# incluindoBFF!# **B# ;C# HA! e outros.
0) Endereço$ http$%%t4istedmatri.com%trac%4i3i%F4istedJeb.
09 Endereço$ http$%%t4istedmatri.com%trac%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 185/359
V4 1.)
)#C
ode!ie"contro!!er 7HC8 @ uma ar?uitetura de sot4are ?ue divide aaplicação em tr>s partes distintas$ o modelo de dados da aplicação# a interacecom o usuário e a l"&ica de controle.
I obetivo @ obter um baio acoplamento entre as tr>s partes de orma ?ueuma alteração em uma parte tenha pouco 7ou nenhum8 impacto nas outraspartes.
A criação da aplicação dependente da deinição de tr>s componentes$▪ Hodelo 7mode!8$ encapsula os dados da aplicação e a l"&ica de dom1nio.▪ isão 7ie"8$ recupera dados do modelo e apresenta ao usuário.▪ Controlador 7contro!!er8$ recebe e rea&e a poss1veis eventos# como
interaçDes com o usuário e re?uisita alteraçDes no modelo e na visão.
Embora a ar?uitetura não determine ormalmente a presença de umcomponente de persist>ncia# ica impl1cito ?ue este a6 parte do componentemodelo.
Controller
@C- odel @ieP Controller
odel@ieP
Jecupera dados eapresenta ao
usuário.
+ncapsula os dadosda aplica,o e a
lógica de dom!nio.
Jece"e e reage ae$entos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 186/359
1., V4
I uso mais comum para o modelo HC @ em aplicaçDes (e$ baseadas em bancos de dados# ?ue implementam as operaçDes básicas chamadas C;U
74reate7 ead7 5pdate and *e!ete8.
Eistem vários frame"or#s para aumentar a produtividade na criação deaplicativos se&uindo o HC# com recursos como$
▪ Scripts ?ue automati6am as tareas mais comuns de desenvolvimento.▪ =eração automática de c"di&o.▪ Uso de I;H.▪ Uso de C**0/ 74ascade Sty!e Sheets8.
▪ Uso de A<A 7 Dsynchronous aascript Dnd NL8.▪ Hodelos de aplicaçDes.▪ Uso de introspecção para obter inormaçDes sobre as estruturas de
dados e &erar ormulários com campos com as caracter1sticascorrespondentes.
▪ iversas opçDes pr@-coni&uradas com defau!ts ade?uados para amaioria das aplicaçDes.
Uma das maiores vanta&ens oerecidas pelo HC @ ?ue# ao separar a
apresentação da l"&ica de aplicação# se torna mais ácil dividir as tareas dedesenvolvimento e de design da interace em uma e?uipe.
Eemplo$
# 5 codin: ut/= 5---^e3 com opera;Mes *TU---
# *herryPyi"port cherrypy
# *herry,emplatei"port cherrytemplate
# >WSlchemyi"port slalchemy as sl
0/ Especiicação em$ http$%%444.4+.or&%*t'le%C**%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 187/359
V4 1.-
# *onecta ao 3andod3 = sl.createDenine('slite:8oo.d3')
# Scesso aos metadadosmetadata = sl.Hetaata(d3)
tr: # *arrea metadados da ta3ela 8oo = sl.,a3le('8oo', metadata, autoload=,rue)
ecept: # e/ine a estrutura da ta3ela 8oo 8oo = sl.,a3le('8oo', metadata,
sl.*olumn('id', sl.?nteer, primaryD\ey=,rue), sl.*olumn('nome', sl.>trin(!!), uniue=,rue, nulla3le=False), sl.*olumn('uantidade', sl.?nteer, de/ault=), sl.*olumn('o3s', sl.>trin(2!!), de/ault='') )
# *ria a ta3ela 8oo.create()
# Ls nomes das colunas
colunas = [col for col in 8oo.columns.\eys()]colunas.remo$e('id')
class oot(o3Aect): ---Tai8 do site---
gcherrypy.expose &ef in&e(sel/ , **ars): --- Wista os reistros
---
ms = '' op = ars.et('op') ident = int(ars.et('ident', !)) no$o = #$
for coluna in colunas: no$o[coluna] = ars.et(coluna)
if op == 'rem':
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 188/359
1.. V4
# Temo$e dados rem = 8oo.delete(8oo.c.id==ident)
rem.execute() ms = 'reistro remo$ido.'
elif op == 'add':
no$o = #$
for coluna in colunas: no$o[coluna] = ars[coluna]
tr:
# ?nsere dados ins = 8oo.insert() ins.execute(no$o) ms = 'reistro adicionado.'
ecept sl.exceptions.?nterityError: ms = 'reistro existe.'
elif op == 'mod':
no$o = #$
for coluna in colunas: no$o[coluna] = ars[coluna]
tr: # Hodi/ica dados mod = 8oo.update(8oo.c.id==ident) mod.execute(no$o) ms = 'reistro modi/icado.'
ecept sl.exceptions.?nterityError:
ms = 'reistro existe.'
# >eleciona dados sel = 8oo.select(orderD3y=8oo.c.nome) rec = sel.execute()
# Gera a pIina principal a partir do modelo -index.html- return cherrytemplate.render,emplate(/ile='index.html', outputEncodin='ut/=')
gcherrypy.expose
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 189/359
V4 1.
&ef a&&(sel/ ): --- *adastra no$os reistros
---
# Gera a pIina de reistro no$o a partir do modelo -add.html- return cherrytemplate.render,emplate(/ile='add.html', outputEncodin='ut/=')
gcherrypy.expose &ef re"(sel/ , ident): --- *on/irma a remo;<o de reistros ---
# >eleciona o reistro sel = 8oo.select(8oo.c.id==ident) rec = sel.execute() res = rec./etchone()
# Gera a pIina de con/irmar exclus<o a partir do modelo -rem.html- return cherrytemplate.render,emplate(/ile='rem.html', outputEncodin='ut/=')
gcherrypy.expose
&ef "o&(sel/ , ident): --- Hodi/ica reistros ---
# >eleciona o reistro sel = 8oo.select(8oo.c.id==ident) rec = sel.execute() res = rec./etchone()
# Gera a pIina de altera;<o de reistro a partir do modelo -mod.html-
return cherrytemplate.render,emplate(/ile='mod.html', outputEncodin='ut/=')
# ?nicia o ser$idor na porta =!=!cherrypy.uic\start(Toot())
Hodelo Tinde.html 7pá&ina principal8$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 190/359
10 V4
th0th0py/or@-coluna in colunas-0 th0pye$al@-coluna-0th0py/or0th0th0th0th0tr0py/or@-i" campos in enumerate(rec./etchall(-0 tr0 th0pye$al@-unicode(i K -0th0 py/or@-coluna in colunas-0
td0pye$al@-unicode(campos)coluna+-0td0 py/or0 td0 a hre/ @-modident@pye$al@-unicode(campos)'id'+-0-0modi/icara0 td0td0 a hre/ @-remident@pye$al@-unicode(campos)'id'+-0-0remo$era0 td0 tr0py/or0ta3le0
3r 0/orm action@-add- method@-post-0 input type@-su3mit- $alue@- adicionar - 0/orm0p0pye$al@-ms-0p0pyinclude@-/ooter.html-0
Hodelo Tadd.html 7pá&ina de ormulário para novos re&istros8$
[email protected]/orm action@-op@add- method@-post-0 ta3le0 py/or@-coluna in colunas-0 tr0td0 pye$al@-coluna-0 td0td0 input type@-text- si8e@-%!- name@-pye$al@-coluna-0- 0 td0tr0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 191/359
V4 11
py/or0 ta3le03r 0
input type@-su3mit- $alue@- sal$ar - 0/orm03r 0) a hre/ @--0$oltara0 +pyinclude@-/ooter.html-0
Hodelo Tmod.html 7pá&ina de ormulário para alteração de re&istros8$
/orm action@-op@modident@pye$al@-unicode(res)'id'+-0-method@-post-0 ta3le 3order@-!-0 py/or@-coluna in colunas-0 tr0th0 pye$al@-coluna-0 th0td0 input type@-text- si8e@-%!- name@-pye$al@-coluna-0- $alue@-pye$al@-unicode(res)coluna+-0- 0 td0tr0 py/or0
ta3le03r 0input type@-su3mit- $alue@- sal$ar - 0/orm03r 0) a hre/ @--0$oltara0 +pyinclude@-/ooter.html-0
Hodelo Trem.html 7pá&ina ?ue pede conirmação para remoção dere&istros8$
[email protected] 3order@--0tr0py/or@-coluna in colunas-0 th0pye$al@-coluna-0th0py/or0tr0tr0py/or@-coluna in colunas-0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 192/359
12 V4
td0pye$al@-unicode(res)coluna+-0td0py/or0tr0
ta3le03r 0/orm action@-op@remident@pye$al@-unicode(res)'id'+-0-method@-post-0 input type@-su3mit- $alue@- remo$er - 0/orm03r 0) a hre/ @--0$oltara0 +pyinclude@-/ooter.html-0
Hodelo Theader.html 7cabeçalho comum a todos os modelos8$
html0head0 meta httpeui$@-*ontent,ype- content@-texthtmlcharset@ut/=- 0title0Rootitle0style type@-textcss-013ody Z marin: !
paddin: ! /ont: =!O ]erdana" Wucida" sansseri/ color: #%%%%66[h Z marin: ! paddin: ! /ont: 2!!O Wucida" ]erdana" sansseri/[a Z color: #4%6&76
textdecoration: none[a:ho$er Z 3ac\round: #c4cded textdecoration: underline[ta3le Z marin: em !em em !em 3ordercollapse: collapse 3orderle/t: px solid #==3a 3order3ottom: px solid #==3a
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 193/359
V4 13
/ont: &!O ]erdana" Wucida" sansseri/[ta3le th Z
paddin: !em em !em em 3ordertop: px solid #==3a 3order3ottom: px solid #==3a 3orderriht: px solid #==3a 3ac\round: #c4cded /ontCeiht: normal[ta3le td Z paddin: !em em !em em 3ordertop: px solid #==3a 3orderriht: px solid #==3a
textalin: center[/orm Z marin: ! 3order: none[input Z 3order: px solid #==3a 3ac\roundcolor: #c4cded $erticalalin: middle[
0style0head03ody0h0Rooh03r 0
Hodelo Tooter.html 7rodap@ comum a todos os modelos8$
3ody0html0
!á&ina principal$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 194/359
1' V4
I frame"or# HC mais conhecido @ o ;ub' In ;ails# ?ue audou apopulari6ar o HC entre os desenvolvedores.
Especiicamente desenvolvidos em !'thon# eistem os frame"or#s an&o5, #Furbo=ears5( e 4eb2p'52 # entre outros.
5, !á&ina oicial em$ http$%%444.dan&oproect.com%.5( !á&ina oicial em$ http$%%turbo&ears.or&%.
52 !á&ina oicial em$ http$%%444.4eb2p'.com%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 195/359
/erc?cios V 1)
%&erccios #
(. mplementar uma classe Dnima! com os atributos$ nome# esp@cie# &>nero#peso# altura e idade. I obeto derivado desta classe deverá salvar seu estadoem ar?uivo com um m@todo chamado Tsalvar e recarre&ar o estado em umm@todo chamado Tdesa6er.
2. mplementar uma unção ?ue ormate uma lista de tuplas como tabelaBFHL.
+. mplementar uma aplicação (e$ com uma saudação dependente do
horário 7eemplos$ Tom dia# são ,/$,,.# Toa tarde# são (+$,,. e Toa noite#são 2+$,,.8.
0. mplementar uma aplicação (e$ com um ormulário ?ue receba epressDes!'thon e retorne a epressão com seu resultado.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 196/359
1, Parte VI
Parte VIEsta parte apresenta al&umas uncionalidades dos pacotes Num!'# *ci!' eHatplolib# e tamb@m de conhecidos too!#its para interaces &ráicas. Al@mdisso# uma breve introdução a computação &ráica e processamentodistribu1do. E por im# observaçDes sobre perormance no !'thon e ormas deempacotar e distribuir aplicativos.
ConteKdo$
▪ !rocessamento num@rico.▪ nterace &ráica.▪ Computação &ráica.▪ !rocessamento de ima&em.▪ *= .▪ ma&ens em tr>s dimensDes .▪ !rocessamento distribu1do.▪ !erormance .▪ Empacotamento e distribuição.▪ Eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 197/359
Processamento numQrico 1-
Processamento num>rico
No !'thon# al@m dos recursos matemáticos ?ue a6em parte da distribuiçãopadrão# o processamento num@rico pode ser eito atrav@s do Num!' e outrospacotes ?ue oram constru1dos a partir dele.
/umPy
Num!'5+ @ um pacote ?ue inclui$
▪ Classe array.▪ Classe matri.▪ árias unçDes auiliares.
Arran-os
A classe array implementa um arrano homo&>neo mutável com nKmeroarbitrário de elementos# semelhante Y lista comum do !'thon# por@m maispoderosa.
Eemplos$
i"port numpy
# *riando arranAos
print 'SrranAo criado a partir de uma lista:'a = numpy.array([!, , 2, %, 4, , 6, 7, =])
print a# )! 2 % 4 6 7 =+
print 'SrranAo criado a partir de um inter$alo:'8 = numpy.arane(!., 4., .)
print 8# ) !. !. . . 2. 2. %. %. 4. +
print 'SrranAo de s 2x%:'y = numpy.ones((2, %))
5+ ontes# binários e documentação podem ser encontrados em$ http$%%nump'.scip'.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 198/359
1. Processamento numQrico
print y# )) . . .+
# ) . . .++
print 'SrranAos podem erar no$os arranAos:'# numpy.round( Q uma /un;<o do numpy# semelhante ao 3uiltin round(" porQm aceita# arranAos como parYmetrocos = numpy.round(numpy.cos(8), )
print cos# ) . !.& !. !. !.4 !.= . !.& !.7+
print 'Hultiplicando cada elemento por um escalar:'print * 8# ) !. 2. . 7. !. 2. . 7. 2!. +
print '>omando arranAos elemento por elemento:'print 8 + cos# ) . .4 . .6 .6 .7 2. 2.6 %.%+
print 'Tedimensionando o arranAo:'8.shape = %, %
print 8# )) !. !. . +# ) . 2. 2.+# ) %. %. 4. ++
print 'SrranAo transposto:'print 8.transpose()# )) !. . %. +# ) !. 2. %.+# ) . 2. 4. ++
print '-Schata- o arranAo:'print 8./latten()# ) !. !. . . 2. 2. %. %. 4. +
print 'L acesso aos elementos /unciona como nas listas:'print 8[]# ) . 2. 2.+
print '*aso especial" di/erente da lista:'print 8[, ]# 2.!
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 199/359
Processamento numQrico 1
# ados so3re o arranAo
print 'Formato do arranAo:'print 8.shape# (%" %
print 'uantidade de eixos:'print 8.ndim# 2
print ',ipo dos dados:'print 8.dtype# /loat64
*a1da completa$
SrranAo criado a partir de uma lista:)! 2 % 4 6 7 =+SrranAo criado a partir de um inter$alo:) !. !. . . 2. 2. %. %. 4. +SrranAo de s 2x%:)) . . .+
) . . .++SrranAos podem erar no$os arranAos:) . !.& !. !. !.4 !.= . !.& !.7+Hultiplicando cada elemento por um escalar:) !. 2. . 7. !. 2. . 7. 2!. +>omando arranAos elemento por elemento:) . .4 . .6 .6 .7 2. 2.6 %.%+Tedimensionando o arranAo:)) !. !. . + ) . 2. 2.+ ) %. %. 4. ++
SrranAo transposto:)) !. . %. + ) !. 2. %.+ ) . 2. 4. ++-Schata- o arranAo:) !. !. . . 2. 2. %. %. 4. +L acesso aos elementos /unciona como nas listas:) . 2. 2.+*aso especial" di/erente da lista:2.!Formato do arranAo:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 200/359
200 Processamento numQrico
(%" %uantidade de eixos:2
,ipo dos dados:/loat64
Ao contrário da lista# os arranos sempre são homo&>neos# ou sea# todoselementos são do mesmo tipo.
)atri7es
A classe matri implementa operaçDes de matri6es.
Eemplos$
i"port numpy
print '*riando uma matri8 a partir de uma lista:'l = [[%,4,], [6, 7, =], [&, !, ]]R = numpy.matrix(l)print R# ))% 4 +# )6 7 =+# )& ! ++
print ',ransposta da matri8:'print R.,# ))% 6 &+# )4 7 !+# ) = ++
print '?n$ersa da matri8:'print R.?
# ))!.2%%%%%%% !.%%%%%%% !. +# )2.2 .4 !.2 +# ) 2. .2 !. ++
# *riando outra matri8T = numpy.matrix([[%, 2, ]])
print 'Hultiplicando matri8es:'print T * R# ))%! 26 %2++
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 201/359
Processamento numQrico 201
print 'Tesol$endo um sistema linear:'print numpy.linal.sol$e(R, numpy.array([!, , 2]))
# ) !.%%%%%%%% . . +
*a1da$
*riando uma matri8 a partir de uma lista:))% 4 + )6 7 =+ )& ! ++,ransposta da matri8:
))% 6 &+ )4 7 !+ ) = ++?n$ersa da matri8:))!.2%%%%%%% !.%%%%%%% !. + )2.2 .4 !.2 + ) 2. .2 !. ++Hultiplicando matri8es:))%! 26 %2++Tesol$endo um sistema linear:) !.%%%%%%%% . . +
I m"dulo numpy@!ina!g tamb@m implementa unçDes de decomposição dematri6es$
fro" numpy i"port *
# Hatri8 %x%S = array([(&, 4, 2), (, %, ), (2, !, 7)])print 'Hatri8 S:'print S
# ecompondo usando T, T = linal.r(S)
# Tesultadosprint 'Hatri8 :'print print 'Hatri8 T:'print T
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 202/359
202 Processamento numQrico
# Produtoprint ' . T:'print int!(dot(, T))
*a1da$
Hatri8 S:))& 4 2+ ) % + )2 ! 7++Hatri8 :))!.==6%% !.4=4!%% !.4&%&+
)!.4767%2& !.==%!24 !.6%=4+ )!.&!6&22 !.7&672&% !.7%462%4++Hatri8 T:))!.4==!==4= 4.=626&2 %.27==+ ) !. .6%=4&4 .2==!&4%+ ) !. !. %.6=64%64++ . T:))& 4 2+ ) % + )2 ! 7++
I Num!' serve de base para diversos outros proetos de c"di&o aberto# comoo Hatplolib e o *ci!'# ?ue complementam o Nump' de várias ormas.
SciPy
*ci!'50 @ um pacote ?ue epande o Num!' com outras uncionalidadesvoltadas para a área cientiica.
Entre os m"dulos ?ue a6em parte do pacote# temos$▪ linal&$ unçDes de ál&ebra linear.▪ tpac3$ transormada de ourier.▪ inte&rate$ unçDes de inte&ração.▪ interpolate$ unçDes de interpolação.▪ optimi6e$ unçDes de optimi6ação.▪ si&nal$ processamento de sinais.
50 !á&ina oicial em$ http$%%444.scip'.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 203/359
Processamento numQrico 203
▪ special$ unçDes especiais 7Air'# essel# etc8.
Eemplo$
# 5 codin: latin 5
fro" numpy i"port arane, cos, sin
# uas /un;Mes do >ciPy para processamento de sinaisfro" scipy.sinal i"port csplined, csplinedDe$al
# uas /un;Mes do Hatplotli3 para erar um rI/icofro" pyla3 i"port plot, shoC
x! = arane(2!) # oriinaly! = cos(x!) * sin(x! / 2) # a partir de dx = x![]!x![!] # i/eren;a oriinalx = arane(!, 2, !.)
# *oe/icientes para arranAo de dimens<ocA = csplined(y!)
# S$alia o >pline para um no$o conAunto de pontosy = csplinedDe$al(cA, x, dx=dx,x!=x![!])
plot(x, y, '', x!, y!, 'jy') # esenhashoC() # Hostra o rI/ico
*a1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 204/359
20' Processamento numQrico
Al@m do *ci!'# eiste tamb@m o *cientiic!'thon55 # ?ue @ outro pacote ?ueimplementa rotinas para uso cientiico.
)atplotlib
Eistem vários pacotes de terceiros para a &eração de &ráicos dispon1veispara !'thon# sendo ?ue o mais popular deles @ o !'lab % Hatplotlib5:.
I pacote tem dois m"dulos principais$▪ matp!ot!i$$ m"dulo ?ue oerece uma abstração orientada a obetos aos
recursos do pacote.▪ py!a$$ m"dulo ?ue oerece uma coleção de comandos ?ue se assemelha
ao Hatlab# e @ mais ade?uado para o uso interativo.
Eemplo$
fro" pyla3 i"port *
ent = arane(!., 2!., .)
# *alcula os cossenos da entrada
sai = cos(ent)
# Plota a cur$aplot(ent, sai)
# ,exto para o eixo xla3el('entrada')
# ,exto para o eixo yla3el('cosseno')
# ,exto no topo da /iuratitle('*ossenos')
# Sti$a a raderid(,rue)
# Spresenta a /iura resultante na tela
55 ontes e binários dispon1veis em$ http$%%sourcesup.cru.r%proects%scientiic-p'%.5: ontes# binários e documentação podem ser encontrados em$
http$%%matplotlib.sourceor&e.net%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 205/359
Processamento numQrico 20)
shoC()
*a1da$
Iutro eemplo$
fro" pyla3 i"port *
# adosent = arane(!., 7., .)sai = cos(ent)sai2 = sin(ent)di/ = sai2 ! sai
# i$ide a /iura em 2 linhas e coluna"# e seleciona a parte superiorsu3plot(2)
# Plota a cur$a# Primeira cur$a: ent" sai" '3o:'# >eunda cur$a: ent" sai2" 'j'plot(ent, sai, '3o:', ent, sai2, 'j')
# *ria uma leendaleend(['*ossenos', '>enos'])
# >eleciona a parte in/eriorsu3plot(22)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 206/359
20, Processamento numQrico
# esenha 3arras# Eixo : arane(len(di/ K .# Eixo : di/
# Warura das 3arras: .# *or: #cc33aa3ar(arane(len(di/ )) + ., di/ , ., color='#cc33aa')
# >al$a a /iurasa$e/i('ra/.pn')
*a1da$I pacote tem unçDes para &erar &ráicos de barra# linha# dispersão# pi66a epolar# entre outros.
Eemplo usando matp!ot!i$$
# 5 codin: latin 5
i"port os
i"port matplotli3fro" matplotli3./iure i"port Fiurefro" matplotli3.3ac\ends.3ac\endDa i"port Fiure*an$asS
&ef pie(/ilename, la3els, $alues): --- Gera um diarama de Pi88a e sal$a em arui$o. ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 207/359
Processamento numQrico 20-
# Use a 3i3lioteca SntiGrain Geometry matplotli3.use('S')
# *ores personali8adas colors = ['seareen', 'lihtslateray', 'la$ender', '\ha\i', '3urlyCood', 'corn/loCer3lue']
# Sltera as op;Mes padr<o matplotli3.rc('patch', edecolor='#4!67=', lineCidth=, antialiased=,rue) # Sltera as dimensMes da imaem matplotli3.rc('/iure', /isi8e=(=., 7.))
# ?niciali8a a /iura /i = Fiure() /i.clear() axes = /i.addDsu3plot()
if $alues: # iarama chart = axes.pie($alues, colors=colors, autopct='O2.!/OO')
# Weenda pieDleend = axes.leend(la3els)
pieDleend.pad = !.%
# Sltera o tamanho da /onte for i in xrane(len(chart[!])): chart[!][i].setD/ontsi8e(2) pieDleend.texts[!].setD/ontsi8e(!)
else: # Hensaem de erro # eslia o diarama axes.setDaxisDo// ()
# Hostra a mensaem axes.text(!., !., '>em dados', hori8ontalalinment='center', $erticalalinment='center', /ontsi8e=%2, color='#6/7c=c')
# >al$a a /iura can$as = Fiure*an$asS(/i) can$as.printD/iure(/ilename, dpi=6!!)
if DDnameDD == 'DDmainDD':
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 208/359
20. Processamento numQrico
# ,estes pie('/i.pn', [], []) pie('/i2.pn', ['S', 'B', '*', '', 'E'],
[6.7, .6, 4., %.4, 2.%])
*a1da$
Eistem add ons para o Hatplotlib# ?ue epandem a biblioteca com novasuncionalidades# como @ o caso do asemap.
Eemplo com asemap$
fro" mplDtool\its.3asemap i"port Basemapfro" matplotli3 i"port pyplotfro" numpy i"port arane
# *ria um mapa usando Basemapmapa = Basemap(proAection='ro3in', latD!=!2!, lonD!=!!, resolution='l', areaDthresh=e%) # desenha a costa dos continentesmapa.draCcoastlines(color='#7777&&')# esenha as /ronteirasmapa.draCcountries(color='#ccccee')# Pinta os continentesmapa./illcontinents(color='#ddddcc')# esenha os meridianos
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 209/359
Processamento numQrico 20
mapa.draCmeridians(arane(!, %6!, %!), color='#ccccee')# esenha os paralelosmapa.draCparallels(arane(!=!, =!, %!), color='#ccccee')
# esenha os limites do mapamapa.draCmap3oundary()
# >al$a a imaempyplot.sa$e/i('mapa.pn', dpi=!)
*a1da$
Iutro eemplo$
fro" mplDtool\its.3asemap i"port Basemapfro" matplotli3 i"port pyplot
mapa = Basemap(proAection='ortho', latD!=!, lonD!=!!, resolution='l', areaDthresh=e%)# Preenche o mapa com rele$omapa.3luemar3le()mapa.draCmap3oundary()
lxy = (('Tio9nde9naneiro', !4%., !22.4), ('Wondres', !.!7, !.%!))
# ,ranspostalxy = 8ip(*lxy)# *on$erte as coordenadasx, y = mapa(lxy[], lxy[2])lxy = lxy[!], x, y# Harca no mapamapa.plot(x, y, 'Cj')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 210/359
210 Processamento numQrico
# Escre$e os nomesfor l, x, y in 8ip(*lxy):
pyplot.text(x+2e, y!6e, l, color='#eeeecc')
pyplot.sa$e/i('mapa2.pn', dpi=!)
*a1da$
!ara processamento de inormaçDes &eorreerenciadas de orma maissoisticada# eiste o proeto Hap*erver5) # um servidor de aplicação voltadopara =* 7%eographic Information System8 ?ue suporta diversas lin&ua&ens#inclusive !'thon.
Al@m de m"dulos de terceiros# tamb@m @ poss1vel usar a planilha dorIice.or&59 para &erar &ráicos com o !'thon# atrav@s da A! chamada!'thon-UNI rid&e5/.
5) *ite oicial em http$%%mapserver.or&%.59 ispon1vel em$ http$%%444.broice.or&%.
5/ Hais inormaçDes em$ http$%%ud3.openoice.or&%p'thon%p'thon-brid&e.html.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 211/359
Interface %ráfica 211
Interface 5ráfica
As nteraces =ráicas com Usuário 7=U# %raphic 5ser Interface8 sepopulari6aram no ambiente des#top # devido Y acilidade de uso e aprodutividade. Eistem hoe muitas bibliotecas dispon1veis para a construçãode aplicaçDes =U# tais como$ =FPW# OF# FP e 4Jid&ets.
Ar1uitetura
nteraces &ráicas &eralmente utili6am a metáora do des#top # um espaço emduas dimensDes# @ ?ue ocupado por anelas retan&ulares# ?ue representam
aplicativos# propriedades ou documentos.
As anelas podem conter diversos tipos de controles 7obetos utili6ados paraintera&ir com o usuário ou para apresentar inormaçDes8 e containers 7obetos?ue servem de reposit"rio para coleçDes de outros obetos8.
Na maior parte do tempo# a interace &ráica espera por eventos e respondede acordo. Is eventos podem ser resultado da interação do usuário# como
cli?ues e arrastar de mouse ou di&itação# ou ainda de eventos de sistema#
Yanela
Containers Controles
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 212/359
212 Interface %ráfica
como o rel"&io da má?uina. A reação a um evento ?ual?uer @ deinidaatrav@s de unçDes ca!!$ac# 7unçDes ?ue são passadas como ar&umento paraoutras rotinas8.
Controles mais usados$▪ ;"tulo 7!a$e!8$ retGn&ulo ?ue eibe teto.▪ Caia de teto 7tet $o8$ área de edição de teto.▪ otão 7$utton8$ área ?ue pode ser ativada interativamente.▪ otão de rádio 7radio $utton8$ tipo especial de botão# com o ?ual são
ormados &rupos aonde apenas um pode ser apertado de cada ve6.▪ otão de veriicação 7chec# $utton8$ botão ?ue pode ser marcado e
desmarcado.▪ arras de rola&em 7scro!! $ars8$ controles desli6antes hori6ontais ou
verticais# usados para intervalos de valores num@ricos.▪ otão &irat"rio 7spin $utton8$ caia de teto com dois botDes com setas
ao lado ?ue incrementam e decrementam o nKmero na caia.▪ arra de status 7status $ar8$ barra para eibição de mensa&ens#
&eralmente na parte inerior da anela.▪ ma&em 7image8$ área para eibição de ima&ens.
Controles podem ter aceleradores 7teclas de atalho8 associados a eles.
4ontainers mais usados$▪ arra de menu 7menu $ar8$ sistema de menus# &eralmente na parte
superior da anela.▪ io 7 fied8$ os obetos permanecem ios nas mesmas posiçDes.▪ Fabela 7ta$!e8$ coleção de compartimentos para iar os obetos#
distribu1dos em linhas e colunas.
▪ Caia hori6ontal 7hori<onta! $o8$ semelhante Y tabela# por@m apenascom uma linha.▪ Caia vertical 7ertica! $o8$ semelhante Y tabela# por@m apenas com
uma coluna.▪ Caderno 7note$oo#8$ várias áreas ?ue podem ser visuali6adas uma de
cada ve6 ?uando selecionadas atrav@s de abas# &eralmente na partesuperior.
▪ arra de erramentas 7too! $ar8$ área com botDes para acesso rápido aosprincipais recursos do aplicativo.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 213/359
Interface %ráfica 213
!ara lidar com eventos de tempo# as interaces &ráicas implementam umrecurso chamado tempori6ador 7timer8 ?ue evoca a unção ca!!$ac# depois de
um certo tempo pro&ramado.
Py5'?
I =FPW:, 7=H! Fool3it8 @ uma biblioteca Cpen Source escrita em lin&ua&emC. Iri&inalmente concebida para ser usada pelo =H!:( # @ compat1vel com asplataormas mais utili6adas atualmente e rica em recursos# entre eles# umconstrutor de interaces chamado =lade.
nterace do =lade$
I =FPW @ usado pelo =NIHE:2 7ambiente des#top Cpen Source8 e pordiversos aplicativos# como os portes do Ho6illa ireo e do rIice.or& para
:, A pá&ina internet do proeto reside em$ http$%%444.&t3.or&%. e os binários para Jindo4sestão dispon1veis em$ http$%%&lade4in+2.sourceor&e.net%. A versão para desenvolvedoresinstala o =lade.
:( Endereço oicial do proeto$ http$%%444.&imp.or&%.
:2 ocumentação e ontes em$ http$%%444.&nome.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 214/359
21' Interface %ráfica
sistemas UN. I =FPW pode ser usado no !'thon atrav@s do pacote!'=FP:+. Is portes das bibliotecas para Jindo4s podem ser encontradosem$
▪ !'=FP$ http$%%tp.&nome.or&%pub%&nome%binaries%4in+2%p'&t3%▪ !'=Ibect$ http$%%tp.&nome.or&%pub%&nome%binaries%4in+2%p'&obect%▪ !'Cairo$ http$%%tp.&nome.or&%pub%&nome%binaries%4in+2%p'cairo%
Embora sea poss1vel criar interaces inteiramente usando c"di&o# @ maisprodutivo construir a interace em um sot4are apropriado. I =lade &eraar?uivos HL com etensão T.&lade# ?ue podem ser lidos por pro&ramas?ue usam =FPW# automati6ando o processo de criar interaces &ráicas.
;oteiro básico para construir uma interace$
No =lade$▪ Crie uma anela usando al&um dos modelos dispon1veis em TN1veis
*uperiores.▪ Crie containers para arma6enar os controles.▪ Crie os controles.▪ Crie os manipuladores para os sinais necessários.▪ *alve o ar?uivo com a etensão T.&lade.
No !'thon$▪ mporte os pacotes necessários.▪ Use o =FP para interpretar o ar?uivo HL do =lade.▪ Crie rotinas para serem usadas como unçDes ca!!$ac#.▪ Associe as rotinas com os manipuladores correspondes ?ue oram
criados no =lade# atrav@s do m@todo signa!Eautoconnect:;.
▪ Ative o laço para processar eventos com gt#@main:;.
Eemplo 7rel"&io8$
No =lade$▪ Cli?ue em Tanela em TN1veis *uperiores.▪ Nas propriedades da anela$
• Hude TNome para Tmain em T=eral.
:+ A pá&ina na internet do !'=FP @ http$%%444.p'&t3.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 215/359
Interface %ráfica 21)
• Hude T;edimensionável para T*im.• Hude T!osição da anela para TCentrali6ar.• Hude Tis1vel para T*im em TComum.• Hude o manipulador para TonXmainXdestro' do sinal Tdestro'
de T=t3Ibect em T*inais.▪ Cli?ue em TCaia vertical em TContainers# depois cli?ue dentro da
anela e escolha o nKmero de itens i&ual a +.▪ Cli?ue em Tarra de menu em TContainers# depois cli?ue dentro do
espaço va6io superior e delete os itens TEditar e Ter.▪ Cli?ue em Tarra de status em TControle e Eibição e depois cli?ue
dentro do espaço va6io inerior.
▪ Hude o nome da barra de status para TstsXdata em T=eral.▪ Cli?ue em T;"tulo em TControle e Eibição e depois cli?ue dentro
do espaço va6io central.▪ Nas propriedades do r"tulo# mude TNome para TlblXhora e T;"tulo
para va6io em T=eral# T*olicitação de lar&ura para T+,, eT*olicitação de altura para T(5, em TComum.
▪ No Tnspetor 7lista em orma de árvore com todos itens8# delete$• Tima&emenuitem(.• Tima&emenuitem2.• Tima&emenuitem+.• Tima&emenuitem0.• Tseparatormenuitem(.
▪ No Tnspetor$• locali6e Tima&emenuitem5 e mude o manipulador em T*inais do
sinal Tactivate para TonXima&emenuitem5Xactivate deT=t3Henutem.
• locali6e Tima&emenuitem(, e mude o manipulador em T*inais do
sinal Tactivate para TonXima&emenuitem(,Xactivate deT=t3Henutem.▪ *alve o ar?uivo como Trelo&io.&lade.
<anela principal do rel"&io$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 216/359
21, Interface %ráfica
C"di&o em !'thon$
# 5 codin: latin 5---Um relio com G,X.---
i"port datetime
# G,X e outros mdulos associadosi"port t\i"port t\.lade
i"port o3Aecti"port pano
class eloio(o3Aect): --- ?mplementa a Aanela principal do prorama. ---
&ef init (sel/ ): ---
?niciali8a a classe. ---
# *arrea a inter/ace sel/ .tree = t\.lade.HW('reloio.lade', 'main')
# Wia os e$entos call3ac\s = # 'onDmainDdestroy': sel/ .onDmainDdestroy, 'onDimaemenuitemDacti$ate': sel/ .onDmainDdestroy, 'onDimaemenuitem!Dacti$ate': sel/ .onDimaemenuitem!Dacti$ate
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 217/359
Interface %ráfica 21-
$
sel/ .tree.sinalDautoconnect(call3ac\s)
# *oloca um ttulo na Aanela sel/ .tree.etDCidet('main').setDtitle('Telio')
# L rtulo ue re3erI a hora sel/ .hora = sel/ .tree.etDCidet('l3lDhora')
# S 3arra de status ue re3erI a data sel/ .data = sel/ .tree.etDCidet('stsDdata') print dir(sel/ .data)
# Huda a /onte do rtulo sel/ .hora.modi/yD/ont(pano.Fontescription('$erdana 2='))
# Um tempori8ador para manter a hora atuali8ada sel/ .timer = o3Aect.timeoutDadd(!!!, sel/ .onDtimer)
&ef oni"ae"enuite"CBacti3ate(sel/ , Cidet): --- *ria a Aanela de ->o3re-. ---
# *aixa de dialoo dialo = t\.Hessaeialo(parent=sel/ .tree.etDCidet('main'), /las=t\.?SWLGDHLSW J t\.?SWLGDE>,TLD^?,VDPSTE,, type=t\.HE>>SGEDL,VET, 3uttons=t\.BU,,L>DLX, messaeD/ormat='Primeiro exemplo usando G,X.')
dialo.setDtitle('>o3re') dialo.setDposition(t\.^?DPL>D*E,ETDSW^S>)
# Exi3e a caixa dialo.run()
dialo.destroy() return
&ef onti"er(sel/ ): --- Totina para o tempori8ador. ---
# Pea a hora do sistema hora = datetime.datetime.noC().time().iso/ormat().split('.')[!]
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 218/359
21. Interface %ráfica
# Huda o texto do rtulo sel/ .hora.setDtext(hora)
# Pea a data do sistema em /ormato ?>L data = datetime.datetime.noC().date().iso/ormat() data = 'ata: ' + ''. Aoin(data.split('')[::!])
# *oloca a data na 3arra de status sel/ .data.push(!, data)
# ]erdadeiro /a8 com ue o tempori8ador rode de no$o return ,rue
&ef on"ain&estro(sel/ , Cidet):
--- ,ermina o prorama. ---
raise >ystemExit
if DDnameDD == -DDmainDD-:
# ?nicia a GU? reloio = Teloio()
t\.main()
Ar?uivo Trelo&io.&lade$
<xml $ersion@-.!- encodin@-U,F=- standalone@-no->1K;06H2I ladeinter/ace >>,EH -lade2.!.dtd-01Generated Cith lade% %.4.% on >at Hay !% 4:!6:= 2!!= 0ladeinter/ace0 Cidet class@-Gt\^indoC- id@-main-0
property name@-$isi3le-0,rueproperty0 property name@-resi8a3le-0Falseproperty0 property name@-CindoCDposition-0G,XD^?DPL>D*E,ETproperty0 sinal name@-destroy- handler@-onDmainDdestroy- 0 child0 Cidet class@-Gt\]Box- id@-$3ox-0 property name@-$isi3le-0,rueproperty0 child0 Cidet class@-Gt\HenuBar- id@-menu3ar-0 property name@-$isi3le-0,rueproperty0 child0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 219/359
Interface %ráfica 21
Cidet class@-Gt\Henu?tem- id@-menuitem-0 property name@-$isi3le-0,rueproperty0 property name@-la3el- translata3le@-yes-0 DSrui$oproperty0
property name@-useDunderline-0,rueproperty0 child0 Cidet class@-Gt\Henu- id@-menu-0 property name@-$isi3le-0,rueproperty0 child0 Cidet class@-Gt\?maeHenu?tem- id@-imaemenuitem-0 property name@-$isi3le-0,rueproperty0 property name@-la3el- translata3le@-yes-0t\uitproperty0 property name@-useDunderline-0,rueproperty0 property name@-useDstoc\-0,rueproperty0
sinal name@-acti$ate-handler@-onDimaemenuitemDacti$ate- 0 Cidet0 child0 Cidet0 child0 Cidet0 child0 child0 Cidet class@-Gt\Henu?tem- id@-menuitem4-0 property name@-$isi3le-0,rueproperty0
property name@-la3el- translata3le@-yes-0SADudaproperty0 property name@-useDunderline-0,rueproperty0 child0 Cidet class@-Gt\Henu- id@-menu%-0 property name@-$isi3le-0,rueproperty0 child0 Cidet class@-Gt\?maeHenu?tem-id@-imaemenuitem!-0 property name@-$isi3le-0,rueproperty0 property name@-la3el- translata3le@-yes-0t\a3outproperty0
property name@-useDunderline-0,rueproperty0 property name@-useDstoc\-0,rueproperty0 sinal name@-acti$ate-handler@-onDimaemenuitem!Dacti$ate- 0 Cidet0 child0 Cidet0 child0 Cidet0 child0 Cidet0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 220/359
220 Interface %ráfica
pac\in0 property name@-expand-0Falseproperty0 pac\in0
child0 child0 Cidet class@-Gt\Wa3el- id@-l3lDhora-0 property name@-CidthDreuest-0%!!property0 property name@-heihtDreuest-0!property0 property name@-$isi3le-0,rueproperty0 property name@-xpad-0property0 property name@-ypad-0property0 Cidet0 pac\in0 property name@-position-0property0
pac\in0 child0 child0 Cidet class@-Gt\>tatus3ar- id@-stsDdata-0 property name@-$isi3le-0,rueproperty0 property name@-spacin-02property0 Cidet0 pac\in0 property name@-expand-0Falseproperty0 property name@-position-02property0 pac\in0
child0 Cidet0 child0 Cidet0ladeinter/ace0
Eemplo 7rodando pro&ramas8$
No =lade$
▪ Crie uma anela com o nome Tmain com o manipuladorTonXmainXdestro' para o sinal Tdestro'.▪ Crie um container io para receber os controles.▪ Crie uma caia de teto chamada TntrXcmd. Esta caia receberá
comandos para serem eecutados.▪ Crie um botão de veriicação chamado Tch3Xshell# com o teto T<anela
de teto. *e o botão estiver marcado# o comando será eecutado emuma anela de teto.
▪ Crie um botão chamado TbtnXrodar com o manipulador
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 221/359
Interface %ráfica 221
TonXbtnXecharXclic3ed para o sinal Tclic3ed. Ouando clicado# ocomando da caia de teto @ eecutado.
▪ Crie um botão chamado TbtnXechar com o manipulador
TonXbtnXecharXclic3ed para o sinal Tclic3ed. Ouando clicado# opro&rama termina.
<anela principal$
C"di&o em !'thon$
# 5 codin: ut/= 5---Todando proramas com G,X.---
i"port su3process
i"port t\i"port t\.ladei"port o3Aecti"port pano
class Iec(o3Aect): --- anela principal. ---
&ef init (sel/ ): --- ?niciali8a a classe. ---
# *arrea a inter/ace sel/ .tree = t\.lade.HW('cmd.lade', 'main')
# Wia os e$entos
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 222/359
222 Interface %ráfica
call3ac\s = # 'onDmainDdestroy': sel/ .onDmainDdestroy, 'onD3tnD/echarDclic\ed': sel/ .onDmainDdestroy,
'onD3tnDrodarDclic\ed': sel/ .onD3tnDrodarDclic\ed $
sel/ .tree.sinalDautoconnect(call3ac\s)
&ef onbtnro&arclicke&(sel/ , Cidet): --- Toda o comando. ---
ntrDcmd = sel/ .tree.etDCidet('ntrDcmd')
ch\Dshell = sel/ .tree.etDCidet('ch\Dshell')
cmd = ntrDcmd.etDtext() if cmd: # ch\Dshell.state serI se ch\Dshell esti$er marcado if ch\Dshell.state: cmd = 'cmd start cmd c ' + cmd su3process.Popen(ars=cmd)
else: # *aixa de dialoo
dialo = t\.Hessaeialo(parent=sel/ .tree.etDCidet('main'), /las=t\.?SWLGDHLSW J t\.?SWLGDE>,TLD^?,VDPSTE,, type=t\.HE>>SGEDL,VET, 3uttons=t\.BU,,L>DLX, messaeD/ormat='iite um comando.')
dialo.setDtitle('Hensaem') dialo.setDposition(t\.^?DPL>D*E,ETDSW^S>)
# Exi3e a caixa dialo.run()
dialo.destroy()
return ,rue
&ef on"ain&estro(sel/ , Cidet): --- ,ermina o prorama. ---
raise >ystemExit
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 223/359
Interface %ráfica 223
if DDnameDD == -DDmainDD-:
# ?nicia a GU? exe = Exec() t\.main()
I ar?uivo Tcmd.&lade$
<xml $ersion@-.!- encodin@-U,F=- standalone@-no->1K;06H2I ladeinter/ace >>,EH -lade2.!.dtd-01Generated Cith lade% %.4.% on ,ue Hay 27 2%:44:!% 2!!= 0
ladeinter/ace0 Cidet class@-Gt\^indoC- id@-main-0 property name@-CidthDreuest-0%=!property0 property name@-heihtDreuest-0!!property0 property name@-$isi3le-0,rueproperty0 property name@-title- translata3le@-yes-0Entre com umcomando...property0 property name@-resi8a3le-0Falseproperty0 property name@-modal-0,rueproperty0 property name@-CindoCDposition-0G,XD^?DPL>D*E,ETproperty0 sinal name@-destroy- handler@-onDmainDdestroy- 0
child0 Cidet class@-Gt\Fixed- id@-/ixed-0 property name@-CidthDreuest-0%=!property0 property name@-heihtDreuest-0!!property0 property name@-$isi3le-0,rueproperty0 child0 Cidet class@-Gt\Button- id@-3tnDrodar-0 property name@-CidthDreuest-0!!property0 property name@-heihtDreuest-02&property0 property name@-$isi3le-0,rueproperty0 property name@-canD/ocus-0,rueproperty0
property name@-recei$esDde/ault-0,rueproperty0 property name@-la3el- translata3le@-yes-0 DTodarproperty0 property name@-useDunderline-0,rueproperty0 property name@-responseDid-0!property0 sinal name@-clic\ed- handler@-onD3tnDrodarDclic\ed- 0 Cidet0 pac\in0 property name@-x-067property0 property name@-y-06property0 pac\in0 child0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 224/359
22' Interface %ráfica
child0 Cidet class@-Gt\Button- id@-3tnD/echar-0 property name@-CidthDreuest-0!!property0
property name@-heihtDreuest-02&property0 property name@-$isi3le-0,rueproperty0 property name@-canD/ocus-0,rueproperty0 property name@-recei$esDde/ault-0,rueproperty0 property name@-la3el- translata3le@-yes-0 DFecharproperty0 property name@-useDunderline-0,rueproperty0 property name@-responseDid-0!property0 sinal name@-clic\ed- handler@-onD3tnD/echarDclic\ed- 0 Cidet0 pac\in0 property name@-x-0272property0
property name@-y-06property0 pac\in0 child0 child0 Cidet class@-Gt\Entry- id@-ntrDcmd-0 property name@-CidthDreuest-0%6property0 property name@-heihtDreuest-02&property0 property name@-$isi3le-0,rueproperty0 property name@-canD/ocus-0,rueproperty0 Cidet0 pac\in0
property name@-x-0&property0 property name@-y-04property0 pac\in0 child0 child0 Cidet class@-Gt\*hec\Button- id@-ch\Dshell-0 property name@-CidthDreuest-0%6property0 property name@-heihtDreuest-02&property0 property name@-$isi3le-0,rueproperty0 property name@-canD/ocus-0,rueproperty0 property name@-la3el- translata3le@-yes-0 Danela de
textoproperty0 property name@-useDunderline-0,rueproperty0 property name@-responseDid-0!property0 property name@-draCDindicator-0,rueproperty0 Cidet0 pac\in0 property name@-x-0property0 property name@-y-0&property0 pac\in0 child0 Cidet0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 225/359
Interface %ráfica 22)
child0 Cidet0ladeinter/ace0
Al@m do =lade# tamb@m eiste o =aspacho:0 # outro construtor de interaces?ue tamb@m &era ar?uivos HL no padrão do =lade.
@&Python
I pacote 4!'thon:5 @ basicamente um "rapper para o too!#it 7conunto deerramentas e bibliotecas8 4Jid&ets# desenvolvido em CWW. !rincipais
caracter1sticas$▪ Hulti-plataorma.▪ Loo# R fee! 7apar>ncia e comportamento8 nativo# ou sea# coerente com o
ambiente em ?ue está sendo eecutado.▪ =rande coleção de componentes prontos.▪ Comunidade bastante ativa.
I orma &eral de uncionamento @ similar ao =FPW$ o frame"or# controla ainteração com o usuário atrav@s de um laço ?ue detecta eventos e ativa as
rotinas correspondentes.
A maneira mais usual de implementar uma interace &ráica atrav@s do4!'thon consiste em$
▪ mportar o pacote ".▪ Criar uma classe de anela atrav@s de herança. Na iniciali6ação da
classe podem ser deinidos controles e containers ?ue a6em parte da anela e as associaçDes entre os eventos com as unçDes ca!!$ac#
correspondentes# ?ue &eralmente são m@todos da pr"pria classe.▪ Criar um obeto Taplicação usando a classe Dpp do 4!'thon.▪ Criar um obeto a partir da classe de anela.▪ niciar o !oop de tratamento de eventos da aplicação.
Eemplo 7caia de teto8$
:0 ispon1vel em$ http$%%&a6pacho.sicem.bi6%.
:5 ontes# binários e documentação estão dispon1veis em http$%%444.4p'thon.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 226/359
22, Interface %ráfica
# 5 codin: latin 5
# importa CxPythoni"port Cx
class 4ain(Cx.Frame): --- *lasse ue de/ine a Aanela principal do prorama. --- &ef init (sel/ , parent, id, title): --- ?niciali8a a classe. ---
# e/ine a Aanela usando o DDinitDD da classe m<e Cx.Frame. DDinitDD(sel/ , parent, id, title, si8e=(6!!, 4!!))
# *ria uma caixa de texto sel/ .text = Cx.,ext*trl(sel/ , style=Cx.,EDHUW,?W?E)
# Pea o /onte do prorama (decodi/icado para latin /ont = /ile( DD/ileDD, 'r3').read().decode('latin')
# *arrea o /onte do prorama na caixa de texto
sel/ .text.>etWa3el(/ont)
# Hostra a Aanela sel/ .>hoC(,rue)
if DDnameDD == 'DDmainDD':
# *ria um o3Aeto -aplica;<o- do CxPython app = Cx.Spp()
# *ria um o3Aeto -Aanela- a partir da classe /rame = Hain(one, Cx.?DS, 'Fonte')
# ?nicia o loop de tratamento de e$entos app.HainWoop()
<anela do eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 227/359
Interface %ráfica 22-
Eemplo 7tempori6ador8$
# 5 codin: latin 5
i"port Cxi"port time
class 4ain(Cx.Frame):
&ef init (sel/ , parent, id, title): Cx.Frame. DDinitDD(sel/ , parent, id, title, si8e=(!, =!)) cloc\ = time.asctime().split()[%]
# *ria um rtulo de texto sel/ .control = Cx.>tatic,ext(sel/ , la3el=cloc\)
# Huda a /onte sel/ .control.>etFont(Cx.Font(22, Cx.>^?>>, Cx.LTHSW, Cx.BLW))
# *ria um timer ,?HETD? = !! sel/ .timer = Cx.,imer(sel/ , ,?HETD?)
# ?nicia o timer sel/ .timer.>tart(!!!)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 228/359
22. Interface %ráfica
# Sssocia os mQtodos com os e$entos Cx.E],D,?HET(sel/ , ,?HETD?, sel/ .onDtimer) Cx.E],D*WL>E(sel/ , sel/ .onDclose)
sel/ .>hoC(,rue)
&ef onti"er(sel/ , e$ent):
# Stuali8a o relio cloc\ = time.asctime().split()[%] sel/ .control.>etWa3el(cloc\)
&ef onclose(sel/ , e$ent):
# Para o timer
sel/ .timer.>top() sel/ .estroy()
app = Cx.Spp()Hain(one, Cx.?DS, 'Telio')app.HainWoop()
nterace$
Eemplo 7barra de menus8$
# 5 codin: latin 5
i"port Cx
# ?denti/icadores para as op;Mes do menu?DF?WEDLPE = Cx.eC?d()?DF?WED>S]E = Cx.eC?d()?DF?WEDE?, = Cx.eC?d()?DVEWPDSBLU, = Cx.eC?d()
class 4ain(Cx.Frame): &ef init (sel/ , parent, id, title):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 229/359
Interface %ráfica 22
Cx.Frame. DDinitDD(sel/ , parent, id, title) # *ria o menu arui$o /ilemenu = Cx.Henu()
# *ria as op;Mes /ilemenu.Sppend(?DF?WEDLPE, 'S3rir arui$o...') /ilemenu.Sppend(?DF?WED>S]E, '>al$ar') /ilemenu.Sppend>eparator() /ilemenu.Sppend(?DF?WEDE?,, '>air')
# *ria o menu aAuda helpmenu = Cx.Henu() helpmenu.Sppend(?DVEWPDSBLU,, '>o3re...')
# *ria o menu menu3ar = Cx.HenuBar() menu3ar.Sppend(/ilemenu, 'Srui$o') menu3ar.Sppend(helpmenu, 'SAuda') sel/ .>etHenuBar(menu3ar)
# Sssocia mQtodos aos e$entos de menu Cx.E],DHEU(sel/ , ?DF?WEDLPE, sel/ .onDopen) Cx.E],DHEU(sel/ , ?DF?WED>S]E, sel/ .onDsa$e) Cx.E],DHEU(sel/ , ?DF?WEDE?,, sel/ .onDexit) Cx.E],DHEU(sel/ , ?DVEWPDSBLU,, sel/ .a3out)
# *ria uma caixa de texto sel/ .control = Cx.,ext*trl(sel/ , , style=Cx.,EDHUW,?W?E) sel/ ./n = ''
&ef onopen(sel/ , e$t):
# S3re uma caixa de dialoo escolher arui$o dialo = Cx.Fileialo(one, style=Cx.LPE) d = dialo.>hoCHodal()
if d == Cx.?DLX:
# Pea o arui$o escolhido sel/ ./n = dialo.GetPath()
# Huda o ttulo da Aanela sel/ .>et,itle(sel/ ./n)
# *arrea o texto na caixa de texto sel/ .control.>etWa3el(/ile(sel/ ./n, 'r3').read())
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 230/359
230 Interface %ráfica
dialo.estroy()
&ef onsa3e(sel/ , e$t):
# >al$a o texto na caixa de texto if sel/ ./n: /ile(sel/ ./n, 'C3').Crite(sel/ .control.GetWa3el())
&ef oneit(sel/ , e$t): # Fecha a Aanela principal sel/ .*lose(,rue)
&ef about(sel/ , e$t): dl = Cx.Hessaeialo(sel/ ,
'Exemplo CxPython', '>o3re...', Cx.LX J Cx.?*LD?FLTHS,?L) dl.>hoCHodal() dl.estroy()
app = Cx.Spp()/rame = Hain(one , Cx.?DS, '?sto Q uase um editor...')/rame.>hoC(,rue)app.HainWoop()
<anela principal$
Eemplo 7caia de mensa&em8$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 231/359
Interface %ráfica 231
i"port Cx
class 4ain(Cx.Frame):
&ef init (sel/ , parent, id, title):
# *ria Aanela Cx.Frame. DDinitDD(sel/ , parent, id, title, si8e=(%!!, !)) sel/ .*entre() sel/ .>hoC(,rue)
# *ria um texto estItico
sel/ .text = Cx.>tatic,ext(sel/ , la3el='Entre com uma express<o:', pos=(!, !))
# *ria uma caixa de edi;<o de texto sel/ .edit = Cx.,ext*trl(sel/ , si8e=(2!, !), pos=(!, %!))
# *ria um 3ot<o sel/ .3utton = Cx.Button(sel/ , la3el='o\', pos=(!, 6!))
# *onecta um mQtodo ao 3ot<o sel/ .3utton.Bind(Cx.E],DBU,,L, sel/ .onD3utton)
&ef onbutton(sel/ , e$ent):
# Pea o $alor da caixa de texto txt = sel/ .edit.Get]alue()
# ,enta resol$er e apresentar a express<o tr: Cx.HessaeBox(txt + ' @ ' + str(e$al(txt)), 'Tesultado')
# >e alo inesperado ocorrer
ecept: Cx.HessaeBox('Express<o in$Ilida', 'Erro')
app = Cx.Spp()Hain(one, !, ',este de HessaeBox')app.HainWoop()
<anela principal e caia de mensa&em$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 232/359
232 Interface %ráfica
I 4!'thon oerece uma variedade enorme de controles prontos# ?ue ser nopro&rama de demonstração ?ue @ distribu1do unto com a documentação e oseemplos.
Py<t
Ot:: @ um too!#it desenvolvido em CWW e @ utili6ado por diversos pro&ramas#incluindo o ambiente de des#top &ráico PE e seus aplicativos. Embora o Otsea mais usado para a criação de aplicativos =U# ele tamb@m inclui
bibliotecas com outras uncionalidades# como acesso a banco de dados#comunicação de rede e controle de threads # entre outras. !'Ot:) @ um $inding?ue permite o uso do Ot no !'thon# dispon1vel sob a licença =!L.
A Ot na versão 0 possui dois m"dulos principais# chamados Ot%ui # ?uedeine as rotinas de interace# e Ot4ore # ?ue deine estruturas essenciais para ouncionamento do too!#it # como# por eemplo# os sinais 7eventos8.
Eemplo$
# 5 codin: ut/= 5
i"port sysfro" Pyt4 i"port tGui, t*ore
class 4ain(tGui.^idet): --- anela principal ---
:: *ite oicial$ http$%%?t.no3ia.com%.
:) *ite oicial$ http$%%444.riverban3computin&.co.u3%sot4are%p'?t%intro.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 233/359
Interface %ráfica 233
&ef init (sel/ , parent=one):
tGui.^idet. DDinitDD(sel/ , parent)
# Huda a eometria da Aanela sel/ .setGeometry(2!!, 2!!, 2!!, !!)
# Huda o ttulo sel/ .set^indoC,itle(',este')
# *ria um 3ot<o uit = tGui.PushButton('Fechar', sel/ ) uit.setGeometry(!, !, 6!, %)
# *onecta o sinal erado pelo 3ot<o com a /un;<o # ue encerra o prorama sel/ .connect(uit, t*ore.>?GSW('clic\ed('), tGui.Spp, t*ore.>WL,('uit('))
# *ria um o3Aeto -aplica;<o t-" ue trata os e$entosapp = tGui.Spplication(sys.ar$)
# *ria a Aanela principal
3 = Hain()3.shoC()
# ?nicia a -aplica;<o t-sys.exit(app.execD())
<anela principal$
Um dos maiores atrativos do !'Ot @ o =U 8ui!der 7erramenta para aconstrução de interaces8 Ot esi&ner. Is ar?uivos HL &erados pelo Otesi&ner 7com a etensão .ui8 podem ser convertidos em m"dulos !'thon
atrav@s do utilitário p'uic.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 234/359
23' Interface %ráfica
!ara &erar o m"dulo !'thon a partir do ar?uivo criado no Ot esi&ner$
pyuic dialo.ui o dialo.py
No ?ual Tdialo&.ui @ o ar?uivo de interace e Tdialo&.p' @ o m"dulo.
Eemplo de ar?uivo &erado pelo Ot esi&ner 7dialo&.ui8$
ui $ersion@-4.!- 0
class0ialoclass0 Cidet class@-ialo- name@-ialo- 0 property name@-eometry- 0 rect0 x0!x0 y0!y0 Cidth06Cidth0 heiht0!=heiht0 rect0 property0 property name@-CindoC,itle- 0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 235/359
Interface %ráfica 23)
strin0ialostrin0 property0 Cidet class@-PushButton- name@-ms- 0
property name@-eometry- 0 rect0 x02!x0 y02!y0 Cidth07Cidth0 heiht02%heiht0 rect0 property0 property name@-text- 0 strin0Hensaemstrin0 property0
Cidet0 Cidet class@-PushButton- name@-/im- 0 property name@-eometry- 0 rect0 x02!x0 y06!y0 Cidth07Cidth0 heiht02%heiht0 rect0 property0 property name@-text- 0
strin0Fecharstrin0 property0 Cidet0 Cidet0 resources0 connections0 connection0 sender0/imsender0 sinal0clic\ed(sinal0 recei$er0ialorecei$er0 slot0close(slot0
hints0 hint type@-sourcela3el- 0 x07x0 y07y0 hint0 hint type@-destinationla3el- 0 x07x0 y0%y0 hint0 hints0 connection0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 236/359
23, Interface %ráfica
connections0ui0
I ar?uivo de interace deine uma anela# da classe O*ia!og # chamadaTialo&# com dois botDes# da classe OPush8utton # chamados Tms& e Tim.
Eemplo usando o m"dulo criado pelo Ot esi&ner$
# 5 codin: ut/= 5
i"port sys
i"port timefro" Pyt4 i"port t*ore, tGui
# Hdulo erado pelo pyuicfro" dialo i"port UiDialo
class 4ain(tGui.Hain^indoC): --- anela principal ---
&ef init (sel/ , parent=one): --- ?niciali8a;<o da Aanela --- tGui.^idet. DDinitDD(sel/ , parent)
# *ria um o3Aeto a partir da inter/ace erada pelo pyuic sel/ .ui = UiDialo() sel/ .ui.setupUi(sel/ )
# *onecta o mQtodo ao 3ot<o ue /oi de/inido atra$Qs do t esiner
sel/ .connect(sel/ .ui.ms, t*ore.>?GSW('clic\ed('), sel/ .shoCDms)
&ef show"s(sel/ ): --- HQtodo ue e$oca a caixa de mensaem --- reply = tGui.HessaeBox.uestion(sel/ , 'Hessaem', 'Vora: ' + time.asctime().split()[%], tGui.HessaeBox.L\)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 237/359
Interface %ráfica 23-
if DDnameDD == -DDmainDD-:
app = tGui.Spplication(sys.ar$) myapp = Hain() myapp.shoC() sys.exit(app.execD())
<anela principal e caia de mensa&em$
Famb@m está dispon1vel um $inding L=!L similar ao !'Ot# chamado!'*ide:9.
Iutras uncionalidades associadas a interace &ráica podem ser obtidas
usando outros m"dulos# como o p'*'stra':/ # ?ue implementa auncionalidade ?ue permite ?ue o aplicativo use a bandea de sistema noJindo4s.
:9 *ite oicial$ http$%%444.p'side.or&%.
:/ Endereço na internet$ http$%%datavibe.net%essiene%p's'stra'%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 238/359
23. 4omputação %ráfica
Computação 5ráfica
A Computação =ráica 7C=8 @ a área da Ci>ncia da Computação ?ue estuda a&eração# representação e manipulação de conteKdo visual em sistemascomputacionais e tem aplicação em várias áreas do conhecimento humano.
*imulaçDes# por eemplo# são sistemas ?ue empre&am cálculos matemáticospara imitar um ou mais aspectos de um enmeno ou processo ?ue eiste nomundo real. *imulaçDes permitem entender melhor como o eperimento realunciona e veriicar cenários alternativos com outras condiçDes.
No caso dos o&os# ?ue na verdade são uma orma de simulação interativa?ue a6 uso de recursos visuais para aumentar a sensação de realismo#conhecida como imersão# e com isso# enri?uecer a eperi>ncia do o&ador.
Iutra aplicação @ a visuali6ação# como di6ia um anti&o ditado popular$ umaima&em vale por mil palavas# e isso @ mais verdadeiro ainda ?uando @necessário interpretar &randes ?uantidades de dados# como acontece emdiversas atividades cientiicas# m@dicas e de en&enharia.
reas como &eo&raia# carto&raia e &eolo&ia demandam por =* 7%eographicInformation Systems % *istemas de normaçDes =eo&ráicas8# ?ue representamtopolo&ias e dados associados# tais como altura# umidade e outros.
A en&enharia e atividades ains usam erramentas CA :4omputer Dided*esign % !roeto Assistido por Computador8 para acilitar a criação dedesenhos t@cnicos para componentes ou peças de ma?uinaria.
Al@m disso# várias ormas de arte se beneiciam da C=# como o cinema#principalmente para a criação de eeitos especiais. A C= tamb@m permitiu osur&imento novas ormas de arte# ?ue usam um ambiente di&ital como m1dia#como por eemplo a animação em tr>s dimensDes 7+8.
)atri7es versus vetores
S muito comum representar uma inormação visual em orma bidimensional728# sea em otos# &ráicos impressos ou em uma tela de LC. Eistem duas
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 239/359
4omputação %ráfica 23
ormas para a representação de ima&ens bidimensionais amplamenteutili6adas# cada ?ual com suas vanta&ens e desvanta&ens.
A primeira @ matricial# tamb@m conhecida como mapa de $its 7$itmap8 ouraster # na ?ual a ima&em @ representada como uma matri6 bidimensional depontos com inormaçDes sobre cor# chamados de elementos de ima&em7 picture e!ement # &eralmente abreviado como pie!8. Esta orma re?ueral&oritmos soisticados para ser manipulada e arma6enada# devido aovolume de dados# e a compleidade das operaçDes# como interpolar valoresdurante um redimensionamento# por eemplo.
A se&unda orma de representação são as ima&ens vetoriais# ?ue são descritasatrav@s de entidades matemáticas ?ue compDem a &eometria da ima&em7linhas# pol1&onos# teto e outros8. Esta orma @ menos ei&ente em termos derecursos computacionais e não apresenta problemas associados aredimensionamento# por@m não permite muitas operaçDes ?ue o mapa de bitsviabili6a.
Entre outras ormas de representação# @ interessante destacar os ractais# em
?ue as ima&ens são &eradas atrav@s de al&oritmos ?ue são aplicados de orma
(2;3D 264D 2;3)
8 imagem écomposta por pixels
com uma corassociada.
Teralmente as coress,o representadas
em JT% ("ed D #reen e Blue).
(2;3D 264D 264)
(2;3D 264D 3;5)
(62D 2;3D 264)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 240/359
2'0 4omputação %ráfica
recursiva.
Estas ormas de representação levaram ao sur&imento de vários ormatos de
ar?uivo para arma6enamento de ima&ens# inclusive abertos# como o !N=7Porta$!e =et"or# %raphics8# ?ue suporta ima&ens raster # com transpar>nciainclusive# e o *= 7Sca!a$!e Vectoria! %raphics8# para ima&ens vetoriais# mapasde bits e at@ animaçDes. Ambos são homolo&ados pelo J+C 7(or!d (ide (e$4onsortium8.
Eistem hoe várias bibliotecas voltadas para C= dispon1veis para !'thon#?ue estão em estado avançado de maturidade.
apa de bits @etorial
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 241/359
Processamento de imagem 2'1
Processamento de imagem
Python Imaging Li$rary),
7!L8 @ uma biblioteca de processamento de ima&ensmatriciais para !'thon.
!L possui m"dulos ?ue implementam$▪ erramentas para cortar# redimensionar e mesclar ima&ens.▪ Al&oritmos de conversão# ?ue suportam diversos ormatos.▪ iltros# tais como suavi6ar# borrar e detectar bordas.▪ Austes# incluindo brilho e contraste.▪ IperaçDes com paletas de cores.▪ esenhos simples em 2.▪ ;otinas para tratamento de ima&ens$ e?uali6ação# auto-contraste#
deormar# inverter e outras.
Eemplo de tratamento de ima&em$
# 5 codin: latin 5---*ria miniaturas sua$i8adas para cadaPEG na pasta corrente---
i"port lo3
# Hdulo principal do P?Wi"port ?mae
# Hdulo de /iltrosi"port ?maeFilter
# Para cada arui$o PEGfor /n in lo3.lo3(-5.Ap-):
# Tetorna o nome do arui$o sem extens<o / = lo3.os.path.splitext(/n)[!]
print 'Processando:', /n imaem = ?mae.open(/n)
), ocumentação# ontes e binários dispon1veis em$
http$%%444.p'thon4are.com%products%pil%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 242/359
2'2 Processamento de imagem
# *ria thum3nail (miniatura da imaem # de tamanho 26x26 usando antialiasin
imaem.thum3nail((26, 26), ?mae.S,?SW?S>)
# Filtro sua$i8a a imaem imaem = imaem./ilter(?maeFilter.>HLL,V)
# >al$a como arui$o PG imaem.sa$e(/ + '.pn', 'PG')
Eemplo de desenho$
# 5 codin: latin 5---*ria uma imaem com $Irios radientes de cores---
i"port ?mae
# Hdulo de desenhoi"port ?maeraC
# Warura e altural, a = 2, 2
# *ria uma imaem no$a com /undo 3rancoimaem = ?mae.neC('TGBS', (l, a), 'Chite')
# L o3Aeto desenho ae so3re o o3Aeto imaemdesenho = ?maeraC.raC(imaem)
# *alcula a larura da /aixa de cor/aixa = l / 26
# esenha um radiente de corfor i in xrane(!, l):
# *alcula a cor da linha r3 = (!.2 * i / /aixa, !. * i / /aixa, i / /aixa) cor = '#O!2xO!2xO!2x' % r3
# esenha uma linha colorida # Primeiro arumento Q uma tupla com # as coordenadas de inicio e /im da linha
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 243/359
Processamento de imagem 2'3
desenho.line((!, i, l, i), /ill=cor)
# *opia e cola recortes in$ertidos do radientefor i in xrane(l, l / 2, !l / !):
# ,amanho do recorte area = (l ! i, a ! i, i, i)
# *opia e in$erte /lip = ?mae.FW?PD,LPDBL,,LH recorte = imaem.crop(area).transpose(/lip)
# *ola de $olta na imaem oriinal imaem.paste(recorte, area)
# >al$a como arui$o PGimaem.sa$e('desenho.pn', 'PG')
Ar?uivo de sa1da Tdesenho.pn&$
S poss1vel calcular os dados da ima&em com o Num!' e usar o !L para
&erar a ima&em real.
Eemplo com modulação de amplitude de onda$
# 5 codin: latin 5---*riando uma imaem usando umPy---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 244/359
2'' Processamento de imagem
i"port numpyi"port ?mae
&ef coor&s(xy, tam): --- coords(xy" tam @0 x" y ,rans/orma as coordenadas normali8adas para o centro da imaem de tamanho -tam- --- , = tam
x = int((. + xy[!]) * ( ! .) / 2.) y = int((. + xy[]) * ( ! .) / 2.) return x, y
if DDnameDD == 'DDmainDD':
# imensMes tam = &!!, 6!!
# *ria um arranAo apenas com 8eros # com as dimensMes transpostas # -tam)::+- Q o re$erso de -tam- e
# -(%"- Q uma tupla para representar -(T" G" B- ima = numpy.8eros(tam[::!] + (%,), numpy.uint=)
# Preenche de 3ranco ima./ill(2)
# ados do eixo xs = numpy.arane(!., ., !.!!!!)
# Lnda moduladora # ]alor mQdio" amplitude e /re`Jncia $med = !.6 amp = !.4
/m = 2. mod = $med + amp * numpy.cos(/m * numpy.pi * xs)
# FreuJncia da portadora /c = =. # Nmero de cur$as internas ci = %2. # *ontador i = !
# Gera um conAunto de cur$as
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 245/359
Processamento de imagem 2')
for deltaDy in numpy.arane(. / ci, . + . / ci, . / ci):
# ados do eixo ys = mod * deltaDy * numpy.sin(/c * numpy.pi * xs)
# Pares x" y xys = 8ip(xs, ys)
# esenha a portadora e as cur$as internas # Para cada ponto na lista for xy in xys:
# *oordenadas in$ertidas
x, y = coords(xy, tam)[::!]
# Splica cor a xy ima[x, y] = (2! ! !! * deltaDy, ! ! !! * deltaDy, ! + !! * deltaDy) i +=
for x, y in 8ip(xs, mod): # esenha as en$oltrias ima[coords((x, y), tam)[::!]] = (!, !, !)
ima[coords((x, !y), tam)[::!]] = (!, !, !)
# Bordas superior e in/erior ima[coords((x, .), tam)[::!]] = (!, !, !) ima[coords((x, !.), tam)[::!]] = (!, !, !) i += 4
for y in xs:
# Bordas laterais ima[coords((., y), tam)[::!]] = (!, !, !)
ima[coords((!., y), tam)[::!]] = (!, !, !) i += 2
print i, 'pontos calculados'
# *ria a imaem a partir do arranAo imaem = ?mae./romarray(ima, 'TGB') imaem.sa$e('cur$as.pn', 'PG')
Ar?uivo de sa1da Tcurvas.pn&$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 246/359
2', Processamento de imagem
IbservaçDes$▪ A biblioteca trabalha com o conceito de bandas# ?ue são camadas ?ue
compDem a ima&em. Cada ima&em pode ter várias bandas# mas todasdevem ter as mesmas dimensDes e proundidade.
▪ A ori&em do sistema de coordenadas @ no canto superior es?uerdo.
Al@m do !L# tamb@m poss1vel usar o ma&eHa&ic3)( com !'thon. Com umaproposta dierente# ma&eHa&ic3 @ um conunto de utilitários para processarima&ens raster # eito basicamente para uso atrav@s de linha de comando ou
atrav@s de lin&ua&ens de pro&ramação.
)( *ite oicial$ http$%%444.ima&ema&ic3.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 247/359
SV% 2'-
S#5
*=)2
7Sca!a$!e Vector %raphics8 @ um ormato aberto# baseado no HL# ?uedescreve ima&ens vetoriais# na orma de estruturas compostas por instruçDesde alto n1vel ?ue representam primitivas &eom@tricas. I ormato oi propostopelo J+C 7(or!d (ide (e$ 4onsortium8# a entidade ?ue deine os padrDesvi&entes na nternet# como o BFHL e o pr"prio HL.
Ar?uivos *= podem arma6enar vários tipos de inormaçDes vetoriais#incluindo pol1&onos básicos# ?ue são representados por linhas ?ue delimitam
uma área echada# tais como retGn&ulos# elipses e outras ormas simples.Al@m disso# ele tamb@m suporta caminhos 7 paths8# ?ue são i&uras# compreenchimento ou não# compostas por linhas e%ou curvas deinidas porpontos# ?ue são codiicados atrav@s de comandos de um caractere 7TLsi&niica TLine Fo# por eemplo8 e um par de coordenadas e M# o ?ue &eraum c"di&o muito compacto.
Feto unicode pode ser inclu1do em um ar?uivo *=# com eeitos visuais# e a
)2 !á&ina oicial$ http$%%444.4+.or&%=raphics%*=%.
'magem gerada a partirdas instru*es que
descre$em os o"Letos.
8rqui$o @Toriginal.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 248/359
2'. SV%
especiicação inclui tratamento de teto bidirecional# vertical e se&uindocaminhos curvos. I teto pode ser ormatadas com ontes de teto eternas#mas para ameni6ar o problema do teto não ser apresentado corretamente em
sistemas dierentes# eiste uma onte interna# ?ue está sempre dispon1vel.
As i&uras &eom@tricas# caminhos e teto podem ser usados como contornos#internos ou eternos# ?ue pode usar tr>s tipos de preenchimento$
▪ Cores s"lidas# ?ue podem ser opacas ou com transpar>ncia.▪ =radientes# ?ue podem ser lineares ou radiais.▪ !adrDes# ?ue são ima&ens $itmap ou vetoriais ?ue se repetem ao lon&o
do obeto.
Fantos os &radientes ?uantos os padrDes podem ser animados.
I *= tamb@m permite ?ue o autor inclua metadados com inormaçDes arespeito da ima&em# tais como t1tulo# descrição e outros# com o obetivo deacilitar a catalo&ação# indeação e recuperação dos ar?uivos.
Fodos os componentes de um ar?uivo *= pode ser lidos e alterados usandoscripts da mesma orma ?ue o BFHL# tendo como padrão a lin&ua&em
/4DScript. A especiicação tamb@m prev> tratamento de eventos de mousee teclado# o ?ue# unto com hyper!in#s # permite adicionar interatividade aos&ráicos.
I ormato tamb@m suporta animação atrav@s do /4DScript # ?ue podetransormar os elementos da ima&em e tempori6ar o movimento. ssotamb@m poder ser eito atrav@s de recursos pr"prios do *=# usando tags.
!ara o *=# iltros são conuntos de operaçDes &ráicas ?ue são aplicadas aum determinado &ráico vetorial# para produ6ir uma ima&em matricial com oresultado. Fais operaçDes &ráicas são chamadas primitivas de iltro# ?ue&eralmente reali6am uma orma de processamento de ima&em# como# poreemplo# o eeito %aussian 8!ur # e por isso# &eram um $itmap comtranspar>ncia 7padrão ;=A8 como sa1da# ?ue @ re&erado se necessário. Iresultado de uma primitiva pode ser usado como entrada para outraprimitiva# permitindo a concatenação de várias para &erar o eeito deseado.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 249/359
SV% 2'
S#5*ig
Is ar?uivos *= podem manipulados atrav@s de bibliotecas HL# como o
ElementFree# mas @ mais produtivo usar componentes ?ue á proetados comessa inalidade. I *=i& @ um m"dulo para *= com muitos recursosprontos. I m"dulo permite tanto usar as primitivas de desenho do *=diretamente# como tamb@m rotinas pr"prias de alto n1vel.
Eemplo 7usando primitivas do *=8$
# 5 codin: latin 5
# ?mporta >]GFifro" s$/i i"port *
cores = ['#dddddd', '#%!6!&!', '#6!&!%!', '#&!6!%!']
# Um retYnulo usando >]G# x" y 0 posi;<o do canto superior esuerdo# Cidth" heiht 0 tamanho# /ill 0 cor do preenchimento# opacity 0 opacidade (.! @ !!O# stro\eDCidth 0 larura da linha (em pontos
= >]G('rect', x=!, y=!, Cidth=!!, heiht=!!, /ill=cores[!], opacity='.!', stro\eDCidth='!.2pt')
# Primeiro crculo# cx" cy 0 posi;<o do centro# r 0 raioc = >]G('circle', cx=%, cy=6, r=%!, /ill=cores[], opacity='!.', stro\eDCidth='!.2pt')
# >eundo crculoc2 = >]G('circle', cx=6, cy=6, r=%!,
/ill=cores[2], opacity='!.', stro\eDCidth='!.2pt')
# ,erceiro crculoc% = >]G('circle', cx=!, cy=%, r=%!, /ill=cores[%], opacity='!.', stro\eDCidth='!.2pt')
# *riando um rupo com as /iuras = >]G('', , c, c2, c%)
# >al$ando.sa$e(-tmp.s$-)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 250/359
2)0 SV%
*a1da 7ar?uivo *=8$
<xml $ersion@-.!- standalone@-no->1K;06H2I s$ PUBW?* -^%*, >]G .E--http:CCC.C%.orGraphics>]G.,s$.dtd-0
s$ style@-stro\elineAoin:round stro\e:3lac\ stro\eCidth:!.pt textanchor:middle /ill:none- xmlns@-http:CCC.C%.or2!!!s$- /ont/amily@-Vel$etica" Srial" Free>ans" >ans" sans" sansseri/- heiht@-4!!px-Cidth@-4!!px- [email protected] xmlns:xlin\@-http:CCC.C%.or&&&xlin\-$ieCBox@-! ! !! !!-0
0
rect opacity@-.!- heiht@-!!- Cidth@-!!- y@-!- x@-!- stro\eCidth@-!.2pt- /ill@-#dddddd- 0
circle opacity@-!.- stro\eCidth@-!.2pt- cy@-6- cx@-%- r@-%!-/ill@-#%!6!&!- 0
circle opacity@-!.- stro\eCidth@-!.2pt- cy@-6- cx@-6- r@-%!-/ill@-#6!&!%!- 0
circle opacity@-!.- stro\eCidth@-!.2pt- cy@-%- cx@-!- r@-%!-/ill@-#&!6!%!- 0
0
s$0
*a1da 7&ráico8$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 251/359
SV% 2)1
Eemplo 7com rotinas do *=i&8$
# 5 codin: latin 5
fro" math i"port sin, cos, pifro" s$/i i"port *
# *ria uma cur$a para t @ seno(2t 2 K cosseno(%t# de 2Pi a 2 Pi" da cor #cc33aacur$a = *ur$e('t" !. 5 sin(25t K cos(%5t', !2*pi, 2*pi, stro\e='#cc33aa')
# Gera um rI/ico com eixos# (2Pi a 2Pi e (2 a 2 com a cur$a
ra/ico = Plot(!2*pi, 2*pi, !2, 2, cur$a)
# *ria um o3Aeto >]Gs$ = ra/ico.>]G()
# >al$a em um arui$os$.sa$e(-tmp.s$-)
*a1da 7&ráico8$
I *=i& tem várias primitivas de desenho implementadas na orma deunçDes# incluindo caminhos 7Path:;8# linhas 7Line:;8 e teto 7+et:;8.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 252/359
2)2 Imagens em trKs dimens>es
Imagens em tr2s dimens$es
Is ormatos matricial e vetorial representam ima&ens bidimensionais nocomputador de orma ade?uada para a maior parte das aplicaçDes. !or@m#elas são limitadas em vários aspectos# principalmente para simulaçDes# poismundo ?ue vivemos tem tr>s dimensDes 7+8.
Uma cena + @ composta por obetos# ?ue representam s"lidos# ontes de lu6e cGmeras. Is obetos s"lidos &eralmente são representados por malhas7meshes8# ?ue são conunto de pontos 7v@rtices8. Estes possuem coordenadas #' e 6. Is pontos são interli&ados por linhas 7arestas8 ?ue ormam as
super1cies 7aces8 dos obetos. Conuntos de linhas ?ue representam asmalhas são chamados de estruturas de arame 7"ireframes8.
Ibetos podem usar um ou mais materiais e estes podem ter váriascaracter1sticas# tais como cor# transpar>ncia e sombreamento# ?ue @ a ormacomo o material responde a iluminação da cena. Al@m disso# o material podeter uma ou mais teturas associadas.
O"Letos
CNmera/onte de lu:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 253/359
Imagens em trKs dimens>es 2)3
Feturas são compostas por ima&ens de duas dimensDes ?ue podem serusadas nos materiais aplicados as super1cies dos obetos# alterando váriaspropriedades# tais como releão# transpar>ncia e enru&amento 7$ump8 da
super1cie.
Em uma cena +# os obetos podem modiicados atrav@s de transormaçDes#tais como translação 7mover de uma posição para outra8# rotação 7&irar emtorno de um eio8 e redimensionamento 7mudar de tamanho em uma ou maisdimensDes8.
!ara renderi6ar# ou sea# &erar a ima&em inal# @ necessário a6er uma s@rie decálculos compleos para aplicar iluminação e perspectiva aos obetos da cena.Entre os al&oritmos usados para renderi6ação# um dos mais conhecidos @ ochamado raytrace # no ?ual os raios de lu6 são calculados da cGmera at@ asontes de lu6. Com isso# são evitados cálculos desnecessários dos raios ?uenão che&am at@ a cGmera.
Um dos usos mais populares da tecnolo&ia + @ em animaçDes. A t@cnicamais comum de animação em + @ chamada de #eyframe. Nela# o obeto a seranimado @ posicionado em locais dierentes em momentos chave daanimação# e o sot4are se encarre&a de calcular os ?uadros intermediários.
Huitos aplicativos + utili6am bibliotecas ?ue implementam a especiicaçãoIpen=L 7Cpen %raphics Li$rary8# ?ue deine uma A! independente de
plataorma e de lin&ua&em# para a manipulação de &ráicos +# permitindo a
+strutura de arame ólido 'magem final
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 254/359
2)' Imagens em trKs dimens>es
renderi6ação em tempo real acelerada por hard"are. *ua caracter1stica maismarcante @ a perormance. Hesa +)+ @ a implementação livre mais conhecidae está amplamente dispon1vel em distribuiçDes de Linu e *.
#Python
!'thon)0 @ um pacote ?ue permite criar e animar modelos simples em tr>sdimensDes. *eu obetivo @ acilitar a criação rápida de simulaçDes e prot"tipos?ue não re?uerem soluçDes compleas.
I !'thon prov> iluminação# controle de cGmera e tratamento de eventos demouse 7rotação e <oom8 automaticamente. Is obetos podem ser criados
interativamente no interpretador# ?ue a anela + do !'thon @ atuali6ada deacordo.
Eemplo$
# 5 codin: latin 5---Vexaedro---
# ]Pythoni"port $isual
# *oordenadas para os $Qrtices e arestascoords = (!%, %)
# *or do $Qrticecor = (!.&, !.&, .!)
# *or da aresta
cor2 = (!., !., !.6)
# esenha es/eras nos $Qrticesfor x in coords: for y in coords: for 8 in coords: # pos Q a posi;<o do centro da es/era $isual.sphere(pos=(x, y, 8), color=cor)
)+ !á&ina oicial$ http$%%444.mesa+d.or&%.
)0 ocumentação# ontes e binários para instalação em$ http$%%444.vp'thon.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 255/359
Imagens em trKs dimens>es 2))
# esenha os cilindros das arestasfor x in coords:
for 8 in coords: # pos Q a posi;<o do centro da 3ase do cilindro # radius Q o raio da 3ase do cilindro # axis Q o eixo do cilindro $isual.cylinder(pos=(x, %, 8), color=cor2, radius=!.2, axis=(!, !6, !))
for y in coords: $isual.cylinder(pos=(x, y, %), color=cor2, radius=!.2, axis=(!, !, !6))
for y in coords: for 8 in coords: $isual.cylinder(pos=(%, y, 8), color=cor2, radius=!.2, axis=(!6, !, !))
<anela +$
Is obetos + do !'thon podem ser a&rupados em ?uadros 7 frames8# ?uepodem ser movidos e rotacionados.
S poss1vel animar os obetos + usando laços. !ara controlar a velocidade daanimação# o !'thon prov> a unção rate:; # ?ue pausa animação pelo inversodo ar&umento em se&undos.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 256/359
2), Imagens em trKs dimens>es
Eemplo de ?uadro e animação$
# 5 codin: latin 5---Lctaedro animado---
fro" $isual i"port *
# *oresa8ul = (!.2, !.2, !.!)$erde = (!.2, !.!, !.2)
# Eixo de rota;<oeixo = (!, , !)
# *ria um /rame alinhado com o eixo de rota;<o/r = /rame(axis=eixo)
# L /undo da caixa3ox(pos=(!, !!., !), color=a8ul, si8e=(!.!, !., =.!))
# L 3ordas da caixa3ox(pos=(!, !!., 4.!), color=a8ul, si8e=(.!, .!, .!))3ox(pos=(!, !!., !4.!), color=a8ul, si8e=(.!, .!, .!))3ox(pos=(.!, !!., !), color=a8ul, si8e=(.!, .!, =.!))3ox(pos=(!.!, !!., !), color=a8ul, si8e=(.!, .!, =.!))
# L pi<opy = pyramid(/rame=/r, pos=(, !, !), color=$erde,
axis=(, !, !))py2 = pyramid(/rame=/r, pos=(, !, !), color=$erde, axis=(!, !, !))
# L pi<o anda no plano y @ !deltaDx = !.!deltaD8 = !.!
print /r.axis
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 257/359
Imagens em trKs dimens>es 2)-
while ,rue:
# ?n$erte o sentido em x
if a3s(/r.x) > 4.2: deltaDx = !deltaDx
# ?n$erte o sentido em 8 if a3s(/r.8) > %.: deltaD8 = !deltaD8
/r.x += deltaDx /r.8 += deltaD8
# Totaciona em Pi !! no eixo
/r.rotate(anle=pi / !!, axis=eixo)
# Espere !! seundos rate(2!)
<anela +$
I pacote inclui tamb@m um m"dulo de plota&em de &ráicos# chamado graph.
Eemplo$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 258/359
2). Imagens em trKs dimens>es
# Hdulo para plotaem de rI/icosfro" $isual.raph i"port *
# GrI/ico de linha simples = cur$e(color=(.=, .6, .%))
# GrI/ico de 3arras2 = $3ars(delta=!.!2, color=(.6, .4, .6))
# Wimites do eixo do rI/icofor x in arane(!., !., .):
# plot( rece3e e
# Plotando a cur$a .plot(pos=(x, % * sin(x) + cos( * x)))
# Plotando as 3arras 2.plot(pos=(x, tan(x) * sin(4 * x)))
<anela de sa1da$
Na versão 5# o !'thon passou a incluir recursos como materiais prontos7como madeira# por eemplo8 e controle de opacidade.
Eemplo$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 259/359
Imagens em trKs dimens>es 2)
# 5 codin: latin 5
fro" $isual i"port *
# e/ine posi;<o inicial da cYmerascene./orCard = (!!., !!., !!.)
# Wimpa a ilumina;<oscene.lihts = []
# e/ine a ilumina;<o am3ientescene.am3ient = (., ., .2)
# Uma caixa de madeira
3ox(material=materials.Cood)
# Uma es/era de material semitransparentesphere(radius=.2, pos=(!, !!.%, ), color=(.4, ., .4), material=materials.rouh, opacity=.)
# Uma textura xadre8x = 2 * (2 * (, !), 2 * (!, ))# e/ine a textura no$amat = materials.texture(data=x, interpolate=False, mappin='rectanular')
# *aixa com a no$a textura3ox(axis=(!, , !), si8e=(4, 4, 4), pos=(!, !%, !), material=mat)
# S lYmpada Q um /rame composto por uma es/era e uma /onte de lu8c = (., .&, .=)lamp = /rame(pos=(!, , !))# e/ine uma /onte de lu8localDliht(/rame=lamp, pos=(2, , !), color=c)# e/ine uma es/era com material emissorsphere(/rame=lamp, radius=!., pos=(2, , !), color=c, material=materials.emissi$e)
while ,rue: # Snima a lYmpada" rotacionando em torno do eixo lamp.rotate(axis=(!, , !), anle=.) rate(!)
<anela de sa1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 260/359
2,0 Imagens em trKs dimens>es
I !'thon tem várias limitaçDes. Ele não prov> ormas de criar e%oumanipular materiais ou teturas mais compleas# nem ormas avançadas deiluminação ou detecção de colisDes. !ara cenas mais soisticadas# eistemoutras soluçDes# como o !'thon I&re)5 e o lender# ?ue @ um aplicativo demodela&em + ?ue usa !'thon como lin&ua&em script.
Py,pen5L
As bibliotecas Ipen=L): implementam uma A! de baio n1vel para
manipulação de ima&ens +# permitindo o acesso aos recursos dispon1veis nohard"are de v1deo# e tamb@m torna o c"di&o independente da plataorma#pois emula por soft"are as uncionalidades ?ue não estiverem dispon1veis noe?uipamento. Entre esses recursos temos$ primitivas 7linhas e pol1&onos8#mapeamento de teturas# operaçDes de transormação e iluminação.
A Ipen=L unciona em um conteto# ?ue tem seu estado alterado atrav@s dasunçDes deinidas na especiicação. Este estado @ mantido at@ ?ue sora umanova alteração.
Complementando a biblioteca principal# a Cpen%L 5ti!ity Li$rary 7=LU8 @uma biblioteca com unçDes de alto n1vel# en?uanto a Cpen%L 5ti!ity +oo!#it7=LUF8 deine rotinas independentes de plataorma para &erenciamento de
anelas# entrada e conteto.
A =LUF @ orientada a eventos# aos ?uais @ poss1vel se associar unçDes
)5 ispon1vel em$ http$%%p'thon-o&re.or&%.
): ocumentação em http$%%444.open&l.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 261/359
Imagens em trKs dimens>es 2,1
ca!!$ac# # ?ue eecutam as chamadas Ipen=L. A biblioteca tem uma rotina?ue monitora os eventos e evoca as unçDes ?uando necessário.
!'Ipen=L)) @ um pacote ?ue permite ?ue pro&ramas em !'thon utili6em as bibliotecas Ipen=L# =LU e =LUF.
Eemplo$
# 5 codin: latin 5
fro" sys i"port ar$fro" LpenGW.GW i"port *
fro" LpenGW.GWU, i"port *
&ef &ispla(): --- Fun;<o call3ac\ ue desenha na Aanela ---
# l*lear limpa a Aanela com $alores prQdeterminados # GWD*LWLTDBUFFETDB?, de/ine ue o 3u//er aceita escrita de cores # GWDEP,VDBUFFETDB?, de/ine ue o 3u//er de pro/undidade serI usado l*lear(GWD*LWLTDBUFFETDB?, J GWDEP,VDBUFFETDB?,)
r3a = [.=, .6, .4, .&] # lHaterial especi/ica os parYmetros do material ue ser<o # usados no modelo de ilumina;<o da cena (no /ormato TGBS # GWDFTL, de/ine ue a /ace a/etada pela /un;<o Q a /rontal # GWDSHB?E, especi/ica ue o parYmetro Q a re/lex<o de am3iente lHaterial/$(GWDFTL,, GWDSHB?E,, r3a)
# GWD?FFU>E especi/ica ue o parYmetro Q a re/lex<o di/usa do material lHaterial/$(GWDFTL,, GWD?FFU>E, r3a)
# GWD>PE*UWST especi/ica ue o parYmetro Q a re/lex<o especular lHaterial/$(GWDFTL,, GWD>PE*UWST, r3a)
# GWDEH?>>?L especi/ica ue o parYmetro Q a emiss<o do material # lHaterial/$(GWDFTL," GWDEH?>>?L" r3a
# GWD>V??E>> especi/ica o expoente usado pela re/lex<o especular lHaterial/$(GWDFTL,, GWD>V??E>>, 2!)
)) !á&ina oicial do proeto$ http$%%p'open&l.sourceor&e.net%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 262/359
2,2 Imagens em trKs dimens>es
# esenha uma es/era slida" com raio !. e 2= di$isMes # na hori8ontal e na $ertical lut>olid>phere(!., 2=, 2=)
# For;a a execu;<o dos comandos da LpenGW lFlush()
# ?niciali8a a 3i3lioteca GWU,lut?nit(ar$)
# lut?nitisplayHode con/iura o modo de exi3i;<o# GWU,D>?GWE de/ine o 3u//er como simples# (tam3Qm pode ser duplo" com GWU,DLUBWE# GWU,DTGB seleciona o modo TGB
lut?nitisplayHode(GWU,D>?GWE J GWU,DTGB)
# *ria a Aanela principallut*reate^indoC('Es/era')
# *on/iura a /un;<o call3ac\ ue desenha na Aanela atuallutisplayFunc(display)
# Wimpa a Aanela com a cor especi/icadal*lear*olor(.2, ., ., .)
# Huda a matri8 corrente para GWDPTLE*,?LlHatrixHode(GWDPTLE*,?L)
# *arrea uma matri8 identidade na matri8 correntelWoad?dentity()
# *on/iurando os parYmetros para as /ontes de lu8# GWD?FFU>E de/ine o parYmetro usado a lu8 di/usa (no /ormato TGBSlWiht/$(GWDW?GV,!, GWD?FFU>E, [., ., ., .])
# Ls trJs parYmetros de/inem a posi;<o da /onte luminosa
# L uarto de/ine se a /onte Q direcional (! ou posicional (lWiht/$(GWDW?GV,!, GWDPL>?,?L, [!., ., !., .])
# Splica os parYmetros de ilumina;<olEna3le(GWDW?GV,?G)
# ?nclui a /onte de lu8 ! no calculo da ilumina;<olEna3le(GWDW?GV,!)
# ?nicia o la;o de e$entos da GWU,lutHainWoop()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 263/359
Imagens em trKs dimens>es 2,3
*a1da$
A biblioteca tamb@m oerece rotinas para a6er transormaçDes# o ?ue permiteanimar os obetos da cena.
Eemplo$
# 5 codin: latin 5
fro" sys i"port ar$fro" LpenGW.GW i"port *fro" LpenGW.GWU i"port *fro" LpenGW.GWU, i"port *
# bnulo de rota;<o do o3Aetoar = !.
# ]aria;<o da rota;<odr = .
&ef resiLe(x, y): --- Fun;<o call3ac\ ue Q e$ocada uando a Aanela muda de tamanho ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 264/359
2,' Imagens em trKs dimens>es
# Wimpa a $ista l]ieCport(!, !, x, y)
# >eleciona a matri8 de proAe;<o lHatrixHode(GWDPTLE*,?L)
# Wimpa a matri8 de proAe;<o lWoad?dentity()
# *alcula o aspecto da perspecti$a luPerspecti$e(4., /loat(x)//loat(y), !., !!.!)
# >eleciona a matri8 de $isuali8a;<o
lHatrixHode(GWDHLEW]?E^)
&ef &raw(): --- Fun;<o ue desenha os o3Aetos --- lobal ar, dr
# Wimpa a Aanela e o 3u//er de pro/undidade l*lear(GWD*LWLTDBUFFETDB?, J GWDEP,VDBUFFETDB?,)
# Wimpa a matri8 de $isuali8a;<o lWoad?dentity()
# Ho$e o o3Aeto (transla;<o # ParYmetros: x" y e 8 (deslocamento l,ranslate/ (!!., !!., !4.)
# Tota;<o (em raus # ParYmetros: raus" x" y e 8 (eixo lTotate/ (ar, .! , .!, .!)
# Hudan;a de escala # ParYmetros: x" y e 8 (tamanho l>cale/ (ar / !!!, ar / !!!, ar / !!!)
for i in xrane(!, %6!, !):
# Tota;<o das /aces do o3Aeto lTotate/ (!, .! , .!, .!)
# ?nicia a cria;<o de uma /ace retanular lBein(GWDUS>)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 265/359
Imagens em trKs dimens>es 2,)
# e/ine a cor ue serI usada para desenhar (T" G" B l*olor%/ (.7, ., .)
# *ria um $Qrtice da /ace l]ertex%/ (!., !., !.) l*olor%/ (.7, .%, .) l]ertex%/ (., !., !.) l*olor%/ (., ., .) l]ertex%/ (., ., !.) l*olor%/ (.7, .%, .) l]ertex%/ (!., ., !.)
# ,ermina a /ace
lEnd()
# ?n$erte a $aria;<o if ar > !!!: dr = ! if ar < : dr = ar = ar + dr
# ,roca o 3u//er" exi3indo o ue aca3ou de ser usado lut>CapBu//ers()
&ef keboar&(*ars):
--- Fun;<o call3ac\ para tratar e$entos de teclado --- # ,esta se a tecla E>* /oi apertada if ars[!] == '9%%':
raise >ystemExit
if DDnameDD == 'DDmainDD':
# ?niciali8a a GWU, lut?nit(ar$)
# >eleciona o modo de exi3i;<o lut?nitisplayHode(GWU,DTGBS J GWU,DLUBWE J GWU,DEP,V)
# *on/iura a resolu;<o da Aanela do GWU, de 64! x 4=! lut?nit^indoC>i8e(64!, 4=!)
# *ria a Aanela do GWU, CindoC = lut*reate^indoC(',rans/orma;Mes')
# *on/iura a /un;<o call3ac\ ue desenha na Aanela atual
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 266/359
2,, Imagens em trKs dimens>es
lutisplayFunc(draC)
# Para exi3ir em tela cheia
#lutFull>creen(
# Teistra a /un;<o para tratar redesenhar a Aanela uando # n<o hI nada a /a8er lut?dleFunc(draC)
# Teistra a /un;<o para redesenhar a Aanela uando # ela /or redimensionada lutTeshapeFunc(resi8e)
# Teistra a /un;<o para tratar e$entos de teclado
lutXey3oardFunc(\ey3oard)
# ?niciali8a;<o da Aanela # Wimpa a imaem (/undo preto l*lear*olor(!., !., !., !.)
# Wimpa o 3u//er de pro/undidade l*learepth(.)
# *on/iura o tipo do teste de pro/undidade lepthFunc(GWDWE>>)
# Sti$a o teste de pro/undidade lEna3le(GWDEP,VD,E>,)
# *on/iura o som3reamento sua$e l>hadeHodel(GWD>HLL,V)
# >eleciona a matri8 de proAe;<o lHatrixHode(GWDPTLE*,?L) lWoad?dentity() luPerspecti$e(4., 64!. / 4=!., ., !!.)
# >eleciona a matri8 de $isuali8a;<o lHatrixHode(GWDHLEW]?E^)
# ?nicia o la;o de e$entos da GWU, lutHainWoop()
<anela de sa1da$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 267/359
Imagens em trKs dimens>es 2,-
A Ipen=L pode ser inte&rada com too!#its &ráicos# como "(idgets e Ot # aoinv@s de usar a =LUF# e com isso# ser incorporada em aplicaçDes =Uconvencionais.
Uma das principais reer>ncias sobre Ipen=L @ o livro TIpen=L
!ro&rammin& =uide# tamb@m conhecido como T;ed oo3)9
.
)9 ersão on!ine dispon1vel em http$%%444.&lpro&rammin&.com%red%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 268/359
2,. Processamento distri$u?do
Processamento distribudo
=eralmente a solução para problemas ?ue re?uerem muita pot>nciacomputacional @ a utili6ação de má?uinas mais poderosas# por@m estasolução @ limitada em termos de escalabilidade. Uma alternativa @ dividir osprocessos da aplicação entre várias má?uinas ?ue se comunicam atrav@s deuma rede# ormando um c!uster ou um grid.
A dierença básica entre c!uster e grid @ ?ue o primeiro tem como premissa deproeto ser um ambiente controlado# homo&>neo e previs1vel# en?uanto ose&undo @ &eralmente hetero&>neo# não controlado e imprevis1vel. Um c!uster
@ um ambiente planeado especiicamente para processamento distribu1do#com má?uinas dedicadas em um lu&ar ade?uado. Um grid se caracteri6a pelouso de estaçDes de trabalho ?ue podem estar em ?ual?uer lu&ar.
Is modelos mais comuns de c!uster$▪ computacional.▪ de recursos.▪ de aplicação ou h1brido.
U!"rido
8 %
C
Computacional
8 %
C
O ser$idor fa: oescalonamento das tarefas
para as esta*es.
Sualquer máquina pode
atuar como cliente eser$idor.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 269/359
Processamento distri$u?do 2,
I modelo computacional tem como obetivo usar processadores e mem"riados e?uipamentos envolvidos para obter mais pot>ncia computacional. A
implementação &eralmente utili6a um sistema escalonador de ilas7metaschedu!er8# ?ue reali6a o a&endamento das tareas a serem processadaspelos n"s 7má?uinas ?ue compDem o modelo8# com isso a operação tende aser cont1nua# com interação redu6ida com os usuários. Um eemploconhecido @ o *EFhome)/.
I c!uster de recursos @ usado para arma6enar inormaçDes em um &rupo decomputadores# tanto para obter mais perormance de recuperação de dados
?uanto para epandir a capacidade de arma6enamento. Este modelo pode serusado para prover inra-estrutura para aplicaçDes ou para atender re?uisiçDeseitas de orma interativa por usuários. Entre os serviços ?ue podem operardesta orma estão os *istemas =erenciadores de anco de ados 7*=8#como o H'*OL Cluster9,.
I modelo h1brido @ uma aplicação proetada especiicamente para uncionar
)/ !á&ina do proeto em$ http$%%setiathome.ber3ele'.edu%.
9, Endereço na internet$ http$%%444.m's?l.com%products%database%cluster%.
Clientes
Jecursos
8 %
C
Clientes fa:em requisi*esao cluster ...
... e qualquer máquina docluster pode atuar como
ser$idor.
+ /
T U
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 270/359
2-0 Processamento distri$u?do
em várias má?uinas ao mesmo tempo. Ao inv@s de prover recursosdiretamente# a aplicação utili6a os e?uipamentos para suportar suas pr"priasuncionalidades. Com isso# a inra-estrutura @ utili6ada de orma ?uase
transparente pelos usuários ?ue usam a aplicação interativamente. Fodos osn"s rodam o aplicativo e podem operar como servidores e clientes. Ieemplo mais comum de ar?uitetura h1brida são os sistemas decompartilhamento de ar?uivos 7 fi!e sharing8 ?ue usam comunicação Peer +oPeer 7!2!8.
ndependente do modelo utili6ado. sistemas distribu1dos devem atender a?uatro re?uisitos básicos$
▪ Comunicação$ as má?uinas envolvidas devem se comunicar de orma apermitir a troca de inormaçDes entre elas.▪ Hetadados$ os dados sobre o processamento precisam ser mantidos de
orma ade?uada.▪ Controle$ os processos devem ser &erenciados e monitorados.▪ *e&urança$ o si&ilo# inte&ridade e disponibilidade devem estar
prote&idos.
Eistem diversas tecnolo&ias voltadas para o desenvolvimento de aplicaçDes
distribu1das# tais como$ HL-;!C9( # Jeb *ervices# obetos distribu1dos# H! eoutras.
9( Especiicação em http$%%444.mlrpc.com%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 271/359
Processamento distri$u?do 2-1
,b-etos distribudos
A premissa básica da tecnolo&ia de obetos distribu1dos @ tornar obetosdispon1veis para ?ue seus m@todos possam ser evocados remotamente apartir de outras má?uinas ou mesmo por outros processos na mesmamá?uina# usando a pilha de protocolos de rede FC!%! para isso.
Eistem diversas soluçDes para estes casos# por@m utili6ar obetosdistribu1dos oerece várias vanta&ens em relação a outras soluçDes ?ueimplementam uncionalidades semelhantes# tal como o protocolo HL-;!C$
▪
*implicidade para implementação.▪ Iculta as camadas de comunicação.▪ *uporte a estruturas de dados nativas 7contanto ?ue seam
seriali6áveis8.▪ oa perormance.▪ Haturidade da solução.
PBthon emote C$Gects 7!M;I928 @ um frame"or# para aplicaçDes distribu1das
92 ocumentação e ontes dispon1veis em$ http$%%p'ro.sourceor&e.net%.
Jede
Cliente
'nterpretador
rograma
/ramePorZ
er$idor
'nterpretador
O"Leto
/ramePorZ
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 272/359
2-2 Processamento distri$u?do
?ue permite publicar obetos via FC!%!. Na má?uina servidora# o !M;Ipublica o obeto# cuidando de detalhes como$ protocolo# controle de sessão#autenticação# controle de concorr>ncia e outros.
Eemplo de servidor$
#1usr3inen$ python# 5 codin: ut/= 5
i"port Pyro.core
# S classe Pyro.core.L3ABase de/ine# o comportamento dos o3Aetos distri3udosclass Kist(Pyro.core.L3ABase):
&ef calc(sel/ , n):
return n**n
if DDnameDD == 'DDmainDD':
# ?nicia a thread do ser$idor Pyro.core.init>er$er()
# *ria o ser$idor daemon = Pyro.core.aemon()
# Pu3lica o o3Aeto uri = daemon.connect(ist(),'dist')
# *oloca o ser$idor em estado operacional daemon.reuestWoop()
Na má?uina cliente# o pro&rama usa o !M;I para evocar rotinas do servidore recebe os resultados# da mesma orma ?ue um m@todo de um obeto local.
Eemplo de cliente$
# 5 codin: ut/= 5
i"port Pyro.core
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 273/359
Processamento distri$u?do 2-3
# *ria um o3Aeto local para acessar o o3Aeto remotoproxy = Pyro.core.etProxyForUT?('PTLWL*:27.!.!.dist')
# E$oca um mQtodo do o3Aeto remotoprint proxy.calc(!!!)
Is m@todos publicados atrav@s do !M;I não podem ser identiicados porintrospecção pelo cliente.
Embora o !M;I resolva problemas de concorr>ncia de comunicação com osclientes ?ue estão acessando o mesmo servidor 7cada coneão roda em uma
thread separada8# ica por conta do desenvolvedor 7ou de outros frame"or#s?ue a aplicação utili6e8 resolver ?uestDes de concorr>ncia por outros recursos#como ar?uivos ou coneDes de banco de dados9+ # por eemplo. S poss1velautenticar as coneDes atrav@s da criação de obetos da classe Va!idator # ?uepodem veriicar credenciais# endereços ! e outros itens.
9+ !roblemas de concorr>ncia de coneDes de banco de dados podem ser tratados de ormatransparente com a utili6ação de I;Hs ?ue implementam esta uncionalidade ou pelopacote Utils 7http$%%444.4eb4areorp'thon.or&%Utils8# ?ue a6 parte do proeto
Jeb4are or !'thon 7http$%%444.4eb4areorp'thon.or&%8.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 274/359
2-' Performance
Performance
I !'thon prov> al&umas erramentas para avaliar perormance e locali6ar&ar&alos na aplicação. Entre estas erramentas estão os m"dulos cProfi!e etimeit.
I m"dulo cProfi!e.' a6 uma análise detalhada de perormance# incluindo aschamadas de unção# retornos de unção e eceçDes.
Eemplo$
# 5 codin: latin 5
i"port cPro/ile
&ef rbC(): --- Fun;<o usando rane( --- r3s = [] for r in rane(26):
for in rane(26): for 3 in rane(26): r3s.append('#O!2xO!2xO!2x' % (r, , 3)) return r3s
&ef rbM(): --- Fun;<o usando xrane( --- r3s = [] for r in xrane(26): for in xrane(26): for 3 in xrane(26): r3s.append('#O!2xO!2xO!2x' % (r, , 3)) return r3s
&ef rb5(): --- Gerador usando xrane( ---
90 I m"dulo cProfi!e 7dispon1vel no !'thon 2.5 em diante8 @ uma versão otimi6ada do
m"dulo profi!e # ?ue tem a mesma uncionalidade.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 275/359
Performance 2-)
for r in xrane(26): for in xrane(26): for 3 in xrane(26):
iel& '#O!2xO!2xO!2x' % (r, , 3)
&ef rbN(): --- Fun;<o usando uma lista $Irias $e8es --- r3s = [] ints = rane(26) for r in ints: for in ints: for 3 in ints:
r3s.append('#O!2xO!2xO!2x' % (r, , 3)) return r3s
&ef rbO(): --- Gerador usando apenas uma lista --- for i in rane(26 ** %): iel& '#O!6x' % i
&ef rbP():
--- Gerador usando xrane( uma $e8 --- for i in xrane(26 ** %): iel& '#O!6x' % i
# Benchmar\sprint 'r3:'cPro/ile.run('r3(')
print 'r32:'
cPro/ile.run('r32(')
print 'r3%:'cPro/ile.run('list(r3%(')
print 'r34:'cPro/ile.run('r34(')
print 'r3:'cPro/ile.run('list(r3(')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 276/359
2-, Performance
print 'r36:'cPro/ile.run('list(r36(')
*a1da$
r3: 6=4%!2 /unction calls in 4.&7 *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction !.6%% !.6%% 4.&7 4.&7 strin0:(module0
4&.2!% 4&.2!% %.64 %.64 r3s.py:(r3 677726 4.76 !.!!! 4.76 !.!!! Zmethod 'append' o/ 'list'o3Aects[ !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[ 67&% !.=6 !.!!! !.=6 !.!!! Zrane[
r32: 67772& /unction calls in %.64! *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction !.624 !.624 %.64! %.64! strin0:(module0 4&.!! 4&.!! %.!6 %.!6 r3s.py:6(r32 677726 4.!!6 !.!!! 4.!!6 !.!!! Zmethod 'append' o/ 'list'o3Aects[ !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[
r3%: 67772& /unction calls in 2.%7 *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction 6.2 6.2 2.%7 2.%7 strin0:(module0 677727 46.!66 !.!!! 46.!66 !.!!! r3s.py:27(r3% !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 277/359
Performance 2--
r34: 677722! /unction calls in %.6= *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction !.624 !.624 %.6= %.6= strin0:(module0 4=.&2 4=.&2 2.&&4 2.&&4 r3s.py:%6(r34 677726 4.!42 !.!!! 4.!42 !.!!! Zmethod 'append' o/ 'list'o3Aects[ !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[ !.!!! !.!!! !.!!! !.!!! Zrane[
r3: 677722! /unction calls in %2.2!& *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction 6.! 6.! %2.2!& %2.2!& strin0:(module0 677727 2.6%6 !.!!! 26.!&& !.!!! r3s.py:4=(r3 !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/
'Dlspro/.Pro/iler' o3Aects[ !.46% !.46% !.46% !.46% Zrane[
r36: 67772& /unction calls in %!.4% *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction 6.!66 6.!66 %!.4% %!.4% strin0:(module0
677727 24.%6 !.!!! 24.%6 !.!!! r3s.py:(r36 !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[
I relat"rio do cProfi!e mostra no inicio as duas inormaçDes mais importantes$o tempo de C!U consumido em se&undos e a ?uantidade de chamadas deunção. As outras linhas mostram os detalhes por unção# incluindo o tempototal e por chamada.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 278/359
2-. Performance
As cinco rotinas do eemplo t>m a mesma uncionalidade$ &eram uma escalade cores ;=. !or@m# o tempo de eecução @ dierente.
Comparando os resultados$
otina 6ipo 6e"po ?a-os /rane()
r3( Fun;<o 4.&7 % rane(
r32( Fun;<o %.64! % xrane(
r3%( Gerador 2.%7 % xrane(
r34( Fun;<o %.6= % rane(
r3( Gerador %2.2!& rane(
r36( Gerador %!.4% xrane(
atores observados ?ue pesaram no desempenho$▪ A compleidade do al&oritmo.▪ =eradores apresentaram melhores resultados do ?ue as unçDes
tradicionais.▪ I &erador range:; apresentou uma perormance li&eiramente melhor
do ?ue a unção range:;.
I &erador rg$,:; # ?ue usa apenas um laço e range:; # @ bem mais eiciente ?ueas outras rotinas.
Iutro eemplo$
# 5 codin: latin 5
i"port cPro/ile
&ef fibC(n): --- Fi3onacci calculado de /orma recursi$a. --- if n > : return /i3(n ! ) + /i3(n ! 2) else: return
&ef fibM(n):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 279/359
Performance 2-
--- Fi3onacci calculado por um loop. ---
if n > :
# L dicionIrio uarda os resultados /i3s = #!:, :$ for i in xrane(2, n + ): /i3s[i] = /i3s[i ! ] + /i3s[i ! 2] return /i3s[n] else: return
print '/i3'
cPro/ile.run(')/i3(x /or x in xrane(" %+')print '/i32'cPro/ile.run(')/i32(x /or x in xrane(" %+')
*a1da$
/i3 7!4&24 /unction calls (%2 primiti$e calls in 2.=44 *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction !.!!! !.!!! 2.=44 2.=44 strin0:(module07!4&22%! 2.=44 !.!!! 2.=44 !.72= /i3s.py:4(/i3 !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[
/i32 %2 /unction calls in !.!! *PU seconds
Lrdered 3y: standard name
ncalls tottime percall cumtime percall /ilename:lineno(/unction !.!!! !.!!! !.!! !.!! strin0:(module0 %! !.!! !.!!! !.!! !.!!! /i3s.py:%(/i32 !.!!! !.!!! !.!!! !.!!! Zmethod 'disa3le' o/'Dlspro/.Pro/iler' o3Aects[
A perormance do cálculo da s@rie de ibonacci usando um laço ?ue preenche
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 280/359
2.0 Performance
um dicionário @ muito mais eiciente do ?ue a versão usando recursão# ?uea6 muitas chamadas de unção.
I m"dulo timeit serve para a6er $enchmar# de pe?uenos trechos de c"di&o95.I m"dulo oi proetado para evitar as alhas mais comuns ?ue aetampro&ramas usados para a6er $enchmar#s.
Eemplo$
i"port timeit
# Wista dos uadrados de a !!!cod = '''s @ )+/or i in xrane(" !!: s.append(i 55 2'''print timeit.,imer(cod).timeit()
# *om Generator Expressioncod = 'list(x 55 2 /or x in xrane(" !!'print timeit.,imer(cod).timeit()
# *om Wist *omprehesion
cod = ')x 55 2 /or x in xrane(" !!+'print timeit.,imer(cod).timeit()
*a1da$
&.%726%7&=74!6.464&!!%%26.%%!2&%=&4
I List 4omprehension @ mais eiciente do ?ue o laço tradicional.
Iutra orma de melhorar a perormance de uma aplicação @ usando o Psyco #?ue @ uma esp@cie de ust In 4ompi!er 7<F8. urante a eecução# ele tentaotimi6ar o c"di&o da aplicação e# por isso# o m"dulo deve ser importado antesdo c"di&o a ser otimi6ado 7o inicio do m"dulo principal da aplicação @ um
95 I m"dulo cProfi!e não @ apropriado para avaliar pe?uenos trechos de c"di&o. I m"dulo
timeit @ mais ade?uado pois eecuta o c"di&o várias ve6es durante a avaliação.
O código é passado para o
benchmar$ como uma strin%.
O código é passado para o
benchmar$ como uma strin%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 281/359
Performance 2.1
lu&ar ade?uado8.
Eemplo 7com o Kltimo trecho de c"di&o avaliado no eemplo anterior8$
i"port psyco
# ,ente otimi8ar tudopsyco./ull()
i"port timeit
# Wista dos uadrados de a !!!cod = ')x 55 2 /or x in xrane(" !!+'
print timeit.,imer(cod).timeit()
*a1da$
27.67=4=!2
I c"di&o oi eecutado mais de duas ve6es mais rápido do ?ue antes. !araisso# oi necessário apenas acrescentar duas linhas de c"di&o.
!or@m# o Psyco deve ser usado com al&uns cuidados# pois em al&uns casos elepode não conse&uir otimi6ar ou at@ piorar a perormance9:. As unçDes map:;e fi!ter:; devem ser evitadas e m"dulos escritos em C# como o re 7epressDesre&ulares8 devem ser marcados com a unção cannotcompi!e:; para ?ue o Psycoos i&nore. I m"dulo ornece ormas de otimi6ar apenas determinadas partesdo c"di&o da aplicação# tal como a unção profi!e:; # ?ue s" otimi6a as partesmais pesadas do aplicativo# e uma unção !og:; ?ue analisa a aplicação# para
contornar estas situaçDes.
Al&umas dicas sobre otimi6ação$▪ Hantenha o c"di&o simples.▪ Itimi6e apenas o c"di&o aonde a perormance da aplicação @ realmente
cr1tica.
9: Eistem al&umas unçDes em ?ue o !s'co tem o eeito de redu6ir a velocidade dopro&rama# pois o pr"prio Psyco consome C!U tamb@m. Al@m disso# o Psyco tamb@m a6
com ?ue a aplicação consuma mais mem"ria.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 282/359
2.2 Performance
▪ Use erramentas para identiicar os &ar&alos no c"di&o.▪ Evite unçDes recursivas.▪ Use os recursos nativos da lin&ua&em. As listas e dicionários do !'thon
são muito otimi6ados.▪ Use List 4omprehensions ao inv@s de laços para processar listas usando
epressDes simples.▪ Evite unçDes dentro de laços. unçDes podem receber e devolver listas.▪ Use &eradores ao inv@s de unçDes para &randes se?u>ncias de dados.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 283/359
/mpacotamento e distri$uição 2.3
%mpacotamento e distribuição
=eralmente @ bem mais simples distribuir aplicaçDes na orma de binário# em?ue basta rodar um eecutável para iniciar a aplicação# do ?ue instalar todasas depend>ncias necessárias em cada má?uina em ?ue se desea eecutar aaplicação.
Eistem vários sot4ares ?ue permitem &erar eecutáveis a partir de umpro&rama eito em !'thon# como o !'2ee9) e cXree6e99.
I !'2ee s" unciona na plataorma Jindo4s# por@m possui muitosrecursos# podendo &erar eecutáveis com interace de teto# &ráicos# serviços7pro&ramas ?ue rodam sem intervenção do usuário# de orma semelhante aosdaemons nos sistemas UN8 e servidores CIH 7ar?uitetura de componentesda Hicrosot8.
9) ocumentação# ontes e binários de instalação podem ser encontrados em$http$%%444.p'2ee.or&%.
99 ocumentação# ontes e binários de instalação para várias plataormas podem ser
encontrados em$ http$%%starship.p'thon.net%cre4%atuinin&%cXree6e%.
/ontes(H.py)
%ytecode(H.pyc & H.pyo)
%inários
'nterpretador e depend9ncias
Compila,o +mpacotamento
'nstalador
%inários
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 284/359
2.' /mpacotamento e distri$uição
I cXree6e @ portável# podendo rodar em ambientes UN# por@m @ bemmenos versátil ?ue o !'2ee.
!ara usar o !'2ee# @ preciso criar um script # ?ue normalmente se chamaTsetup.p'# ?ue di6 ao !'2ee o ?ue @ necessário para &erar o eecutável.
Eemplo de Tsetup.p'$
# 5 codin: latin 5---Exemplo de uso do py2exe---fro" distutils.core i"port setupi"port py2exe
setup(name = '>?H >istema ?nterati$o de HNsica', ser$ice = ['simser$ice'], console = ['sim.py', 'simimport.py'], CindoCs = ['simt\.py'], options = #'py2exe': # 'optimi8e': 2, 'includes': ['at\', 'o3Aect', 't\','t\.lade',
'pano', 'cairo', 'panocairo'] $$, dataD/iles=[('',['Aanela.lade', 'sim.ico'])], description = 'Primeira ]ers<o...', $ersion = '.!')
No eemplo# temos um sistema ?ue @ composto por dois utilitários de linhacomando# um aplicativo com interace &ráica e um serviço. I aplicativo com=U depende do =FPW para uncionar e oi desenvolvido usando =lade.
Entre os parGmetros do !'2ee# os mais usuais são$▪ name$ nome da aplicação.▪ serice$ lista de serviços.▪ conso!e$ lista de pro&ramas com interace de teto.▪ "indo"s$ lista de pro&ramas com interace &ráica.▪ optionsMpy2eeMT$ dicionário com opçDes ?ue alteram o comportamento
do !'2ee$•
optimi<e$ , 7otimi6ação desativada# $ytecode padrão8# ( 7otimi6ação
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 285/359
/mpacotamento e distri$uição 2.)
ativada# e?uivale ao parGmetro T-I do interpretador8 ou 27otimi6ação com remoção de *oc Strings ativada# e?uivale aoparGmetro T-II do interpretador8.
• inc!udes$ lista de m"dulos ?ue serão inclu1dos como depend>ncias.=eralmente# o Py2ee detecta as depend>ncias sem necessidade deusar esta opção.
• dataEfi!es$ outros ar?uivos ?ue a6em parte da aplicação# tais comoima&ens# 1cones e ar?uivos de coni&uração.
• description$ comentário.• ersion$ versão da aplicação# como string.
!ara &erar o eecutável# o comando @$
python setup.py py2exe
I !'2ee criará duas pastas$
▪ $ui!d$ ar?uivos temporários.▪ dist$ ar?uivos para distribuição.
Entre os ar?uivos para distribuição# T4/popen.ee @ necessário apenaspara as versDes anti&as do Jindo4s 7/5 e /98 e pode ser removido semproblemas em versDes mais recentes.
!ela linha de comando tamb@m @ poss1vel passar al&umas opçDesinteressantes# como o parGmetro T-b(# para &erar menos ar?uivos para adistribuição.
I cXree6e @ um utilitário de linha de comando.
Free8ePython LL c sim.py
A opção T-c a6 com ?ue o $ytecode sea comprimido no ormato <ip.
Free8ePython LL includemodules@at\"cairo"pano"panocairo simt\.py
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 286/359
2., /mpacotamento e distri$uição
A opção T--include-modules# permite passar uma lista de m"dulos ?ue serãoinclu1dos na distribuição.
Fanto o !'2ee ?uanto o cXree6e não são compiladores. I ?ue eles a6em @empacotar os $ytecodes da aplicação# suas depend>ncias e o interpretador em7pelo menos8 um ar?uivo eecutável 7e ar?uivos auiliares8 ?ue nãodependem do ambiente em ?ue oram &erados. Com isso# a distribuição doaplicativo se torna bem mais simples. Entretanto# não há &anho deperormance em &erar eecutáveis# eceto pela car&a da aplicação para amem"ria em al&uns casos.
Eles tamb@m não &eram pro&ramas de instalação. !ara isso# @ necessário ouso de um sot4are espec1ico. Is instaladores são &erados por aplicativos?ue se encarre&am de automati6ar tareas comuns do processo de instalação.*ão eemplos de sot4ares dessa cate&oria$ nno *etup9/ e N**/,.
9/ ocumentação e binários de instalação dispon1veis em$http$%%444.rsot4are.or&%isino.php.
/, Endereço do proeto$ http$%%nsis.sourceor&e.net%HainX!a&e.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 287/359
/erc?cios VI 2.-
%&erccios #I
(. mplementar um m"dulo com uma unção tri$onacci:n; ?ue retorne umalista de n nKmeros de Fribonacci# aonde n @ o parGmetro da unção. açatestes da unção caso o m"dulo sea eecutado como principal.
2. mplementar$▪ um servidor ?ue publi?ue um obeto distribu1do e este evo?ue a unção
tri$onacci.▪ um cliente ?ue use o obeto distribu1do para calcular a se?u>ncia de
Fribonacci.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 288/359
2.. DpKndices
ApêndicesEsta parte se concentra em outras tecnolo&ias ?ue tem convivem com o!'thon de diversas ormas. E ao inal# as respostas dos eerc1cios propostosnas partes anteriores.
ConteKdo$▪ nte&ração com aplicativos.▪ lender .
▪ =H! .▪ n3scape .▪ rIice.or& .▪ nte&ração com outras lin&ua&ens.▪ nte&ração com .NEF .▪ ;espostas dos eerc1cios .▪ ;espostas dos eerc1cios .▪ ;espostas dos eerc1cios .▪ ;espostas dos eerc1cios .▪ ;espostas dos eerc1cios .▪ ;espostas dos eerc1cios .
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 289/359
Integração com ap!icatios 2.
Integração com aplicativos
!'thon pode ser usado como lin&ua&em script em vários aplicativos paraautomati6ar tareas e adicionar novas uncionalidades# ou para oerecer seusrecursos para outro pro&rama# atrav@s de uma A! ou protocolo. Huitosdesses pacotes de sot4are são Cpen Source # como o rIice.or& e o lender#por eemplo.
Huitas ve6es isso @ poss1vel por?ue esses pro&ramas adotaram umaar?uitetura de p!ugins # na ?ual eiste uma inraestrutura &en@rica ?ue permite?ue componentes eternos seam li&ados aos aplicativos.
Na maioria dos casos# isso @ viabili6ado mediante o uso de uma A! ?ue @disponibili6ada pelo sot4are# ?ue @ vista pelo !'thon como um m"dulo ouum pacote# ?ue apenas precisa estar no !MFBIN!AFB para ?ue possa serutili6ado. Com isso# o pro&rama pode a6er chamadas as rotinas doaplicativo# para utili6ar seus recursos e se comunicar.
Em outros casos# como o n3scape# o pro&rama em !'thon unciona como umiltro# recebendo e enviando inormaçDes para o aplicativo atrav@s de entrada7stdin8 e sa1da 7stdout8 padrDes.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 290/359
20 8!ender
+lender
lender/(
@ um sot4are de modela&em + de c"di&o aberto# capa6 de &eraranimaçDes e tamb@m unciona como %ame /ngine 7inraestruturaespeciali6ada para criação de o&os para computador8. Al@m disso# o sot4arepossui um renderi6ador interno e pode ser inte&rado a renderi6adoreseternos# como os proetos# tamb@m de c"di&o aberto# Maara'/2 eLu;ender/+.
No lender# uma cena @ composta por obetos# ?ue precisam ser iados emposiçDes e conectados a cena. *e o obeto não estiver conectado a cena# eleserá eliminado ao im do processamento. !ara cada s"lido# @ poss1velconi&urar vários materiais# ?ue podem ter 6ero ou mais teturas.
A cena padrão do lender @ composta por tr>s obetos$ uma cGmera# uma
/( ocumentação# ontes e binários podem ser encontrados em$ http$%%444.blender.or&%./2 !á&ina do proeto$ http$%%444.'aara'.or&%.
/+ *ite oicial$ http$%%444.lurender.net%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 291/359
8!ender 21
lGmpada e um cubo 7representado como mesh8. A escala no lender @ medidaem Us 78!ender 5nits8.
Com !'thon @ poss1vel acessar todas essas estruturas do lender atrav@s dem"dulos# incluindo$
▪ 8!ender$ permite abrir ar?uivos# salvar e outras unçDes correlatas.▪ C$Gect$ operaçDes com obetos +.▪ ateria!s$ manipulação de materiais.▪ +etures$ manipulação de teturas.▪ (or!d$ manipulação do ambiente da cena.▪ *ra"$ rotinas de interace com o usuário.
▪ =mesh$ manipulação de malhas.▪ 8%L$ acesso direto as unçDes do Ipen=L.
A A! do lender oerece várias teturas procedurais e uma coleção des"lidos primitivos prontos# ?ue podem ser criados e alterados atrav@s dec"di&o.
Eemplo de c"di&o para a criação de uma cena$
# 5 codin: latin 5
i"port mathi"port Blender
# Pea a cena atualcena = Blender.>cene.Get*urrent()
# Elementos da cena -de/ault-camera = Blender.L3Aect.Get()[!]
cu3o = Blender.L3Aect.Get()[]lamp = Blender.L3Aect.Get()[2]
# Ho$e a cYmeracamera.setWocation(=., !=., 4.)camera.setEuler(math.radians(7!), !., math.radians(4))
# Huda a lentecamera.data.lens = %!
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 292/359
22 8!ender
# Temo$e da cena o o3Aeto -de/ault-cena.o3Aects.unlin\(cu3o)
# Sltera a intensidade da lu8lamp.data.enery = .2
# Huda o tipo para ->un-lamp.data.type =
# Sumenta o nNmero de sampleslamp.data.ray>amples = 6lamp.data.ray>amples = 6
# E a cor
lamp.data.col = ., .&, .=
# *ria outra /onte de lu8lamp = Blender.Wamp.eC('Wamp')lamp.enery = !.lamp.col = .&, ., . Dlamp = Blender.L3Aect.eC('Wamp')
# Huda o luar da /onte (de/ault @ !.!" !.!" !.! Dlamp.setWocation(6., !6., 6.)
# -Prende- a /onte de lu8 na cena Dlamp.lin\(lamp)cena.o3Aects.lin\( Dlamp)
# *ria um materialmaterial = Blender.Haterial.eC('neCHat')material.r3*ol = [.%=, .%%, .2=]material.setSlpha(.)
# *ria uma texturatextura = Blender.,exture.Get()[!]
textura.set,ype('*louds')textura.noise,ype = 'so/t'textura.noiseBasis = Blender.,exture.oise[']LTLL?*TS*XWE']
# *oloca no materialmaterial.set,exture(!, textura)mtex = material.et,extures()[!]mtex.col = .26, .22, .=mtex.mtor = mtex.ne = ,ruemtex.texco = Blender.,exture.,ex*o['GWLB']
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 293/359
8!ender 23
material.mode += Blender.Haterial.Hodes['TSH?TTLT']material.rayHirr = !.2material.lossHir = !.=
# *ria o pisomesh = Blender.Hesh.Primiti$es.Plane(4!.)piso = cena.o3Aects.neC(mesh,'Hesh')piso.setWocation(!., !., .!)# Totaciona o pisopiso.setEuler(!., !., math.radians(4))
# *oloca o material no pisopiso.setHaterials([material])piso.col3its =
# *ria outro materialmaterial2 = Blender.Haterial.eC('neCHat2')material2.r3*ol = [.77, .7=, .7&]material2.setSlpha(.)material2.mode += Blender.Haterial.Hodes['TSH?TTLT']material2.rayHirr = !.6material2.lossHir = !.4
# *oloca textura no outro materialmaterial2.set,exture(!, textura)
mtex2 = material2.et,extures()[!]mtex2.col = .%, .%, .4mtex2.mtor = mtex2.ne = ,ruemtex2.texco = Blender.,exture.,ex*o['GWLB']
mat = [material2]
# *ria o3Aetos na cena&ef obeto(local, tam, mat, prim=Blender.Hesh.Primiti$es.*u3e):
mesh = prim() o3A = cena.o3Aects.neC(mesh, 'Hesh') o3A.setWocation(*local) o3A.si8e = tam o3A.setHaterials(mat) o3A.col3its = return o3A
&ef coluna(x=!., y=!., 8=!., mat=mat):
# *ilindro
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 294/359
2' 8!ender
prim = Blender.Hesh.Primiti$es.*ylinder
# ,opo
local = x, y, 2. + 8 tam = .2, .2, . o3Aeto(local, tam, mat)
# Base local = x, y, !. + 8 o3Aeto(local, tam, mat)
# *orpo for \ in xrane(!): local = x, y, .2 * \ + 8
tam = .2 ! \ / 2!!., .2 ! \ / 2!!., .2 o3Aeto(local, tam, mat, prim)
# *ria colunas no /undofor i in xrane(6):
# Primeira /ileira coluna(i ! =., =)
# >eunda /ileira coluna(!=., i ! =.)
# Sueduto local = !=., i ! =., %. tam = ., ., . o3Aeto(local, tam, mat)
local = i ! =., =., %. o3Aeto(local, tam, mat)
8 = .2
# *ria colunas em cima do pisofor i in (!%, %): for A in rane(!2, %):
# Fileiras coluna(i, A, 8)
# Fileiras coluna( A, i, 8)
# *antos
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 295/359
8!ender 2)
for A in (!%, %): coluna(i, A, 8)
# *ria escadafor i in xrane(=): local = !., !., i / %2. ! .2 tam = %.% + (=. ! i) / =., %.% + (=. ! i) / =., .2 o3Aeto(local, tam, mat)
# *ria tetofor i in xrane(%): local = !., !., 2.& + i / 6!. tam = %. ! i / 2!!., %. * ( . ! i / %.), . o3Aeto(local, tam, mat)
# Pea o -mundo-Corld = Blender.^orld.Get()[!]
# Hodo -3lend- no /undoCorld.s\ytype =
# Stuali8a a cenacena.update()
*a1da 7renderi6ada8$
Eemplo com interace$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 296/359
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 297/359
8!ender 2-
--- Fun;<o ue responde a e$entos di$ersos" menos os erados por 3otMes
---
# Ls e$entos das teclas est<o de/inidas em raC if e$t == E>*XE: # ,ermina o prorama Exit()
&ef buttons(e$t): --- Fun;<o ue responde a e$entos dos 3otMes ---
if e$t == 2: Exit()
elif e$t == : en%d()
&ef en5&():
# *ena % cena = >cene.Get*urrent()
x = y = 8 = !
while x < 2 * pi:
# *alcula os $alores de 8 8 = e$al(Buttons./ormula.$al)
# *ria uma es/era de 6 sementos" 6 anQis e !. BU de raio s = Hesh.Primiti$es.U]sphere(6, 6, .) es/era = cena.o3Aects.neC(s, 'Hesh')
# ,rans/ere a es/era para o local calculado es/era.setWocation(x, y, 8)
# Prximo x x += Buttons.delta.$al
# Stuali8a a cena cena.update()
if DDnameDD == 'DDmainDD':
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 298/359
2. 8!ender
# Teistra as /un;Mes call3ac\ Teister(inter/ace, e$ents, 3uttons)
nterace$
*a1da$
Eemplo de criação de malha$
# 5 codin: latin 5
fro" Blender i"port Hesh, TedraC
# *ria uma no$a malhamesh = Hesh.eC()
# Um dicionIrio para arma8enar os $Qrtices# con/orme a posi;<o$ertices = #$
for in xrane(%):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 299/359
8!ender 2
for in rane(%): # Uma /ace Q determinada pelos $Qrtices ue /a8em parte dela /ace = []
coords = [( + !, + !), ( + !, + ), ( + , + ), ( + , + !)]
# ]Qrtices da /ace for x, y in coords: $ertices[(x, y)] = $ertices.et((x, y), Hesh.]ert(x, y, !)) /ace.append($ertices[(x, y)])
# Sdiciona um o3Aeto -/ace- na lista de /aces da malha mesh./aces.append(Hesh.Face(/ace))
# Sdiciona os $Qrtices na malhafor $ertice in $ertices.$alues(): mesh.$erts.append($ertice)
# *arrea a malha na cenaHesh.PutTaC(mesh, 'chess', ,rue)TedraC()
*a1da$
!ara eecutar c"di&o em !'thon no ambiente do lender# basta carre&ar opro&rama na anela de editor de teto do lender e usar a opção de eecuçãono menu.
5ame engine
%ame engine @ um sot4are ?ue acilita a criação de o&os# simulandodeterminados aspectos da realidade# de orma a possibilitar a interação com
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 300/359
300 8!ender
obetos em tempo real. !ara isso# ele deve implementar váriasuncionalidades ?ue são comuns em o&os# como por eemplo a capacidadede simulação 1sica. I obetivo principal do uso de game engines @ centrar o
oco da criação do o&o no conteKdo# ou sea# mapas 7n1veis8# persona&ens#obetos# diálo&os# trilha sonora e cenas. S comum ?ue vários o&os usem omesmo engine # redu6indo assim# o esorço de desenvolvimento.
Um dos principais recursos ornecidos por game engines @ a capacidade derenderi6ar cenas em 2 ou + em tempo real# &eralmente usando uma
biblioteca &ráica# como o Ipen=L# permitindo animaçDes e eeitos especiais.I componente especiali6ado para esta unção @ conhecido como render engine.
Al@m disso# a simulação 1sica tamb@m @ essencial para um o&o# pararepresentar de orma ade?uada os movimentos dos persona&ens sendoinluenciados pela &ravidade# in@rcia# atrito# detecção de colisDes e outros. Icomponente ?ue reali6a esses cálculos @ chamado Physics /ngine.
Iutra uncionalidade importante @ a l"&ica# ?ue @ como o o&o determina ocomportamento do ambiente e dos persona&ens. Em muitos casos# o gameengine suporta uma ou mais lin&ua&ens para descreve-la.
Is game engines podem incluir outros recursos importantes paradeterminados tipos de o&os# como conectividade. No caso de HHI=7 assie!y u!tip!ayer Cn!ine %ames8# ?ue são muito compleos# ainraestrutura de sot4are @ mais conhecida como midd!e"are.
A populari6ação dos game engines aconteceu durante a d@cada de /,# &raças ad *ot4are# ?ue desenvolveu os o&os ?ue deiniram o &>nero chamado !*
7&irst Person Shooter8# o&os de ação em primeira pessoa. Esses t1tulos tiveramseus engines licenciados para outras empresas# ?ue criaram outros o&osdesenvolvendo o conteKdo do o&o. Em paralelo# os processadores de v1deooram incorporando suporte as unçDes &ráicas cada ve6 mais soisticadas# o?ue acilitou a evolução dos engines. A d tamb@m liberou os game engines dass@ries IIH e Oua3e em =!L.
Al@m de entretenimento# outras áreas podem se beneiciar desses engines.Chamadas &enericamente de serious games # aplicaçDes nas áreas de
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 301/359
8!ender 301
treinamento# ar?uitetura# en&enharia# medicina e mar3etin& estão sepopulari6ando aos poucos.
I lender inclui um game engine &en@rico# ?ue permite a criação de o&os +#usando o pr"prio aplicativo para criação de conteKdo e !'thon para as partescom l"&ica mais complea.
I lender =ame En&ine 7=E8 usa como physics engine o proeto# tamb@mCpen Source # chamado ullet/0. Com ele# @ poss1vel simular o comportamentode corpos r1&idos 7como peças de ma?uinaria8# macios 7como tecidos8#estáticos 7ios8 e intan&1veis 7?ue não são aetados por colisDes8.
I render engine do lender suporta =L*L 7Cpen%L Shading Language8# o ?uepermite ?ue ele utili6e recursos avançados dispon1veis nos processadores dev1deo mais recentes.
<á a l"&ica @ deinida no =E atrav@s de Logic 8ric#s # ?ue se&ue um modelo baseado em eventos. Eventos são associados a um obeto da cena e podem ser&erados por peri@ricos de entrada 7como teclado e mouse8# pelo sistema7tempo8# pelo pr"prio =E 7colisDes# por eemplo8 ou por mensa&ensenviadas por outros obetos. Ouando um ou mais eventos são detectados# o=E toma uma decisão e rea&e de acordo.
Eistem tr>s tipos de $ric#s$
/0 *ite oicial$ http$%%444.bulletph'sics.or&%.
Suadro 27; Suadro 34; Suadro 4;;
%lender K %ullet
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 302/359
302 8!ender
▪ *ensores 7sensors8# ?ue detectam os eventos.▪ Controladores 7contro!!ers8# ?ue relacionam os sensores com os
ativadores ade?uados.▪ Ativadores 7actuators8# ?ue ativam as reaçDes.
No painel Logic # as associaçDes entre os $ric#s pode ser deinida de ormainterativa. I =E tem diversos ativadores prontos# para reali6ar tareas comoencerrar a eecução ou mudar a velocidade do obeto.
I =E pode evocar c"di&o em !'thon para responder aos eventos# atrav@sdo controlador T!'thon. Ouando uma unção em !'thon @ eecutada# ela
recebe como ar&umento o controlador ?ue reali6ou a chamada# com isso @poss1vel identiicar e modiicar o obeto 7on"er8 ?ue possui o controlador.
Eemplo 7m"dulo com unção para teleporte8$
# 5 codin: latin 5
# Hdulo de inter/ace com o Game Eninei"port GameWoic
&ef teleport(cont):
# o3tJm o dono do controller oCn = cont.oCner
# o3tJm a cena scene = GameWoic.et*urrent>cene()
# o3tJm o destino dest = scene.etL3AectWist()['LBrDportal']
# o3tJm as coordenadas do destino x, y, 8 = dest.etPosition()
# mo$e a cYmera para BU acima do destino oCn.setPosition([x, y, 8 + ])
Essa unção muda a posição do obeto# para um U a cima do obeto chamadoTrXportal# independente do lu&ar na cena em ?ue estiver locali6ado.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 303/359
%IP 303
5I)P
=H!/5
7%=5 Image anipu!ation Program8 @ um sot4are de c"di&o aberto bastante conhecido# ?ue implementa várias erramentas para processamentoe edição de ima&ens raster 7com al&uns recursos vetoriais# para lidar comteto# por eemplo8# al@m de al&oritmos de conversão para diversos ormatos.!ermite a manipulação de ima&ens compostas de mKltiplas camadas e possuiuma ar?uitetura baseada em p!ugins ?ue permite implementar novasuncionalidades.
Iri&inalmente# os p!ugins eram criados na lin&ua&em uncional *cheme#
por@m hoe @ poss1vel usar !'thon tamb@m# atrav@s de uma etensãochamada =imp-!'thon/:.
Um p!ugin eito em !'thon deve se&uir os se&uintes passos$▪ mportar &impu$ o m"dulo &impu deine as unçDes e tipos
necessários para o !'thon possa se comunicar com o =H!.▪ einir unção de processamento$ a unção ?ue será utili6ada para
processar a ima&em# usando a A! do =H!.
▪ ;e&istrar a unção$ a unção register:; cadastra a unção deprocessamento na Procedura! *ata$ase 7!8# permitindo ?ue o =H!conheça as inormaçDes necessárias para eecutar o p!ugin.
▪ Eecutar main:;$ rotina principal da A!.
A unção de processamento terá reali6ar al&uns passos para poder intera&ircorretamente com o =H!$
▪ ;eceber variáveis$ a unção recebe como ar&umentos a ima&em 7image8#a camada corrente em edição 7dra"a$!e8 e outros ?ue orem deinidosno re&istro da unção. Is outros parGmetros serão obtidos atrav@s deuma caia de dialo&o apresentada ao usuário antes da eecução.
▪ niciar transação$ inicio da transação atrav@s da unção pd$@gimpEimageEundoEgroupEstart:;. A transação pode ser deseitaposteriormente atrav@s de undo.
▪ !rocessar ima&em$ altera a ima&em ou a camada atrav@s das unçDesdeinidas na A!.
/5 Site oicial$ http$%%444.&imp.or&% .
/: ocumentação dispon1vel em$ http$%%444.&imp.or&%docs%p'thon%inde.html.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 304/359
30' %IP
▪ Ferminar transação$ encerra a transação atrav@s da unção pd$@gimpEimageEundoEgroupEend:;.
Com isso# o processamento reali6ado pelo p!ugin terá um comportamentoconorme com outras uncionalidades presentes no sot4are# incluindo acapacidade de ter a operação deseita 7undo8.
Eemplo$
# 5 codin: latin 5
# ?mporta a inter/ace para o G?HPfro" imp/u i"port *
&ef stonif(im, draCa3le, /racture=%, picture=%): ------ # ?nicia a transa;<o para UL pd3.impDimaeDundoDroupDstart(im)
# *ria uma camada de la$a pd3.scriptD/uDla$a(im, draCa3le, !, !, 7, 'German /la smooth', , , !) la$a = im.layers[!]
C, h = im.Cidth, im.heiht
# *ria uma camada de rudo roc\ = imp.Wayer(im, 'Toc\', C, h, TGBD?HSGE, !!, HUW,?PWDHLE) pd3.impDimaeDaddDlayer(im, roc\, !) pd3.pluDinDsolidDnoise(im, roc\, !, !, !, , 4, 4)
# Splica rele$o nas camadas pd3.pluDinD3umpDmap(im, roc\, la$a, /racture, 4, , !, !, !, !, , !, !)
pd3.pluDinD3umpDmap(im, roc\, draCa3le, picture, 4, %!, !, !, !, !, , !, !) la$a.$isi3le = !
# *om3ina as camadas da imaem em uma s im./latten() pd3.impD3rihtnessDcontrast (im.layers[!], %!, !)
# ,ermina a transa;<o pd3.impDimaeDundoDroupDend(im)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 305/359
%IP 30)
# Teistra a /un;<o na PBreister( # ?denti/ica;<o
'>toni/y', '->toni/y- the imae...', '->toni/y- the imae Cith some noise', 'Wui8 Eduardo Bores', 'Wui8 Eduardo Bores', '2!!=2!!', # Wocali8a;<o no menu '?mae0FiltersTender>toni/y...', # Hodos suportados (todos
'5', # ParYmetros
[ (PFD?,, '/racture', 'Fracture poCer', %), (PFD?,, 'picture', 'Picture poCer', %) ], # Tesultados [], stoni/y)
# Executa o pluinmain()
<anela de opçDes$
Eemplo dos passos para a &eração da ima&em$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 306/359
30, %IP
I =H! tamb@m permite ?ue os p!ugins seam eecutados atrav@s de linha decomando# usando os parGmetros T--no-interace --batch.
I script precisa estar numa pasta em ?ue o =H! possa encontra-lo. !ara o=H! 2.:# a pasta de p!ugins do usuário ica em .&imp-2.:%plu&-ins abaio dodiret"rio home do usuário. Al@m disso# a etensão re?uer ?ue !'=FP e suasdepend>ncias esteam instaladas.
Jele$o Jele$o
Ju!do
0a$aCom"ina
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 307/359
In#scape 30-
Inscape
I editor de ima&ens vetoriais n3scape/)
permite o uso do !'thon comolin&ua&em script # para a criação de etensDes. I aplicativo utili6a o *= comoormato nativo e implementa vários recursos previstos no padrão.
As etensDes para o n3scape servem principalmente para a implementaçãode iltros e eeitos. En?uanto outros aplicativos 7como o lender8 apresentamuma A! na orma de m"dulos para o interpretador# o n3scape passaar&umentos pela linha de comando e transere inormaçDes pela entrada esa1da padrão do sistema operacional# de orma similar aos utilitários de
tratamento de teto encontrados em sistemas UN. Com isso# a etensão temacesso apenas aos elementos ?ue a6em parte do documento# e não a interace&ráica do aplicativo. Oual?uer interação com o usuário durante a eecuçãoica por conta da etensão.
A criação e manipulação das estruturas de dados @ eita usando HL# comoprev> a especiicação do ormato *=# permitindo com isso o uso de m"duloscomo o /!ement+ree.
!ara simpliicar o processo# o n3scape prov> o m"dulo chamado in#e # ?uedeine estruturas básicas para etensDes. Com esse m"dulo# novas etensDespodem ser criadas por herança a partir de uma classe chamada /ffect.
Eemplo 7randomtet.p'8$
#1 usr3inen$ python# 5 codin: latin 5
i"port randomi"port in\exi"port simplestyle
class an&o"6et(in\ex.E//ect): --- Tepete um texto aleatoriamente dentro de uma Irea.
/) *ite oicial$ http$%%444.in3scape.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 308/359
30. In#scape
--- &ef init (sel/ ):
# E$oca a iniciali8a;<o da superclasse in\ex.E//ect. DDinitDD(sel/ )
# Sdiciona um parYmetro para ser rece3ido do ?n\scape sel/ .LptionParser.addDoption('t', 'texto', action = 'store', type = 'strin', dest = 'texto', de/ault = 'Python', help = ',exto para ser randomi8ado')
sel/ .LptionParser.addDoption('', 'uantidade', action='store', type='int',
dest='uantidade', de/ault=2!, help='uantidade de $e8es ue o texto irI aparecer')
sel/ .LptionParser.addDoption('l', 'larura', action='store', type='int', dest='larura', de/ault=!!!, help='Warura da Irea')
sel/ .LptionParser.addDoption('c', 'altura', action='store', type='int', dest='altura', de/ault=!!!,
help='Sltura da Irea')
&ef effect(sel/ ):
# Pea as $ariI$eis ue /oram passadas como # op;Mes de linha de comando pelo ?n\scape texto = sel/ .options.texto uantidade = sel/ .options.uantidade larura = sel/ .options.larura altura = sel/ .options.altura
# Tai8 do >]G s$ = sel/ .document.etroot()
# Sltura e larura do documento docDlarura = in\ex.unittouu(s$.attri3['Cidth']) docDaltura = in\ex.unittouu(s$.attri3['heiht'])
# *ria uma camada no documento camada = in\ex.etree.>u3Element(s$, '') camada.set(in\ex.add>('la3el', 'in\scape'), 'randomtext') camada.set(in\ex.add>('roupmode', 'in\scape'), 'camada')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 309/359
In#scape 30
for i in xrane(uantidade):
# *ria um elemento para o texto xmltexto = in\ex.etree.Element(in\ex.add>('text','s$')) xmltexto.text = texto
# Posiciona o elemento no documento x = random.randint(!, larura) + (docDlarura ! larura) / 2 xmltexto.set('x', str(x)) y = random.randint(!, altura) + (docDaltura ! altura) / 2 xmltexto.set('y', str(y))
# *entrali8a na $ertical e na hori8ontal
# e muda a cor de preenchimento usando *>> c = random.randint(!!, 2) style = #'textalin' : 'center', 'textanchor': 'middle', '/ill': '#O!2xO!2xO!2x' % (c, c ! %!, c ! 6!)$ xmltexto.set('style', simplestyle./ormat>tyle(style))
# *oloca o texto na camada camada.append(xmltexto)
if DDnameDD == 'DDmainDD': rt = Tandom,ext() rt.a//ect()
!ara ?ue o n3scape reconheça a nova etensão# @ necessário criar um ar?uivoHL com a coni&uração# ?ue inorma ao aplicativo os m"dulos e osparGmetros usados pela etensão# incluindo os tipos# limites e valores padrãodesses parGmetros# para ?ue ele possa intera&ir com o usuário atrav@s de umacaia de dialo&o antes da eecução para obter os valores deseados. Is
parGmetros são passados como ar&umentos na linha de comando ?uando oscript @ eecutado.
Ar?uivo de coni&uração 7randomtet.in8$
<xml $ersion@-.!- encodin@-U,F=->in\scapeextensionxmlns@-http:CCC.in\scape.ornamespacein\scapeextension-0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 310/359
310 In#scape
Dname0Tandom,extDname0 id0or.e\ips./ilter.randomtextid0 dependency type@-executa3le-
[email protected] dependency type@-executa3le-location@-extensions-0in\ex.pydependency0 param name@-texto- type@-strin- Duitext@-,exto-0Pythonparam0 param name@-uantidade- type@-int- min@-- max@-!!- Duitext@-uantidade-02!param0 param name@-larura- type@-int- min@-- max@-!!!!- Duitext@-Warura-0!!!param0 param name@-altura- type@-int- min@-- max@-!!!!- Duitext@-Sltura-0!!!param0 e//ect0
o3Aecttype0allo3Aecttype0 e//ectsmenu0 su3menu Dname@-Tender- 0 e//ectsmenu0 e//ect0 script0 command reldir@[email protected] script0in\scapeextension0
<anela com os parGmetros da etensão$
Eemplo de sa1da 7?uantidade i&ual a (,,# lar&ura i&ual a :,, e altura i&ual a2,,8$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 311/359
In#scape 311
Fanto o pro&rama ?uanto o ar?uivo de coni&uração precisam icar na pastade etensDes 7shareZetensions# dentro da pasta de instalação# para a versão
Jindo4s8 para ?ue seam encontrados pelo aplicativo e o nome do ar?uivode coni&uração precisa ter etensão T.in.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 312/359
312 8rCffice@org
+r,fficeBorg
rIice.or&/9
@ um conhecido pacote de automação de escrit"rios de c"di&oaberto# ?ue inclui editor de tetos# planilha e outros aplicativos. Al@m disso# orIice.or& tamb@m suporta !'thon 7entre outras lin&ua&ens8$
▪ Como lin&ua&em de macro# permitindo a automati6ação de tareas.▪ !ara a construção de etensDes 7add ons8.▪ Em um serviço para atender coneDes# atrav@s de uma A! chamada
UNI 75niersa! =et"or# C$Gects8.
Eemplo de macro$
# 5 codin: latin 5
# S macro de$e ser executada a partir do# BrL//ice.or *alc
&ef plan(): --- Preenche uma planilha ---
# L3tJm o documento para o contexto de script doc = >*T?P,*L,E,.etocument()
# S primeira planilha do documento sheet = doc.et>heets().etBy?ndex(!)
col = lin = ! a = ord('S')
# *ria uma linha com os ttulos para as colunas
for titulo in ('an', 'Fe$', 'Har', ',otal'):
col += sheet.et*ellByPosition(col, lin).set>trin(titulo)
# E coloca uma /rmula com somatrio na Nltima linha coluna = chr(a + col) /ormula = '@>UH(Os2:Os6' % (coluna, coluna) sheet.et*ellByPosition(col, lin + 6).setFormula(/ormula)
/9 ispon1vel em$ http$%%444.broice.or&%.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 313/359
8rCffice@org 313
for lin in xrane(, 6):
# umera as linhas sheet.et*ellByPosition(!, lin).set]alue(lin)
# *oloca somatrios no /im de cada linha /ormula = '@>UH(BOd:Od' % (lin + , lin + ) sheet.et*ellByPosition(4, lin).setFormula(/ormula)
# Preenche os dados for col in (, 2, %): sheet.et*ellByPosition(col, lin).setFormula('@!5TS(')
# >u3stitui a /rmula pelo $alor $al = sheet.et*ellByPosition(col, lin).et]alue() sheet.et*ellByPosition(col, lin).set]alue($al)
return one
*a1da$
!ara ?ue o rIice.or& possa identiicar o script escrito em !'thon como umar?uivo de macro# ele precisa estar na pasta para scripts em !'thon# ?ue noJindo4s ica em TasisZshareZ*criptsZp'thon# dentro da pasta deinstalação do rIice.or&.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 314/359
31' 8rCffice@org
Eemplo de &eração de relat"rio em ! atrav@s do editor de teto 7Jriter8#atrav@s da !'thon UNI rid&e$
# 5 codin: latin 5
# Para iniciar o BrL//ice.or como ser$idor:# sCriter.exe headless# -accept@pipe"name@pyurp>tarL//ice.>er$iceHanaer-
i"port osi"port unofro" com.sun.star.3eans i"port Property]alue
# ados...mus = [('Srtista', 'Faixa'), ('Xin *rimson', '>tarless'), ('es', '>i3erian Xhatru'), ('Wed Reppellin', 'o uarter'), ('Genesis', '>upper9's Teady')]
# L3tJm o nNmero e o tamanho dos reistrosroCs = len(mus)cols = len(mus[!])
# ?nicio do -Boiler Plate-...
# *ontexto de componente localloc = uno.et*omponent*ontext()
# Para resol$er UTWsres = loc.>er$iceHanaer.create?nstance^ith*ontext( 'com.sun.star.3ride.UnoUrlTesol$er', loc)
# *ontexto para a UTWcon = res.resol$e('uno:pipe"name@pyurp>tarL//ice.*omponent*ontext')
# ocumento correntedes\top = con.>er$iceHanaer.create?nstance^ith*ontext( 'com.sun.star./rame.es\top', con)
# Fim do -Boiler Plate-...
# *ria um documento no$o no ^riterdoc = des\top.load*omponentFromUTW('pri$ate:/actorysCriter', 'D3lan\', !, ())
# *ursor de texto
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 315/359
8rCffice@org 31)
cursor = doc.,ext.create,ext*ursor()
# Huda as propriedades do texto
cursor.setProperty]alue('*harFontame', ']erdana')cursor.setProperty]alue('*harVeiht', 2!)cursor.setProperty]alue('*har^eiht', =!)
# ?nsere o texto no documentodoc.,ext.insert>trin(cursor, 'HNsicas /a$oritas9n', !)
# *ria ta3elata3 = doc.create?nstance('com.sun.star.text.,ext,a3le')ta3.initiali8e(roCs, cols)doc.,ext.insert,ext*ontent(cursor, ta3, !)
# Preenche a ta3elafor roC in xrane(roCs): for col in xrane(cols): cel = chr(ord('S') + col) + str(roC + ) ta3.et*ellByame(cel).set>trin(mus[roC][col])
# Propriedades para exportar o documentoprops = []p = Property]alue()p.ame = 'L$erCrite'
p.]alue = ,rue # >o3rescre$e o documento anteriorprops.append(p)
p = Property]alue()p.ame = 'Filterame'p.]alue = 'CriterDpd/DExport' # ^riter para PFprops.append(p)
# UTW de destino" no ual o arui$o PF serI sal$ourl = uno.systemPath,oFileUrl(os.path.a3spath('musicas.pd/'))
# >al$a o documento como PFdoc.store,oUTW(url, tuple(props))
# Fecha o documentodoc.close(,rue)
*a1da 7ar?uivo !8$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 316/359
31, 8rCffice@org
A A! do rIice.or& @ bastante completa e simpliica várias atividades ?uesão lu&ar comum em pro&ramas para ambiente des#top.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 317/359
Integração com outras !inguagens 31-
Integração com outras linguagens
Eiste hoe muito c"di&o le&ado desenvolvido em diversas lin&ua&ens ?uepode ser aproveitado pelo !'thon# atrav@s de várias ormas de inte&ração.
Uma orma &en@rica de a6er isso @ &erar uma biblioteca compartilhada7shared !i$rary8 atrav@s do compilador da outra lin&ua&em e a6er chamadas aunçDes ?ue estão deinidas na biblioteca.
Como a implementação ori&inal do !'thon @ usando Lin&ua&em C# @ poss1velinte&rar !'thon e C nos dois sentidos$
▪ !'thon -Q C 7!'thon a6 chamadas a um m"dulo compilado em C8.▪ C -Q !'thon 7C evoca o interpretador !'thon em modo em$edded8.
Famb@m @ poss1vel inte&rar o !'thon com ortran usando o utilitário 2p'#?ue a6 parte do proeto Num!'.
+ibliotecas compartilhadas
A partir da versão 2.5# o !'thon incorporou o m"dulo ctypes # ?ue implementa
tipos compat1veis com os tipos usados pela lin&ua&em C e permite evocarunçDes de bibliotecas compartilhadas.
I m"dulo prov> várias ormas de evocar unçDes. unçDes ?ue se&uem aconvenção de chamada stdca!! # como a A! do Jindo4s# podem seracessadas atrav@s da classe "ind!!. *ynamic!in# !i$rary 7LL8 @ aimplementação de bibliotecas compartilhadas ?ue são usadas no Jindo4s.
Eemplo com "ind!!$
# 5 codin: latin 5
i"port ctypes
# E$ocando a caixa de mensaens do ^indoCs# Ls arumentos s<o: Aanela pai" mensaem"# ttulo da Aanela e o tipo da Aanela.# S /un;<o retorna um inteiro" ue
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 318/359
31. Integração com outras !inguagens
# corresponde a ue 3ot<o /oi pressionadoi = ctypes.Cindll.user%2.HessaeBoxS(one, ',este de WW1', 'Hensaem', !)
# L resultado indica ual 3ot<o /oi clicadoprint i
!ara unçDes ?ue se&uem a convenção de chamada cdec! # usada pela maioriados compiladores C# eiste a classe cd!!. !ara as passa&ens de ar&umentos porreer>ncia @ preciso criar uma variável ?ue unciona como um $uffer parareceber os resultados. sso @ necessário para receber strings # por eemplo.
Eemplo com cd!! e $uffer$
# 5 codin: latin 5
i"port ctypes
# ms$crt Q a 3i3lioteca com a maioria das /un;Mes# padrMes da linuaens * no ^indoCs# L ^indoCs coloca automaticamente
# a extens<o do arui$ocli3 = ctypes.cdll.ms$crt
# *ria um 3u//er para rece3er o resultado# a re/erJncia para o 3u//er serI passada para# a /un;<o" ue preenche o 3u//er com o resultados = ctypes.cD3u//er('9!!!', 4!)
# sscan/( Q uma /un;<o ue extrai $alores# de uma strin con/orme uma mascaracli3.sscan/ (',estando sscan/19n', ',estando Os19n', s)
# Hostra o resultadoprint s.$alue
S poss1vel tamb@m evocar unçDes de bibliotecas compartilhadas no Linu$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 319/359
Integração com outras !inguagens 31
i"port ctypes
# *arrea a 3i3lioteca padr<o * no Winux
# S extens<o do arui$o precisa passada# para a /un;<o WoadWi3rary(cli3 = ctypes.cdll.WoadWi3rary(-li3c.so.6-)
# *ria um 3u//er para rece3er o resultados = ctypes.cD3u//er('9!!!', 4!)
# E$oca a /un;<o sprint/ cli3.sprint/ (s, ',estando Os9n', 'sprint/1')
# Hostra o resultado
print s.$alue
Atrav@s de bibliotecas compartilhadas @ poss1vel usar c"di&o desenvolvidoem outras lin&ua&ens de uma maneira simples.
Python = C
I m"dulo escrito em C deve utili6ar as estruturas do !'thon 7?ue estãodeinidas na A! de interace8 para se comunicar com o interpretador !'thon.
Eemplo$
Srui$o: mymodule.c
Python.h de/ine as estruturas do Python em *#include Python.h0
o Python" mesmo os erros sao o3Aetos
static PyL3Aect *HyHoduleErrorQ *hamando a /uncao -system- em *static PyL3Aect *mymoduleDsystem(PyL3Aect *sel/ , PyL3Aect *ars)# const char *commandQ int stsQ
-PySrDParse,uple- desempacota a tupla de parametros -s- sini/ica ue ele de$e identi/icar uma strin
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 320/359
320 Integração com outras !inguagens
if (RPySrDParse,uple(ars, -s-, S command)) retornando UWW era uma excessao caso /alte parametros
return UWWQ
chamando -system-: sts = system(command)Q
-PyDBuild]alue- era o3Aetos ue o Python conhece -i- sini/ica inteiro return PyDBuild]alue(-i-, sts)Q$
,a3ela ue o Python consulta para resol$er
os metodos do modulo e pode ser usado tam3em para erar a documentacao por instrospeccao: dir(" help("...static PyHethode/ HyHoduleHethods[] = # #-system-, mymoduleDsystem, HE,VD]STSTG>, -Executa comandos externos.-$, Fim da ta3ela: #UWW, UWW, !, UWW$$Q
iniciali8acao do modulo:
PyHL??,DFU*initmymodule(3oi&)# L modulo tam3em e' um o3Aeto PyL3Aect *mQ
-PyD?nitHodule- precisa do nome do modulo e da ta3ela de metodos m = PyD?nitHodule(-mymodule-, HyHoduleHethods)Q
Erros...
HyHoduleError = PyErrDeCException(-mymodule.error-, UWW, UWW)Q
-PyD?*TEF- incrementa o numero de re/erencias do o3Aeto PyD?*TEF(HyHoduleError)Q
-PyHoduleDSddL3Aect- adiciona um o3Aeto ao modulo PyHoduleDSddL3Aect(m, -error-, HyHoduleError)Q
$
Ao inv@s de compilar o m"dulo manualmente# use o !'thon para
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 321/359
Integração com outras !inguagens 321
automati6ar o processo. !rimeiro# crie o script$
# Srui$o: setup.py
fro" distutils.core i"port setup, Extension
mymodule = Extension('mymodule', sources = ['mymodule.c'])setup(name = 'HyPac\ae', $ersion = '.!', description = 'Hy Pac\ae', extDmodules = [mymodule])
E para compilar$
python setup.py 3uild
I binário compilado será &erado dentro da pasta Tbuild. I m"dulo pode serusado como ?ual?uer outro m"dulo no !'thon 7atrav@s de import8.
C = Python
I inverso tamb@m @ poss1vel. Um pro&rama escrito em C pode evocar o
interpretador !'thon se&uindo tr>s passos$▪ niciali6ar o interpretador.▪ ntera&ir 7?ue pode ser eito de diversas ormas8.▪ inali6ar o interpretador.
Eemplo$
Srui$o: pyDcall.c
Python.h com as de/inicoes para interair com o interpretador#include Python.h0
int main()# ?niciali8a interpretador Python PyD?nitiali8e()Q
Executando codio Python
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 322/359
322 Integração com outras !inguagens
PyTunD>imple>trin(-import os9n- -/or / in os.listdir('.':9n- - i/ os.path.is/ile(/:9n-
- print /" ':'" os.path.etsi8e(/9n-)Q
Finali8a interpretador Python PyDFinali8e()Q return !Q
$
!ara compilar# @ preciso passar a locali6ação das headers e !i$raries do !'thonpara o compilador C$
cc ?usrincludepython2. 9 Wusrli3python2.con/i 9 lpython2. opyDcall pyDcall.c
IbservaçDes$▪ Esta A! a6 parte do C!'thon 7porte do !'thon escrito em C8.▪ Eistem erramentas para automati6ar o processo para &erar interaces
para sistemas maiores$ *J=# oost.!'thon e *!.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 323/359
Integração com @=/+ 323
Integração com B/%'
ron!'thon//
@ a implementação do interpretador !'thon na lin&ua&em C[.Embora o proeto tenha como obetivo a compatibilidade com C!'thon#eistem al&umas dierenças entre elas. A principal vanta&em do ron!'thonem relação ao C!'thon @ a inte&ração com componentes baseados no
frame"or# .NEF.
I .NEF @ uma inra-estrutura de sot4are criada pela Hicrosot para a criaçãoe eecução de aplicaçDes. A parte principal do .NEF @ o 4ommon Language
untime 7CL;8# ?ue prov> uma s@rie recursos aos pro&ramas# como&erenciamento de mem"ria para as aplicaçDes. Al@m disso# há um vastoconunto de bibliotecas de componentes prontos para uso. As instruçDes daslin&ua&ens de pro&ramação são tradu6idas para intermediate !anguage 7L8reconhecida pelo CL;# permitindo ?ue várias lin&ua&ens seam usadas.
entro dos recursos dispon1veis no frame"or# # eiste o *ynamic Language
// ontes# binários# eemplos# documentação e outras inormaçDes podem ser encontrados
em$ http$%%444.codeple.com%Ji3i%ie4.aspk!roectName`ron!'thon.
/ontesython
!m"olos #r$ore sintática
C0J
Compila,o
O"Letos
'ronythonTerador '0
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 324/359
32' Integração com @=/+
untime 7L;8# ?ue implementa os serviços necessários para lin&ua&ensdinGmicas. I ron!'thon a6 uso desses serviços.
!ara evocar o modo interativo do ron!'thon$
ipy
!ara eecutar um pro&rama$
ipy pro.py
As bibliotecas do C!'thon podem ser usadas dentro do ron!'thon# desde?ue as versDes seam compat1veis.
Eemplo$
i"port sys
# Screscenta o caminho no P,VLPS,V
sys.path.append(r'c:9python29li3')i"port osprint os.listdir('.')
Eemplo usando um componente .NEF$
fro" >ystem.ianostics i"port ProcessProcess.>tart('http:CCC.C%c.or')
A unção Start irá evocar o $ro"ser para abrir a U;L.
Is obetos .NEF podem ser usados ao inv@s dos $ui!tins do !'thon$
i"port >ystemfro" >ystem.*ollections i"port Vashta3le
hash = Vashta3le()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 325/359
Integração com @=/+ 32)
hash['3aixo'] = '4 cordas'hash['uitarra'] = '6 cordas'
for item in hash: print item.Xey, '@0', item.]alue
A classe Hashta$!e tem uncionalidade semelhante ao dicionário do !'thon.
nte&ração com outros componentes .NEF adicionais# como o (indo"s &orms #?ue implementa a interace &ráica# @ eita atrav@s do m"dulo clr. Ap"s aimportação do m"dulo# o ron!'thon passa a usar os tipos do .NEF# ao inv@s
da biblioteca padrão do !'thon.
Eemplo com (indo"s &orms$
# 5 codin: ut/= 5
i"port clr
# Sdiciona re/erJncias para esses componentesclr.SddTe/erence('>ystem.^indoCs.Forms')
clr.SddTe/erence('>ystem.raCin')
# ?mporta os componentesfro" >ystem.^indoCs.Forms i"port *fro" >ystem.raCin i"port *
# *ria uma Aanela/rm = Form(^idth=2!!, Veiht=2!!)
# *oloca ttulo na Aanela/rm.,ext = 'Hini calculadora Python'
# *ria textol3l = Wa3el(,ext='Entre com a express<o:', We/t=2!, ,op=2!, ^idth=4!)# Sdiciona a Aanela/rm.*ontrols.Sdd(l3l)
# *ria caixa de textotxt = ,extBox(We/t=2!, ,op=6!, ^idth=4!)# Sdiciona a Aanela/rm.*ontrols.Sdd(txt)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 326/359
32, Integração com @=/+
# Fun;<o para o 3ot<o&ef onbtnclick(*ars):
tr:
r = repr(e$al(txt.,ext)) HessaeBox.>hoC(txt.,ext + '@' + r, 'Tesultado')
ecept: HessaeBox.>hoC('<o /oi poss$el a$aliar: ' + 9 txt.,ext, 'Erro')
# *ria 3ot<o3tn = Button(,ext='*alcular1', We/t=2!, ,op=!!, ^idth=6!)
3tn.*lic\ += onD3tnDclic\# Sdiciona a Aanela/rm.*ontrols.Sdd(3tn)
# Hostra a Aanela/rm.>hoC()
# Splica;<o entra no loop de e$entos"# esperando pela intera;<o do usuIrioSpplication.Tun(/rm)
nterace do pro&rama$
I mais comum @ usar herança para especiali6ar a classe de anela# em umasolução mais orientada a obetos# encapsulando o c"di&o da criação e
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 327/359
Integração com @=/+ 32-
manipulação dos controles. A se&unda versão do pro&rama usa herança einclui um componente de !ayout$ &!o"LayoutPane!.
# 5 codin: ut/= 5---Hini calculadora Python---i"port clr
clr.SddTe/erence('>ystem.^indoCs.Forms')clr.SddTe/erence('>ystem.raCin')
fro" >ystem.^indoCs.Forms i"port *fro" >ystem.raCin i"port *
class Tanela(Form): --- anela principal --- &ef init (sel/ ): --- ?niciali8a a Aanela ---
sel/ .^idth=2!! sel/ .Veiht=2!!
sel/ .,ext = 'Hini calculadora Python'
sel/ .l3l = Wa3el(,ext='Entre com a express<o:')
sel/ .txt = ,extBox()
sel/ .3tn = Button(,ext='*alcular1') sel/ .3tn.*lic\ += sel/ .onD3tnDclic\
# Wayout automItico para os controles sel/ .panel = FloCWayoutPanel(oc\ = oc\>tyle.Fill) sel/ .panel.*ontrols.Sdd(sel/ .l3l) sel/ .panel.*ontrols.Sdd(sel/ .txt) sel/ .panel.*ontrols.Sdd(sel/ .3tn) sel/ .*ontrols.Sdd(sel/ .panel)
sel/ .>hoC()
Spplication.Tun(sel/ )
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 328/359
32. Integração com @=/+
&ef onbtnclick(sel/ , *ars): ---
Scontece uando o 3ot<o Q pressionado ---
tr: r = repr(e$al(sel/ .txt.,ext)) HessaeBox.>hoC(sel/ .txt.,ext + ' @ ' + r, 'Tesultado')
ecept: HessaeBox.>hoC('<o /oi poss$el a$aliar: ' + 9 sel/ .txt.,ext, 'Erro')
if DDnameDD == 'DDmainDD':
Aanela = anela()
I ron!'thon pode ser usado com o Hono(,, # ?ue uma implementação CpenSource da especiicação do .NEF. I Hono apresenta a vanta&em de serportável# suportando outras plataormas al@m do Jindo4s# por@m nãoimplementa todos os componentes do .NEF 7como o (indo"s &orms8. Eistetamb@m uma E para o ron!'thon# chamada ron!'thon *tudio(,(.
(,,Endereço do proeto$ http$%%444.mono-proect.com%HainX!a&e.
(,(ispon1vel em$ http$%%444.codeple.com%ron!'thon*tudio.
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 329/359
espostas dos eerc?cios I 32
6espostas dos e&erccios I
(. mplementar duas unçDes$▪ Uma ?ue converta temperatura em &raus 4e!sius para &ahrenheit@▪ Iutra ?ue converta temperatura em &raus &ahrenheit para 4e!sius.
Lembrando ?ue$
*olução$
&ef celsiusfahrenheit(c=!):
# round(n" d @0 arredonda n em d casas decimais return round(&. * c / . + %2., 2)
&ef fahrenheitcelsius(/ =!):
return round(. * (/ ! %2.) / &., 2)
# ,estesprint celsiusD/ahrenheit(2%.!)print /ahrenheitDcelsius(2%.4)
2. mplementar uma unção ?ue retorne verdadeiro se o nKmero or primo7also caso contrário8. Festar de ( a (,,.
*olução$
# 5 codin: latin 5
# ,esta se o nNmero Q primo&ef ispri"e(n):
if n < 2: return False
for i in rane(2, n):
F =9
5⋅C 32
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 330/359
330 espostas dos eerc?cios I
if not n % i: return False else:
return ,rue
# Para x de a !!for x in rane(, !): if isDprime(x): print x
+. mplementar uma unção ?ue receba uma lista de listas de comprimentos?uais?uer e retorne uma lista de uma dimensão.
*olução$
&ef flatten(it): --- -Schata- listas... ---
# >e /or uma lista if isinstance(it, list):
ls = []
# Para cada item da lista for item in it: # E$oca /latten( recursi$amente ls = ls + /latten(item) return ls
else: return [it]
# ,estel = [[, [2]], [%, 4], [[, 6], 7]]print /latten(l)
# imprime: )" 2" %" 4" " 6" 7+
0. mplementar uma unção ?ue receba um dicionário e retorne a soma# am@dia e a variação dos valores.
*olução$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 331/359
espostas dos eerc?cios I 331
# 5 codin: latin 5
&ef stat(dic):
# >oma s = sum(dic.$alues())
# HQdia med = s / len(dic.$alues())
# ]aria;<o $ar = max(dic.$alues()) ! min(dic.$alues())
return s, med, $ar
5. Escreva uma unção ?ue$▪ ;eceba uma rase como parGmetro.▪ ;etorne uma nova rase com cada palavra com as letras invertidas.
*olução$
&ef re3erseC(t): --- Usando um loop con$encional. ---
r = t.split() for i in xrane(len(r)): r[i] = r[i][::!] return ' '. Aoin(r)
&ef re3erseM(t):
--- Usando Generator Expression. ---
return ' '. Aoin(s[::!] for s in t.split())
# ,estes/ = ',he uic\ 3roCn /ox Aumps o$er the la8y do'print re$erse(/ )print re$erse2(/ )# mostra: -eh, \ciu nCor3 xo/ spmuA re$o eht y8al od-
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 332/359
332 espostas dos eerc?cios I
:. Crie uma unção ?ue$▪ ;eceba uma lista de tuplas 7dados8# um inteiro 7chave# 6ero por padrão
i&ual8 e um booleano 7reverso# also por padrão8.▪ ;etorne dados ordenados pelo item indicado pela chave e em ordem
decrescente se reverso or verdadeiro.
*olução$
&ef or&tab(dados, cha$e=!, re$erso=False):
# Totina para comparar as tuplas em sort( &ef or&(x, y):
return x[cha$e] ! y[cha$e]
dados.sort( Dord, re$erse=re$erso)
return dados
# ,estest = [(, 2, !), (%, , ), (!, %, %)]print ordDta3(t)print ordDta3(t, )print ordDta3(t, 2)
# Hostra:# )(!" %" %" (" 2" !" (%" " +# )(%" " " (" 2" !" (!" %" %+# )(" 2" !" (!" %" %" (%" " +
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 333/359
espostas dos eerc?cios II 333
6espostas dos e&erccios II
(. mplementar um pro&rama ?ue receba um nome de ar?uivo e &ereestat1sticas sobre o ar?uivo 7nKmero de caracteres# nKmero de linhas enKmero de palavras8
*olução ($
7Economi6ando mem"ria8
# 5 codin: latin 5
/ilename = raCDinput('ome do arui$o: ')inD/ile = /ile(/ilename)
c, C, l = !, !, !
# Para cada linha do arui$ofor line in inD/ile:
# >oma ao nNmero de linhas l +=
# >oma o tamanho da linha ao nNmero de caracteres c += len(line)
# >oma a uantidade de pala$ra C += len(line.split())
inD/ile.close()
print 'Bytes: Od" pala$ras: Od" linhas: Os' % (c, C, l)
*olução 2$
7Economi6ando c"di&o8
# 5 codin: latin 5
/ilename = raCDinput('ome do arui$o: ')
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 334/359
33' espostas dos eerc?cios II
# WJ o arui$o inteiro para uma strinchars = /ile(/ilename).read()
c = len(chars)C = len(chars.split())
# >oma o nNmero de caracteres de no$a linhal = chars.count('9n')
print 'Bytes: Od" pala$ras: Od" linhas: Os' % (c, C, l)
2. mplementar um m"dulo com duas unçDes$▪
matriEsum:Fmatrices; # ?ue retorna a matri6 soma de matri6es de duasdimensDes.▪ came!Ecase:s; # ?ue converte nomes para CamelCase.
*olução$
# 5 codin: latin 5
&ef "atrisu"(*matrices):
--- >oma matri8es de duas dimensMes. --- # Peue a primeira matri8 mat = matrices[!]
# Para cada matri8 da seunda em diante for matrix in matrices[:]:
# Para cada linha da matri8 for x, roC in enumerate(matrix):
# Para cada elemento da linha for y, col in enumerate(roC):
# >ome na matri8 de resposta mat[x][y] += col
return mat
&ef ca"elcase(s): ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 335/359
espostas dos eerc?cios II 33)
Formata strins estaForma. --- return ''. Aoin(s.title().split())
if DDnameDD == 'DDmainDD':
# ,estes print matrixDsum([[, 2], [%, 4]], [[, 6], [7, =]]) print camelDcase('close to the ede')
+. mplementar uma unção ?ue leia um ar?uivo e retorne uma lista de tuplascom os dados 7o separador de campo do ar?uivo @ v1r&ula8# eliminando as
linhas va6ias. Caso ocorra al&um problema# imprima uma mensa&em deaviso e encerre o pro&rama.
Script para &erar os dados de teste$
# 5 codin: latin 5
# ?mporta o mdulo para erar# nNmeros randfmicos
i"port random# S3re o arui$ocs$ = /ile('test.cs$', 'C')
for i in xrane(!!): r = []
for i in xrane(!): # random.randrane( escolhe nNmeros # dentro de um inter$alo. S sintaxe # Q a mesma da /un;<o rane( r.append('O!4d' %random.randrane(!!!))
cs$.Crite('"'. Aoin(r) + '9n')
# Fecha o arui$ocs$.close()
*olução$
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 336/359
33, espostas dos eerc?cios II
# 5 codin: latin 5
&ef loa&cs3(/n):
tr:
# WJ todas as linhas do arui$o lines = /ile(/n).readlines() neCDlines = []
for line in lines: neCDline = line.strip()
# >e hou$er caracteres na linha
if neCDline:
# ue3ra nas $rulas" con$erte para tupla e # acrescenta na sada neCDlines.append(tuple(neCDline.split('"')))
return neCDlines
# ,ratamento de exce;<o ecept:
print 'Lcorreu um erro ao ler o arui$o', /n raise >ystemExit
0. mplementar um m"dulo com duas unçDes$▪ sp!it:fn7 n; # ?ue ?uebra o ar?uivo n em partes de n $ytes e salva com
nomes se?uenciais 7se fn ` ar?.tt# então ar?X,,(.tt# ar?X,,2.tt# ... 8▪ Goin:fn7 fn!ist; ?ue unte os ar?uivos da lista fn!ist em um ar?uivo s" fn.
*olução$
# 5 codin: latin 5---3rea\er.py---
# ue3ra o arui$o em /atias de n 3ytes&ef split(/n, n):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 337/359
espostas dos eerc?cios II 33-
3ytes = list(/ile(/n, 'r3').read()) name, ext = /n.split('.') num =
while 3ytes: out = ''. Aoin(3ytes[:n]) &el 3ytes[:n] neC/n = 'OsDO%d.Os' % (name, num, ext) /ile(neC/n, 'C3').Crite(out) num +=
# unta as /atias em um arui$o&ef oin(/n, /nlist):
out = '' for / in /nlist: out += /ile(/ , 'r3').read() /ile(/n, 'C3').Crite(out)
if DDnameDD == 'DDmainDD': # ,este i"port lo3
split('3rea\er.py', 2!) Aoin('3rea\er2.py', sorted(lo3.lo3('3rea\erD5.py')))
5. Crie um script ?ue$▪ Compare a lista de ar?uivos em duas pastas distintas.▪ Hostre os nomes dos ar?uivos ?ue tem conteKdos dierentes e%ou ?ue
eistem em apenas uma das pastas.
*olução$
# 5 codin: latin 5
i"port os
# omes das pastaspst = 'teste'pst2 = 'teste2'
# Wista o conteNdo das pastaslst = os.listdir(pst)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 338/359
33. espostas dos eerc?cios II
lst2 = os.listdir(pst2)
for /l in lst:
if /l in lst2:
# WJ os arui$os e compara: if /ile(os.path. Aoin(pst, /l)).read() <> 9 /ile(os.path. Aoin(pst2, /l)).read(): print /l, 'di/erente'
# L arui$o n<o estI na seunda pasta else: print /l, 'apenas em', pst
for /l in lst2: # L arui$o n<o estI na primeira pasta if not /l in lst: print /l, 'apenas em', pst2
:. aça um script ?ue$▪ Leia um ar?uivo teto.▪ Conte as ocorr>ncias de cada palavra.
▪ Hostre os resultados ordenados pelo nKmero de ocorr>ncias.
*olução$
# 5 codin: latin 5
i"port strin
# WJ o arui$otexto = /ile('note.txt').read()
textoDlimpo = ''
# Wimpa o textofor car in texto: if not car in strin.punctuation: textoDlimpo += car
# >epara as pala$raspala$ras = textoDlimpo.split()
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 339/359
espostas dos eerc?cios II 33
# *ontaresp = #$for pala$ra in pala$ras:
resp[pala$ra] = resp.et(pala$ra, !) + saida = resp.items()
# Lrdena&ef c"p(x, y): return x[!] ! y[!]saida.sort(cmp=cmp, re$erse=,rue)
# ?mprimefor \, $ in saida: print \, '@0', $
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 340/359
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 341/359
espostas dos eerc?cios III 3'1
fro" itertools i"port count
# ]eri/ica se o nNmero Q primo&ef ispri"e(n):
if n < 2: return False
for i in xrane(2, n): if not n % i: return False else: return ,rue
# Generator Expressionprimes = (i for i in count() if isDprime(i))
# ,este: !! primeiros primosfor i in rane(!!): print primes.next()
+. mplementar um &erador ?ue produ6a tuplas com as cores do padrão ;=7;# = e variam de , a 2558 usando range:; e uma unção ?ue produ6a uma
lista com as tuplas ;= usando range:;. Compare a perormance.
*olução$
# 5 codin: latin 5
&ef rblst():
r3 = [] for r in rane(26):
for in rane(26): for 3 in rane(26): r3.append((r, , 3))
return r3
&ef rben():
for r in xrane(26): for in xrane(26): for 3 in xrane(26):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 342/359
3'2 espostas dos eerc?cios III
iel& (r, , 3)
i"port time
tt = time.time()l = r3Dlst()print time.time() ! tt
tt = time.time()for color in r3Den(): passprint time.time() ! tt
0. mplementar um &erador ?ue leia um ar?uivo e retorne uma lista de tuplascom os dados 7o separador de campo do ar?uivo @ v1r&ula8# eliminando aslinhas va6ias. Caso ocorra al&um problema# imprima uma mensa&em deaviso e encerre o pro&rama.
*olução$
# 5 codin: latin 5
&ef loa&cs3(/n):
tr: for line in /ile(/n): neCDline = line.strip()
if neCDline: iel& tuple(neCDline.split('"'))
ecept: print 'Lcorreu um erro ao ler o arui$o', /n raise >ystemExit
# ,estefor line in loadDcs$('teste.cs$'): print line
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 343/359
espostas dos eerc?cios IV 3'3
6espostas dos e&erccios I#
(. Crie uma classe ?ue modele um ?uadrado# com um atributo lado e osm@todos$ mudar valor do lado# retornar valor do lado e calcular área.
*olução$
# 5 codin: latin 5
class 8uare(o3Aect): --- *lasse ue modela um uadrado. ---
&ef init (sel/ , side=):
sel/ .side = side
&ef etsi&e(sel/ ):
return sel/ .side
&ef setsi&e(sel/ , side):
sel/ .side = side
&ef etarea(sel/ ):
# S Irea Q o uadrado do lado return sel/ .side ** 2
# ,estessuare = >uare(2)suare.setDside(%)
print suare.etDarea()
2. Crie uma classe derivada de lista com um m@todo retorne os elementos dalista sem repetição.
*olução$
# 5 codin: latin 5
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 344/359
3'' espostas dos eerc?cios IV
class ?ist(list):
&ef uni8ue(sel/ ): --- Tetorna a lista sem repeti;Mes. ---
res = [] for item in sel/ :
if item not in res: res.append(item)
return res
# ,estel = Wist([, , 2, 2, 2, %, %])
print l.uniue()
+. mplemente uma classe 4arro com as se&uintes propriedades$▪ Um ve1culo tem um certo consumo de combust1vel 7medidos em 3m %
litro8 e uma certa ?uantidade de combust1vel no tan?ue.▪ I consumo @ especiicado no construtor e o n1vel de combust1vel inicial@ ,.
▪ orneça um m@todo moer:#m; ?ue receba a distGncia em ?uilmetros eredu6a o n1vel de combust1vel no tan?ue de &asolina.
▪ orneça um m@todo gaso!ina:; # ?ue retorna o n1vel atual decombust1vel.
▪ orneça um m@todo a$astecer:!itros; # para abastecer o tan?ue.
*olução$
# 5 codin: latin 5
class 0arro(o3Aect): --- *lasse ue calcula o consumo de um carro. ---
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 345/359
espostas dos eerc?cios IV 3')
tanue = !
&ef init (sel/ , consumo):
sel/ .consumo = consumo
&ef "o3er(sel/ , \m):
asto = sel/ .consumo * \m
if sel/ .tanue > asto: sel/ .tanue = sel/ .tanue ! asto else:
sel/ .tanue = !
&ef abastecer(sel/ , litros):
sel/ .tanue = sel/ .tanue + litros
&ef asolina(sel/ ):
return sel/ .tanue
# ,este
carro = *arro(consumo=)carro.a3astecer(litros=22!)carro.mo$er(\m=2!)print carro.asolina()
0. mplementar uma classe Vetor$▪ Com coordenadas # ' e 6.▪ Oue suporte soma# subtração# produto escalar e produto vetorial.▪ Oue calcule o m"dulo 7valor absoluto8 do vetor.
*olução$
# 5 codin: latin 5
i"port math
class Uetor(o3Aect):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 346/359
3', espostas dos eerc?cios IV
&ef init (sel/ , x, y, 8):
sel/ .x = /loat(x)
sel/ .y = /loat(y) sel/ .8 = /loat(8)
&ef repr (sel/ ):
return ']etor(x@O./" y@O./" 8@O./' % (sel/ .x, sel/ .y, sel/ .8)
&ef a&& (sel/ , $):
x = sel/ .x + $.x y = sel/ .y + $.y
8 = sel/ .8 + $.8 return ]etor(x, y, 8)
&ef sub (sel/ , $):
x = sel/ .x ! $.x y = sel/ .y ! $.y 8 = sel/ .8 ! $.8 return ]etor(x, y, 8)
&ef abs (sel/ ):
tmp = sel/ .x ** 2 + sel/ .y ** 2 + sel/ .8 ** 2 return math.srt(tmp)
&ef "ul (sel/ , $):
if isinstance($, ]etor): x = sel/ .y * $.8 ! $.y * sel/ .8 y = sel/ .8 * $.x ! $.8 * sel/ .x 8 = sel/ .x * $.y ! $.x * sel/ .y else:
x = sel/ .x * /loat($) y = sel/ .y * /loat($) 8 = sel/ .8 * /loat($) return ]etor(x, y, 8)
$etor = ]etor(, 2, %)
print a3s($etor)print ]etor(4., , 6) + $etorprint ]etor(4., , 6) ! $etorprint ]etor(4., , 6) * $etor
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 347/359
espostas dos eerc?cios IV 3'-
print ]etor(4., , 6) *
5. mplemente um m"dulo com$▪ Uma classe Ponto # com coordenadas # ' e 6.▪ Uma classe Linha # com dois pontos A e # e ?ue calcule o comprimento
da linha.▪ Uma classe +riangu!o # com dois pontos A# e C# ?ue calcule o
comprimento dos lados e a área.
*olução$
class 2onto(o3Aect):
&ef init (sel/ , x, y, 8):
# *oordenadas sel/ .x = /loat(x) sel/ .y = /loat(y) sel/ .8 = /loat(8)
&ef repr (sel/ ):
return '(O2./" O2./" O2./' % 9
(sel/ .x, sel/ .y, sel/ .8)
class ?inha(o3Aect):
&ef init (sel/ , a, 3):
# Pontos sel/ .a = a sel/ .3 = 3
&ef co"p(sel/ ):
x = sel/ .3.x ! sel/ .a.x y = sel/ .3.y ! sel/ .a.y 8 = sel/ .3.8 ! sel/ .a.8
return round((x ** 2 + y ** 2 + 8 ** 2)9 ** ., )
&ef repr (sel/ ):
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 348/359
3'. espostas dos eerc?cios IV
return 'Os @0 Os' % 9
(sel/ .a, sel/ .3)
class 6rianulo(o3Aect):
&ef init (sel/ , a, 3, c):
# ]ertices sel/ .a = a sel/ .3 = 3 sel/ .c = c
# Wados
sel/ .a3 = Winha(a, 3) sel/ .3c = Winha(3, c) sel/ .ca = Winha(c, a)
&ef area(sel/ ):
# *omprimento dos lados a3 = sel/ .a3.comp() 3c = sel/ .3c.comp() ca = sel/ .ca.comp()
# >emiperimetro p = (a3 + 3c + ca) / 2.
# ,eorema de Veron return round((p * (p ! a3) * (p ! 3c) 9 * (p ! ca)) ** ., )
&ef repr (sel/ ):
return 'Os @0 Os @0 Os' % 9 (sel/ .a, sel/ .3, sel/ .c)
# ,estesa = Ponto(2, %, )3 = Ponto(, , 4)c = Ponto(4, 2, )l = Winha(a, 3)t = ,rianulo(a, 3, c)
print 'Ponto S:', aprint 'Ponto B:', 3print 'Ponto *:', c
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 349/359
espostas dos eerc?cios IV 3'
print 'Winha:', lprint '*omprimento:', l.comp()print ',rianulo:', tprint 'Srea:', t.area()
# Hostra:# Ponto S: (2.!" %.!" .!# Ponto B: (.!" .!" 4.!# Ponto *: (4.!" 2.!" .!# Winha: (2.!" %.!" .! @0 (.!" .!" 4.!# *omprimento: 4.7# ,rianulo: (2.!" %.!" .! @0 (.!" .!" 4.! @0 (4.!" 2.!" .!# Srea: %.&
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 350/359
3)0 espostas dos eerc?cios V
6espostas dos e&erccios #
(. mplementar uma classe Dnima! com os atributos$ nome# esp@cie# &>nero#peso# altura e idade. I obeto derivado desta classe deverá salvar seu estadoem ar?uivo com um m@todo chamado Tsalvar e recarre&ar o estado em umm@todo chamado Tdesa6er.
*olução$
# 5 codin: latin 5
i"port pic\le
class 7ni"al(o3Aect): --- *lasse ue representa um animal. ---
attrs = ['nome', 'especie', 'enero', 'peso', 'altura', 'idade']
&ef init (sel/ , **ars):
# *rie os atri3utos no o3Aeto a partir da lista # Ls atri3utos tem one como $alor de/ault for attr in sel/ .attrs: setattr(sel/ , attr, ars.et(attr, one))
&ef repr (sel/ ):
dicDattrs = #$ for attr in sel/ .attrs: dicDattrs[attr] = etattr(sel/ , attr) return 'Snimal: Os' % str(dicDattrs)
&ef sal3ar(sel/ ):
--- >al$a os dados do animal. --- dicDattrs = #$ for attr in sel/ .attrs: dicDattrs[attr] = etattr(sel/ , attr)
pic\le.dump(dicDattrs, /ile('a.p\l', 'C'))
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 351/359
espostas dos eerc?cios V 3)1
&ef &esfaLer(sel/ ):
--- Testaura os Nltimos dados sal$os. --- attrs = pic\le.load(/ile('a.p\l'))
for attr in attrs: setattr(sel/ , attr, attrs[attr])
# ,esteato = Snimal(nome=',in\er', especie='Gato', enero='m', peso=6, altura=!.%!, idade=4)
ato.sal$ar()ato.idade = print atoato.des/a8er()print ato
2. mplementar uma unção ?ue ormate uma lista de tuplas como tabelaBFHL.
*olução$
# 5 codin: latin 5
# L mdulo >trin?L implementa uma classe# de strins ue se comportam como arui$osi"port >trin?L
&ef tablefor"at(dataset):
--- *lasse ue representa um animal. ---
out = >trin?L.>trin?L() out.Crite('ta3le0')
for roC in dataset: out.Crite('tr0') for col in roC: out.Crite('td0Ostd0' % col)
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 352/359
3)2 espostas dos eerc?cios V
out.Crite('tr0')
out.Crite('ta3le0')
out.see\(!) return out.read()
+. mplementar uma aplicação (e$ com uma saudação dependente dohorário 7eemplos$ Tom dia# são ,/$,,.# Toa tarde# são (+$,,. e Toa noite#são 2+$,,.8.
*olução$
# 5 codin: latin 5
i"port timei"port cherrypy
class oot(o3Aect): --- Tai8 do site. ---
gcherrypy.expose &ef in&e(sel/ ): --- Exi3e a sauda;<o con/orme o horIrio do sistema. ---
# WJ a hora do sistema hour = 'O!2d:O!2d' % time.localtime()[%:]
if '!6:!!' < hour <= '2:!!': salute = 'Bom dia'
elif '2:!!' < hour <= '=:!!': salute = 'Boa tarde' else: salute = 'Boa noite'
# Tetorna a mensaem para o 3roCser return 'Os" s<o Os.' % (salute, hour)
cherrypy.uic\start(Toot())
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 353/359
espostas dos eerc?cios V 3)3
0. mplementar uma aplicação (e$ com um ormulário ?ue receba epressDes!'thon e retorne a epressão com seu resultado.
*olução$
# 5 codin: latin 5
i"port trace3ac\i"port cherrypy
class oot(o3Aect):
# Hodelo para a pIina V,HW
template = ''' html03ody0 /orm action@--0 input type@-text- name@-exp- $alue@-Os- 0 input type@-su3mit- $alue@-en$iar-0 pre0Ospre0 3ody0html0'''
gcherrypy.expose &ef in&e(sel/ , exp=''):
out = '' if exp:
# ,ente a$aliar a express<o tr: out = e$al(exp)
# >e der errado" mostre a mensaem do erro ecept: out = trace3ac\./ormatDexc()
return sel/ .template % (exp, out)
cherrypy.uic\start(Toot())
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 354/359
3)' espostas dos eerc?cios VI
6espostas dos e&erccios #I
(. mplementar um m"dulo com uma unção tri$onacci:n; ?ue retorne umalista de n nKmeros de Fribonacci# aonde n @ o parGmetro da unção. açatestes da unção caso o m"dulo sea eecutado como principal.
*olução$
# 5 codin: latin 5
&ef tribonacci(n):
--- Tetorna uma lista com n elementos de ,ri3onacci.
000 t @ )" " 2" 4" 7" %" 24" 44" =" 4&" 9 274" !4" &27" 7!" %%6" 76=" !6!&" &%" 9 %=&!" 66!2" 24" 22%%7+ 000 t @@ tri3onacci(22 ,rue 000 tri3onacci('22' ,race3ac\ (most recent call last: File -pyroDser$er.py-" line 26" in module0
print ist(.tri3onacci('22' File -pyroDser$er.py-" line 4" in tri3onacci raise ,ypeError ,ypeError --- if type(n) is not int: raise ,ypeError
# Ls % primeiros elementos da seuJncia t = [, , 2]
if
n <
4: return t[:n]
for i in rane(%, n):
# >oma os % elementos /inais t.append(sum(t[!%:]))
return t
&ef &octest():
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 355/359
espostas dos eerc?cios VI 3))
--- E$oca o doctest. ---
i"port doctest
doctest.testmod()
if DDnameDD == -DDmainDD-:
Ddoctest()
2. mplementar$▪
um servidor ?ue publi?ue um obeto distribu1do e este evo?ue a unçãotri$onacci.▪ um cliente ?ue use o obeto distribu1do para calcular a se?u>ncia de
Fribonacci.
*olução$
*ervidor$
# 5 codin: latin 5
i"port Pyro.core
# ?mporta o mdulo com a /un;<oi"port tri3
class Kist(Pyro.core.L3ABase):
gstaticmethod &ef tribonacci(n):
return tri3.tri3onacci(n)
if DDnameDD == 'DDmainDD':
# e/ine a porta ,*P?P usada pelo Pyro Pyro.con/i.PTLDPLT, = ====
# e/ine o limite de cliente ao mesmo tempo Pyro.con/i.PTLDHS*LE*,?L> = 2!!!
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 356/359
3), espostas dos eerc?cios VI
Pyro.core.init>er$er()
# norane@ /a8 com ue o Pyro sempre use a mesma porta
daemon = Pyro.core.aemon(norane = )
# e/ine o limite de tempo daemon.set,imeout(%!!)
uri = daemon.connect(ist(),'dist') daemon.reuestWoop()
Cliente$
# 5 codin: latin 5
i"port Pyro.core
# UTW com a portaurl = 'PTLWL*:27.!.!.:====dist'proxy = Pyro.core.etProxyForUT?(url)
# ,este com atQ de8 elementosfor i in rane(!):
print i + , '@0', proxy.tri3onacci(i + )
*a1da$
Pyro *lient ?nitiali8ed. Usin Pyro ]%.7 @0 )+2 @0 )" +% @0 )" " 2+4 @0 )" " 2" 4+
@0 )" " 2" 4" 7+6 @0 )" " 2" 4" 7" %+7 @0 )" " 2" 4" 7" %" 24+= @0 )" " 2" 4" 7" %" 24" 44+& @0 )" " 2" 4" 7" %" 24" 44" =+! @0 )" " 2" 4" 7" %" 24" 44" =" 4&+
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 357/359
Undice remissio 3)-
ndice remissivo
Abstract ase Classes............................................................................................(+:Ar?uivos...................................................................................................................)2Arranos..................................................................................................................(/)anco de dados...........................................................................(52# (:5p.# (:9# ())=E......................................................................................................................+,(p.ibliotecas compartilhadas..................................................................................+()ibliotecas de terceiros...........................................................................................95lender...........................................................................................(+# 2:,# 2/,p.# 2//rIice.or&.........................................................................(+# 2(,# 29/# +(2pp.# +(:
'tecode................................................................................................................(:p.Cherr'!'.........................................................................................................(9(# (9:Cherr'Femplate.....................................................................................(9(# (9+# (9:Classes................................................................(,/pp.# ((0# (()# (2,# (22# (2)# (+0Comentários uncionais..........................................................................................22Controle de luo.....................................................................................................2:C!'thon....................................................................................................................(0...............................................................................................................(::p.# ())
ecoradores...........................................................................................................(,)ecoradores de classe...........................................................................................(+/icionários.........................................................................................................05# 0)oc *trin&s......................................................................................52# 59# :2# /,# (0(IH..................................................................................................................(5/pp.uc3 F'pin&............................................................................................................(5ElementFree...........................................................................................(5/# (:2# (:+Empacotamento.....................................................................................................29+EceçDes................................................................................................................9)p.alse..........................................................................................................................0/erramentas..............................................................................................................(9irebird................................................................................................................(:/p.unçDes...............................................................................................................+9# 52=ame En&ine............................................................................................2/,# 2//pp.=enerator Epression............................................................................................(,0=eradores................................................................................................................./5=H!......................................................................................................(+# +,+p.# +,:
=lade............................................................................................................2(+p.# 22,
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 358/359
3). Undice remissio
=FPW............................................................................................................2((# 2(+p.Berança...........................................................................................................(()# (2,Berança mKltipla...................................................................................................(2,
Bist"rico...................................................................................................................(0E.........................................................................................................................(9p.n3scape..............................................................................................(+# 29/# +,)pp.nte&ração com .NEF.............................................................................................+2+nterace &ráica.....................................................................................................2((ntrospecção........................................................................................................../,p.ron!'thon................................................................................................+2+pp.# +29
<*IN................................................................................................................(52# (5)
Laços.........................................................................................................................29Lambda...................................................................................................................../)La6' Evaluation......................................................................................................./5List Comprehension...........................................................................................(,+p.Listas...................................................................................................................0,# 0+Hapeamento obeto-relacional............................................................................())Hatplotlib...............................................................................................................2,0Hatri6es..................................................................................................................2,,Hetaclasses.....................................................................................................(((# (+0
H@todos de classe..................................................................................................((2H@todos de obeto.................................................................................................((2H@todos estáticos..................................................................................................((2Hodo interativo.......................................................................................................()H"dulos.................................................................................................:2p.# :9p.# 95HC.............................................................................................................(95p.# (/0H'*OL................................................................................................................(::p.Name Han&lin&.....................................................................................................((+
Namespace.........................................................................................................:2# ::None......................................................................................................................0/p.NKmeros...................................................................................................................+2Num!'............................................................................................................(/)# 2,2Ibetos.........................................................................................................(,/p.# (+0Ibetos distribu1dos..............................................................................................2)(Ipen=L.............................................................................................25+# 2:,pp.# 2:)Iperadores booleanos............................................................................................5,I;H................................................................................................................())# (9:
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf
http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 359/359
Undice remissio 3)
!erormance......................................................................................2)(# 2)0# 2)/pp.!erl............................................................................................................................(0!ersist>ncia.................................................................................................(5(p.# (95
!h'sics en&ine....................................................................................................+,,p.!L...........................................................................................................................20(!ost&re*OL......................................................................................(+# (),p.# ()0pp.!rocessamento de ima&em...................................................................................20(!rocessamento distribu1do...................................................................................2:9!ro&ramação uncional.........................................................................................../)!ropriedades..........................................................................................................(20!s'co....................................................................................................................29,p.
!'2ee...............................................................................................................29+pp.!'IC......................................................................................................................59!'Ipen=L..........................................................................................................2:,p.!M;I.................................................................................................................2)(pp.!'thonic....................................................................................................................2,!MFBIN!AFB.......................................................................................................:2;eleão..................................................................................................................../,;ub'..........................................................................................................................(0*A..............................................................................................................(5/# (:(p.
*eriali6ação.....................................................................................................(5(# (50*=...............................................................................................................(:5# ())*hell.....................................................................................................................(:pp.*intae...................................................................................22# 2:# 2/# 0,# 0+# 05# 52*obrecar&a de operadores............................................................................((,# (2)*OL............................................................................................................(:5pp.# ())*OLite..........................................................................................................(:)p.# ()9*trin&s......................................................................................+0p.# +)pp.# 05# 52# 59
*=.................................................................................................20,# 20)pp.# +,)p.*=i&............................................................................................................20/# 25(Fempo.......................................................................................................................9,Festes automati6ados............................................................................................(0(Fhreads.............................................................................................................(0)pp.Fipa&em dinGmica.............................................................................................(+# (5Fipos..........................................................................................................................(:
mutáveis..................................................................................................+(# +0# 02Hutáveis..........................................................................................+(# +/p.# 0+# 05