python_para_desenvolvedores_-_2a_edicao_-_luiz_eduardo_borges.pdf

359
7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 1/359

Upload: mrfe

Post on 10-Feb-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 1/359

Page 2: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 3: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 4: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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(-(-:

Page 5: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 6: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 :/

Page 7: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:

Page 8: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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/

Page 9: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 10: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 11: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 12: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 13: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 14: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 15: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 16: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 17: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 18: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 19: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 20: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 21: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 22: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 23: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 24: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 25: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 26: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 27: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 28: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 29: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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>

Page 30: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 31: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 32: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 @ %

Page 33: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 34: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 35: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 36: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 37: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 38: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 39: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 40: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 41: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 42: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 43: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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, %]

Page 44: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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]):

Page 45: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 46: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 47: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 48: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 ! !! ! ! ! ! ! ! % ! ! ! !! ! ! ! ! ! ! ! ! ! !

Page 49: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 50: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 %

Page 51: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 52: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 53: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 54: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 55: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 56: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 57: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 58: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 59: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 60: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 61: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 62: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 63: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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]

Page 64: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:

Page 65: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 66: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 67: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 68: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 69: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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]:

Page 70: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 71: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 72: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 73: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)):

Page 74: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 75: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 76: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 77: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 78: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 79: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 80: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 81: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 82: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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!!!

Page 83: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 84: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 85: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 86: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 87: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 88: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 89: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 90: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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]

Page 91: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 92: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 93: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 94: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 95: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 96: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 97: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 98: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 99: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 100: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 101: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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!:;.

Page 102: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 103: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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}

Page 104: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 105: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 106: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 107: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 108: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 109: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 110: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 111: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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  ---

Page 112: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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'):  ---

Page 113: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 114: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 115: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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'+

Page 116: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:;.

Page 117: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 118: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 119: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 120: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 121: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 122: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 123: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 124: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 125: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 126: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 127: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 128: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 129: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):  ---

Page 130: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):  ---

Page 131: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)),

Page 132: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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" % @ %.!

Page 133: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 134: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 135: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 136: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 137: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 138: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 139: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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')

Page 140: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 141: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 142: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 143: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 144: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 145: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 146: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 147: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 148: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 149: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 150: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 151: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 152: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 153: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 154: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 155: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 156: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 157: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 158: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 159: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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>

Page 160: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 161: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 += ' '

Page 162: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 163: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 164: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 165: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 166: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 167: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 168: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 169: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 170: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 171: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 172: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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')

Page 173: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 174: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 __

Page 175: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 176: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 177: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

%'

Page 178: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 179: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 180: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 181: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 182: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 183: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 184: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 185: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 186: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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**%.

Page 187: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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':

Page 188: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 189: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 190: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 190/359

10 V4

[email protected]

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

Page 191: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

[email protected]

/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

Page 192: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 193: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 194: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 195: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 196: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 197: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 198: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.!

Page 199: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:

Page 200: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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++

Page 201: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 202: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 203: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 204: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 205: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 206: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.  ---

Page 207: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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':

Page 208: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 209: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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')

Page 210: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 211: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 212: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 213: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 214: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 215: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 216: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 217: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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('.')[!]

Page 218: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 219: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 220: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 221: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 222: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 223: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 224: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 225: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 226: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 227: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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(!!!)

Page 228: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 229: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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())

Page 230: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 231: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 232: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 233: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 234: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 235: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 236: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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\)

Page 237: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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'%.

Page 238: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 239: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 240: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 241: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 242: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 243: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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---

Page 244: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 245: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&$

Page 246: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 247: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 248: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 249: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$-)

Page 250: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 251: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 252: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:

Page 253: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 254: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 255: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 256: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 257: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 258: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 259: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 260: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 261: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 262: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 263: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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  ---

Page 264: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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>)

Page 265: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 266: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 267: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 268: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 269: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 270: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 271: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 272: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 273: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 274: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 275: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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(')

Page 276: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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[

Page 277: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 278: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 279: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 280: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 281: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 282: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 283: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 284: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 285: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 286: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 287: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 288: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 .

Page 289: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 290: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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%.

Page 291: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 = %!

Page 292: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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']

Page 293: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 294: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 295: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 296: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 296/359

Page 297: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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':

Page 298: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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(%):

Page 299: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 300: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 301: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 302: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 303: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 304: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 305: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 306: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 307: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 308: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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')

Page 309: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 310: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 311: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 312: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&%.

Page 313: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&.

Page 314: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 315: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 316: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 317: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 318: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 319: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 320: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 321: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 322: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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 *!.

Page 323: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 324: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 325: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 326: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 327: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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/ )

Page 328: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.

Page 329: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 330: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 331: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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-

Page 332: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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" !" (!" %" %" (%" " +

Page 333: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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: ')

Page 334: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):  ---

Page 335: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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$

Page 336: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 337: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 338: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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()

Page 339: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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', $

Page 340: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

7/22/2019 Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

http://slidepdf.com/reader/full/pythonparadesenvolvedores-2aedicao-luizeduardoborgespdf 340/359

Page 341: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 342: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 343: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 344: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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.  ---

Page 345: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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):

Page 346: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 347: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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/ ):

Page 348: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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

Page 349: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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: %.&

Page 350: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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'))

Page 351: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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)

Page 352: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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())

Page 353: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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())

Page 354: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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():

Page 355: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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!!! 

Page 356: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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&+

Page 357: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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,

Page 358: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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:

Page 359: Python_para_Desenvolvedores_-_2a_Edicao_-_Luiz_Eduardo_Borges.pdf

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