Escolar Documentos
Profissional Documentos
Cultura Documentos
Pythonparadesenvolvedores 091015065338 Phpapp02
Pythonparadesenvolvedores 091015065338 Phpapp02
Este trabalho est licenciado sob uma Licena Creative Commons Atribuio-Uso No-
Comercial-Compartilhamento pela mesma Licena 2.5 Brasil. Para ver uma cpia desta
licena, visite http://creativecommons.org/licenses/by-nc-sa/.!/br/ ou envie uma carta
para "reative "ommons, #$# %econd %treet, %uite &'', %an (rancisco, "ali)ornia *+#'!,
,%-.
Lui. Eduardo /orges
Python para desenvolvedores
#0 E12345
625 1E 7-8E265
E12345 15 -,956
''*
Python para desenvolvedores / Lui. Eduardo /orges
6io de 7aneiro, Edi:o do -utor, ''*
2%/8 *$;-;!-*'*+!#-'-*
Sumrio
Parte 2 ;
Pre)cio *
2ntrodu:o #'
"aracter<sticas #'
=istrico #'
E>emplo ##
?ers@es ##
9ipagem dinAmica #
/ytecode #
Bodo interativo #
(erramentas #+
"ultura #!
%inta>e #$
"ontrole de )lu>o '
5peradores lgicos #
Laos
(or
Chile &
9ipos !
8Dmeros E
9e>to $
Listas &#
9uplas &
5utros tipos de seFGHncias &&
1icionrios &+
?erdadeiro, )also e nulo &;
(un@es &*
1ocumenta:o +
E>erc<cios 2 +&
Parte 22 ++
Bdulos +!
Bdulos da biblioteca padr:o +$
Escopo de nomes +;
Pacotes !'
/ibliotecas compartilhadas !#
/ibliotecas de terceiros !&
-rFuivos e 2/5 !!
%istema de arFuivos !E
-rFuivos compactados !$
-rFuivos de dados !;
E>ce@es E'
9empo E
2ntrospec:o E!
Bdulo inspect EE
E>erc<cios 22 E;
Parte 222 E*
Ieradores $'
Programa:o )uncional $
Lambda $
Bapeamento $&
(iltragem $+
6edu:o $!
9ransposi:o $E
List "omprehension $$
Ienerator E>pression $$
E>erc<cios 222 $*
Parte 2? ;'
1ecoradores ;#
"lasses ;&
"lasses abertas ;;
=erana simples *'
=erana mDltipla *
Propriedades *!
%obrecarga de operadores *;
Betaclasses #''
9estes automati.ados #'&
E>erc<cios 2? #'$
Parte ? #';
8umPy #'*
-rranJos #'*
Batri.es ###
Ir)icos ##+
Processamento de imagem ##
Ir)icos &1 #$
PersistHncia #&#
%eriali.a:o #&#
K51/ #&&
L-BL #&!
MBL #&;
/anco de dados #++
1/2 #++
%NLite #+!
Postgre%NL #+E
Bapeamento obJeto-relacional #!
Ceb #!!
"herryPy #!E
"herry9emplate #!E
"liente Ceb #!;
B?" #E'
E>erc<cios ? #E*
Parte ?2 #$'
2nter)ace Ir)ica #$#
-rFuitetura #$
"onstruindo inter)aces #$&
9hreads #;+
Processamento distribu<do #;$
5bJetos distribu<dos #*'
Per)ormance #*&
Empacotamento e distribui:o de aplica@es '#
E>erc<cios ?2 '+
-pHndices '!
2ntegra:o com /lender 'E
2ntegra:o com /r5))ice.org #&
2ntegra:o com Linguagem " #E
Python OP " #E
" OP Python #;
2ntegra:o com .8E9 #*
6espostas dos e>erc<cios 2 !
6espostas dos e>erc<cios 22 *
6espostas dos e>erc<cios 222 &!
6espostas dos e>erc<cios 2? &;
6espostas dos e>erc<cios ? ++
6espostas dos e>erc<cios ?2 +;
Qndice remissivo !#
8 Parte I
Parte I
Pre)cio.
2ntrodu:o.
%inta>e.
9ipos.
(un@es.
1ocumenta:o.
E>erc<cios 2.
Prefcio 9
Prefcio
-s linguagens dinAmicas eram vistas no passado apenas como linguagens script, usadas
para automati.ar peFuenas tare)as, porRm, com o passar do tempo, elas cresceram,
amadureceram e conFuistaram seu espao no mercado, a ponto de chamar a aten:o dos
grandes )ornecedores de tecnologia.
?rios )atores contribu<ram para esta mudana, tais como a internet, o so)tSare de cdigo
aberto e as metodologias geis de desenvolvimento.
- internet viabili.ou o compartilhamento de in)orma@es de uma )orma sem precedentes
na histria, Fue tornou poss<vel o crescimento do so)tSare de cdigo aberto. -s
linguagens dinAmicas geralmente s:o cdigo aberto e compartilham as mesmas
)uncionalidades e em alguns casos, os mesmos obJetivos.
- produtividade e e>pressividade das linguagens dinAmicas se encai>am per)eitamente
com as metodologias geis, Fue nasceram do desenvolvimento de so)tSare de cdigo
aberto e de)endem um en)oFue mais pragmtico no processo de cria:o e manuten:o de
so)tSare do Fue as metodologias mais tradicionais.
Entre as linguagens dinAmicas, o Python se destaca como uma das mais populares e
poderosas. E>iste uma comunidade movimentada de usurios da linguagem no mundo, o
Fue se re)lete em listas de discuss:o ativas e muitas )erramentas dispon<veis em cdigo
aberto.
-prender uma nova linguagem de programa:o signi)ica aprender a pensar de outra
)orma. E aprender uma linguagem dinAmica representa uma mudana de paradigma
ainda mais )orte para aFuelas pessoas Fue passaram anos desenvolvendo em linguagens
estticas.
10 Introduo
Introduo
Python
#
R uma linguagem de alt<ssimo n<vel Tem inglHs, Very High Level LanguageU
orientada a obJetos, de tipagem dinAmica e )orte, interpretada e interativa.
Caractersticas
5 Python possui uma sinta>e clara e concisa, Fue )avorece a legibilidade do cdigo )onte,
tornando a linguagem mais produtiva.
- linguagem inclui diversas estruturas de alto n<vel Tlistas, tuplas, dicionrios, data / hora,
comple>os e outrasU e uma vasta cole:o de mdulos prontos para uso, alRm de frae!or"s
de terceiros Fue podem ser adicionados. 9ambRm possui recursos encontrados em outras
linguagens modernas, tais como: geradores, introspec:o, persistHncia, metaclasses e
unidades de teste. Bultiparadigma, a linguagem suporta programa:o modular e
)uncional, alRm da orienta:o a obJetos. Besmo os tipos bsicos no Python s:o obJetos.
- linguagem R interpretada atravRs de #ytecode pela mFuina virtual Python, tornando o
cdigo portvel. "om isso R poss<vel compilar aplica@es em uma plata)orma e rodar em
outras ou e>ecutar direto do cdigo )onte.
Python R um so)tSare de cdigo aberto Tcom licena compat<vel com a $eneral Pu#lic
License TIPLU, porRm menos restritiva, permitindo Fue o Python seJa incorporados em
produtos proprietriosU e a especi)ica:o da linguagem R mantida pela Python %oft!are
&oundation
'
TP%(U.
Python R muito utili.ado como linguagem script em vrios so)tSares, permitindo
automati.ar tare)as e adicionar novas )uncionalidades, entre eles: /r5))ice.org,
Postgre%NL, /lender e I2BP. 9ambRm R poss<vel integrar o Python a outras linguagens,
como a Linguagem ". Em termos gerais, o Python apresenta muitas similaridades com
outras linguagens dinAmicas, como Perl e 6uby.
Histrico
Python )oi criada em #**' por Iuido van 6ossum, no 2nstituto 8acional de PesFuisa para
Batemtica e "iHncia da "omputa:o da =olanda T"C2U e tinha como )oco original
usurios como )<sicos e engenheiros. 5 Python )oi concebido a partir de outra linguagem
e>istente na Rpoca, chamada -/".
=oJe, a linguagem R bem aceita na industria por empresas de alta tecnologia, tais como:
# Pgina o)icial: http://SSS.python.org/.
Endereo na internet da P%(: http://SSS.python.org/ps)/.
Introduo 11
Ioogle Taplica@es (e#U.
Lahoo Taplica@es (e#U.
Bicroso)t T2ronPython: Python para .8E9U.
8oVia Tdispon<vel para as linhas recentes de celulares e P1-sU.
1isney Tanima@es &1U.
Exemplo
E>emplo de programa em Python:
# Exemplo de programa em Python
# Uma lista de instrumentos musicais
instrumentos = ['Baixo', 'Bateria', 'Guitarra']
# Para cada nome na lista de instrumentos
for instrumento in instrumentos:
# mostre o nome do instrumento musical
print instrumento
%a<da:
Baixo
Bateria
Guitarra
8o e>emplo, WinstrumentosX R uma lista contendo itens W/ai>oX, W/ateriaX e WIuitarraX. 7
WinstrumentoX R um nome Fue corresponde a cada um dos itens da lista, con)orme o lao R
e>ecutado.
Verses
- implementa:o o)icial do Python R mantida pela P%( e escrita em ", e por isso R tambRm
conhecida como "Python. - vers:o estvel mais recente est dispon<vel para do!nload no
endereo:
http://SSS.python.org/doSnload/
Para CindoSs, basta e>ecutar o instalador. Para outras plata)ormas, geralmente o Python
J )a. parte do sistema, porRm em alguns casos pode ser necessrio compilar e instalar a
partir dos arFuivos )onte.
1' Introduo
E>istem tambRm implementa@es de Python para .8E9 T2ronPythonU e 7?B T7ythonU.
ipa!em din"mica
Python utili.a tipagem dinAmica, o Fue signi)ica Fue o tipo de uma varivel R in)erido
pelo interpretador em tempo de e>ecu:o Tisto R conhecido como )uc" *ypingU. 8o
momento em Fue uma varivel R criada atravRs de atribui:o, o interpretador de)ine um
tipo para a varivel, com as opera@es Fue podem ser aplicadas.
5 Python tem tipagem )orte, ou seJa, ele veri)ica se as opera@es s:o vlidas e n:o )a.
coer@es automticas entre tipos incompat<veis
&
. Para reali.ar a opera:o entre tipos n:o
compat<veis, R necessrio converter e>plicitamente o tipo da varivel ou variveis antes da
opera:o.
#$tecode
5 cdigo )onte R tradu.ido pelo interpretador para o )ormato #ytecode, Fue R
multiplata)orma e pode ser e>ecutado e distribu<do sem )onte original.
Por padr:o, o interpretador compila os )ontes e arma.ena o #ytecode em disco, para Fue a
pr>ima ve. Fue o e>ecutar, n:o precise compilar novamente o programa, redu.indo o
tempo de carga na e>ecu:o. %e os )ontes )orem alterados, o interpretador se encarregar
de regerar o #ytecode automaticamente, mesmo utili.ando o shell interativo. Nuando um
programa ou um mdulo R evocado, o interpretador reali.a a anlise do cdigo, converte
para s<mbolos, compila Tse n:o houver #ytecode atuali.ado em discoU e e>ecuta na mFuina
virtual Python.
5 #ytecode R arma.enado em arFuivos com e>tens:o W+pyc, T#ytecode normalU ou W+pyo,
T#ytecode otimi.adoU.
5 #ytecode tambRm pode ser empacotado Junto com o interpretador em um e>ecutvel,
para )acilitar a distribui:o da aplica:o.
%odo interati&o
5 interpretador Python pode ser usado de )orma interativa, na Fual as linhas de cdigo
s:o digitadas em um propt Tlinha de comandoU semelhante ao shell do sistema
operacional.
Para evocar o modo interativo basta rodar o Python Tse ele estiver no pathU:
& Em Python, coer@es s:o reali.adas automaticamente apenas entre tipos Fue s:o claramente relacionados,
como inteiro e inteiro longo.
Introduo 1-
python
Ele estar pronto para receber comandos surgir o propt WPPPX na tela.
5 modo interativo R uma caracter<stica di)erencial da linguagem, pois R poss<vel testar e
modi)icar o cdigo de um programa antes da inclus:o do cdigo nos programas, por
e>emplo.
E>emplo do Python sendo usado de )orma interativa Tcom o shell Py"rust
+
U:
5s arFuivos )onte normalmente s:o identi)icados pela e>tens:o W+py, e podem ser
e>ecutados diretamente pelo interpretador:
python apl.py
+ Py"rust R uma )erramenta Fue )a. parte do proJeto S>Python Thttp://SSS.S>python.org/U.
1. Introduo
-ssim o programa Wapl.pyX ser e>ecutado.
'erramentas
E>istem muitas )erramentas de desenvolvimento para Python, como 21Es, editores e shells
TFue aproveitam da capacidade interativa do PythonU.
Integrated )evelopent /nvironents T21EsU s:o pacotes de so)tSare integram vrias
)erramentas de desenvolvimento em um ambiente integrado, com o obJetivo de aumentar
a produtividade do desenvolvedor.
Entre as 21Es Fue suportam Python, encontram-se:
%PE T%taniYs Python EditorU.
Eric.
5pen Zomodo.
Py1ev Tplugin para a 21E EclipseU.
E>istem tambRm editores de te>to especiali.ados em cdigo de programa:o, Fue
possuem )uncionalidades como colori.a:o de sinta>e, e>porta:o para outros )ormatos e
convers:o de codi)ica:o de te>to.
Esses editores suportam diversas linguagens de programa:o, dentre elas o Python:
%ci9E.
8otepad[[.
%hells s:o ambientes interativos para e>ecu:o de comandos, muito Dteis para testar
peFuenas por@es de cdigo e para atividades como data crunching Te>trair in)orma@es de
interessa de massas de dados ou tradu.ir dados de um )ormato para outroU.
-lRm do prprio %hell padr:o do Python, e>istem os outros dispon<veis:
Py"rust Tgr)icoU.
2python Tte>toU.
Empacotadores s:o utilitrios Fue empacotam o bytecode com o interpretador e outras
dependHncias, em um ou mais e>ecutveis e arFuivos compactados, permitindo Fue o
aplicativo rode em mFuinas sem Python instalado.
Entre empacotadores )eitos para Python, est:o dispon<veis:
Pye>e Tapenas para CindoSsU.
c>\(ree.e TportvelU.
Introduo 10
&rae!or"s s:o cole@es de componentes de so)tSare Tbibliotecas, utilitrios e outrosU Fue
)oram proJetados para serem utili.ados por outros sistemas.
-lguns frae!or"s dispon<veis mais conhecidos:
Ceb: 1Jango, 9urboIears e Kope.
2nter)ace gr)ica: S>Python, PyI9Z e PyN9.
Processamento cienti)ico: 8umPy.
Processamento de imagens: P2L.
1: Batplotlib.
&1: ?isual Python, Py5penIL e Python 5gre.
Bapeamento obJeto-relacional: %NL-lchemy e %NL5bJect.
Cultura
5 nome Python )oi tirado por Iuido van 6ossum do programa da 9? britAnica 1onty
Python &lying 2ircus, e e>istem vrias re)erHncias na documenta:o da linguagem ao
programa, como, por e>emplo, o repositrio de pacotes o)icial do Python se chamava
2heese %hop, Fue era o nome de um dos Fuadros do programa. -tualmente, o nome do
repositrio R Python Pac"age Inde3
0
TPLP2U.
- comunidade de usurios de Python criou algumas e>press@es para se re)erir aos
assuntos relacionados ] linguagem. 8este Jarg:o, o termo Pythonic R usado para indicar
Fue algo R compat<vel com as premissas de proJeto do Python, e 4npythonic signi)ica o
oposto. 7 o usurio da linguagem R chamado de Pythonist.
-s metas do proJeto )oram resumidas por 9im Peters em um te>to chamado 5en of Python6
Fue est dispon<vel no prprio Python atravRs do comando:
import this
5 te>to en)ati.a a postura pragmtica do 7enevolent )ictator for Life T/1(LU, como Iuido R
conhecido na comunidade Python.
Propostas para melhoria da linguagem s:o chamadas de PEPs TPython /nhanceent
ProposalsU, Fue tambRm servem de re)erHncia para novos recursos a serem implementados
na linguagem.
-lRm do site o)icial, outras boas )ontes de in)orma:o sobre a linguagem s:o:
! Endereo: http://pypi.python.org/pypi.
18 Introduo
Python/rasil
E
, o site da comunidade Python no /rasil, com bastante in)orma:o em
portuguHs, e Python "ooVbooV
$
, site Fue arma.ena WreceitasX: peFuenas por@es de cdigo
para reali.ar tare)as espec<)icas.
E Endereo: http://SSS.pythonbrasil.com.br/.
$ Endereo: http://aspn.activestate.com/-%P8/Python/"ooVbooV/.
%inta3e 19
Sintaxe
,m programa )eito em Python R constitu<do de linhas, Fue podem continuar nas linhas
seguintes, pelo uso do caractere de barra invertida T^U ao )inal da linha ou parHnteses,
colchetes ou chaves, em e>press@es Fue utili.am tais caracteres.
5 caractere : marca o inicio de comentrio. NualFuer te>to depois do _ ser ignorado atR o
)im da linha , com e>ce:o dos comentrios )uncionais.
"omentrios )uncionais geralmente s:o usados para:
alterar a codi)ica:o do arFuivo )onte do programa acrescentando um comentrio
com o te>to W_-`- coding: aencodingP -`_-X no inicio do arFuivo, aonde aencodingP R
a codi)ica:o do arFuivo Tgeralmente latin1 ou utf;8U. -lterar a codi)ica:o R
necessrio para suportar caracteres Fue n:o )a.em parte da linguagem inglesa, no
cdigo )onte do programa.
de)inir o interpretador Fue ser utili.ado para rodar o programa em sistemas
,82M, atravRs de um comentrio comeando com W_bX no inicio do arFuivo, Fue
indica o caminho para o interpretador Tgeralmente a linha de comentrio ser algo
como W_b/usr/bin/env pythonXU.
E>emplo de comentrios )uncionais:
#!/usr/bin/env python
# -*- coding: latin1 -*-
# Uma linha de cdigo que mostra o resultado de 7 vezes 3
print 7 * 3
E>emplos de linhas Fuebradas:
# Uma linha quebrada por contra-barra
a = 7 * 3 + \
5 / 2
# Uma lista (quebrada por vrgula)
b = ['a', 'b', 'c',
'd', 'e']
# Uma chamada de funo (quebrada por vrgula)
c = range(1,
11)
18 %inta3e
# imprime todos na tela
print a, b, c
Em Python, os blocos de cdigo s:o delimitados pelo uso de indenta:o. - indenta:o
deve ser constante no bloco de cdigo, porRm R considerada uma boa prtica manter a
consistHncia no proJeto todo e evitar a mistura tabula@es e espaos
;
.
E>emplo:
# Para i na lista 234, 654, 378, 798:
for i in [234, 654, 378, 798]:
# Se o resto dividindo por 3 for igual a zero:
if i % 3 == 0:
# Imprime...
print i, '/ 3 =', i / 3
%a<da:
; - recomenda:o o)icial de estilo de codi)ica:o Thttp://SSS.python.org/dev/peps/pep-''';/U R usar
Fuatro espaos para indenta:o e esta conven:o R amplamente aceita pelos desenvolvedores.
Programa
Instrues
Enquanto condio:
Dois pontos obrigatrios.
Se condio:
Instrues
Seno:
Instrues
Instrues
Inicio de um bloco.
Fim dos dois blocos.
Outro bloco.
Fim do programa.
Instrues
Inicio do programa.
%inta3e 19
234 / 3 = 78
654 / 3 = 218
378 / 3 = 126
798 / 3 = 266
5 comando print coloca espaos entre as e>press@es Fue )orem recebidas como parAmetro
e um caractere de nova linha no )inal, a n:o ser Fue ele receba uma v<rgula no )im da lista
parAmetros.
5 Python R uma linguagem orientada a obJeto, sendo assim as variveis atributos TdadosU
e mRtodos Trotinas associadas ao obJetoU. 9anto os atributos Fuanto os mRtodos s:o
acessados usando ponto T.U, sendo Fue os mRtodos devem ser sempre seguidos de
parHnteses:
Para mostrar um atributo:
print obJeto.atributo
Para e>ecutar um mRtodo:
objeto.metodo(argumentos)
Besmo um mRtodo sem argumentos precisa de parHnteses:
objeto.metodo()
5 ponto tambRm R usado para acessar estruturas de mdulos Fue )oram importados pelo
programa.
'0 2ontrole de flu3o
Controle de fluxo
c muito comum em um programa Fue certos conJuntos de instru@es seJam e>ecutados de
)orma condicional, em casos como validar entradas de dados, por e>emplo.
%inta>e:
if <condio>:
<bloco de cdigo>
elif <condio>:
<bloco de cdigo>
elif <condio>:
<bloco de cdigo>
else:
<bloco de cdigo>
-onde:
acondi:oP: sentena Fue possa ser avaliada como verdadeira ou )alsa.
abloco de cdigoP: seFGHncia de linhas de comando.
-s clausulas elif e else s:o opcionais e podem e>istir vrios elifs para o mesmo if.
ParHnteses s s:o necessrios para evitar ambigGidades.
E>emplo:
temp = int(raw_input('Entre com a temperatura: '))
if temp < 0:
print 'Congelando...'
elif 0 <= temp <= 20:
print 'Frio'
elif 21 <= temp <= 25:
print 'Normal'
elif 26 <= temp <= 35:
print 'Quente'
else:
print 'Muito quente!'
%e o bloco de cdigo )or composto de apenas uma linha, ele pode ser escrito aps os dois
pontos:
if temp < 0: print 'Congelando...'
- partir da vers:o .!, o Python suporta a e>press:o:
2ontrole de flu3o '1
avarivelP O avalor #P i) acondi:oP else avalor P
-onde avarivelP receber avalor #P se acondi:oP )or verdadeira e avalor P caso
contrrio.
(peradores l!icos
5s operadores lgicos s:o: and, or, not, is e in.
and: retorna verdadeiro se e somente se receber duas e>press@es Fue )orem
verdadeiras.
or: retorna )also se e somente se receber duas e>press@es Fue )orem )alsas.
not: retorna )also se receber uma e>press:o verdadeira e vice-versa.
is: retorna verdadeiro se receber duas re)erHncias ao mesmo obJeto e )also em caso
contrrio.
in: retorna verdadeiro se receber um item e uma lista e o item ocorrer uma ou mais
ve.es na lista e )also em caso contrrio.
"om operadores lgicos R poss<vel construir condi@es mais comple>as para controlar
desvios condicionais e laos.
'' Laos
Laos
Laos s:o estruturas de repeti:o, geralmente usados para processar cole@es de dados,
tais como linhas de um arFuivo ou registros de um banco de dados, Fue precisam ser
processados por um mesmo bloco de cdigo.
'or
c a estrutura de repeti:o mais usada no Python. dtil para percorrer seFGHncias ou
processar iteradores.
- instru:o for aceita n:o s seFGHncias estticas, mas tambRm seFGHncias geradas por
iteradores. 2terador R uma estrutura Fue permite itera@es, ou seJa, acesso aos itens de uma
cole:o de elementos, de )orma seFGencial.
1urante a e>ecu:o de um lao for, a re)erHncia aponta para um elemento da seFGHncia. -
cada itera:o, a re)erHncia R atuali.ada, para Fue o bloco de cdigo do for processe o
elemento correspondente.
- clausula #rea" interrompe o lao e continue passa para a pr>ima itera:o. 5 cdigo
dentro do else R e>ecutado ao )inal do lao, a n:o ser Fue o lao tenha sido interrompido
Lista
aponta para !.
1
2
3
4
5
6
...
x
"rimeira
iterao
# re$er%ncia
$oi atuali&ada.
Lista
1
2
3
4
5
6
...
x
Segunda
iterao
' apenas uma
re$er%ncia.
aponta para (.
Laos '-
por #rea".
Buito Dtil em laos com a instru:o for, a )un:o range<6 n6 p= retorna uma lista de
inteiros, comeando em e menores Fue n, em passos de comprimento p, Fue podem ser
usados como seFGHncia para o lao.
%inta>e:
for <referncia> in <sequncia>:
<bloco de cdigo>
continue
break
else:
<bloco de cdigo>
E>emplo:
# Soma de 0 a 99
s = 0
for x in range(1, 100):
s = s + x
print s
5 resultado R +*!'.
)*ile
E>ecuta um bloco de cdigo atendendo a uma condi:o.
%inta>e:
while <condio>:
<bloco de cdigo>
continue
break
else:
<bloco de cdigo>
5 bloco de cdigo dentro do lao !hile R repetido enFuanto a condi:o do lao estiver
sendo avaliada como verdadeira.
E>emplo:
'. Laos
# Soma de 0 a 99
s = 0
x = 1
while x < 100:
s = s + x
x = x + 1
print s
5 lao !hile R adeFuado Fuando n:o h como determinar Fuantas itera@es v:o ocorrer e
n:o h uma seFGHncia a seguir.
*ipos '0
ipos
?ariveis no interpretador Python s:o criadas atravRs da atribui:o e destru<das pelo
coletor de li>o, Fuando n:o e>istem mais re)erHncias a elas.
5s nomes das variveis devem comear com letra Tsem acentua:oU ou sublinhado T\U e
seguido por letras Tsem acentua:oU, d<gitos ou sublinhados T\U, sendo Fue maiDsculas e
minDsculas s:o consideradas di)erentes.
E>istem vrios tipos simples de dados prR-de)inidos no Python, tais como:
8Dmeros Tinteiros, reais, comple>os, ... U.
9e>to.
/ooleanos.
-lRm disso, e>istem tipos Fue )uncionam como cole@es. 5s principais s:o:
Lista.
9upla.
1icionrio.
5s tipos no Python podem ser:
Butveis: permitem Fue os conteDdos das variveis seJam alterados.
2mutveis: n:o permitem Fue os conteDdos das variveis seJam alterados.
Em Python, os nomes de variveis s:o re)erHncias, Fue podem ser alteradas em tempos de
e>ecu:o.
'8 *ipos
+,meros
Python o)erece vrios tipos numRricos:
2nteiro TintU: i O #
6eal de ponto )lutuante TfloatU: ) O &.#+
"omple>o Tcople3U: c O & [ +J
5bserva@es:
-s convers@es entre inteiro e longo s:o automticas.
6eais podem ser representados em nota:o cienti)ica: #.e
5pera@es numRricas:
%oma T[U.
1i)erena T-U.
Bultiplica:o T`U.
1ivis:o T/U: entre dois inteiros )unciona igual ] divis:o inteira. Em outros casos, o
resultado R real.
1ivis:o inteira T//U: o resultado R truncado para o inteiro imediatamente in)erior,
mesmo Fuando aplicado em nDmeros reais, porRm neste caso o resultado ser real
tambRm.
E>ponencia:o T``U: pode ser usada para calcular a rai., atravRs de e>poentes
)racionrios Te>emplo: #''``'.!U.
Bdulo TeU: retorna o resto da divis:o.
1urante as opera@es, os nDmeros ser:o convertidos de )orma adeFuada Te>emplo: T#.![+JU
[ & resulta em +.![+JU.
-lRm dos tipos #uiltins do interpretador, na biblioteca padr:o ainda e>iste o mdulo
decial, Fue de)ine opera@es com nDmeros reais com precis:o )i>a, e tipos para data e
hora.
*ipos '9
exto
-s strings no Python s:o #uitins para arma.enar te>to. %:o imutveis, sendo assim, n:o R
poss<vel adicionar, remover ou mesmo modi)icar algum caractere de uma string. Para
reali.ar essas opera@es, o Python precisa criar um nova string.
9ipos:
%tring padr:o: s O YLed KeppelinY
%tring unicode: u O uY/JfrVY
- string padr:o pode ser convertida para unicode atravRs da )un:o unicode<=.
- iniciali.a:o de strings pode ser:
"om aspas simples ou duplas.
Em vrias linhas consecutivas, desde Fue seJa entre trHs aspas simples ou duplas.
%em e>pans:o de caracteres Te>emplo: s O rY^nY, aonde s conter os caracteres W^X e
WnXU.
5pera@es com strings:
s = 'Camel'
# Concatenao
print 'The ' + s + ' run away!'
# Interpolao
print 'tamanho de %s => %d' % (s, len(s))
# String tratada como seqncia
for ch in s: print ch
# Strings so objetos
if s.startswith('C'): print s.upper()
# o que acontecer?
print 3 * s
# 3 * s consistente com s +s + s
2nterpola:o:
5perador WeX R usado para )a.er interpola:o de strings. - interpola:o R mais e)iciente
do Fue a concatena:o convencional.
print 'Agora so %02d:%02d.' % (16, 30)
'8 *ipos
# Imprime: Agora so 16:30.
%<mbolos usados na interpola:o:
es: string.
ed: inteiro.
e): real.
(atias TslicesU de strings podem ser obtidas colocando <ndices entre colchetes aps a string.
5s <ndices no Python:
"omeam em .ero.
"ontam a partir do )im se )orem negativos.
Podem ser de)inidos como trechos, na )orma ginicio:)im [ #:intervaloh. %e n:o )or
de)inido o inicio, ser considerado como .ero. %e n:o )or de)inido o )im [ #, ser
considerado o tamanho do obJeto. 5 intervalo Tentre os caracteresU, se n:o )or
de)inido, ser #.
c poss<vel inverter strings usando um intervalo negativo:
Fatiando strings
String s
" ) t * o n
+ ! ( , - .
s/+0
1aracteres
"osies
s/:(0 s/(:0 s/2!0
" ") t*on n
Epresses
Fatias
*ipos '9
print 'Python'[::!1]
# Mostra: nohtyP
?rias )un@es para tratar com te>to est:o no mdulo string.
# -*- coding: latin1 -*-
# importando o mdulo string
i"port string
# O alfabeto
a = string.ascii_letters
# Rodando o alfabeto um caractere para a esquerda
b = a[1:] + a[0]
# A funo maketrans() cria uma tabela de traduo
# entre os caracteres das duas strings que ela
# recebeu como parmetro.
# Os caracteres ausentes nas tabelas sero
# copiados para a sada.
tab = string.maketrans(a, b)
# A mensagem...
msg = '''Esse texto ser traduzido..
Vai ficar bem estranho.
'''
# A funo translate() usa a tabela de traduo
# criada pela maketrans() para traduzir uma string
print string.translate(msg, tab)
%a<da:
Fttf ufyup tfs usbevAjep..
Wbj gjdbs cfn ftusboip.
5 mdulo tambRm implementa um tipo chamado *eplate, Fue R um modelo de string Fue
pode ser preenchido atravRs de um dicionrio. 5s identi)icadores s:o inciados por ci)r:o
TiU e podem ser cercados por chaves, para evitar con)us@es.
E>emplo:
# -*- coding: latin1 -*-
-0 *ipos
# importando o mdulo string
i"port string
# Cria uma string template
st = string.Template('$aviso aconteceu em $quando')
# Preenche o modelo com um dicionrio
s = st.substitute(#'aviso': 'Falta de eletricidade',
'quando': '03 de Abril de 2002'$)
# Mostra:
# Falta de eletricidade aconteceu em 03 de Abril de 2002
print s
c poss<vel usar strings mutveis no Python, atravRs do mdulo 4ser%tring, Fue de)ine o
tipo 1uta#le%tring:
# -*- coding: latin1 -*-
# importando o mdulo UserString
i"port UserString
s = UserString.MutableString('Python')
s[0] = 'p'
print s # mostra "python"
%trings mutveis s:o menos e)icientes do Fue strings mutveis.
*ipos -1
Listas
Listas s:o cole@es heterogHneas de obJetos, Fue podem ser de FualFuer tipo, inclusive
outras listas.
-s listas no Python s:o mutveis, podendo ser alteradas a FualFuer momento. Listas
podem ser )atiadas da mesma )orma Fue as strings, mas como as listas s:o mutveis, R
poss<vel )a.er atribui@es a itens da lista.
%inta>e:
lista = [a, b, ..., z]
5pera@es comuns com listas:
# Uma nova lista: Brit Progs dos anos 70
progs = ['Yes', 'Genesis', 'Pink Floyd', 'ELP']
# Varrendo a lista inteira
for prog in progs:
print prog
# Trocando o ltimo elemento
progs[!1] = 'King Crimson'
# Incluindo
progs.append('Camel')
# Removendo
progs.remove('Pink Floyd')
# Ordena a lista
progs.sort()
# Inverte a lista
progs.reverse()
# Imprime numerado
for i, prog in enumerate(progs):
print i + 1, '=>', prog
# Imprime do segundo item em diante
print progs[1:]
print range(10)
-' *ipos
- )un:o enuerate<= retorna uma tupla de dois elementos a cada itera:o: um nDmero
seFGencial e um item da seFGHncia correspondente.
- opera@es de ordena:o TsortU e invers:o TreverseU s:o reali.adas na prpria lista, sendo
assim, n:o geram novas listas.
uplas
%emelhantes as listas, porRm s:o imutveis: n:o se pode acrescentar, apagar ou )a.er
atribui@es aos itens.
%inta>e:
tupla = (a, b, ..., z)
5s parHnteses s:o opcionais.
Particularidade: tupla com apenas um elemento R representada como:
t1 = (1,)
5s elementos de uma tupla podem ser re)erenciados da mesma )orma Fue os elementos de
uma lista:
primeiro_elemento = tupla[0]
Listas podem ser convertidas em tuplas:
tupla = tuple(lista)
E tuplas podem ser convertidas em listas:
lista = list(tupla)
Embora a tupla possa conter elementos mutveis, esses elementos n:o podem so)rer
atribui:o, pois isto modi)icaria a re)erHncia ao obJeto.
E>emplo usando o modo interativo:
*ipos --
>>> t = ([1, 2], 4)
>>> t[0].append(3)
>>> t
([1, 2, 3], 4)
>>> t[0] = [1, 2, 3]
Traceback (most recent call last):
File "<input>", line 1, in %
TypeError: object does not support item assignment
>>>
-s tuplas s:o mais e)icientes do Fue as listas convencionais, pois consomem menos
recursos computacionais.
(utros tipos de se-./ncias
5 Python provH entre os #uiltins tambRm:
set: lista mutvel un<voca Tsem repeti@esU.
fro>enset: lista imutvel un<voca.
-. *ipos
0icionrios
,m dicionrio R uma lista de associa@es compostas por uma chave Dnica e estruturas
correspondentes. 1icionrios s:o mutveis, tais como as listas.
- chave tem Fue ser de um tipo imutvel, geralmente strings, mas tambRm podem ser
tuplas ou tipos numRricos. 5 dicionrio do Python n:o )ornece garantia de Fue as chaves
estar:o ordenadas.
%inta>e:
dicionario = #'a': a, 'b': b, ..., 'z', z$
Estrutura:
E>emplo de dicionrio:
dic = #'nome': 'Shirley Manson', 'banda': 'Garbage'$
1*a3es
Fractal
#'Fractal': 'IFS', 'Palheta': 'Verde', 'Limites': (640, 480), (0, 0): (42, 35)$
4alores
IFS
"al*eta 4erde
Limites 56-+7 -8+9
5+7 +9 5-(7 ,.9
Elementos
imut:3eis
Ob;etos
quaisquer
*ipos -0
-cessando elementos:
print dic['nome']
-dicionando elementos:
dic['album'] = 'Version 2.0'
-pagando um elemento do dicionrio:
&el dic['album']
5btendo os itens, chaves e valores:
itens = dic.items()
chaves = dic.keys()
valores = dic.values()
E>emplos com dicionrios:
# Progs e seus albuns
progs = #'Yes': ['Close To The Edge', 'Fragile'],
'Genesis': ['Foxtrot', 'The Nursery Crime'],
'ELP': ['Brain Salad Surgery']$
# Mais progs
progs['King Crimson'] = ['Red', 'Discipline']
# Iterao
for prog, albuns in progs.items():
print prog, '=>', albuns
# Se tiver 'ELP', deleta
if progs.has_key('ELP'):
&el progs['ELP']
E>emplo de matri. esparsa:
# -*- coding: latin1 -*-
# Matriz esparsa implementada
items() retorna uma lista de
tuplas com a chave e o valor.
-8 *ipos
# com dicionrio
# Matriz esparsa uma estrutura
# que s armazena os valores que
# existem na matriz
dim = 6, 12
mat = #$
# Tuplas so imutveis
# Cada tupla representa
# uma posio na matriz
mat[3, 7] = 3
mat[4, 6] = 5
mat[6, 3] = 7
mat[5, 4] = 6
mat[2, 9] = 4
mat[1, 0] = 9
for lin in range(dim[0]):
for col in range(dim[1]):
# Mtodo get(chave, valor)
# retorna o valor da chave
# no dicionrio ou se a chave
# no existir, retorna o
# segundo argumento
print mat.get((lin, col), 0),
print
%a<da:
0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0 0
0 0 0 0 0 0 0 3 0 0 0 0
0 0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 6 0 0 0 0 0 0 0
Ierando a matri. esparsa:
# -*- coding: latin1 -*-
# Matriz em forma de string
matriz = '''0 0 0 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0 0
0 0 0 0 0 0 0 3 0 0 0 0
*ipos -9
0 0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 6 0 0 0 0 0 0 0'''
mat = #$
# Quebra a matriz em linhas
for lin, linha in enumerate(matriz.splitlines()):
# Quebra a linha em colunas
for col, coluna in enumerate(linha.split()):
coluna = int(coluna)
# Coloca a coluna no resultado,
# se for diferente de zero
if coluna:
mat[lin, col] = coluna
print mat
# Some um nas dimenses pois a contagem comea em zero
print 'Tamanho da matriz completa:', (lin + 1) * (col + 1)
print 'Tamanho da matriz esparsa:', len(mat)
%a<da:
{(5, 4): 6, (3, 7): 3, (1, 0): 9, (4, 6): 5, (2, 9): 4}
Tamanho da matriz completa: 72
Tamanho da matriz esparsa: 5
- matri. esparsa R uma boa solu:o de processamento para estruturas em Fue a maioria
dos itens permanecem va.ios, como planilhas, por e>emplo.
-8 *ipos
Verdadeiro1 falso e nulo
Em Python, o tipo booleano T#oolU R uma especiali.a:o do tipo inteiro TintU. 5 verdadeiro R
chamado *rue e R igual a #, enFuanto o )also R chamado &alse e R igual a .ero.
5s seguintes valores s:o considerados )alsos:
&alse T)alsoU.
?one TnuloU.
' T.eroU.
YY Tstring va.iaU.
gh Tlista va.iaU.
TU Ttupla va.iaU.
jk Tdicionrio va.ioU.
5utras estruturas com o tamanho igual a .ero.
%:o considerados verdadeiros todos os outros obJetos )ora dessa lista.
5 obJeto ?one, Fue R do tipo ?one*ype, do Python representa o nulo e R avaliado como
)also pelo interpretador.
&un@es -9
'unes
(un@es s:o blocos de cdigo identi)icados por um nome, Fue podem receber parAmetros
prR-determinados.
8o Python, as )un@es:
Podem retornar ou n:o obJetos.
-ceitam )oc %trings.
-ceitam parAmetros opcionais Tcom defaultsU. %e n:o )or passado o parAmetro ser
igual ao default de)inido na )un:o.
-ceitam Fue os parAmetros seJam passados com nome. 8este caso,a ordem em Fue
os parAmetros )oram passados n:o importa.
9em naespace prprio Tescopo localU, e por isso podem o)uscar de)ini@es de
escopo global.
Podem ter suas propriedades alteradas Tgeralmente por decoradoresU.
)oc %trings s:o strings Fue est:o associadas a uma estrutura do Python. 8as )un@es, as
)oc %trings s:o colocadas dentro do corpo da )un:o, geralmente no comeo. 5 obJetivo
das )oc %trings R servir de documenta:o para aFuela estrutura.
%inta>e:
&ef func(parametro1, parametro2=padrao):
"""Doc String
"""
<bloco de cdigo>
return valor
5s parAmetros com default devem )icar aps os Fue n:o tem default.
E>emplo T)atorialU:
&ef fatorial(num):
if num <= 1:
return 1
else:
return(num * fatorial(num ! 1))
E>emplo TsRrie de (ibonacciU:
!un"#o $ recursiva.
% retorno $ opcional.
.0 &un@es
&ef fib(n):
"""Fibonacci:
fib(n) => fib(n - 1) + fib(n - 2) se n > 1
fib(n) => 1 se n <= 1
"""
if n > 1:
return fib(n ! 1) + fib(n ! 2)
else:
return 1
# Mostrar Fibonacci de 1 a 5
for i in [1, 2, 3, 4, 5]:
print i, '=>', fib(i)
E>emplo Tconvers:o de 6I/U:
# -*- coding: latin1 -*-
&ef r'b(ht"l(r=0, g=0, b=0):
"""Converte R, G, B em #RRGGBB"""
return '#%02x%02x%02x' % (r, g, b)
&ef ht"l(r'b(color='#000000'):
"""Converte #RRGGBB em R, G, B"""
if color.startswith('#'): color = color[1:]
r = int(color[:2], 16)
g = int(color[2:4], 16)
b = int(color[4:], 16)
return r, g, b # Uma seqncia
print rgb_html(200, 200, 255)
print rgb_html(b=200, g=200, r=255) # O que houve?
print html_rgb('#c8c8ff')
5bserva@es:
5s argumentos com padr:o devem vir por Dltimo, depois dos argumentos sem
padr:o.
5 valor do padr:o para um parAmetro R calculado Fuando a )un:o R de)inida.
5s argumentos passados sem identi)icador s:o recebidos pela )un:o na )orma de
uma lista.
5s argumentos passados com identi)icador s:o recebidos pela )un:o na )orma de
um dicionrio.
5s parAmetros passados com identi)icador na chamada da )un:o devem vir no )im
&un@es .1
da lista de parAmetros.
E>emplo de como receber todos parAmetros:
# -*- coding: latin1 -*-
# *args - argumentos sem nome (lista)
# **kargs - argumentos com nome (dicionrio)
&ef func(*args, **kargs):
print args
print kargs
8o e>emplo, "args receber os argumentos nomeados e args receber os outros.
.' )ocuentao
0ocumentao
Py15" R a )erramenta padr:o de documenta:o
*
do Python. Ela pode ser utili.ada tanto
para acessar a documenta:o dos mdulos Fue acompanham o Python, Fuanto mdulos
de terceiros.
8o CindoSs, acesse o <cone WBodule 1ocsX para a documenta:o da biblioteca padr:o e
WPython BanualsX para consultar o tutorial, re)erHncias e outros documentos mais
e>tensos.
Para utili.ar o Py15" no Linu>:
pydoc ./modulo.py
Para e>ibir a documenta:o de Wmodulo.pyX no diretrio atual.
8o Linu>, para ver a documenta:o das bibliotecas no #ro!ser, utili.e o comando:
pydoc -p 8000
E acesse o endereo http://localhost:;'''/.
Para rodar a vers:o gr)ica do Py15" e>ecute:
pydoc -g
5 Py15" utili.a as )oc %trings dos mdulos para gerar a documenta:o.
-lRm disso, R poss<vel ainda consultar a documenta:o no prprio interpretador, atravRs
da )un:o help<=.
E>emplo:
help(list)
Bostra a documenta:o para a lista do Python.
* - documenta:o do Python tambRm dispon<vel na internet em: http://SSS.python.org/doc/.
/3ercAcios I .-
Exerccios I
#. 2mplementar duas )un@es:
,ma Fue converta temperatura em graus 2elsius para &ahrenheit+
5utra Fue converta temperatura em graus &ahrenheit para 2elsius.
Lembrando Fue:
. 2mplementar uma )un:o Fue retorne verdadeiro se o nDmero )or primo T)also caso
contrrioU. 9estar de # a #''.
&. 2mplementar uma )un:o Fue receba uma lista de listas de comprimentos FuaisFuer e
retorne uma lista de uma dimens:o.
+. 2mplementar uma )un:o Fue receba um dicionrio e retorne a soma, a mRdia e a
varia:o dos valores.
!. Escreva uma )un:o Fue:
6eceba uma )rase como parAmetro.
6etorne uma nova )rase com cada palavra com as letras invertidas.
E. "rie uma )un:o Fue:
6eceba uma lista de tuplas TdadosU, um inteiro Tchave, .ero por padr:o igualU e um
booleano Treverso, )also por padr:oU.
6etorne dados ordenados pelo item indicado pela chave e em ordem decrescente se
reverso )or verdadeiro.
F=
9
5
C32
.. Parte II
Parte II
Bdulos.
Escopo de nomes.
Pacotes.
/ibliotecas compartilhadas.
/ibliotecas de terceiros.
-rFuivos e 2/5.
E>ce@es.
9empo.
2ntrospec:o.
E>erc<cios 22.
1Bdulos .0
%dulos
Bdulos s:o arFuivos Fue podem importados para um programa. Podem conter FualFuer
estrutura do Python e s:o e>ecutados Fuando importados
#'
. Eles s:o compilados Fuando
importados pela primeira ve. e arma.enados em arFuivo Tcom e>tens:o W+pyc, ou W+pyo,U,
possuem naespace prprio e aceitam )oc %trings. %:o obJetos %ingleton Ts R carregada
uma instAncia em memria, Fue )ica dispon<vel de )orma global para o programaU.
5s mdulos s:o locali.ados pelo interpretador atravRs da lista de pastas PC*HD?PE*H
Tsys+pathU, Fue normalmente inclui a pasta corrente em primeiro lugar. 5 mdulo principal
de um programa tem a varivel FFnaeFF igual ] W\\main\\X, ent:o R poss<vel testar se o
mdulo R o principal usando:
if __name__ == "__main__":
# Aqui o cdigo s ser executado
# se este for o mdulo principal
# e no quando ele for importado por outro programa
#' "aso seJa necessrio e>ecutar de novo o mdulo durante a e>ecu:o da aplica:o, ele ter Fue carregado
outra ve. atravRs da )un:o reload.
<<main<<
Funo
s)s.pat*
s)s.eit59
=dulo principal em eecuo.
s)s
pat*
eit
=dulo sys 5import sys9
path ' uma lista.
exit ' uma $uno.
Funo de$inida em __main__.
1*amando exit de sys.
.8 1Bdulos
"om isso R )cil trans)ormar um programa em um mdulo.
5s mdulos s:o carregados atravRs da instru:o iport. 1esta )orma, ao usar alguma
estrutura do mdulo, R necessrio identi)icar o mdulo. 2sto R chamado de iportao
a#soluta.
i"port os
print os.name
9ambRm poss<vel importar mdulos de )orma relativa:
fro" os i"port name
print name
5 caractere W`X pode ser usado para importar tudo Fue est de)inido no mdulo:
fro" os i"port *
print name
Por evitar problemas como a o)usca:o de variveis, a importa:o absoluta R uma prtica
melhor de programa:o do Fue a importa:o relativa.
E>emplo de mdulo:
# -*- coding: latin1 -*-
"""
modutils => rotinas utilitrias para mdulos
"""
i"port os.path
i"port sys
i"port glob
&ef fin&(txt):
"""encontra mdulos que tem o nome
contendo o parmetro
"""
resp = []
for path in sys.path:
mods = glob.glob('%s/*.py' % path)
1Bdulos .9
for mod in mods:
if txt in os.path.basename(mod):
resp.append(mod)
return resp
E>emplo de uso do mdulo:
fro" os.path i"port getsize, getmtime
fro" time i"port localtime, asctime
i"port modutils
mods = modutils.find('xml')
for mod in mods:
tm = asctime(localtime(getmtime(mod)))
kb = getsize(mod) / 1024
print '%s: (%d kbytes, %s)' % (mod, kb, tm)
%a<da:
c:\python25\lib\xmllib.py: (34 kbytes, Fri Oct 28 20:07:40 2005)
c:\python25\lib\xmlrpclib.py: (46 kbytes, Thu Dec 08 14:20:04 2005)
1ividir programas em mdulos )acilita o reaproveitamento e locali.a:o de )alhas no
cdigo.
%dulos da 2i2lioteca padro
c comum di.er Fue o Python vem com Wbaterias inclusasX, em re)erHncia a vasta biblioteca
de mdulos e pacotes Fue R distribu<da com o interpretador.
-lguns mdulos importantes da biblioteca padr:o:
%istema: os, glo#, shutils, su#process.
*hreads: threading.
PersistHncia: pic"le, cPic"le.
MBL: 3l+do, 3l+sa3, eleent*ree Ta partir da vers:o .!U.
"on)igura:o: 2onfigParser, optparse.
9empo: tie, datetie.
5utros: sys, logging, trace#ac", types, tieit.
.8 /scopo de noes
Escopo de nomes
?aespaces s:o dicionrios Fue relacionam os nomes dos obJetos Tre)erHnciasU e os obJetos
em si.
8ormalmente, os nomes est:o de)inidos em dois dicionrios, Fue podem ser consultados
atravRs das )un@es locals<= e glo#als<=. Estes dicionrios s:o alterados dinamicamente em
tempo de e>ecu:o
##
.
?ariveis globais podem ser o)uscadas por variveis Tpois o escopo local R veri)icado antes
do escopo globalU. Para evitar isso, R preciso declarar a varivel como global no escopo
local.
E>emplo:
&ef so"alista(lista):
"""
## Embora os dicionrios retornados por locals<= e glo#als<= possam ser alterados diretamente, isso deve ser
evitado, pois pode ter e)eitos indeseJveis.
=dulo
Funo
4ar<!
4ar<(
4ar<,
4ar<,
4ar<-
Estas so 3ari:3eis globais.
Estas so 3ari:3eis locais.
4ar<, $oi o$uscada7 pois $oi
5re9de$inida no escopo local.
>m namespace ' um escopo de
de$inio de estruturas.
/scopo de noes .9
Soma listas de listas, recursivamente
Coloca o resultado como global
"""
'lobal soma
for item in lista:
if type(item) is list: # Se o tipo do item for lista
somalista(item)
else:
soma += item
soma = 0
somalista([[1, 2], [3, 4, 5], 6])
print soma # 21
,sar variveis globais n:o R considerada uma boa prtica de desenvolvimento, pois
tornam mais di)<cil entender o sistema, portanto R melhor evitar seu uso. E o)uscar
variveis tambRm.
00 Pacotes
Pacotes
Pacotes Tpac"agesU s:o pastas Fue s:o identi)icadas pelo interpretador pela presena de um
arFuivo com o nome W\\init\\.pyX. 5s pacotes servem como containers para mdulos.
c poss<vel importar todos os mdulos do pacote usando a declara:o fro noeFdoFpacote
iport G.
5 arFuivo W\\init\\.pyX pode estar va.io ou conter cdigo de iniciali.a:o do pacote ou
de)inir uma varivel chamada FFallFF, uma lista de mdulos do pacote ser:o importados
Fuando )or usado W`X. %em o arFuivo, o Python n:o identi)ica a pasta como um pacote
vlido.
componentes
displa).p)
lcd
oled
&sta pasta $ um pacote.
sensor.p)
termico
Identi$ica a pasta como pacote.
componentes.sensor.
componentes.sensor.termico.
componentes.display.crt.
componentes.display.oled.
<<init<<.p)
crt
componentes.display.lcd.
componentes.display.
7i#liotecas copartilhadas 01
#i2liotecas compartil*adas
- partir da vers:o .!, o Python incorporou o mdulo ctypes, Fue implementa tipos
compat<veis com os tipos usados pela linguagem " e permite evocar )un@es de bibliotecas
compartilhadas.
5 mdulo provH vrias )ormas de evocar )un@es. (un@es Fue seguem a conven:o de
chamada stdcall, como a -P2 do CindoSs, podem ser acessadas atravRs da classe !indll.
)ynaic;lin" li#rary T1LLU R a implementa:o de bibliotecas compartilhadas Fue s:o
usadas no CindoSs.
E>emplo com !indll:
# -*- coding: latin1 -*-
i"port ctypes
# Evocando a caixa de mensagens do Windows
# Os argumentos so: janela pai, mensagem,
# ttulo da janela e o tipo da janela.
# A funo retorna um inteiro, que
# corresponde a que boto foi pressionado
i = ctypes.windll.user32.MessageBoxA()one,
'Teste de DLL!', 'Mensagem', 0)
# O resultado indica qual boto foi clicado
print i
Para )un@es Fue seguem a conven:o de chamada cdecl, usada pela maioria dos
compiladores ", e>iste a classe cdll. Para as passagens de argumentos por re)erHncia R
preciso criar uma varivel Fue )unciona como um #uffer para receber os resultados. 2sso R
necessrio para receber strings, por e>emplo.
E>emplo com cdll e #uffer:
# -*- coding: latin1 -*-
i"port ctypes
# msvcrt a biblioteca com a maioria das funes
# padres da linguagens C no Windows
# O Windows coloca automaticamente
# a extenso do arquivo
clib = ctypes.cdll.msvcrt
0' 7i#liotecas copartilhadas
# Cria um buffer para receber o resultado
# a referncia para o buffer ser passada para
# a funo, que preenche o buffer com o resultado
s = ctypes.c_buffer('\000', 40)
# sscanf() uma funo que extrai valores
# de uma string conforme uma mascara
clib.sscanf('Testando sscanf!\n',
'Testando %s!\n', s)
# Mostra o resultado
print s.value
c poss<vel tambRm evocar )un@es de bibliotecas compartilhadas no Linu>:
# -*- coding: latin1 -*-
i"port ctypes
# Carrega a biblioteca padro C no Linux
# A extenso do arquivo precisa passada
# para a funo LoadLibrary()
clib = ctypes.cdll.LoadLibrary("libc.so.6")
# Cria um buffer para receber o resultado
s = ctypes.c_buffer('\000', 40)
# Evoca a funo sprintf
clib.sprintf(s, 'Testando %s\n', 'sprintf!')
# Mostra o resultado
print s.value
-travRs de bibliotecas compartilhadas R poss<vel usar cdigo desenvolvido em outras
linguagens de uma maneira simples.
7i#liotecas de terceiros 0-
#i2liotecas de terceiros
=oJe e>istem muitas bibliotecas escritas por terceiros dispon<veis para Python, compostas
por pacotes ou mdulos, Fue implementam diversos recursos alRm da biblioteca padr:o.
Ieralmente, as bibliotecas s:o distribu<das das seguintes )ormas:
Pacotes distutils.
Pacotes para gerenciadores de pacotes do %istema 5peracional.
2nstaladores.
Python Eggs.
5s pacotes usando o mdulo distutils, Fue R distribu<do com o Python, s:o muito
populares. 5s pacotes s:o distribu<dos em arFuivos compactados Tgeralmente W.tar.g.X,
W.tar.b.X ou W..ipXU. Para instalar, R necessrio descompactar o arFuivo, entrar na pasta
Fue )oi descompactada e por )im e>ecutar o comando:
python setup.py install
Nue o pacote ser instalado na pasta Wsite-pacVagesX no Python.
Ierenciadores de pacotes do %istema 5peracional, geralmente trabalham com )ormatos
prprios de pacote, como W.debX T1ebian Linu>U ou W.rpmX T6ed=at Linu>U. - )orma de
instalar os pacotes depende do gerenciador utili.ado. - grande vantagem R Fue o
gerenciador de pacotes cuida das dependHncias e atuali.a@es.
2nstaladores s:o e>ecutveis Fue instalam a biblioteca. Ieralmente s:o usados em
ambiente CindoSs e podem ser desinstalados pelo Painel de "ontrole.
Python Eggs s:o pacotes Tcom a e>tens:o W.eggXU administrados pelo easy\install,
utilitrio Fue )a. parte do proJeto setuptools
#
. %emelhante a algumas )erramentas
encontradas em outras linguagens, como o 6uby Iems, aos poucos est se tornando o
padr:o de )ato para distribui:o de bibliotecas em Python.
5 programa procura pela vers:o mais nova do pacote no PLP2
#&
TPython Pac"age Inde3U,
repositrio de pacotes Python, e tambRm procura instalar as dependHncias Fue )orem
necessrias.
# (ontes e documenta:o do proJeto em: http://peaV.telecommunity.com/1ev"enter/setuptools/.
#& Endereo: http://pypi.python.org/pypi.
0. 7i#liotecas de terceiros
Python Eggs podem ser instalados pelo comando:
easy_install nome_do_pacote
5 script easy\install R instalado na pasta WscriptsX do Python.
ErHuivos e IID 00
3r-ui&os e I4(
5s arFuivos no Python s:o representados por obJetos do tipo file
1.
, Fue o)erecem mRtodos
para diversas opera@es de arFuivos. -rFuivos podem ser abertos para leitura TYrY, Fue R o
defaultU, grava:o TYSYU ou adi:o TYaYU, em modo te>to ou binrioTYbYU.
Em Python:
sys+stdin representa a entrada padr:o.
sys+stdout representa a sa<da padr:o.
sys+stderr representa a sa<da de erro padr:o.
- entrada, sa<da e erro padr@es s:o tratados pelo Python como arFuivos abertos. -
entrada em modo de leitura e os outros em modo de grava:o.
E>emplo de escrita:
i"port sys
# Criando um objeto do tipo file
temp = file('temp.txt', 'w')
# Escrevendo no arquivo
for i in range(100):
temp.write('%03d\n' % i)
# Fechando
temp.close()
temp = file('temp.txt')
# Escrevendo no terminal
for x in temp:
sys.stdout.write(x)
#Escrever em sys.stdout envia
# otexto para a sada padro
temp.close()
- itera:o do segundo lao, o obJeto retorna uma linha do arFuivo.
E>emplo de leitura:
i"port sys
#+ - re)erHncia open aponta para file.
08 ErHuivos e IID
i"port os.path
# raw_input retorna a string digitada
fn = raw_input('Nome do arquivo: ').strip()
if not os.path.exists(fn):
print 'Tente outra vez...'
sys.exit()
# Numerando as linhas
for i, s in enumerate(file(fn)):
print i + 1, s,
c poss<vel ler todas as linhas com o mRtodo readlines<=:
# Imprime uma lista contendo linhas do arquivo
print file('temp.txt').readlines()
5s obJetos de arFuivo tambRm possuem um mRtodo see"<=, Fue permite ir para FualFuer
posi:o no arFuivo.
Sistema de ar-ui&os
5 mdulo os+path implementa vrias )uncionalidades relacionadas a sistemas de arFuivo,
tais como:
os+path+#asenae<=: retorna o componente )inal de um caminho.
os+path+dirnae<=: retorna um caminho sem o componente )inal.
os+path+e3ists<=: retorna *rue se o caminho e>iste ou &alse em caso contrrio.
os+path+getsi>e<=: retorna o tamanho do arFuivo em #ytes.
5 glo# R outro mdulo relacionado ao sistema de arFuivo:
i"port os.path
i"port glob
# Mostra uma lista de nomes de arquivos
# e seus respectivos tamanhos
for arq in sorted(glob.glob('*.py')):
print arq, os.path.getsize(arq)
- )un:o glo#+glo#<= retorna uma lista com os nomes de arFuivo Fue atendem ao critRrio
passado como parAmetro, de )orma semelhante ao comando WlsX dispon<vel nos sistemas
,82M.
ErHuivos e IID 09
3r-ui&os compactados
5 Python possui mdulos para trabalhar com vrios )ormatos de arFuivos compactados.
E>emplo de grava:o de um arFuivo W..ipX:
# -*- coding: latin1 -*-
"""
Gravando texto em um arquivo compactado
"""
i"port zipfile
texto = """
***************************************
Esse o texto que ser compactado e...
... guardado dentro de um arquivo zip.
***************************************
"""
# Cria um zip novo
zip = zipfile.ZipFile('arq.zip', 'w',
zipfile.ZIP_DEFLATED)
# Escreve uma string no zip como se fosse um arquivo
zip.writestr('texto.txt', texto)
# Fecha o zip
zip.close()
E>emplo de leitura:
# -*- coding: latin1 -*-
"""
Lendo um arquivo compactado
"""
i"port zipfile
# Abre o arquivo zip para leitura
zip = zipfile.ZipFile('arq.zip')
# Pega a lista dos arquivos compactados
arqs = zip.namelist()
for arq in arqs:
# Mostra o nome do arquivo
print 'Arquivo:', arq
08 ErHuivos e IID
# Informaes do arquivo
zipinfo = zip.getinfo(arq)
print 'Tamanho original:', zipinfo.file_size
print 'Tamanho comprimido:', zipinfo.compress_size
# Mostra o contedo do arquivo
print zip.read(arq)
%a<da:
Arquivo: texto.txt
Tamanho original: 160
Tamanho comprimido: 82
***************************************
Esse o texto que ser compactado e...
... guardado dentro de um arquivo zip.
***************************************
5 Python tambRm provH mdulos para os )ormatos g.ip, b.ip e tar, Fue s:o bastante
utili.ados em ambientes ,82M.
3r-ui&os de dados
8a biblioteca padr:o, o Python tambRm )ornece um mdulo para simpli)icar o
processamento de arFuivos no )ormato "%? T2oa %eparated ValuesU.
5 )ormato R muito simples, os dados s:o arma.enados em )orma de te>to, separados por
v<rgula, um registro por linha.
E>emplo de escrita:
i"port csv
# Dados
dt = (('temperatura', 15.0, 'C', '10:40', '2006-12-31'),
('peso', 42.5, 'kg', '10:45', '2006-12-31'))
# A escrita recebe um objeto do tipo "file"
out = csv.writer(file('dt.csv', 'w'))
# Escrevendo as tuplas no arquivo
out.writerows(dt)
-rFuivo de sa<da:
ErHuivos e IID 09
temperatura,15.0,C,10:40,2006-12-31
peso,42.5,kg,10:45,2006-12-31
E>emplo de leitura:
i"port csv
# A leitura recebe um objeto arquivo
dt = csv.reader(file('dt.csv'))
# Para cada registro do arquivo, imprima
for reg in dt:
print reg
%a<da:
['temperatura', '15.0', 'C', '10:40', '2006-12-31']
['peso', '42.5', 'kg', '10:45', '2006-12-31']
5 )ormato "%? R aceito pela maioria das planilhas e sistemas de banco de dados para
importa:o e e>porta:o de in)orma@es.
80 /3ce@es
Excees
Nuando ocorre uma )alha no programa Tcomo uma divis:o por .ero, por e>emploU em
tempo de e>ecu:o, uma e>ce:o R gerada. %e a e>ce:o n:o )or tratada, ela ser
propagada atravRs das chamadas de )un:o atR o mdulo principal do programa,
interrompendo a e>ecu:o.
print 1/0
Traceback (most recent call last):
File "<input>", line 1, in %
ZeroDivisionError: integer division or modulo by zero
- instru:o try permite o tratamento de e>ce@es no Python. %e ocorrer uma e>ce:o em
um bloco marcado com try, R poss<vel tratar a e>ce:o atravRs da instru:o e3cept. Podem
e>istir vrios e3cepts para um try.
tr*:
print 1/0
e+cept ZeroDivisionError:
print 'Erro ao tentar dividir por zero.'
# Mostra:
# Erro ao tentar dividir por zero.
%e e3cept recebe o nome da e>ce:o, s esta ser tratada. %e n:o )or passada nenhuma
e>ce:o como parAmetro, todas ser:o tratadas.
i"port traceback
# Tente receber o nome do arquivo
tr*:
fn = raw_input('Nome do arquivo: ').strip()
# Numerando as linhas
for i, s in enumerate(file(fn)):
print i + 1, s,
# Se ocorrer um erro
e+cept:
# Mostre na tela
trace = traceback.format_exc()
/3ce@es 81
# E salve num arquivo
print 'Aconteceu um erro:\n', trace
file('trace.log', 'a').write(trace)
# Encerre o programa
raise SystemExit
5 mdulo trace#ac" o)erece )un@es para manipular as mensagens de erro. - )un:o
foratFe3c retorna a sa<da da Dltima e>ce:o )ormatada em uma string.
5 tratamento de e>ce@es pode possuir um bloco else, Fue ser e>ecutado Fuando n:o
ocorrer nenhuma e>ce:o e um bloco finally, ser e>ecutado de FualFuer )orma, tendo
ocorrido uma e>ce:o ou n:o
#!
. 8ovos tipos de e>ce@es podem ser de)inidos atravRs de
herana a partir da classe /3ception.
#! - declara:o finally pode ser usada para liberar recursos Fue )oram usados no bloco try, tais como
cone>@es de banco de dados ou arFuivos abertos.
8' *epo
empo
5 Python possui dois mdulos para lidar com tempo:
tie: implementa )un@es bsicas para lidar com o tempo gerado pelo sistema
operacional.
datetie: implementa tipos de alto n<vel para lidar opera@es de data e hora.
E>emplo com time:
# -*- coding: latin-1 -*-
i"port time
# localtime() Retorna a data e hora local no formato
# de uma tupla:
# (ano, ms, dia, hora, minuto, segundo, dia da semana,
# dia do ano, horrio de vero)
print time.localtime()
# asctime() retorna a data e hora como string, conforme
# a configurao do sistema operacional
print time.asctime()
# time() retorna o tempo do sistema em segundos
ts1 = time.time()
# gmtime() converte segundos para tuplas no mesmo
# formato de localtime()
tt1 = time.gmtime(ts1)
print ts1, '=>', tt1
# Somando uma hora
tt2 = time.gmtime(ts1 + 3600.)
# mktime() converte tuplas para segundos
ts2 = time.mktime(tt2)
print ts2, '=>', tt2
# clock() retorma o tempo desde quando o programa
# iniciou, em segundos
print 'O programa levou', time.clock(), \
'segundos sendo executado at agora...'
# Contando os segundos...
for i in xrange(5):
# sleep() espera durante o nmero de segundos
# especificados
time.sleep(1)
*epo 8-
print i + 1, 'segundo(s)'
%a<da:
(2008, 5, 11, 9, 55, 57, 6, 132, 0)
Sun May 11 09:55:57 2008
1210510557.44 => (2008, 5, 11, 12, 55, 57, 6, 132, 0)
1210524957.0 => (2008, 5, 11, 13, 55, 57, 6, 132, 0)
O programa levou 1.53650813162e-006 segundos sendo executado at agora...
1 segundo(s)
2 segundo(s)
3 segundo(s)
4 segundo(s)
5 segundo(s)
Em datetie, est:o de)inidos Fuatro tipos para representar o tempo:
datetie: data e hora.
date: apenas data.
tie: apenas hora.
tiedelta: di)erena entre tempos.
E>emplo:
# -*- coding: latin-1 -*-
i"port datetime
# datetime() recebe como parmetros:
# ano, ms, dia, hora, minuto, segundo
# e retorna um objeto do tipo datetime
dt = datetime.datetime(2020, 12, 31, 23, 59, 59)
# Objetos date e time podem ser criados
# a partir de um objeto datetime
data = dt.date()
hora = dt.time()
# Quanto tempo falta para 31/12/2020
dd = dt ! dt.today()
print 'Data:', data
print 'Hora:', hora
print 'Quanto tempo falta para 31/12/2020:', \
str(dd).replace('days', 'dias')
%a<da:
8. *epo
Data: 2020-12-31
Hora: 23:59:59
Quanto tempo falta para 31/12/2020: 4616 dias, 13:22:58.857000
5s obJetos dos tipos date e datetie retornam datas em )ormato 2%5.
Introspeco 80
Introspeco
2ntrospec:o ou re)le>:o R capacidade do so)tSare de identi)icar e relatar suas prprias
estruturas internas, tais como tipos, escopo de variveis, mRtodos e atributos.
(un@es nativas do interpretador para introspec:o:
,un-.o /etorno
type(objeto) O tipo (classe) do objeto.
id(objeto) O identificador do objeto.
locals() O dicionrio de variveis locais.
globals() O dicionrio de variveis globais.
len(objeto) O tamanho do objeto.
dir(objeto) A lista de estruturas do objeto.
help(objeto) As Doc Strings do objeto.
repr(objeto) A representao do objeto.
isinstance(objeto, classe) Verdadeiro se objeto deriva da classe.
issubclass(subclasse, classe) Verdadeiro se subclasse herda classe.
5 identi)icador do obJeto R um nDmero inteiro Dnico Fue R usado pelo interpretador para
identi)icar internamente os obJetos.
E>emplo:
# -*- coding: latin1 -*-
# Colhendo algumas informaes
# dos objetos globais no programa
fro" types i"port ModuleType
&ef info(n_obj):
# Cria uma referncia ao objeto
obj = globals()[n_obj]
# Mostra informaes sobre o objeto
print 'Nome do objeto:', n_obj
print 'Identificador:', id(obj)
print 'Tipo:', type(obj)
print 'Representao:', repr(obj)
88 Introspeco
# Se for um mdulo
if isinstance(obj, ModuleType):
print 'itens:'
for item in dir(obj):
print item
print
# Mostrando as informaes
for n_obj in dir():
info(n_obj)
5 Python tambRm tem um mdulo chamado types, Fue tem as de)ini@es dos tipos bsicos
do interpretador.
-travRs da introspec:o, R poss<vel determinar os campos de uma tabela de banco de
dados, por e>emplo.
%dulo inspect
5 mdulo inspect provH um conJunto de )un@es de introspec:o prontas Fue permitem
investigar tipos , itens de cole@es, classes, )un@es, cdigo )onte e a pilha de e>ecu:o do
interpretador.
E>emplo:
# -*- coding: latin1 -*-
i"port os.path
# inspect: mdulo de introspeco "amigvel"
i"port inspect
print 'Objeto:', inspect.getmodule(os.path)
print 'Classe?', inspect.isclass(str)
# Lista todas as funes que existem em "os.path"
print 'Membros:',
for name, struct in inspect.getmembers(os.path):
if inspect.isfunction(struct):
print name,
%a<da:
Introspeco 89
Objeto: <module 'ntpath' from 'C:\Python24\lib\ntpath.pyc'>
Classe? True
Membros: abspath basename commonprefix dirname exists expanduser expandvars
getatime getctime getmtime getsize isabs isdir isfile islink ismount join lexists normcase
normpath realpath split splitdrive splitext splitunc walk
-s )un@es Fue trabalham com a pilha do interpretador devem ser usadas com cuidado,
pois R poss<vel criar re)erHncias c<clicas Tuma varivel Fue aponta para o item da pilha Fue
tem a prpria varivelU. - e>istHncia de re)erHncias a itens da pilha retarda a destrui:o
dos itens pelo coletor de li>o do interpretador.
88 /3ercAcios II
Exerccios II
#. 2mplementar um programa Fue receba um nome de arFuivo e gere estat<sticas sobre o
arFuivo TnDmero de caracteres, nDmero de linhas e nDmero de palavrasU
. 2mplementar um mdulo com duas )un@es:
atri3Fsu<Gatrices=, Fue retorna a matri. soma de matri.es de duas dimens@es.
caelFcase<s=, Fue converte nomes para "amel"ase.
&. 2mplementar uma )un:o Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
+. 2mplementar um mdulo com duas )un@es:
split<fn6 n=, Fue Fuebra o arFuivo )n em partes de n #ytes e salva com nomes
seFGenciais Tse fn O arF.t>t, ent:o arF\''#.t>t, arF\''.t>t, ... U
Join<fn6 fnlist= Fue Junte os arFuivos da lista fnlist em um arFuivo s fn.
!. "rie um script Fue:
"ompare a lista de arFuivos em duas pastas distintas.
Bostre os nomes dos arFuivos Fue tem conteDdos di)erentes e/ou Fue e>istem em
apenas uma das pastas.
E. (aa um script Fue:
Leia um arFuivo te>to.
"onte as ocorrHncias de cada palavra.
Bostre os resultados ordenados pelo nDmero de ocorrHncias.
Parte III 89
Parte III
Ieradores.
Programa:o )uncional.
E>erc<cios 222.
90 $eradores
5eradores
-s )un@es geralmente seguem o )lu>o convencional de processar, retornar valores e
encerrar. Ieradores s:o estruturas semelhantes, porRm processam e retornam um valor de
uma seFGHncia a cada chamada. 5 gerador lembra o estado do processamento entre as
chamadas, retornam o pr>imo item esperado.
5s geradores apresentam vrias vantagens em rela:o ]s )un@es convencionais:
La>y /valuation: geradores s s:o processados Fuando R realmente necessrio, sendo
assim, economi.am recursos de processamento.
6edu.em a necessidade da cria:o de listas.
Permitem trabalhar com seFGHncias ilimitadas de elementos.
Ieradores normalmente s:o evocados atravRs de um lao for. - sinta>e R semelhante a da
)un:o tradicional, s Fue a instru:o yield substitui o return. - nova cada itera:o, yield
retorna o pr>imo valor.
E>emplo:
# -*- coding: latin-1 -*-
&ef 'en(pares():
"""
Gera nmeros pares infinitamente...
"""
i = 0
while True:
i += 2
*iel& i
# Mostra cada nmero e passa para o prximo
for n in gen_pares():
print n
5utro e>emplo:
i"port os
# Encontra arquivos recursivamente
&ef fin&(path='.'):
'o gerador( )ield toma o lugar
do return.
$eradores 91
for item in os.listdir(path):
fn = os.path.normpath(os.path.join(path, item))
if os.path.isdir(fn):
for f in find(fn):
*iel& f
else:
*iel& fn
for fn in find('c:/temp'):
print fn
8a prpria linguagem e>istem vrios geradores, como o #uiltin 3range<=
18
, e o mdulo
itertools, Fue de)ine vrios geradores Dteis.
Para converter a sa<da do gerador em uma lista:
lista = list(gerador())
-ssim, todos os itens ser:o gerados de uma ve..
#E 5 gerador 3range substitui com vantagem a )un:o range e a sinta>e R a mesma.
cada itera"#o do la"o( o gerador
encontra um novo ar*uivo.
9' Prograao funcional
Pro!ramao funcional
Programa:o )uncional R um paradigma Fue trata a computa:o como uma avalia:o de
)un@es matemticas. 9ais )un@es podem ser aplicadas em seFGHncias de dados
Tgeralmente listasU.
%:o e>emplos de linguagens )uncionais: L2%P, %cheme e =asVell Testa Dltima in)luenciou o
proJeto do Python de )orma marcanteU.
-s opera@es bsicas do paradigma )uncional s:o implementadas no Python pelas )un@es
ap<=, filter<=, reduce<= e >ip<=.
Lam2da
8o Python, la#da R uma )un:o anlnima composta apenas por e>press@es. -s )un@es
la#da podem ter apenas uma linha, e podem ser atribu<das a uma varivel. (un@es
la#da s:o muito usadas em programa:o )uncional.
%inta>e:
la"b&a <lista de variveis>: <expresses >
E>emplo:
# Amplitude de um vetor 3D
amp = la"b&a x, y, z: (x ** 2 + y ** 2 + z ** 2) ** .5
print amp(1, 1, 1)
print amp(3, 4, 5)
%a<da:
1.73205080757
7.07106781187
(un@es la#da consomem menos recursos Fue as )un@es convencionais.
Prograao funcional 9-
%apeamento
5 mapeamento consiste em aplicar uma )un:o a todos os itens de uma seFGHncia,
gerando outra lista contendo os resultados e com o mesmo tamanho da lista inicial.
8o Python, o mapeamento R implementado pela )un:o ap<=.
E>emplos:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# log na base 10
fro" math i"port log10
print map(log10, nums)
# Dividindo por 3
print map(la"b&a x: x / 3, nums)
- )un:o ap<= sempre retorna uma lista.
Lista
!
(
,
-
.
6
?
Lista
!
-
@
!6
(.
,6
-@
Funo
AA(
9. Prograao funcional
'iltra!em
8a )iltragem, uma )un:o R aplicada em todos os itens de uma seFGHncia, se a )un:o
retornar um valor Fue seJa avaliado como verdadeiro, o item original )ar parte da
seFGHncia resultante.
8o Python, a )iltragem R implementada pela )un:o filter<=.
E>emplo:
# Selecionando apenas os mpares
print filter(la"b&a x: x % 2, nums)
- )un:o filter<= aceita tambRm )un@es la#da, alRm de )un@es convencionais.
Lista Lista
!
,
.
?
Funo
B (
Falso
Falso
Falso
!
(
,
-
.
6
?
Prograao funcional 90
6eduo
6edu:o signi)ica aplicar uma )un:o Fue recebe dois parAmetros, nos dois primeiros
elementos de uma seFGHncia, aplicar novamente a )un:o usando como parAmetros o
resultado do primeiro par e o terceiro elemento, seguindo assim atR o )inal da seFGHncia. 5
resultado )inal da redu:o R apenas um elemento.
E>emplos de redu:o, Fue R implementada no Python pela )un:o reduce<=:
# -*- coding: latin1 -*-
nums = range(100)
# Soma com reduce (pode concatenar strings)
print reduce(la"b&a x, y: x + y, nums)
# Soma mais simples, mas s para nmeros
print sum(nums)
# Multiplicao
print reduce(la"b&a x, y: x * y, nums)
- )un:o su<= R mais e)iciente Fue reduce<=.
Lista Cesultado
!
,
6
!+
!.
(!
(8
Funo
D )
!
(
,
-
.
6
?
98 Prograao funcional
ransposio
9ransposi:o R construir uma sRrie de seFGHncias a partir de outra sRrie de seFGHncias,
aonde a primeira nova seFGHncia contRm o primeiro elemento de cada seFGHncia original,
a segunda nova seFGHncia contRm o segundo elemento de cada seFGHncia original, atR Fue
alguma das seFGHncias originais acabe.
E>emplo de transposi:o, Fue R implementada no Python pela )un:o >ip<=:
# Uma lista com ('a', 1), ('b', 2), ...
fro" string i"port ascii_lowercase
print zip(ascii_lowercase, range(1, 100))
# Transposta de uma matriz
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print zip(*matriz)
- )un:o >ip<= sempre retorna uma lista de tuplas.
Listas
!
(
,
-
.
6
Listas
!
-
(
.
,
6
Funo
Prograao funcional 99
List Compre*ension
Em computa:o, List 2oprehension R uma constru:o eFuivalente a nota@es matemticas
do tipo:
5u seJa, % R o conJunto )ormado por > ao Fuadrado para todo > no conJunto dos nDmeros
naturais, se > )or maior ou igual a '.
%inta>e:
lista = [ <expresso> for <referncia> in <seqncia> if <condio> ]
E>emplo:
# -*- coding: latin1 -*-
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# Eleve os mpares ao quadrado
print [ x**2 for x in nums if x % 2 ]
%a<da:
[1, 9, 25, 49, 81, 121]
5 List 2oprehension R mais e)iciente do Fue usar as )un@es ap<= e filter<=.
5enerator Expression
$enerator /3pression R uma e>press:o semelhante ao List 2oprehension Fue )unciona como
um gerador.
E>emplo:
# -*- coding: latin1 -*-
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
S={x
2
xem, x20}
98 Prograao funcional
# Eleve os mpares ao quadrado
gen = ( x**2 for x in nums if x % 2 )
# Mostra os resultados
for num in gen:
print num
5 $enerator /3pression usa menos recursos do Fue o List 2oprehension eFuivalente.
/3ercAcios III 99
Exerccios III
#. 2mplementar um gerador de nDmeros primos.
. 2mplementar o gerador de nDmeros primos como uma e>press:o Tdica: use o mdulo
itertoolsU.
&. 2mplementar um gerador Fue produ.a tuplas com as cores do padr:o 6I/ T6, I e /
variam de ' a !!U usando 3range<= e uma )un:o Fue produ.a uma lista com as tuplas
6I/ usando range<=. "ompare a per)ormance.
+. 2mplementar um gerador Fue leia um arFuivo e retorne uma lista de tuplas com os
dados To separador de campo do arFuivo R v<rgulaU, eliminando as linhas va.ias. "aso
ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.
80 Parte IV
Parte IV
1ecoradores.
"lasses.
9estes automati.ados.
E>erc<cios 2?.
)ecoradores 81
0ecoradores
1ecoradores TdecoratorsU s:o )un@es Fue s:o aplicadas em outras )un@es e retornam
)un@es modi)icadas. 1ecoradores tanto podem ser usados para alterar propriedades das
)un@es TFue s:o obJetosU Fuanto para WenvolverX as )un@es, acrescentando uma camada
em torno delas com novas )uncionalidades.
- partir do Python .+, o caractere WmX pode ser usado para automati.ar o processo de
aplicar o decorador:
&ef &ecorator(f):
f.decorated = True
return f
@decorator
&ef func(arg):
return arg
"om isso, )oi criado um atributo novo na )un:o, Fue pode ser usado depois, Fuando a
)un:o )or e>ecutada.
Funo
Original
Funo
=odi$icada
def func(arg):
return arg
def decorator(f):
f.decorated = True
return f
func = decorator(func)
Decorador
O decorador $oi aplicado.
8' )ecoradores
E>emplo:
# -*- coding: latin1 -*-
# Funo decoradora
&ef &u"par's(f):
# Funo que envolver a outra
&ef func(*args):
# Mostra os argumentos passados para a funo
print args
# Retorna o resultado da funo original
return f(*args)
# Retorna a funo modificada
return func
@dumpargs
&ef "ultipl*(*nums):
m = 1
for n in nums:
m = m * n
return m
print multiply(1, 2, 3)
%a<da:
(1, 2, 3)
6
- sa<da apresenta os parAmetros Fue a )un:o decorada recebeu.
2lasses 8-
Classes
,m obJeto R uma abstra:o computacional Fue representa uma entidade, com Fualidades
TatributosU e a@es TmRtodosU Fue a entidade pode reali.ar. - classe R a estrutura bsica do
paradigma de orienta:o a obJetos. - classe representa o tipo do obJeto, Fue de)ine as
Fualidades do obJeto e o Fue ele pode )a.er.
Por e>emplo, a classe 2anino descreve as caracter<sticas e a@es dos caninos em geral,
enFuanto o obJeto 7andit representa um canino em especial.
5s atributos s:o estruturas de dados sobre o obJeto e os mRtodos s:o )un@es Fue
descrevem como o obJeto se comporta.
8o Python, novos obJetos s:o criados a partir das classes atravRs de atribui:o.
Nuando um novo obJeto R criado, o construtor da classe R e>ecutado. Em Python, o
construtor R um mRtodo especial chamado FFne!FF<=. -ps a chamada ao construtor, o
mRtodo FFinitFF<= R chamado para iniciali.ar a nova instAncia.
,m obJeto continua e>istindo na memria enFuanto e>istir pelo menos uma re)erHncia a
1anino
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
Suas
caracterEsticas.
O que ele pode
$a&er.
Fandit
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
# classe
representa
qualquer canino.
O ob;eto
representa um
canino.
Fandit G 1anino59
8. 2lasses
ele. 5 interpretador Python possui um recurso chamado coletor de li>o T$ar#age 2ollectorU
Fue limpa da memria obJetos sem re)erHncias
#$
. Nuando o obJeto R apagado, o mRtodo
especial FFdoneFF<= R evocado. (un@es ligadas ao coletor de li>o podem ser encontradas
no mdulo gc.
Em Python:
Nuase tudo R obJeto, mesmo os tipos bsicos, como nDmeros inteiros.
9ipos e classes s:o uni)icados.
5s operadores s:o na verdade chamadas para mRtodos especiais.
-s classes s:o abertas Tmenos para os tipos #uiltinsU.
BRtodos especiais s:o identi)icados por nomes no padr:o FFetodoFF<= Tdois sublinhados
no in<cio e no )inal do nomeU e de)inem como os obJetos derivados da classe se
comportar:o em situa@es particulares, como em sobrecarga de operadores.
-s classes ne! style s:o derivadas da classe o#Ject e podem utili.ar recursos novos das
classes do Python, como properties e etaclasses. -s properties s:o atributos calculados em
tempo de e>ecu:o atravRs de mRtodos, enFuanto as etaclasses s:o classes Fue geram
classes, com isso permitem personali.ar o comportamento das classes.
#$ Para apagar uma re)erHncia a um obJeto, use o comando del. %e todas as re)erHncias )orem apagadas, o
$ar#age 2ollector apagar o obJeto.
1lasse
='todos de
classe
#tributos de
classe
='todos
est:ticos
Ob;eto
='todos de
classe
#tributos de
classe
='todos
est:ticos
='todos
dinHmicos
#tributos de
ob;eto
Ob;eto G 1lasse59
O construtor ' eecutado neste
momento.
2lasses 80
%inta>e:
# -*- coding: latin1 -*-
class 0lasse(supcl1, supcl2):
"""
Isto uma classe
"""
clsvar = []
&ef ((init(((self, args):
"""
Inicializador da classe
"""
<bloco de cdigo>
&ef ((&one(((self):
"""
Destrutor da classe
"""
<bloco de cdigo>
&ef "eto&o(self, params):
"""
Mtodo de objeto
"""
<bloco de cdigo>
@classmethod
&ef cls("eto&o(cls, params):
"""
Mtodo de classe
"""
<bloco de cdigo>
@staticmethod
&ef est("eto&o(params):
"""
Mtodo esttico
"""
<bloco de cdigo>
obj = Classe()
obj.metodo()
Classe.cls_metodo()
Classe.est_metodo()
BRtodos estticos s:o aFueles Fue n:o tem liga:o com atributos do obJeto ou da classe.
88 2lasses
(uncionam como as )un@es comuns.
BRtodos de classe podem usar apenas atributos e outros mRtodos de classe. 5 argumento
cls representa a classe em si, precisa ser passado e>plicitamente como primeiro parAmetro
do mRtodo.
BRtodos de obJeto podem usar atributos e outros mRtodos do obJeto. - varivel self, Fue
representa o obJeto e tambRm precisa ser passado de )orma e>pl<cita. 5 nome self R uma
conven:o, assim como cls, podendo ser trocado por outro nome FualFuer, porRm R
considerada como boa prtica manter o nome.
E>emplo de classe:
# -*- coding: latin1 -*-
class 0ell(object):
"""
Classe para clulas de planilha
"""
&ef ((init(((self, formula='""', format='%s'):
"""
Inicializa a clula
"""
self.formula = formula
self.format = format
&ef ((repr(((self):
"""
Retorna a representao em string da clula
"""
return self.format % eval(self.formula)
print Cell('123**2')
print Cell('23*2+2')
print Cell('abs(-1.45 / 0.3)', '%2.3f')
%a<da:
15129
48
4.833
2lasses 89
5 mRtodo FFreprFF<= R usado internamente pelo comando print para obter uma
representa:o do obJeto em )orma de te>to.
88 2lasses
Classes a2ertas
8o Python, as classes Fue n:o s:o #uiltins podem ser alteradas em tempo de e>ecu:o,
devido a nature.a dinAmica da linguagem. c poss<vel acrescentar mRtodos e atributos
novos, por e>emplo. - mesma lgica se aplica aos obJetos.
E>emplo de como acrescentar um novo mRtodo:
# -*- coding: latin1 -*-
class 1ser(object):
"""Uma classe bem simples.
"""
&ef ((init(((self, name):
"""Inicializa a classe, atribuindo um nome
"""
self.name = name
# Um novo mtodo para a classe
&ef set(passwor&(self, password):
"""Troca a senha
"""
self.password = password
print 'Classe original:', dir(User)
# O novo mtodo inserido na classe
User.set_password = set_password
print 'Classe modificada:', dir(User)
user = User('guest')
user.set_password('guest')
print 'Objeto:', dir(user)
print 'Senha:', user.password
%a<da:
Classe original: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', '__weakref__']
Classe modificada: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__str__', '__weakref__', 'set_password']
Objeto: ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
2lasses 89
'__setattr__', '__str__', '__weakref__', 'name', 'password', 'set_password']
Senha: guest
- classe modi)icada passou a ter um novo mRtodo: setFpass!ord<=.
-crescentar mRtodos ou atributos em classes abertas R mais simples do Fue criar uma
nova classe atravRs de herana com os novos mRtodos ou atributos.
90 2lasses
Herana simples
=erana R um mecanismo Fue a orienta:o a obJeto provH, com obJetivo de )acilitar o
reaproveitamento de cdigo. - idRia R Fue as classes seJam constru<das )ormando uma
hierarFuia.
- nova classe pode implementar novos mRtodos e atributos e herdar mRtodos e atributos
da classe antiga TFue tambRm pode ter herdado de classes anterioresU, porRm estes
mRtodos e atributos podem substitu<dos no processo. 8a herana simples, a classe deriva
de somente uma classe J e>istente.
E>emplo de herana simples:
class 2en&ri3e(object):
&ef ((init(((self, tamanho, interface='2.0'):
self.tamanho = tamanho
self.interface = interface
1arnE3oro
"eso7 #ltura7
idade
1orrer7 #tacar7
1omer
1anino
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
Suas
caracterEsticas.
O que ele pode
$a&er.
Fandit
"eso7 #ltura7
idade7 Caa
1orrer7 #tacar7
1omer7 Latir
1lasse para
carnE3oros.
Ob;eto para um
canino.
1lasse para
caninos.
2lasses 91
class 4252la*er(Pendrive):
&ef ((init(((self, tamanho, interface='2.0', turner=False):
self.turner = turner
Pendrive.__init__(self, tamanho, interface)
mp3 = MP3Player(1024)
print '%s\n%s\n%s' % (mp3.tamanho, mp3.interface, mp3.turner)
%a<da:
1024
2.0
False
- classe 1P-Player herda de Pendrive o tamanho e a inter)ace.
classe +P3Pla)er $ derivada
da classe Pendrive.
9' 2lasses
Herana m,ltipla
8a herana mDltipla, a nova classe deriva de vrias classes J e>istentes. - di)erena mais
signi)icativa em rela:o ] herana simples R a ordem de resolu:o de mRtodos Tem inglHs,
1ethod Kesolution Drder- B65U, Fue segue o chamado algoritmo diamante.
8o algoritmo diamante, a resolu:o ser )eita a partir da esFuerda, descendo atR encontrar
a classe em comum entre os caminhos dentro hierarFuia. Nuando encontra a classe em
comum, passa para o caminho ] direita. -o esgotar os caminhos, o algoritmo prossegue
para a classe em comum e repete o processo.
E>emplo:
# -*- coding: latin1 -*-
class 6errestre(object):
"""
Classe de veculos terrestres
"""
se_move_em_terra = True
#n$Ebio
Ob;ect
class #n$ibio51arro7 Farco9:
#qu:tico
Farco
Ierrestre
1arro !
+
,
( -
.
Ordem de resoluo
2lasses 9-
&ef ((init(((self, velocidade=100):
"""
Inicializa o objeto
"""
self.velocidade_em_terra = velocidade
class 78uatico(object):
"""
Classe de veculos aquaticos
"""
se_move_na_agua = True
&ef ((init(((self, velocidade=5):
"""
Inicializa o objeto
"""
self.velocidade_agua = velocidade
class 0arro(Terrestre):
"""
Classe de carros
"""
rodas = 4
&ef ((init(((self, velocidade=120, pistoes=4):
"""
Inicializa o objeto
"""
self.pistoes = pistoes
Terrestre.__init__(self, velocidade=velocidade)
class 9arco(Aquatico):
"""
Classe de barcos
"""
&ef ((init(((self, velocidade=6, helices=1):
"""
Inicializa o objeto
"""
self.helices = helices
Aquatico.__init__(self, velocidade=velocidade)
class 7nfibio(Carro, Barco):
"""
Classe de anfbios
"""
&ef ((init(((self, velocidade_em_terra=80,
classe n!i,io $ derivada
de -arro e .arco.
classe .arco deriva de *uatico.
classe -arro deriva de /errestre.
9. 2lasses
velocidade_na_agua=4, pistoes=6, helices=2):
"""
Inicializa o objeto
"""
# preciso evocar o __init__ de cada classe pai
Carro.__init__(self, velocidade=velocidade_em_terra,
pistoes=pistoes)
Barco.__init__(self, velocidade=velocidade_na_agua,
helices=helices)
novo_anfibio = Anfibio()
for atr in dir(novo_anfibio):
# Se no for mtodo especial:
if not atr.startswith('__'):
print atr, '=', getattr(novo_anfibio, atr)
%a<da:
helices = 2
pistoes = 6
rodas = 4
se_move_em_terra = True
se_move_na_agua = True
velocidade_agua = 4
velocidade_em_terra = 80
8a hierarFuia de classes do e>emplo, a B65 para a classe dos an)<bios ser:
[<class '__main__.Anfibio'>,
<class '__main__.Carro'>,
<class '__main__.Terrestre'>,
<class '__main__.Barco'>,
<class '__main__.Aquatico'>,
<type 'object'>]
- herana mDltipla R um recurso Fue gera muita controvRrsia, pois seu uso pode tornar o
proJeto con)uso e obscuro.
2lasses 90
Propriedades
Propriedades TpropertiesU s:o atributos calculados em tempo de e>ecu:o. -s propriedades
s:o criadas atravRs da )un:o property.
-s vantagens de usar propriedades s:o:
?alidar a entrada do atributo.
"riar atributos apenas de leitura.
(acilitar o uso da classe
#;
.
- )acilidade de mudar de um atributo convencional para uma propriedade sem a
necessidade de alterar as aplica@es Fue utili.am a classe.
E>emplo de cdigo sem propriedades:
# get_*, set_*...
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
&ef 'et(3eloci&a&e(self):
return self.alcance / self.tempo
moab = Projetil(alcance=10000, tempo=60)
print moab.get_velocidade()
%a<da:
166
E>emplo de propriedade atravRs de decorador:
# -*- coding: latin1 -*-
# Exemplo de Property de leitura
#; -s propriedades escondem as )un@es get<= e set<= dos atributos, tornando o uso da classe mais simples.
98 2lasses
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
@property
&ef 3eloci&a&e(self):
return self.alcance / self.tempo
moab = Projetil(alcance=10000, tempo=60)
# A velocidade calculada
print moab.velocidade
%a<da:
166
E>emplo de propriedade atravRs de chamada de )un:o:
# Property de leitura & escrita
class 2ro:etil(object):
&ef ((init(((self, alcance, tempo):
self.alcance = alcance
self.tempo = tempo
# Calcula a velocidade
&ef 'et3(self):
return self.alcance / self.tempo
# Calcula o tempo
&ef set3(self, v):
self.tempo = self.alcance / v
# Define a propriedade
velocidade = property(getv, setv)
2lasses 99
moab = Projetil(alcance=10000, tempo=60)
print moab.velocidade
# Muda a velocidade
moab.velocidade = 350
print moab.tempo
%a<da:
166
28
Propriedades s:o particularmente interessantes para Fuem desenvolve bibliotecas para
serem usadas por outras pessoas.
98 2lasses
So2recar!a de operadores
8o Python, o comportamento dos operadores R de)inido por mRtodos especiais, porRm
tais mRtodos s podem ser alterados nas classes abertas. Por conven:o, os mRtodos
especiais tHm nomes Fue comeam e terminam com W\\X.
E>emplo:
# A classe String deriva de str
class ;trin'(str):
&ef ((sub(((self, s):
return self.replace(s, '')
s1 = String('The Lamb Lies Down On Broadway')
s2 = 'Down '
print '"%s" - "%s" = "%s"' % (s1, s2, s1 ! s2)
%a<da:
"The Lamb Lies Down On Broadway" - "Down " = "The Lamb Lies On Broadway"
Lista de operadores e os mRtodos correspondentes:
<pera&or 4=to&o <pera-.o
+ __add__ adio
- __sub__ subtrao
* __mul__ multiplicao
** __pow__ potncia
/ __div__ diviso
// __floordiv__ diviso truncada
% __mod__ mdulo
+ __pos__ positivo
- __neg__ negativo
2lasses 99
<pera&or 4=to&o <pera-.o
< __lt__ menor que
> __gt__ maior que
<= __le__ menor ou igual a
>= __ge__ maior ou igual a
== __eq__ Igual a
!= __ne__ diferente de
<< __lshift__ deslocamento para
esquerda
>> __rshift__ deslocamento para direita
& __and__ e bit-a-bit
| __or__ ou bit-a-bit
^ __xor__ ou exclusivo bit-a-bit
~ __inv__ inverso
5bserva@es:
- subtra:o de)inida no cdigo n:o R comutativa Tda mesma )orma Fue a adi:o em
strings tambRm n:o RU
- classe str n:o R aberta, portanto n:o R poss<vel alterar o comportamento da string
padr:o do Python. PorRm a classe %tring R aberta.
- rede)ini:o de operadores conhecidos pode di)icultar a leitura do cdigo.
100 2lasses
%etaclasses
Em uma linguagem orientada a obJeto aonde TFuaseU tudo s:o obJetos e todo o obJeto tem
uma classe, R natural Fue as classes tambRm podem ser tratadas como obJetos.
Betaclasse R uma classe cuJas as instAncias s:o classes, sendo assim, a metaclasse de)ine o
comportamento das outras classes. Em Python, a classe type R uma metaclasse e pode ser
usada para criar novas metaclasses.
E>emplo de metaclasse criada a partir de type:
# -*- coding: latin1 -*-
class ;in'leton(type):
"""
Metaclasse Singleton
"""
&ef ((init(((cls, name, bases, dic):
type.__init__(cls, name, bases, dic)
# Retorna o prprio objeto na cpia
&ef ((cop*(((self):
return self
# Retorna o prprio objeto na cpia recursiva
&ef ((&eepcop*(((self, memo=)one):
return self
cls.__copy__ = __copy__
cls.__deepcopy__ = __deepcopy__
&ef ((call(((cls, *args, **kwargs):
# Chamada que cria novos objetos,
# aqui retorna sempre o mesmo
tr*:
return cls.__instance
# Se __instance no existir, ento crie...
e+cept AttributeError:
# A funo super() pesquisa na MRO
# a partir de Singleton
cls.__instance = super(Singleton,
cls).__call__(*args, **kwargs)
2lasses 101
return cls.__instance
i"port MySQLdb
class 0on(object):
"""
Classe de conexo nica
"""
# Define a metaclasse desta classe
__metaclass__ = Singleton
&ef ((init(((self):
# Cria uma conexo e um cursor
con = MySQLdb.connect(user='root')
self.db = con.cursor()
# Sempre ser usado o mesmo
# objeto de cursor
class >o'(object):
"""
Classe de log
"""
# Define a metaclasse desta classe
__metaclass__ = Singleton
&ef ((init(((self):
# Abre o arquivo de log para escrita
self.log = file('msg.log', 'w')
# Sempre ser usado o mesmo
# objeto de arquivo
&ef write(self, msg):
print msg
# Acrescenta as mensagens no arquivo
self.log.write(str(msg) + '\n')
# Conexo 1
con1 = Con()
Log().write('con1 id = %d' % id(con1))
con1.db.execute('show processlist')
Log().write(con1.db.fetchall())
# Conexo 2
10' 2lasses
con2 = Con()
Log().write('con2 id = %d' % id(con2))
con2.db.execute('show processlist')
Log().write(con2.db.fetchall())
i"port copy
# Conexo 3
con3 = copy.copy(con1)
Log().write('con3 id = %d' % id(con3))
con3.db.execute('show processlist')
Log().write(con2.db.fetchall())
%a<da e conteDdo do arFuivo Wmsg.logX:
con1 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
con2 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
con3 id = 10321264
((20L, 'root', 'localhost:1125', None, 'Query', 0L, None, 'show processlist'),)
"om isso, todas as re)erHncias apontam para o mesmo obJeto.
*estes autoati>ados 10-
estes automati7ados
9estar so)tSare R uma tare)a repetitiva, demorada e tediosa. Por isso, surgiram vrias
)erramentas para automati.ar testes. E>istem dois mdulos para testes automati.ados Fue
acompanham o Python: doctest e unittest.
5 mdulo doctest usa )oc %trings presentes no cdigo para de)inir os testes do cdigo. 5
doctest procura por um trecho de te>to seJa semelhante a uma sess:o interativa de Python,
e>ecuta a mesma seFGHncia de comandos, analisa a sa<da e )a. um relatrio dos testes Fue
)alharam, com os erros encontrados.
E>emplo:
"""
fib.py
Implementa Fibonacci.
"""
&ef fib(n):
"""Fibonacci:
Se n <= 1, fib(n) = 1
Se n > 1, fib(n) = fib(n - 1) + fib(n - 2)
Exemplos de uso:
>>> fib(0)
1
>>> fib(1)
1
>>> fib(10)
89
>>> [ fib(x) for x in xrange(10) ]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> fib('')
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 19, in fib
TypeError
>>>
"""
if not type(n) is int:
raise TypeError
if n > 1:
return fib(n ! 1) + fib(n ! 2)
else:
return 1
/estes para o doctest.
10. *estes autoati>ados
&ef (&octest():
"""
Evoca o doctest.
"""
i"port doctest
doctest.testmod()
if __name__ == "__main__":
_doctest()
%e todos os testes )orem bem sucedidos, n:o haver relatrio dos testes.
E>emplo de relatrio de erros do testes Ta )oc %tring )oi alterada de propsito para gerar
um erroU:
**********************************************************************
File "fib.py", line 18, in __main__.fib
Failed example:
fib(10)
Expected:
89
Got:
100
**********************************************************************
1 items had failures:
1 of 5 in __main__.fib
***Test Failed*** 1 failures.
8o unittest, os testes s:o criados atravRs de uma subclasse da classe unittest+*est2ase. 5s
testes s:o de)inidos como mRtodos da subclasse. 5s mRtodos devem ter seus nomes
iniciando com WtestX.
5s mRtodos de teste devem evocar ao terminar um dos mRtodos:
assertF: veri)ica se uma condi:o R atingida.
assert/Hual: veri)ica se o resultado R igual ao parAmetro passado.
EssertKaises: veri)ica se a e>ce:o R a esperada.
%e houver um mRtodo chamado set4p, este ser e>ecutado antes de cada teste, assim R
poss<vel reiniciali.ar variveis e garantir Fue um teste n:o preJudiFue o outro. 5 )inal dos
testes, o unittest gera o relatrio dos testes.
E>emplo:
%s testes ser#o executados
se este m0dulo !or evocado
diretamente pelo P)thon.
*estes autoati>ados 100
"""
fibtest.py
Usa unittest para testar fib.py.
"""
i"port fib
i"port unittest
class 6est;e8uence,unctions(unittest.TestCase):
&ef set1p(self):
self.seq = range(10)
&ef test?(self):
self.assertEqual(fib.fib(0), 1)
&ef test@(self):
self.assertEqual(fib.fib(1), 1)
&ef test@?(self):
self.assertEqual(fib.fib(10), 89)
&ef testse8(self):
fibs = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
for x, y in zip(fibs, [ fib.fib(x) for x in self.seq ]):
self.assert_(x is y)
&ef testt*pe(self):
self.assertRaises(TypeError, fib.fib, '')
if __name__ == '__main__':
unittest.main()
%a<da:
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
E>emplo de relatrio com erros:
..F..
+$todos *ue de!inem os testes.
108 *estes autoati>ados
=========================================================
=============
FAIL: test10 (__main__.TestSequenceFunctions)
----------------------------------------------------------------------
Traceback (most recent call last):
File "unittest1.py", line 22, in test10
self.assertEqual(fib.fib(10), 89)
AssertionError: 100 != 89
----------------------------------------------------------------------
Ran 5 tests in 0.000s
FAILED (failures=1)
8o relatrio, o terceiro teste )alhou, pois W)ib.)ibT#'UX retornou #'' ao invRs de ;*, como
seria o esperado.
5 unittest o)erece uma solu:o muito semelhante a bibliotecas de testes implementadas em
outras linguagens, enFuanto o doctest R mais simples de usar e se integra bem com a
documenta:o Tas sess@es do doctest podem servir como e>emplos de usoU.
/3ercAcios IV 109
Exerccios IV
#. "rie uma classe Fue modele um Fuadrado, com um atributo lado e os mRtodos: mudar
valor do lado, retornar valor do lado e calcular rea.
. "rie uma classe derivada de lista com um mRtodo retorne os elementos da lista sem
repeti:o.
&. 2mplemente uma classe 2arro com as seguintes propriedades:
,m ve<culo tem um certo consumo de combust<vel Tmedidos em Vm / litroU e uma
certa Fuantidade de combust<vel no tanFue.
5 consumo R especi)icado no construtor e o n<vel de combust<vel inicial R '.
(ornea um mRtodo over<"= Fue receba a distAncia em Fuillmetros e redu.a o
n<vel de combust<vel no tanFue de gasolina.
(ornea um mRtodo gasolina<=, Fue retorna o n<vel atual de combust<vel.
(ornea um mRtodo a#astecer<litros=, para abastecer o tanFue.
+. 2mplementar uma classe Vetor:
"om coordenadas >, y e ..
Nue suporte soma, subtra:o, produto escalar, produto vetorial.
Nue calcule o mdulo Tvalor absolutoU do vetor.
!. 2mplemente um mdulo com:
,ma classe Ponto, com coordenadas >, y e ..
,ma classe Linha, com dois pontos - e /, e Fue calcule o comprimento da linha.
,ma classe *riangulo, com dois pontos -, / e ", Fue calcule o comprimento dos
lados e a rea.
108 Parte V
Parte V
8umPy.
Ir)icos.
Processamento de imagem.
Ir)icos &1.
PersistHncia.
/anco de dados.
Ceb.
B?".
E>erc<cios ?.
?uPy 109
+umP$
8umPy
#*
R um pacote Fue inclui:
"lasse array.
"lasse atri3.
?rias )un@es au>iliares.
3rran8os
- classe array implementa um arranJo homogHneo mutvel com nDmero arbitrrio de
elementos, semelhante ] lista comum do Python, porRm mais poderosa.
i"port numpy
# Criando arranjos
print 'Arranjo criado a partir de uma lista:'
a = numpy.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
print a
# [0 1 2 3 4 5 6 7 8]
print 'Arranjo criado a partir de um intervalo:'
z = numpy.arange(0., 4.5, .5)
print z
# [ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
print 'Arranjo de 1s 2x3:'
y = numpy.ones((2, 3))
print y
# [[ 1. 1. 1.]
# [ 1. 1. 1.]]
print 'Arranjos podem gerar novos arranjos:'
# numpy.round() uma funo do numpy
# semelhante ao builtin round(), porm aceita
# arranjos como parmetro
cos = numpy.round(numpy.cos(z), 1)
print cos
# [ 1. 0.9 0.5 0.1 -0.4 -0.8 -1. -0.9 -0.7]
print 'Multiplicando cada elemento por um escalar:'
print 5 * z
# [ 0. 2.5 5. 7.5 10. 12.5 15. 17.5 20. ]
#* 5s )ontes, binrios e documenta:o podem ser encontrados em: http://numpy.scipy.org/.
110 ?uPy
print 'Somando arranjos elemento por elemento:'
print z + cos
# [ 1. 1.4 1.5 1.6 1.6 1.7 2. 2.6 3.3]
print 'Redimensionando o arranjo:'
z.shape = 3, 3
print z
# [[ 0. 0.5 1. ]
# [ 1.5 2. 2.5]
# [ 3. 3.5 4. ]]
print 'Arranjo transposto:'
print z.transpose()
# [[ 0. 1.5 3. ]
# [ 0.5 2. 3.5]
# [ 1. 2.5 4. ]]
print '"Achata" o arranjo:'
print z.flatten()
# [ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
print 'O acesso aos elementos funciona como nas listas:'
print z[1]
# [ 1.5 2. 2.5]
print 'Caso especial, diferente da lista:'
print z[1, 1]
# 2.0
# Dados sobre o arranjo
print 'Formato do arranjo:'
print z.shape
# (3, 3)
print 'Quantidade de eixos:'
print z.ndim
# 2
print 'Tipo dos dados:'
print z.dtype
# float64
%a<da completa:
Arranjo criado a partir de uma lista:
[0 1 2 3 4 5 6 7 8]
Arranjo criado a partir de um intervalo:
?uPy 111
[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
Arranjo de 1s 2x3:
[[ 1. 1. 1.]
[ 1. 1. 1.]]
Arranjos podem gerar novos arranjos:
[ 1. 0.9 0.5 0.1 -0.4 -0.8 -1. -0.9 -0.7]
Multiplicando cada elemento por um escalar:
[ 0. 2.5 5. 7.5 10. 12.5 15. 17.5 20. ]
Somando arranjos elemento por elemento:
[ 1. 1.4 1.5 1.6 1.6 1.7 2. 2.6 3.3]
Redimensionando o arranjo:
[[ 0. 0.5 1. ]
[ 1.5 2. 2.5]
[ 3. 3.5 4. ]]
Arranjo transposto:
[[ 0. 1.5 3. ]
[ 0.5 2. 3.5]
[ 1. 2.5 4. ]]
"Achata" o arranjo:
[ 0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. ]
O acesso aos elementos funciona como nas listas:
[ 1.5 2. 2.5]
Caso especial, diferente da lista:
2.0
Formato do arranjo:
(3, 3)
Quantidade de eixos:
2
Tipo dos dados:
float64
-o contrrio da lista, os arranJos s:o homogHneos, ou seJa, todos elementos s:o do mesmo
tipo.
%atri7es
- classe atri3 implementa opera@es de matri.es.
i"port numpy
print 'Criando uma matriz a partir de uma lista:'
l = [[3,4,5], [6, 7, 8], [9, 0, 1]]
Z = numpy.matrix(l)
print Z
# [[3 4 5]
# [6 7 8]
# [9 0 1]]
print 'Transposta da matriz:'
11' ?uPy
print Z.T
# [[3 6 9]
# [4 7 0]
# [5 8 1]]
print 'Inversa da matriz:'
print Z.I
# [[-0.23333333 0.13333333 0.1 ]
# [-2.2 1.4 -0.2 ]
# [ 2.1 -1.2 0.1 ]]
# Criando outra matriz
R = numpy.matrix([[3, 2, 1]])
print 'Multiplicando matrizes:'
print R * Z
# [[30 26 32]]
print 'Resolvendo um sistema linear:'
print numpy.linalg.solve(Z, numpy.array([0, 1, 2]))
# [ 0.33333333 1. -1. ]
%a<da:
Criando uma matriz a partir de uma lista:
[[3 4 5]
[6 7 8]
[9 0 1]]
Transposta da matriz:
[[3 6 9]
[4 7 0]
[5 8 1]]
Inversa da matriz:
[[-0.23333333 0.13333333 0.1 ]
[-2.2 1.4 -0.2 ]
[ 2.1 -1.2 0.1 ]]
Multiplicando matrizes:
[[30 26 32]]
Resolvendo um sistema linear:
[ 0.33333333 1. -1. ]
5 mdulo numpy.linalg tambRm implementa )un@es de decomposi:o de matri.es:
fro" numpy i"port *
# Matriz 3x3
A = array([(9, 4, 2), (5, 3, 1), (2, 0, 7)])
print 'Matriz A:'
?uPy 11-
print A
# Decompondo usando QR
Q, R = linalg.qr(A)
# Resultados
print 'Matriz Q:'
print Q
print 'Matriz R:'
print R
# Produto
print 'Q . R:'
print int0(dot(Q, R))
%a<da:
Matriz A:
[[9 4 2]
[5 3 1]
[2 0 7]]
Matriz Q:
[[-0.85811633 0.14841033 -0.49153915]
[-0.47673129 -0.58583024 0.65538554]
[-0.19069252 0.79672913 0.57346234]]
Matriz R:
[[-10.48808848 -4.86265921 -3.52781158]
[ 0. -1.16384941 5.28809431]
[ 0. 0. 3.68654364]]
Q . R:
[[9 4 2]
[5 3 1]
[2 0 7]]
5 8umPy serve de base para diversos mdulos, como o Batplolib, Fue implementa
gr)icos 1 e &1, e o %ciPy
'
, Fue e>pande o 8umPy com mais rotinas voltadas para a rea
cienti)ica.
' Pgina o)icial em: http://SSS.scipy.org/.
11. $rficos
5rficos
E>istem vrios pacotes de terceiros para a gera:o de gr)icos dispon<veis para Python,
sendo Fue o mais popular deles R o Pylab / Batplotlib
#
.
5 pacote tem dois mdulos principais:
atplotli#: mdulo Fue o)erece uma abstra:o orientada a obJetos aos recursos do
pacote.
pyla#: mdulo Fue o)erece uma cole:o de comandos semelhante ao Batlab, Fue R
mais adeFuado para o uso interativo.
E>emplo:
fro" pylab i"port *
ent = arange(0., 20.1, .1)
# Calcula os cossenos da entrada
sai = cos(ent)
# Plota a curva
plot(ent, sai)
# Texto para o eixo X
xlabel('entrada')
# Texto para o eixo Y
ylabel('cosseno')
# Texto no topo da figura
title('Cossenos')
# Ativa a grade
grid(True)
# Apresenta a figura resultante na tela
show()
%a<da:
# 5s )ontes, binrios e documenta:o podem ser encontrados em: http://matplotlib.source)orge.net/.
$rficos 110
5utro e>emplo:
fro" pylab i"port *
# Dados
ent1 = arange(0., 7., .1)
sai1 = cos(ent1)
sai2 = sin(ent1)
dif = sai2 ! sai1
# Divide a figura em 2 linhas e 1 coluna,
# e seleciona a parte superior
subplot(211)
# Plota a curva
# Primeira curva: ent1, sai1, 'bo:'
# Segunda curva: ent1, sai2, 'g^-'
plot(ent1, sai1, 'bo:', ent1, sai2, 'g^-')
# Cria uma legenda
legend(['Cossenos', 'Senos'])
# Seleciona a parte inferior
subplot(212)
# Desenha barras
# Eixo X: arange(len(dif)) + .5
# Eixo Y: dif
# Largura das barras: .5
# Cor: #ccbbaa
bar(arange(len(dif)) + .5, dif, .5, color='#ccbbaa')
118 $rficos
# Salva a figura
savefig('graf.png')
%a<da:
5 pacote tem )un@es para gerar gr)icos de barra, linha, dispers:o, pi..a e polar, entre
outros.
E>emplo usando atplotli#:
# -*- coding: latin1 -*-
i"port os
i"port matplotlib
fro" matplotlib.figure i"port Figure
fro" matplotlib.backends.backend_agg i"port FigureCanvasAgg
&ef pie(filename, labels, values):
"""
Gera um diagrama de Pizza e salva em arquivo.
"""
# Use a biblioteca Anti-Grain Geometry
matplotlib.use('Agg')
# Cores personalizadas
colors = ['seagreen', 'lightslategray', 'lavender',
$rficos 119
'khaki', 'burlywood', 'cornflowerblue']
# Altera as opes padro
matplotlib.rc('patch', edgecolor='#406785',
linewidth=1, antialiased=True)
# Altera as dimenses da imagem
matplotlib.rc('figure', figsize=(8., 7.))
# Inicializa a figura
fig = Figure()
fig.clear()
axes = fig.add_subplot(111)
if values:
# Diagrama
chart = axes.pie(values, colors=colors, autopct='%2.0f%%')
# Legenda
pie_legend = axes.legend(labels)
pie_legend.pad = 0.3
# Altera o tamanho da fonte
for i in xrange(len(chart[0])):
chart[!1][i].set_fontsize(12)
pie_legend.texts[0].set_fontsize(10)
else:
# Mensagem de erro
# Desliga o diagrama
axes.set_axis_off()
# Mostra a mensagem
axes.text(0.5, 0.5, 'Sem dados',
horizontalalignment='center',
verticalalignment='center',
fontsize=32, color='#6f7c8c')
# Salva a figura
canvas = FigureCanvasAgg(fig)
canvas.print_figure(filename, dpi=600)
if __name__ == '__main__':
# Testes
pie('fig1.png', [], [])
pie('fig2.png', ['A', 'B', 'C', 'D', 'E'],
[6.7, 5.6, 4.5, 3.4, 2.3])
%a<da:
118 $rficos
E>istem add ons para o Batplotlib, Fue e>pandem a biblioteca com novas )uncionalidades,
como R o caso do /asemap.
E>emplo com /asemap:
fro" mpl_toolkits.basemap i"port Basemap
fro" matplotlib i"port pyplot
fro" numpy i"port arange
# Cria um mapa usando Basemap
mapa = Basemap(projection='robin', lat_0=!20, lon_0=!50,
resolution='l', area_thresh=1e3)
# desenha a costa dos continentes
mapa.drawcoastlines(color='#777799')
# Desenha as fronteiras
mapa.drawcountries(color='#ccccee')
# Pinta os continentes
mapa.fillcontinents(color='#ddddcc')
# Desenha os meridianos
mapa.drawmeridians(arange(0, 360, 30), color='#ccccee')
# Desenha os paralelos
mapa.drawparallels(arange(!180, 180, 30), color='#ccccee')
# Desenha os limites do mapa
mapa.drawmapboundary()
# Salva a imagem
pyplot.savefig('mapa1.png', dpi=150)
$rficos 119
%a<da:
5utro e>emplo:
fro" mpl_toolkits.basemap i"port Basemap
fro" matplotlib i"port pyplot
mapa = Basemap(projection='ortho', lat_0=10, lon_0=!10,
resolution='l', area_thresh=1e3)
# Preenche o mapa com relevo
mapa.bluemarble()
mapa.drawmapboundary()
lxy = (('Rio\nde\nJaneiro', !43.11, !22.54),
('Londres', 0.07, 50.30))
# Transposta
lxy = zip(*lxy)
# Converte as coordenadas
x, y = mapa(lxy[1], lxy[2])
lxy = lxy[0], x, y
# Marca no mapa
mapa.plot(x, y, 'w^')
# Escreve os nomes
for l, x, y in zip(*lxy):
pyplot.text(x+2e5, y!6e5, l,
color='#eeeecc')
pyplot.savefig('mapa2.png', dpi=150)
%a<da:
1'0 $rficos
Para processamento de in)orma@es geore)erenciadas mais so)isticados, e>iste o proJeto
Bap%erver