Escolar Documentos
Profissional Documentos
Cultura Documentos
Python é uma dessas raras linguagens em que se pode alegar ser ao mesmo
tempo simples e poderosa. Você vai se surpreender ao descobrir o quanto é fácil se concentrar na
solução para o problema em vez da sintae e estrutura da linguagem que você está programando.
! introdução oficial para Python é"
Python é uma poderosa linguagem de programação fácil de aprender. Possui eficientes estruturas de
dados de alto#n$vel e uma simples e efetiva abordagem para programação orientada a ob%etos. !
elegante sintae e a tipagem din&mica de Python' aliada a sua natureza interpretada' faz dela uma
linguagem ideal para criar scripts e desenvolver aplicaç(es de modo ágil em diversas áreas e na maioria
das plataformas.
Guido van Rossum, criador da linguagem Python, cujo nome foi baseado na série "Monty
Python's Flying Circus" da C! le, #articularmente, n$o gosta de cobras %ue #ara se
alimentar, esmagam outros animais usando seu e&tenso cor#o!
Características de Python
Simples
Python é uma linguagem sim#les e minimalista! er um bom #rograma em Python é %uase
como ler em ingl(s, ainda %ue seja um ingl(s bem restrito! ste car)ter de #seudo*c+digo do
Python é um de seus maiores #ontos fortes! le #ermite %ue voc( se concentre na solu$o do
#roblema e n$o na linguagem em si!
Fácil de Aprender
Como voc( ver), é e&tremamente f)cil iniciar*se em Python! - linguagem #ossui uma sinta&e
e&traordinariamente sim#les, como j) mencionado!
Livre e de Códio A!erto
Python é um e&em#lo de F.// 0Free1ibre and .#en /ource /oft2are! 3radu4indo, voc( #ode
distribuir livremente c+#ias deste soft2are, ler seu c+digo*fonte, modific)*lo, usar trechos em
novos #rogramas livres e tudo o %ue voc( %uiser fa4er! F.// é baseado no conceito de uma
comunidade %ue com#artilha conhecimento! ste é um dos motivos #elos %uais Python é t$o
bom * ele vem sendo criado e constantemente melhorado #or uma comunidade %ue
sim#lesmente %uer ver a Python cada ve4 melhor!
Linuaem de Alto Nível
Por ser uma linguagem de c+digo aberto, Python foi #ortada 0ou seja, modificada #ara
funcionar7 em muitas #lataformas! 3odos os seus #rogramas em Python #odem rodar em
%ual%uer uma destas #lataformas sem #recisar de mudanas, desde %ue voc( seja cuidadoso o
suficiente #ara evitar usar caracter6sticas %ue de#endam do sistema!
8oc( #ode usar Python em inu&, 9indo2s, Free/:, Macintosh, /olaris, ./1;, -miga, -R./,
-/1<77, e./, ./1=>?, 41./, Palm ./, 5@A, 8M/, Psion, -corn RB/C ./, 8&9ors, Play/tation,
/har# Daurus, 9indo2s C e até mesmo no PocetPCE
Interpretada
Bsto re%uer uma #e%uena e&#lica$o
m #rograma escrito em uma linguagem com#ilada como C ou C é convertido da linguagem
de srcem 0C ou C7 #ara a linguagem %ue é falada #or seu com#utador 0c+digo bin)rio, ou
seja, ?s e Hs7 usando um com#ilador com v)rios flags e o#Ies! 5uando voc( roda o #rograma,
o soft2are lineditor1carregador co#ia o #rograma do disco r6gido #ara a mem+ria e comea a
e&ecut)*lo!
Python, #or sua ve4, n$o necessita de com#ila$o #ara c+digo bin)rio! 8oc( sim#lemente
/e voc( #recisa %ue um trecho cr6tico de c+digo seja e&ecutado com muita ra#ide4 ou %uer %ue
#arte de algum algoritmo n$o seja aberta, voc( #ode codific)*los em C ou C e ent$o us)*los
a #artir de seu #rograma Python!
$m!arcável
8oc( #ode embarcar Pyhton em seus #rogramas C1C #ara fornecer funcionalidades de
scri#ting aos usu)rios dos #rogramas!
&i!liotecas $%tensivas
- iblioteca Padr$o do Python 0Python /tandard ibrary7 é de fato enorme! la #ode ajud)*lo a
fa4er v)rias coisas envolvendo e&#ressIes regulares, gera$o de documenta$o, testes
unit)rios, threading, acesso a bancos de dados, bro2sers 2eb, CGi, F3P, e*mail, AM, AM*RPC,
K3M, ar%uivos 9-8, cri#tografia, GB 0Bnterfaces Gr)ficas com o su)rio7, 3 e outras coisas
de#endentes do sistema! embre*se de %ue tudo isto est) dis#on6vel onde %uer %ue Python
esteja instalado! sta é a chamada filosofia das "Pilhas Bnclu6das" do Python!
-lém da biblioteca #adr$o, e&istem v)rias outras bibliotecas de alta %ualidade, tais
comos 2&Python , 32isted, Python Bmaging ibrary e muitas outras!
Python é' de fato' uma linguagem poderosa e empolgante. *la possui a combinação eata de
desempenho e caracter$sticas que fazem escrever programas em Python uma tarefa fácil e divertida.
/e voc( j) tem o Python ;!& instalado, n$o é #reciso remov(*lo #ara instalar o Python =!?! 8oc( #ode
manter ambos instalados ao mesmo tem#o!
Python 3.0b1
Nota
$ é o #rom#t do shell! le ser) diferente #ara voc( de#endendo das configuraIes do seu
sistema o#eracional, #ortanto eu indicarei o #rom#t a#enas #elo s6mbolo $!
/e voc( v( alguma informa$o sobre a vers$o, como mostrado acima, ent$o o Python j) est) instalado!
Contudo, se voc( obter uma mensagem como esta
$ python -V
nt$o o Python n$o est) instalado! Bsto é altamente im#rov)vel, mas é #oss6vel!
@este caso, voc( tem dois meios #ara instalar o Python em seu sistema
• 8oc( #ode com#ilar oc+digo fonte do Python e ent$o instal)*lo! -s instruIes #ara a com#ila$o
s$o informadas no 2ebsite do Python!
• Bnstalar os #acotes bin)rios usando um gerenciador de #acotes %ue vem com o seu sistema
o#eracional, tal como apt-get no buntu1:ebian e outros inu& baseados em :ebian, yum no
Fedora, pkg_add no Free/:, etc! 8oc( #recisar) de uma cone&$o com a internet #ara usar este
método! ma alternativa é bai&ar os bin)rios de algum outro lugar e ent$o co#i)*los e instal)*los
em seu PC! Qsta o#$o estar) dis#on6vel a#+s o lanamento final do Python =!?
Para usu)rios 9indo2s
8isite o site htt#11222!#ython!org1do2nload1releases1=!?1e bai&e a Lltima vers$o, %ue era a vers$o =!?
beta H, %uando este livro foi escrito! le tem a#enas H;!S M, o %ue é bem com#acto %uando com#arado
com a maioria das outras linguagens ou #rogramas!
Cuidado
5uando for dada a o#$o #ara voc( desmarcar com#onentes o#cionais, n$o desma%ue
nenhumE -lguns destes com#onentes #odem ser Lteis #ara voc(, es#ecialmente B:!
m fato interessante é %ue usu)rios 9indo2s s$o os %ue mais bai&am os ar%uivos do Python! T claro %ue
isso n$o fornece uma vis$o geral, uma ve4 %ue %uase todos os usu)rios inu& j) t(m o Python instalado
#or #adr$odo
Prom#t em :./
seus sistema!
/e voc( %uer ser ca#a4 de usar o Python da linha de comando do 9indo2s, i!e! o #rom#t do :./, ent$o
voc( #recisa configurar a vari)vel P-3K corretamente!
Pra usu)rios 9indo2s ;???, AP ou ;??=, cli%ue em Painel de ontrole *U!istema *U "#anado *
U Vari%#eis de ambiente! Cli%ue na vari)vel chamadaPA12 na se$o '8ari)veis de /istema', ent$o
selecione &ditar e adicione VCWPython=? no fim do %ue j) estiver l)! T claro %ue voc( deve usar o
diret+rio correto onde voc( instalou o Python!
Para versIes antigas do 9indo2s, adicione as seguintes linhas no ar%uivo:'"()*&+&.,") P")/
P"):'Python30 0sem as as#as7 e reinicie o sistema! m 9indo2s @3 use o ar%uivo "()*&+&.2)!
Para usu)rios M-C ./ A
su)rios Mac ./ A j) encontrar$o o Python instalado em seu sistema! -bra o )erminal.app e rode python
- V, e siga os conselhos da se$o #ara usu)rios inu&!
/um)rio
m um sistema inu&, é #rov)vel %ue voc( j) tenha o Python instalado! Caso contr)rio, voc( #ode instal)*
lo usando o gerenciador de #acotes %ue vem com sua distribui$o! m um sistema 9indo2s, instalar o
Python é t$o f)cil como bai&ar o instalador e clicar duas ve4es sobre ele! :a%ui #ara frente n+s
assumiremos %ue voc( j) est) com o Python instalado em seu sistema!
- seguir n+s escreveremos nosso #rimeiro #rograma em Python!
Bntrodu$o
@+s veremos agora como rodar o tradicional #rograma '.l) Mundo' em Python! Bsto ensinar) a voc( como
escrever, salvar e rodar #rogramas no Python!
K) duas formas de usar o Python #ara rodar um #rograma * usando o #rom#t do inter#retador interativo
ou usando um ar%uivo fonte! @+s veremos como usar os dois métodos!
$ python
Python 3.0b 6r30b:;<10;= >ul 1? 00?= 1?:@@:1A8 B9! #.1<00 3 bit 6ntel8C on
Din3
*l% 9undo
FFF
Perceba %ue o Python mostra a sa6da da linha imediatamenteE . %ue voc( acabou de digitar é uma
sim#les instrução! @+s usamos print #ara im#rimir %ual%uer valor %ue voc( fornea! -%ui, n+s estamos
fornecendo o te&to *l% 9undo e este é imediatamente im#resso na tela!
Como Sair do Interpretador
Para sair do #rom#t, #ressione ctrl-d se voc( est) usando o B: ou o shell do inu&1/:! @o
caso do #rom#t de comando do 9indo2s, #ressionectrl-Gseguido da tecla enter!
scolhendo um ditor
-ntes de comearmos a escrever #rogramas em ar%uivos fonte, n+s #recisamos de um editor #ara
escrever estes ar%uivos! - escolha de um editor é crucial! 8oc( deve escolher o editor como se voc( fosse
escolher um carro novo! m bom editor o ajudar) a escrever #rogramas #ara Python facilmente, fa4endo
sua jornada mais confort)vel e te ajudando a chegar em seu destino 0atingindo seu objetivo7 de uma
forma f)cil e segura!
ma das necessidades mais b)sicas é o desta'ue de sinta%e%ue torna colorida todas as diferentes
#artes de seu #rograma, de forma %ue voc( #ossa ver seu #rograma e visuali4ar seu funcionamento!
/e voc( est) usando o 9indo2s, eu sugiro %ue voc( use o B:! . B: destaca a sinta&e e #ermite %ue
voc( rode seus #rogramas dentro dele mesmo, além de fa4er outras coisas! ma observa$o
es#ecial Não use o Notepad * é uma m) escolha #ois ele n$o destaca a sinta&e e também n$o tem
su#orte a indenta$o do te&to, %ue é muito im#ortante no nosso caso, como veremos adiante! ons
editores tais como o B: 0e também o 8BM7 automaticamente o ajudar$o a fa4er isso!
/e voc( est) usando inu&1Free/:, ent$o voc( tem diversas escolhas #ara um editor! /e voc( é um
#rogramador e&#eriente, ent$o voc( j) deve estar usandoVim ou &macs! T desnecess)rio di4er %ue estes
s$o dois dos mais #oderosos editores e %ue voc( ser) beneficiado #or us)*los #ara escrever seus
#rogramas em Python! u #essoalmente uso Vim #ara a maioria de meus #rogramas! /e voc( é um
#rogramador iniciante, voc( #ode usar o Hate, %ue é um dos meus favoritos! @o caso de voc( ter tem#o
#ara a#render Vim ou &macs, ent$o eu realmente recomendo %ue voc( a#renda a usar um deles, #ois ser)
de grande utilidade #ara voc( em sua longa jornada!
@este livro, n+s usaremos o I+L$, nosso B: 0 Integrated Development Environment * -mbiente Bntegrado de
:esenvolvimento7 como editor! . B: é instalado #or #adr$o com os instaladores Python #ara 9indo2s e
Mac ./ A! le também est) dis#on6vel #ara instala$o em inu& e /:s nos seus res#ectivos re#osit+rios!
@+s e&#loraremos como usar o B: na #r+&ima se$o! Para mais detalhes, #or favor veja
a
/edocumenta$o do B:!
voc( ainda deseja e&#lorar outras escolhas #ara um editor, veja a am#la lista de editores #ara
Python e faa sua escolha! 8oc( também #ode escolher um B: #ara Python! 8eja a am#la lista de B:s
%ue su#ortam Python #ara mais detalhes! ma ve4 %ue voc( #asse a escrever grandes #rogramas em
Python, B:s #odem ser muito Lteis!
u re#ito novamente, #or favor escolha um editor a#ro#riado * ele #ode fa4er a elabora$o de #rogramas
em Python mais f)cil e divertida!
Para usuários do 3im
K) uma boa introdu$o sobre como tornar o 8im um #oderoso B: #ara Python #or John M
-nderson!
Para usuários do $macs
K) uma boa introdu$o sobre como tornar o macs um #oderoso B: #ara Python #or Ryan
McGuire!
sando um -r%uivo Fonte
-gora vamos voltar a #rograma$o! K) uma tradi$o de %ue %uando voc( a#rende uma nova linguagem
de #rograma$o, o #rimeiro #rograma %ue voc( escreve e roda é o '.l) Mundo' * tudo %ue ele fa4 é
a#enas di4er '.l) Mundo' %uando voc( o roda! Como /imon Co4ens QH di4, ele é uma 'tradicional
invoca$o #ara os deuses da #rograma$o ajudarem voc( a a#render melhor a linguagem' 7 !
Bnicie o editor escolhido, digite o seguinte #rograma e salve*o como olamundo.py
/e voc( est) usando o B:, cli%ue sobre Iile X 2eD JindoD e ent$o entre com o seguinte #rograma!
nt$o cli%ue sobre Iile X !a#e!
#!/usr/bin/python
#Filename: olamundo.py
print0'.l) Mundo'7
Rode este #rograma abrindo o shell 0terminal inu& ou #rom#t do :./7 e entre com o comando python
olamundo.py!
/e voc( est) usando o B:, use o menu Kun X Kun 9odule ou o atalho I<!
- sa6da é semelhante a seguinte
$ python olamundo.py
*l% 9undo
/e voc( obter uma sa6da como acima, #arabénsE * voc( rodou com sucesso seu #rimeiro #rograma #ara
Python!
@o caso de um erro, #ro favor digite o #rograma acima exatamente como mostrado e rode o #rograma
novamente! @ote %ue Python é case*sensitive i!e! print n$o é o mesmo %ue Print * note o p minLsculo na
#rimeira instru$o e o PmaiLsculo na segunda! -lém disso, assegure*se %ue n$o haja es#aos ou
tabulaIes antes do #rimeiro car)cter de cada linha * n+s veremos #or %ue isso é im#ortante mais tarde!
Como ele Funciona
8amos considerar as duas #rimeiras linhas do #rograma! las s$o chamadas de omentrios * %ual%uer coisa
a direita do s6mbolo L é um coment)rio e é usado #rinci#almente como notas #ara o leitor do #rograma!
Python n$o usa os coment)rio, e&ceto #ara o caso es#ecial da #rimeira linha! la é chamada de linha de
organi"ação * sem#re %ue os dois #rimeiros caracteres do ar%uivo fonte s$o LM seguidos #ela locali4a$o de
um #rograma, isto di4 #ara seu sistema inu&1ni& %ue este #rograma deve ser rodado com este
inter#retador %uando voc( exeutar o #rograma! Bsto é e&#licado em detalhes na #r+&ima se$o! @ote %ue
voc( sem#re #ode rodar o #rograma em %ual%uer #lataforma es#ecificando o inter#retador diretamente
na linha de comando, como o comandopython olamundo.py !
Importante
se coment)rio em seu #rograma de forma sensata, #ara e&#licar algum detalhe im#ortante de
seu #rograma * isto é Ltil #ara %ue os leitores de seu #rograma #ossam entender facilmente o
%ue ele est) fa4endo! embre*se, est) #essoa #ode ser voc( mesmo de#ois de seis mesesE
.s coment)rio s$o seguidos #or uma instrução de Python! -%ui n+s chamamos aunção print %ue a#enas
im#rime o te&to *l% 9undo! @+s a#renderemos sobre funIes em um ca#6tulo #osterior, o %ue voc(
deve entender agora é %ue o %ue voc( colocar nos #ar(nteses ser) im#resso na tela! @este caso, n+s
fornecemos*l% 9undo %ue se refere a uma string * n$o se #reocu#e, n+s vamos e&#lorar essas
terminologias em detalhes mais tarde!
Programas &ecut)veis em Python
Bsto funciona a#enas #ara usu)rios inu&1ni&, mas usu)rios do 9indo2s #odem estar curiosos sobre a
#rimeira linha do #rograma! Bnicialmente, devemos dar ao #rograma a #ermiss$o #ara e&ecutar usando o
comando chmod e ent$o rodar o #rograma fonte!
$ chmod aNO olamundo.py
$ .olamundo.py
*l% 9undo
. comando chmod é usado a%ui #ara mudar 0'ch'ange7 o modo 0'mod'e7 do ar%uivo dando #ermiss$o #ara
todos 0'a'll7 os usu)rio do sistema o e&ecutar 0e'&'ecute7! nt$o, n+s e&ecutamos o #rograma diretamente
es#ecificando a locali4a$o do ar%uivo fonte! @+s usamos o . #ara indicar %ue o #rograma est) no
diret+rio atual!
Para tornar as coisas mais divertidas, voc( #ode renomear o ar%uivo #ara olamundo e rod)*lo
com .olamundo e ele ainda funcionar), uma ve4 %ue o sistema sabe %ue ele tem de rodar o #rograma
usando o inter#retador cuja locali4a$o é es#ecificada na #rimeira linha do ar%uivo fonte!
-gora voc( é ca#a4 de rodar o #rograma desde %ue voc( conhea o caminho e&ato #ara o ar%uivo fonte *
mas e se voc( desejar rodar o ar%uivo de %ual%uer lugarY 8oc( #ode fa4er isso arma4enando o #rograma
em um dos diret+rios listados na vari)vel de ambiente P")! /em#re %ue voc( roda %ual%uer #rograma, o
sistema #rocura #or a%uele #rograma em cada diret+rio listado na vari)vel de ambiente P")e ent$o roda
a%uele #rograma! @+s #odemos tornar este #rograma dis#on6vel em %ual%uer lugar sim#lesmente
co#iando este ar%uivo fonte #ara um dos diret+rios listados no P")!
$ echo $P")
usrlocalbin:usrbin:bin:usr+11K;bin:homesDaroopbin
$ cp olamundo.py homesDaroopbinolamundo
$ olamundo
*l% 9undo
@+s #odemos mostrar a vari)vel P") usando o comando echo e incluindo o #refi&o $ #ara indicar #ara o
shell %ue n+s #recisamos do valor desta vari)vel! @+s vemos %ue homesDaroopbin é um dos diret+rios
na vari)vel P-3K ondes$aroop é o nome de usu)rio %ue eu estou usando em meu sistema! Provavelmente
e&iste um diret+rio similar #ara seu nome de usu)rio #ara seu sistema! -lternativamente, voc( #ode
adicionar um diret+rio de sua escolha #ara a vari)vel P") * isto #ode ser feito
rodando P")/$P"):homesDaroopmydironde homesDaroopmydir é o diret+rio %ue eu desejo
adicionar na vari)velP")!
ste método é muito Ltil se voc( deseja escrever scri#ts Lteis %ue voc( %ueira rodar de %ual%uer lugar, a
%ual%uer hora! T como criar seu #r+#rio comando, semelhante ao cd ou %ual%uer outro comando %ue
voc( use no terminal linu& ou no #rom#t do :./!
Cuidado
.btendo -juda
/e voc( #recisar de informa$o sobre alguma fun$o ou instru$o em Python, ent$o voc( #ode usar a
fun$o embutida help! Bsto é muito Ltil es#ecialmente %uando estiver usando o #rom#t do inter#retador!
Por e&em#lo, rodehelp6print8 * isto mostra a ajuda #ara a fun$o #rint %ue é usada #ara im#rimir coisas
na tela!
Nota
Pressione Q #ara sair da ajuda!
:e forma similar, voc( #ode obter informa$o sobre %uase %ual%uer coisa em Python! se help68 #ara
a#render mais usando o #r+#rio helpE
@o caso de voc( #recisar de ajuda #ara o#eradores como return, ent$o voc( deve coloc)*los dentro de
as#as como em help6return8 dessa forma Python n$o se confunde com o %ue n+s %ueremos fa4er!
/um)rio
-gora voc( é ca#a4 ou de escrever,salvar e rodar #rogramas em Python facilmente! -gora %ue voc( é um
usu)rio Python, vamos a#render alguns conceitos de Python!
Python pt-br:Fundamentos
Bm#rimir '.l) mundo' n$o é suficiente, ou éY 8oc( %uer fa4er mais %ue isso * voc( %uer inserir dados,
mani#ul)*los e obter alguma res#osta a #artir deles! @+s #odemos conseguir isso em Python usando
constantes e vari)veis!
Constantes iterais
m e&em#lo de uma constante literal é um nLmero como <, 1.3, R.<e-3 ou uma string 0se%u(ncia de
caracteres7 como &sta S uma string ou ET uma stringME! la é denominada literal #or%ue é literal *
voc( usa seu valor literalmente! . nLmero sem#re re#resenta a si mesmo e nada além disso * ele é
umaonstante #ois seu valor n$o #ode ser mudado! ogo, todos esses valores referem*se a constantes
literais!
@Lmeros
.s nLmeros em Python s$o s$o de tr(s ti#os * inteiros, #onto flutuante e com#le&os!
• é um e&em#lo de inteiro, os inteiros s$o os nLmeros redondos!
• 3.3 e <.3&-@ s$o e&em#los de nLmeros de #onto flutuante 0ouloats, #ara abreviar7! -
nota$o & indica as #ot(ncias de H?! @este caso, <.3&-@ significa<.3 U 10*Z!
• 6-<N@8 e 6.3 - @.;8 s$o e&em#los de nLmeros com#le&os!
Nota para proramadores e%perientes
@$o h) o ti#o 'long int' 0inteiro longo7 em se#arado! . ti#o inteiro #adr$o #ode assumir
%ual%uer valor grande!
/trings
ma string é uma se%u&nia de arateres! -s strings s$o basicamente um amontoado de #alavras! -s
#alavras #odem estar em ingl(s ou em %ual%uer l6ngua %ue seja su#ortada #elo #adr$o nicode, %ue
atende a %uase todas as l6nguas do mundo!
Nota para proramadores e%perientes
-s#as
-s strings:u#las
em as#as du#las trabalham e&atamente da mesma maneira %ue as strings em as#as unit)rias!
is um e&em#lo EWual S o seu nomeXE
-s#as 3ri#las
8oc( #ode es#ecificar strings %ue ocu#am v)rias linhas usando as#as tri#las * 0""" ou '''7! 8oc( #ode usar
as#as unit)rias e as#as du#las livremente #ara formar as as#as tri#las! is um e&em#lo
&sta S uma string multi-linha. &sta S a primeira linha.
/e%\(ncias de sca#e
/u#onha %ue voc( %ueira obter uma string %ue contenha um a#+strofe 0 7, como voc( escrever) essa
stringY Por e&em#lo, a string é Jhats your nameX! 8oc( n$o #ode escreverJhats your
nameX #or%ue o Python ficar) confuso sobre onde a string comea e onde termina! ogo, voc( ter) %ue
es#ecificar %ue este a#+strofe n$o indica o fim da string! Bsso #ode ser feito com a ajuda do %ue é
denominada uma se%u&nia de esape! 8oc( es#ecifica o a#+strofe como ' * note a barra invertida! -gora,
voc( #ode escrever a string como Jhat's your nameX!
ma outra maneira de escrever essa string es#ec6fica seria EJhats your nameXE, isto é, usando as#as
du#las! :a mesma maneira, voc( #ode usar uma se%u(ncia de esca#e #ara inserir as#as du#las em uma
string limitada #or as#as du#las! 8oc( também #ode inserir a #r+#ria barra invertida usando a se%\(ncia
de esca#e ''!
. %ue fa4er se voc( %uer escrever uma string de duas linhasY ma solu$o é usar uma string limitada #or
as#as tri#las conforme foi ensinado #reviamente ou voc( #ode utili4ar uma se%\(ncia de esca#e #ara o
caracter de nova linha * 'n#ara indicar o in6cio da nova linha! is um e&em#lo, &ssa S a primeira
linha'n&ssa S a segunda linha! ma outra se%\(ncia de esca#e Ltil a ser conhecida é a tabula$o
* 't! K) muitas outras se%\(ncias de esca#e, mas eu mencionei a%ui somente as mais Lteis!
T im#ortante observar %ue numa string, uma Lnica barra invertida no fim da linha indica %ue a string
continua na #r+&ima linha, mas nenhuma linha nova é adicionada! Por e&em#lo
E&ssa S a primeira frase.'
@$o h) ti#o de dado char 0caracter7 se#arado em Python! @$o e&iste nenhum motivo real #ara
isto e eu tenho certe4a %ue voc( n$o es%uecer) isto!
Nota para proramadores Perl4P2P
embre*se %ue strings com as#as sim#les e du#las s$o a mesma coisa * elas n$o diferem entre
si
Nota para 6suários de $%pressão )eular
/em#re use strings brutas %uando estiver mani#ulando e&#ressIes regulares! :o contr)rio,
ser) necess)rio muito uso de caracteres de esca#e! Por e&em#lo, refer(ncias a barras
invertidas #odem ser feitas como ''1 our'1!
. método 'format'
!s vezes n)s iremos querer construir strings de uma outra informação. 5sto é onde o método format68 é
7til
#!/usr/bin/python
# Filename: str'ormat.py
age / ;]
name / '/2aroo#'
Python é fortemente orientada a objetos, no sentido %ue tudo é um objeto, incluindo nLmeros,
strings e funIes!
-gora veremos como usar vari)veis juntamento com constantes literais! /alve o e&em#lo a seguir e
e&ecute o #rograma!
Como escrever proramas em Python
i / ]
print0i7
i / i N H
print0i7
<
print6i8
é o mesmo %ue
i / <
print6i8
ou ainda
i / < print6i8
@o entanto, eu recomendo 8ortemente %ue voc( se atenha a escrever somente uma :nica linha
lóica para cada linha 8ísica! se mais de uma linha f6sica #ara uma Lnica linha l+gica a#enas se a
linha l+gica for realmente com#rida! - ideia é evitar o #onto*e*v6rgula tanto %uanto #oss6vel, uma ve4 %ue
isso condu4 a um c+digo mais leg6vel! :e fato, eu nuna utili4ei ou se%uer vi um #onto*e*v6rgula num
#rograma Python!
/egue um e&em#lo da escrita de uma linha l+gica se estendendo #or muitas linhas f6sicas! @os referimos
a isso com #unção e%plícita de linhas
s / sto S uma string. '
print6s8
6i8
é o mesmo %ue
print6i8
m alguns casos n$o é necess)rio utili4ar barra invertida! @esses casos a linha l+gica usa #ar(nteses,
colchetes ou chaves! Bsto se chama #unção implícita de linha! 8oc( #ode v(*la em a$o %uando
escrevermos #rogramas usandolistasem ca#6tulos #osteriores!
Bndenta$o
s#aos s$o im#ortantes em Python! @a verdade, espaços no início da linha são importantes ! Bsto é
chamado de indentação! s#aos 0es#aos e tabs7 no in6cio da linha l+gica s$o usados #ara determinar o
n6vel de indenta$o da linha l+gica, o %ual #or sua ve4 é usado #ara determinar o agru#amento de
instruIes
Bsto significa %ue as instruIes %ue v$o juntas devem ter a mesma indenta$o! Cada conjunto dessas
instruIes é chamada de !loco! 8eremos e&em#los de como os blocos s$o im#ortantes nos ca#6tulos
seguintes!
ma coisa %ue voc( deve lembrar é %ue indenta$o inade%uada #ode ocasionar erros! Por e&em#lo
i / ]
print0'.
valor é '= i7 # Erro! 0ereba um espaço no in1io da linha
print0'u
re#ito, o valor é ' = i7
5uando voc( e&ecuta isso, obtém o seguinte erro
Iile EDhitespace.pyE= line @
Perceba %ue h) um es#ao no in6cio da segunda linha! . erro indicado #elo Python nos di4 %ue a sinta&e
do #rograma é inv)lida, isto é, o #rograma n$o foi escrito direito! . %ue isso %uer di4er é %ue vo& não pode
0e&ceto #elo bloco #rinci#al #adr$o %ue voc( vem usando o
iniiar novos bloos de instruç3es arbitrariamente
tem#o todo, é claro7! Casos nos %uais voc( #ode usar novos blocos ser$o detalhados em ca#6tulos
#osteriores, tais como o ca#6tulo sobre controle de flu&o!
Como indentar
Não use uma mistura de tabs e es#aos #ara a indenta$o, #ois isso n$o funciona
ade%uadamente em diferentes #lataformas! u reomendo ortemente %ue voc( use um 4nio
tab ou %uatro espaços #ara cada n6vel de indenta$o!
Bntrodu$o
- maioria das instruIes 0linhas l+gicas7 %ue voc( escrever) ir$o contere%press;es! m e&em#lo sim#les
de e&#ress$o
5peradores é N%ue
definem 3! ma e&#ress$o
o#era$o #ode seredivida
ser) reali4ada #odem emser
o#eradores e o#erandos!
re#resentados #or s6mbolos como N ou #or
#alavras*chave es#eciais! .#eradores re%uerem dados #ara funcionar e tais dados s$o
chamados operandos! @este caso, e 3 s$o os o#erandos!
.#eradores
Bremos dar uma breve olhada nos o#eradores e sua utili4a$o
Perceba %ue voc( #ode testar as es#ressIes dadas nos e&em#los usando o inter#retador interativo! Por
e&em#lo, #ara testar a e&#ress$o N 3, use o inter#retador interativo do Python
UUU ; N =
]
UUU = ]
H]
UUU
Operadores e sua utilização
"perador Nome $%plicação $%emplos
3orna um nLmero
negativo ou a -<. retorna um nLmero negativo!<0 -
* /ubtra$o subtra$o de um @ retorna ;!
nLmero #or outro
Retorna o #roduto de
dois nLmeros ou uma U 3 retorna ;! la U
Multi#lica$o string re#etida uma
3 retornalalala!
certa %uantidade de
ve4es!
:esloca os bits do
nLmero #ara a retorna ?! é re#resentado
es%uerda #elo nLmero #or 10 em bits! :eslocando os bits do
:eslocamento de bits es#ecificado!
de bits [ nLmero [ es%uerda #or ; bits
es%uerda 0Cada nLmero é retorna 1000, %ue re#resenta o nLmero
re#resentado na
mem+ria #or bits ou decimal ?!
digitos bin)rios i!e! ?
and H7
its configurados em
.#erador bit a um ou outro o#erador < 3 retorna A
bit .R s$o configurados no
resultado
its configurados em
um ou outro o#erador,
_ .#erador bit a mas n$o em ambos, < 3 retorna ;
bit A.R s$o configurados no
resultado
its configurados no
.#erador bit a o#erador n$o s$o < retorna -;!
bit @.3 configurados no
resultado e vice*versa!
O / y / O // y retorna)rue!
O / str y / stK O //
Bguala Com#ara se os objetos yretorna Ialse!
s$o iguais O / str y / str O //
yretorna )rue!
Precend(ncia de .#eradores
/e voc( tem uma e&#ress$o como N 3 U @, ser) reali4ada #rimeiro a adi$o ou a multi#lica$oY -
matem)tica do nosso ensino médio nos di4 %ue a multi#lica$o deve ser reali4ada #rimeiro! Bsso significa
%ue o o#erador de multi#lica$o #ossui maior #reced(ncia %ue o o#erador de adi$o!
- tabela a seguir nos d) a ordem de #reced(ncia de o#eradores #ara o Python, do de menor #reced(ncia
0least binding7 ao de maior #reced(ncia 0most binding7! Bsto significa %ue em uma dada e&#ress$o, Python
ir) #rimeiramente avaliar os o#eradores listados na base da tabela antes dos o#eradores listados ao to#o!
- tabela a seguir 0tirada de Manual de refer(ncia Python7 é #ro#orcionada visando maior entendimento! T
muito melhor usar #ar(nteses #ara agru#ar o#eradores e o#erandos a#ro#riadamente de maneira %ue
fi%ue clara a #reced(ncia! Bsso torna o #rograma mais leg6vel! 8eja .rdem de -valia$oabai&o #ara
detalhes!
Precedência de Operadores
"perador +escrição
lambda &#ress$oambda
or .#eradorooleano.R
and .#eradorooleano-@:
not& .#eradorooleano@.3
&,*& Positivo,@egativo
& .#eradorbit*a*bit@.3
&#onencia$o
&!atributo Referencia a atributo
&Q6ndice /ubscri$o
&Q6ndiceH6ndice; Re#arti$o
f0argumentos !!!7 Chamada de fun$o
0e&#ressIes, !!!7 niao ou e&ibi$o de tu#la
Qe&#ressIes, !!! &ibi$o de listas
Nchavedado, !!!O &ibi$o de dicion)rio
.s o#eradores %ue ainda n$o vimos ser$o e&#licados em ca#6tulos #osteriores!
.#eradores com a mesma preed&nia s$o listados na mesma linha na tabela acima! Por
e&em#lo, N e - #ossuem a mesma #reced(ncia!
.rdem de avalia$o
Por #adr$o, a tabela de #reced(ncia dos o#eradores decide %ue o#eradores s$o avaliados #rimeiro!
Para tornar uma e&#ress$o mais leg6vel #odemos usar #ar(nteses! Por e&em#lo, N 63 U @8 é,
definitivamente, mais f)cil de entender %ue N 3 U @ %ue re%uer conhecimento da ordem de
#reced(ncia dos o#eradores! -ssim como todo o resto, #ar(nteses devem ser usados conscientemente
0n$o sobrecarregue7 e n$o devem ser redundantes 0como em N 63 N @87!
/e voc( %uer mudar a ordem em %ue eles s$o avaliados, voc( #ode, novamente, usar #ar(nteses! Por
e&em#lo, se voc( %uer %ue a adi$o seja reali4ada antes da multi#lica$o em uma e&#ress$o, ent$o voc(
#ode escrever algo como 6 N 38 U @ !
-ssociatividade
.#eradores s$o, geralmente, associados da es%uerda #ara a direita, isto é, o#eradores com a mesma
#roced(ncia s$o avaliados da es%uerda #ara a direita! Por e&em#lo, N 3 N @ é avaliado como 6 N 38
N @! -lguns o#eradores, como os de atribui$o, #ossuem a associatividade da direira #ara a es%uerda,
isto é, a / b / c é tratado como a / 6b / c8 !
&#ressIes
sando &#ressIes
&em#lo
#!/usr/bin/python
# 6ome do 7r%uivo: expressao.py
length / ]
breadth / ;
rea S 10
Perimetro S 1@
Como Funciona
. tamanho e am#litude do retngulo s$o arma4enados nas vari)veis length e breadth! @+s os utili4amos
#ara calcular
e&#ress$o a )reaUebreadth
length o #er6metro do retngulo
na vari)vel area ecom a ajuda
ent$o de e&#ressIes!
o im#rimimos usando-rma4enamos o !resultado
a fun$o print da
@o segundo
caso, usamos o valor da e&#ress$o U 6length N breadth8 diretamente na fun$o #rint!
Perceba, também, como o Python fa4 a 'im#ress$o elegante' 0#retty*#rint7 da sa6da! Mesmo %ue n$o
tenhamos es#ecificao um es#ao entre rea S e a vari)vel area, Python coloca*o #ara n+s de uma
maneira %ue tenhamos uma sa6da lim#a e bonita, e o #rograma é muito mais leg6vel dessa maneira
0desde %ue n$o tenhamos %ue nos #reocu#ar com es#aamento na string %ue utili4amos #ara a sa6da7!
Bsto é um e&em#lo de como o Python torna mais f)cil a vida do #rogramador!
/um)rio
8imos como utili4ar o#eradores, o#erandos e e&#ressIes * estes s$o os blocos de constru$o b)sicos de
%ual%uer #rograma! - seguir, veremos como fa4er uso deles em nossos #rogramas através de indica$o!
Python pt-br:Controle de Fluxo
Bntrodu$o
@os #rogramas %ue vimos até agora, houveram uma série de declaraIes e o Python e&ecuta*os na
mesma ordem! se voc( %uisesse alterar o flu&o de seu funcionamentoY Por e&em#lo, voc( %uer %ue o
#rograma tome algumas decisIes e faa diferentes coisas de#endendo das diferentes situaIes, como
im#rimir
Como voc( 'om :ia'
deve terou 'oa 3arde'
#ensando, istode#endendo
é alcanado da hora as
usando do instruIes
diaY de controle de flu&o no Python
* if, for e Dhile!
- instru$o BF
- instru$o if é usada #ara verificar uma condi$o e se a condi$o é verdadeira, ser) e&ecutado um bloco
de instruIes 0chamado de blooi(iblo-)7, senão ser) #rocessado outro bloco de instruIes 0chamado
de blooelse(elseblo-)7! - cl)usula elseé o#cional!
&em#lo
#!/usr/bin/python
# 6ome do a%uivo: i.py
number / ;=
guess / int0in#ut0'ntre com um nLmero inteiro 7'7
i8 guess // number:
print0'Parabéns, voc( advinhou!'7 # 6ovo bloo omeça a%ui
print0'0mas voc( n$o ganhou nenhum #r(mioE7'7 # 6ovo bloo termina a%ui
eli8 guess number:
print0'@$o, era um #ouco maior %ue isso'7 # 5utro bloo
# 8o& pode a"er o %ue %uiser em um bloo ...
else:
print0'@$o, era um #ouco menor %ue isso'7
# 8o& deve adivinhar 9 n4mero a alançar a%ui
print0'Feito'7
# Esta 4ltima instrução sempre exeutada; depois da instrução i ser exeutada
/a6da
$ python if.py
Ieito
$ python if.py
Ieito
$ python if.py
Ieito
Como Funciona
@este #rograma, recebemos tentativas de advinhaIes do usu)rio e verificamos se este é igual ao
nLmero %ue temos! /etamos a vari)vel number #ara %ual%uer inteiro %ue desejarmos, digamos 3! nt$o,
#egamos a tentativa de advinha$o do usu)rio usando a fun$o input68! FunIes s$o #eas de
#rogramas reutili4)veis! Bremos ler mais sobre elas no #r+&imo ca#6tulo!
@+s fornecemos uma string #ara fun$o enbutida input %ue a im#rime na tela e aguarda uma entrada do
usu)rio! ma ve4 %ue entramos com algum valor e a#ertamos a tecla enter, a fun$o input68 retorna o
valor %ue entramos, como uma string! @+s, ent$o, convetemos essa string #ara um inteiro usando int e
de#ois arma4enamos na vari)vel guess! @a verdade, o int é uma classe, mas tudo o %ue vo( #recisa
saber agora é %ue voc( #ode us)*la #ara converter uma string em um nLmero inteiro 0assumindo %ue a
string contém um nLmero inteiro v)lido no te&to7!
- seguir, com#aramos a tentativa de adivinha$o do usu)rio com o nLmero %ue escolhemos! /e eles
forem iguais, im#rimimos uma mensagem de sucesso! @ote %ue utili4amos n6veis de indenta$o#ara di4er
ao Python %ue instruIes #ertencem a %ual bloco! T #os isso %ue a indenta$o é t$o im#ortante no
Python! u es#ero %ue voc( esteja mantendo a regra da "indenta$o consistente"! 8oc( est)Y
Perceba %ue a instru$o if contém 'dois #ontos' no final * n+s estamos indicando ao Python %ue a seguir
h) um bloco de instruIes!
nt$o, checamos se a tentativa de advinha$o do usu)rio é menor %ue o nLmero da vari)vel number, e
se for verdadeiro, informamos ao usu)rio #ara tentar com um nLmero um #ouco maior %ue o inserido! .
%ue usamos a%ui é a clausula elif%ue, na verdade, combina duas instruIes if else-if
else relacionadas em uma instru$o if-elif-else combinada! Bsso torna o #rograma mais f)cil e redu4
%uantidade de indentaIes re%ueridas!
-s instruIes elif else devem, também, #ossuir 'dois #ontos' no final da linha l+gica, seguido #elo seu
bloco de instruIes corres#ondente 0com indenta$o a#ro#riada, é claro7!
8oc( #ode ter outra instru$oif dentro de um bloco*if de uma instru$o if if a assim #or diante * isto é
chamado de instru$o if aninhada
embre %ue as #artes elif e else s$o o#cionais! ma instru$o if m6nima v)lida é
i8 3rue:
print0'/im, é verdadeiro'7
:e#ois %ue #ython terminou de e&ecutar a instru$o if com#letamente, junto com as
cl)usulas elif e else associadas, ele #assa #ara a #r+&ima instru$o no bloco contendo a instru$o if!
@este caso, é o bloco #rinci#al onde a e&ecu$o do #rograma inicia e a #r+&ima instru$o
é print6Ieito8! :e#ois disso, Python v( o final do #rograma e sim#lesmente termina!
-inda %ue este seja um #rograma muito sim#les, eu estive a#ontando v)rias coisas %ue voc( deve notar
em #rogramas assim! 3odas elas s$o bem avanadas 0e sur#reendentemente sim#les #ara todos voc(s
com conhecimento em C1C7 e re%uerem %ue voc( esteja inicialmente ciente de todas elas, mas de#ois
disso, voc( ir) se familiari4ar e isso ir) se tornar 'natural' #ara voc(!
Nota para os proramadores de C4C55
@$o h) a instru$o sDitch no Python! 8oc( #ode usar uma instru$oif..elif..else #ara
fa4er a mesma coisa 0e em alguns casos, usar umdicion)rio #ara fa4(*lo ra#idamente7
- instru$o 2hile
- instru$o Dhile #ermite %ue voc( e&ecute re#etidamente um bloco de instruIes en%uanto uma
condi$o for verdadeira! ma instru$o Dhile é um e&em#lo do %ue é chamado de instru$o de looping!
ma instru$o Dhile #ode ter uma cl)usula else o#cional!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: $hile.py
number / ;=
running / 3rue
<hile running:
guess / int0in#ut0'ntre com um nLmero inteiro 7'7
i8 guess // number:
print0'Parabéns, voc( advinhou!'7
running / False # Isto a" o loop $hile parar
eli8 guess number:
print0'@$o, é um #ouco maior %ue este!'7
else:
print0'@$o, é um #ouco menor %ue este!'7
else:
print0'. loo# 2hile terminou!'7
# Faça %ual%uer outra oisa %ue %uiser a%ui
print0'Fim'7
/a6da
$ python Dhile.py
&nter an integer : 3
Iim
Como funciona
@este #rograma, n+s ainda estamos jogando o jogo da advinha$o, mas a vantagem é %ue o usu)rio #ode
continuar tentando advinhar até %ue ele acerte o nLmero * n$o ha necessidade de rodar novamente o
#rograma #ara cada tentativa de adivinha$o, como fi4emos na se$o anterior! Bsto demonstra o uso da
instru$o Dhile!
@+s movemos oinput e a instru$o if #ara dentro do loo# Dhile e setamos a
vari)vel running #ara )rue antes do loo# 2hile! Primeiro, n+s checamos se a
vari)vel running é )rue0verdadeiro7 e ent$o seguimos #ara e&ecutar e&ecutar o em#hasisUbloco
2hile1em#hasisU corres#ondente! :e#ois %ue o bloco é e&ecutado, a condi$o é novamente checada
%ue neste caso é a vari)velrunning! /e isso é verdade, n+s e&ecutamos o bloco 2hile novamente, sen$o
continuamos #ara e&ecutar o bloco else o#tional e ent$o seguir #ara a #r+&ima instru$o!
. bloco else é e&ecutado %uando a condi$o do loo# Dhile se torna Ialse0falso7 * esta #ode até ser a
#rimeira ve4 %ue a condi$o é verificada! /e h) alguma cl)usula else #ara um loo# Dhile, ele é sem#re
e&ecutado a menos %ue voc( tenha um loo#Dhile %ue se e&ecutado #ara sem#re sem sair se%uer uma
ve4E
.s valores )rue0verdadeiro7 e Ialse0falso7 s$o chamados ti#os ooleanos e voc( #ode consider)*los
e%uivalentes aos valores 1 e 0 res#ectivamente!
. bloco else é, na verdade, redundante a #artir %ue voc( #ode colocar estas instruIes no mesmo bloco
0como a instru$o Dhile7 de#ois da instru$o Dhile#ara conseguir o mesmo efeito!
Nota para proramadores de C4C55
embre %ue voc( #ode ter uma cl)usula else else #ara o loo# Dhile!
. loo# for
- instru$o for..in é outra instru$o de loo# %ue itera sobre uma se%u(ncia de objetos, #or e&em#lo,
#ercorre cada item em uma se%u(ncia! Bremos ver mais sobre se%u(ncias em detalhes em ca#6tlos
#osteriores! . %ue voc( #recisa saber agora é %ue uma se%u(ncia é a#enas uma cole$o ordenada de
itens!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: or.py
3
Como funciona
@este #rograma, estamos im#rimindo uma se%u&nia de nLmeros! @+s geramos esta se%u(ncia de nLmeros
usando a fun$o interna range!
. %ue fa4emos é fornecer dois nLmeros e range retorna uma se%u(ncia de nLmeros iniciando do #rimeiro
nLmero e segue até o segundo nLmero! Por e&em#lo,range61=<8 nos d) a se%u(ncia B1= = 3= @C! Por
#adr$o, range
ele se torna d) um #asso
o tamanho contando
do #asso! Por de H em H!
e&em#lo, /e fornecer*mos
range61=<=8 nos um terceiro
d)B1=3C nLmero #ara
! embre*se range, ent$o
%ue range
e&tende*se at o segundo nLmero, ou seja, ele nãoinclui o segundo nLmero!
. loo# for ent$o itera sobre esta fai&a * for i in range61=<8 é e%uivalente afor i in B1= = 3=
@C %ue é a mesma coisa %ue atribuir cada nLmero 0ou objeto7 na se%u(ncia a i, um de cada ve4, e ent$o
e&ecutar o bloco de instriIes #ara cada valor de i! @este caso, n+s a#enas im#rimimos o valor no bloco
de instruIes!
embre*se %ue a #arte else é o#cional! 5uando inclu6da, ela ser) sem#re e&ecutada uma ve4 a#+s o
loo# for ter terminado, a n$o ser %ue uma instru$obrea seja encontrada!
embre*se %ue o loo# for..in funciona #ara %ual%uer se%u(ncia! -%ui, temos uma lista de nLmeros
gerados #ela fun$o interna range, mas, no geral, #odemos usar %ual%uer ti#o de se%u(ncia de %ual%uer
ti#o de objetoE Bremos e&#lorar essa idéia em detalhes em ca#6tulos #osteriores!
Nota para proramadores de C4C554=ava4C>
. loo# for do Python é radicalmente diferente do loo# for das linguagens C1C!
Programadores da linguagem C ir$o notar %ue o loo# for no Python é similar ao
loo# foreach em C! Programadores da linguagem Java ir$o notar %ue o mesmo é similar a for
6int i : nt"rray8 em Java H!] !
m C1C, se voc( %uer escrever for 6int i / 0 i < iNN8 , ent$o em Python voc(
escreve a#enas for i in range60=<8! Como voc( #ode ver, o loo# for é mais sim#les, mais
e&#ressivo e menos #ro#enso a erros no Python!
- instru$o brea
- instru$o break é usada #ara %uebrar uma instru$o de loo#, ou seja, #ara a e&ecu$o de uma instru$o
de loo#, mesmo %ue a condi$o n$o tenha se tornado Ialse ou a se%u(ncia de itens tenha sido iterada
com#letamente!
ma informa$o im#ortante é %ue se voc( %uebra um loo# for ou Dhile, %ual%uer
bloco else corres#ondente não é e&ecutado!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: brea-.py
<hile 3rue:
s / in#ut0'ntre com alguma coisa '7
i8 s // 'sair':
!rea.
print0'3amanho da string é '= len0s77
print0'Feito'7
/a6da
$ python break.py
)amanho da string S 1
&ntre com alguma coisa: se #oc Quer tornar seu trabalho tambSm di#ertido:
)amanho da string S 1
Ieito
Como funciona
@este #rograma, n+s recebemos os dados de entrada do usu)rio re#etidamente e im#rimimos o tamanho
de cada entrada toda ve4! stamos #rovendo uma condi$o es#ecial #ara #arar o #rograma verificando
se a entrada do usu)rio é sair! Paramos o #rograma com em#hasisUbrea1em#hasisU, fa4endo com
%ue saiamos do loo# e alcancemos o fim do #rograma!
. tamanho da entrada #ode ser encontrado utili4ando a fun$o interna len!
embre*se %ue a instru$o break #ode também ser usada com o loo# for!
Python Poético do /2aroo#
.s dados de entrada %ue utili4ei a%ui é um mini #oema %ue escrevi chamadoPython Po9tico do
S<aroop
Programar S di#ertido
use PythonM
- Bnstru$o continue
- instru$o continue é usada #ara di4er ao Python %ue #ule as intruIes restantes do bloco de loo#
<hile 3rue:
s / in#ut0'ntre com algo '7
i8 s // 'sair':
!rea.
i8 len0s7 =:
print0'Muito #e%ueno'7
continue
print0'- entrada é de tamanho suficiente'7
# Faça outros tipos de proesso a%ui...
/a6da
$ python continue.py
9uito peQueno
9uito peQueno
Como funciona
@este #rograma, aceitamos entradas do usu)rio, mas as #rocessamos somente se ela #ossu6rem #elo
menos = caracteres! nt$o, utili4amos a fun$o interna len#ara #egar o tamanho e se este for menor %ue
=, #ulamos o resto das instruIes no bloco utili4ando a instru$o continue! /en$o, o resto das instruIes
no loo# s$o e&ecutadas e #oderemos fa4er %ual%uer ti#o de #rocessamento %ue %uiser*mos a%ui!
@ote %ue a instru$o continue funciona, também, com o loo# for!
/um)rio
8imos como utili4ar as tr(s instruIes de controle de flu&o * if, Dhile and for, em conjunto com suas
instruIes break e continue associadas! stas s$o algumas das #artes mais utili4adas do Python e
outras, tornar*se confort)vel com elas é essencial!
Python pt7!r?Funcoes
Introdução
Bunç(es são pedaços reutilizáveis de programas. *las permitem dar um nome para um bloco de c)digo e
rodá#lo usando seu nome em qualquer lugar do programa' quantas vezes forem necessárias. 5sto é
conhecido como chamar a função. /)s %á usamos muitas funç(es internas como len e range.
C conceito de função é provavelmente o bloco de construção mais importante de qualquer programa não#
trivial 3em qualquer linguagem de programação4' portanto vamos eplorar vários aspectos das funç(es
neste cap$tulo.
Bunç(es são definidas usando a palavra#chave def. ! mesma é seguida pelo seu nome identificador' um
par de parênteses que podem conter ou não nomes de variáveis separados por v$rgula' e por dois pontos
ao final da linha. *m seguida o bloco de c)digo que faz parte desta função. :m eemplo abaio irá
mostrar que isto é realmente muito simples"
*emplo"
#!/usr/bin/python
# Filename: unao,.py
de8 diga*la07:
print0'.l) MundoE'7 # bloo pertenente < unção
# Fim da unção
*l% 9undoM
*l% 9undoM
O / ]
y / k
@ is maOimum
A is maOimum
8omo funciona"
!qui definimos uma função chamada print9aO que recebe dois par&metros chamados a e b.
*ncontramos o maior n7mero usando um simples comandoif..else e então imprimindo o maior
n7mero.
/o primeiro uso de print9aO' nos passamos diretamente os n7meros 3argumentos4. /o segundo'
chamamos
atribu$do aoapar&metro
função usando variáveis. print9aO6O= y8 faz com que o valor do argumento O se%a
a e o valor do argumento y atribu$do ao par&metro b. ! função printAa funciona
da mesma maneira em ambos os casos.
3ariáveis Locais
2uando você declara variáveis dentro de uma definição de função' elas não estão relacionadas de forma
alguma com outras variáveis com os mesmos nomes usados fora da função' ou se%a' variáveis locais em
relação 0 função. 5sto é o que se chama de escopo da variável. ?odas as variáveis têm o escopo do bloco
no qual são declaradas' a partir do ponto da definição do seu nome.
*emplo"
#!/usr/bin/python
# Filename: un'loal.py
de8 func0O7:
print0'& is'= O7
O / ;
print0'8ari)vel local & mudou #ara'= O7
O / ]?
func0O7
print0'& continua'= O7
+a$da"
$ python func_local.py
O is <0
O continua <0
8omo funciona"
/a função' a primeira vez que usamos o valor do nome O' o Python utiliza o valor do par&metros
declarado na função.
*m seguida' atribu$mos o valor a O. C nome O é local 0 nossa função. *ntão' quando mudamos o valor
de O na função' o O definido no bloco principal permanece inalterado.
/o 7ltimo comando print' confirmamos que o valor de O no bloco principal está de fato inalterado.
6sando o comando lo!al
+e você quer atribuit um valor a um nome definido no n$vel mais alto do programa' ou se%a' fora de
qualquer tipo de escopo tal como funç(es ou classes' então você tem que dizer ao Python que o nome
não é local' mas sim global. Bazemos isso usando o comandoglobal. < imposs$vel atribuir um valor a
uma variável definida fora de uma função sem utilizar o comando global.
Você pode usar os valores dessas variáveis globais definidas fora da função' assumindo que não ha%a
nenhuma variável com o mesmo nome dentro da função. /o entanto' isso não é recomendado e deve ser
evitado' uma vez que não fica claro para o leitor do programa onde está a definição da variável. :sar o
comando global torna claro que a variável foi definida no bloc mais eterno.
*emplo"
#!/usr/bin/python
# Filename: un'global.py
de8 func07:
lo!al O
print0'& é'= O7
O / ;
print0'8ari)vel global & mudou #ara'= O7
O / ]?
func07
print0'. valor de & é' = O7
+a$da"
$ python func_global.py
O is <0
* #alor de O S
8omo funciona"
C comando global é usado para declarar que O é uma variável global. !ssim' quando vamos atribuir um
valor a O dentro da função' essa mudança é refletida quando usamos o valor de O no bloco principal.
Você pode especificar mais de uma variável global usando o mesmo comandoglobal. Por
eemplo' global O= y= G.
6sando o comando nonlocal
Vimos acima como acessar variáveis nos escopos local e global. *iste outro tipo de escopo chamado
-nonlocal-' que é um meio termo entre esses dois tipos de escopo. *scopos nonlocal ocorrem quando se
definem funç(es dentro de funç(es.
:ma vez que tudo em Python é c)digo eecutável' você pode definir funç(es em qualquer lugar.
Ve%amos um eemplo"
#!/usr/bin/python
# Filename: un'nonloal.py
de8 func_outer07:
O / ;
print0'& é'= O7
de8 func_inner07:
nonlocal O
O / ]
func_inner07
print0'. & local mudou #ara' = O7
func_outer07
+a$da"
$ python func_nonlocal.py
O S
8omo funciona"
2uando estamos dentro de func_inner' o FF definido na primeira linha defunc_outer não está'
relativamente' nem no escopo local' nem no global. Declaramos que estamos usando esse por meio
de nonlocal O e assim temos acesso 0quela variável.
?ente trocar o nonlocal O para global O e também remover o comando e observar a diferença de
comportamento nesses dois casos.
3alores padrão de arumentos
Para algumas funç(es' você pode querer que alguns dos seus par&metros se%am opcionais e usar valores
padrão pré#definidos se o usuário não quiser fornecer valores para esses par&metros. 5sto é feito com a
a%uda de valores padrão de argumentos. Você pode especificar valores padrão de argumentos para
par&metros colocando o operador de atribuição 3 /4 ap)s o nome do par&metro na definição da função'
seguifo pelo valor padrão.
/ote que o valor do argumento padrão dever ser uma constante. Aais precisamente' o valor do
argumento padrão deve ser imutável. 5sso é eplicado em detalhes nos cap$tulos seguintes. Por
enquanto' basta lembrar disso.
*emplo"
#!/usr/bin/python
# Filename: un'deault.py
say0'.l)'7
say0'Mundo'= ]7
+a$da"
$ python func_default.py
*l%
9undo9undo9undo9undo9undo
8omo funciona"
! função chamada say é usada para imprimir uma string quantas vezes forem necessárias. +e n)s não
fornecemos um valor' então' por padrão' a string é impressa apenas uma vez. 8onseguimos isso
especificando um valor de argumento padrão 1 para o par&metro times.
/o primeiro uso de say' fornecemos apenas a string e ele a imprime uma vez. /o segundo uso de say'
fornecemos tanto a string quanto o argumento G <determinando que queremos dizer a mensagem G
vezes.
Importante
-#enas os #armetros %ue estiverem no final da lista de #armetros #odem receber valores
#adr$o de argumento, ou seja, voc( n$o #ode ter um #armetro com valor de argumento
#adr$o antes de um #armetro sem um valor de argumento #adr$o na ordem dos #armetros
declarados na lista de #armetros da fun$o!
. motivo é %ue os valores s$o atribu6dos aos #armetros #or #osi$o! Por e&em#lo, def
func6a= b/<8 é v)lido, mas def func6a/<= b8 é não vlido!
Arumentos Nomeados
+e você tem funç(es com muitos par&metros e quer especificar apenas alguns deles' então você pode
passar valores para esse par&metros nomeando#os. 5sto é o que chamamos de argumentos nomeados.
:samos o nome 3palavra#chave4 ao invés da posição 3como viemos usando até agora4 para especificar os
argumentos para a função.
*istem duas vantagens nessa abordagem" primeiro' é mais fácil usar a função' uma vez que não
precisamos nos preocupar com a ordem dos argumentos. +egundo' podemos dar valores apenas para os
par&metros que quisermos' desde que os demais tenham valores padrão de argumento.
*emplo"
#!/usr/bin/python
# Filename: un'-ey.py
func0== k7
func0;]= c/;Z7
func0c/]?= a/H??7
+a$da"
$ python func_key.py
a S 3 e b S A e c S 10
a S < e b S < e c S @
8omo funciona"
! função chamada func tem um par&metro sem valores padrão de argumento' seguida por dois
par&metros sem valores padrão de argumento.
/o primeiro uso' func63= A8' o par&metro a recebe o valor 3' o parametro brecebe o valor < e c recebe
o valor padrão de 10.
/o segundo uso func6<= c/@8' a variável a recebe o valor de @G devido 0 posição do argumento.
*ntão' o par&metro c fica com o valor de @ devido ao nome' ou se%a' aos argumentos nomeados. !
variável b fica com o valor padrão de <.
/o terceiro uso func6c/<0= a/1008' utilizamos somente argumentos nomeados para especificar os
valores. /ote que estamos especificando o valor para o par&metro c antes do valor do par&metro a ainda
que a tenha sido definido antes de c na definição da função.
Par@metros 3arArs
1"+"
:evo escrever sobre este assunto num ca#6tulo #osterior, uma ve4 %ue ainda n$o falamos
sobre listas e dicion)riosY
Hs vezes você pode querer definir uma função que possa receber qualquern7mero de par&metros. 5sso
pode ser conseguido usando os asteriscos"
#!/usr/bin/python
# Filename: total.py
1;;
8omo funciona"
2uando declaramos um par&metro prefiado com um asterisco' tal como Uparam' então todos os
argumentos posicionais daquele ponto até o final são armazenados numa lista chamada FparamF.
De maneira similiar' quando declaramos um par&metro prefiado com dois asteriscos' tal como UUparam'
então todos os argumentos nomeados' a partir daquele ponto até o final' serão armazenados em um
dicionário chamado FparamF.
Vamos eplorar as listas e dicionários em um ca#6tulo mais [ frente.
Par@metros apenas por palavra7chave
+e quisermos especificar que certos par&metros por palavra#chave este%am dispon$veis somente por
palavra#chave e não como argumentos posicionais' estes pode ser declarados ap)s um par&metro
marcado com asterisco"
#!/usr/bin/python
# Filename: -ey$ord'only.py
print0total0H?= H= ;= == #egetables/]?77
print0total0H?= H= ;= =77
# =evanta um erro; pois não orneemos um valor de argumento padrão para >vegetables>
+a$da"
$ python keyDord_only.py
;;
print6total610= 1= = 388
8omo funciona"
Declarar par&metros ap)s um par&metro marcado com asterisco resulta em argumentos apenas por
palavra#chave. +e estes argumentos não são fornecidos com um valor padrão' então chamadas 0 função
levantarão um erro se o argumento por palavra#chave não é fornecido' como visto acima.
+e você quer ter apenas par&metros por palavra#chave mas não precisa de um par&metro marcado com
asterisco' então simplesmente use um asterisco sem qualquer nome' tal como def total6initial/<=
U= #egetables8.
" comando return
C comando return é usado para retornar da eecução de uma função' isto é' sair da função. Podemos'
opcionalmente' retornar um valor vindo da função.
*emplo"
#!/usr/bin/python
# Filename: un'return.py
i8 O U y:
return O
else:
return y
print0maOimum0;= =77
+a$da"
$ python func_return.py
8omo funciona"
! função maOimum retornar o maior valor entre os par&metros' neste caso' os n7meros fornecidos para a
função. if..else para encontrar o maior valor e retorna esse valor.
/ote que*la
umusa um simples comando
comando return sem um valor é equivalente a return 2one. 2one é um tipo especial em
Python que representa um valor nulo. Por eemplo' é usado para indicar que uma variável não possui
nenhum valor quando tem o valor 2one.
8ada função implicitamente contém um comando return 2one no final' a menos que você tenha escrito
seu seu pr)prio comando return. Você pode confirmar isso eecutando a print someIunction68 onde a
função someIunction não usa o comando return' tal como"
de8 someIunction07:
pass
C comando pass é usado em Python para indicar um bloco de comandos vazio.
Nota
&iste uma fun$o embutida chamada maO %ue j) im#lementa a funcionalidade 'encontrar
m)&imo'! Portanto, use esta fun$o sem#re %ue #oss6vel!
+ocStrins
Python possui um recurso chamado strings de documentação' usualmente conhecidas pelo seu nome
mais curto' docstrings. Doc+trings são uma ferramenta importante da qual você deve fazer uso' uma vez
que ela a%uda a documentar o programa e o torna mais fácil de entender. Python has a nifty feature
calleddocumentation strings' usually referred to by its shorter name docstrings. Doc+trings are an
important tool that you should mae use of since it helps to document the program better and maes it
more easy to understand. +urpreendentemente' podemos até obter a docstring de' digamos' uma
função' durante a eecução do programa,
*emplo"
#!/usr/bin/python
# Filename: un'do.py
i8 O U y:
print0O= 'é o m)&imo'7
else:
print0y= 'é o m)&imo'7
print9aO0== ]7
print0print9aO.__doc__7
+a$da"
$ python func_doc.py
< S o m%Oimo
8omo funciona"
:ma string na primeira linha l)gica de uma função é o docstring para essa função. /ote#se que
docstrings também se aplicam a m+dulos e classes' que vamos aprender sobre nos respectivos cap$tulos.
! convenção seguida para um docstring é uma string de m7ltiplas linhas onde a primeira linha começa
com uma letra mai7scula e termina com um ponto. *m seguida' a segunda linha fica em branco' seguida
de uma eplicação detalhada a partir da terceira linha. < fortemente recomendado que você siga esta
convenção para todos os seus docstrings em todas as suas funç(es não#triviais.
Podemos acessar a docstring da função print9aO usando o atributo 3nome pertencente a4 __doc__ 3note
o duplo sublinhado4 da função. Iembre#se que Python trata tudo como um ob%eto e isso inclui funç(es.
Vamos saber mais sobre os ob%etos no cap$tulo sobre classes.
+e você %á usou o help68 em Python' então você %á viu o uso de docstrings, C que ele faz é apenas
buscar o atributo __doc__ dessa função e o eibir para você de uma forma elegante. Você pode
eperimentá#lo na função acima # basta incluir help6print9aO8 no seu programa. Iembre#se de
pressionar a tecla Q para sair do help68.
Berramentas automatizadas podem recuperar a documentação do seu programa desta maneira. Portanto'
eu recomendo fortemente que você use docstrings para qualquer função não#trivial que você escreva. C
comando pydoc que vem com sua distribuição Python funciona de forma semelhante a help68 usando
docstrings.
Anotaç;es
Bunç(es possuem outra funcionalidade avançada chamada anotaç(es' que são um modo estiloso de
anear informação adicional para cada um dos par&metros e também para o valor de retorno. 8omo o
interpretador Python não interpreta estas anotaç(es 3tal funcionalidade é responsabilidade de bibliotecas
de terceiros4' pularemos esta funcionalidade desta discussão. +e você está interessado em ler mais sobre
anotaç(es' por favor ve%a a Pro#osta de Melhoria do Python @o! =H?k .
Sumário
Vimos vários aspectos das funç(es mas note que não cobrimos todos os seus aspectos. *ntretanto'
cobrimos a maioria das funç(es de Python que você precisará dia ap)s dia.
* seguida' veremos como usar e criar m)dulos de Python.
Python pt-br:Modulos
Bntrodu$o
8oc( viu como #ode reutili4ar c+digos em seu #rograma através da defini$o a#enas uma ve4 de funIes!
5ue tal se voc( %uisesse reutili4ar um certo nLmero de funIes em outros #rogramas %ue voc( escreverY
Como voc( #oderia ter adivinhado, a res#osta est) em m+dulos! m m+dulo é basicamente um ar%uivo
contendo
Para todaso as
reutili4ar funIes
m+dulo emeoutros
vari)veis %ue voc(o definiu!
#rogramas, nome do m+dulo deve ter uma e&tens$o .py!
m m+dulo #ode ser importado #or um outro #rograma #ra fa4er uso da sua funcionalidade! -ssim é
também como n+s #odemos usar a biblioteca #adr$o de Python! Primeiro, n+s veremos como utili4ar os
m+dulos da biblioteca #adr$o!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: using'sys.py
import sys
print0i7
test.py
nos
somos
argumentos
:''Python30= :''Python30''lib''site-packagesC
Como Funciona
Primeiro n+s importamos o m+dulo sys usando o comando import! asicamente, isso se tradu4 em n+s
di4ermos a Python %ue %ueremos em#regar este m+dulo! . m+dulo sys contém funcionalidade
relacionada ao inter#retador de Python e o seu ambiente, ou seja, o systema!
5uando Python e&ecuta o comandoimport sys, #rocura #elo m+dulo sys.py em um dos diret+rios
listados na sua vari)vel sys.path! /e o ar%uivo é encontrado, ent$o os comandos do bloco #rinci#al
0main7 do m+dulo s$o e&ecutados e o m+dulo é tornado dispon1vel #ara seu uso! .bserve %ue a
iniciali4a$o é reali4ada a#enas a primeira ve4 %ue n+s im#ortamos o m+dulo!
- vari)vel arg# no m+dulo sys é acessada utili4ando*se a nota$o #or #ontos 0dotted7 isto é sys.arg#!
la claramente indica %ue este nome é #arte do m+dulosys! ma outra vantagem dessa abordagem é
%ue o nome n$o colide com %ual%uer vari)vel arg# usada em seu #rograma!
- vari)vel sys.arg# é uma lista de strings 0listas 0lists7 s$o e&#licadas em detalhes em
um ca#6tulo #osterior7! s#ecificamente, sys.arg# contém a lista deargumentos da linha de omando, ou seja,
os argumentos %ue s$o #assados #ara o seu #rograma usando a linha de comando!
/e voc( estiver usando uma B: #ara escrever e e&ecutar esses #rogramas, #rocure #or uma forma de
es#ecificar os argumentos da linha de comando ao seu #rograma nos menus!
-%ui, %uando n+s e&ecutamospython using_sys.py nos somos argumentos n+s e&ecutamos o
m+dulo using_sys.py com o comando python e as outras coisas %ue seguem s$o argumentos #assados
ao #rograma! Python guarda os argumentos da linha de comando na vari)vel sys.arg# #ara nosso uso!
embre*se, o nome do scri#t %ue est) em e&ecu$o é sem#re o #rimeiro argumento na lista sys.arg#!
assim, neste caso n+s
teremos using_sys.pycomo sys.arg#B0C, nos como sys.arg#B1C, somos como sys.arg#BC ea
rgumentos como sys.arg#B3C! @ote %ue Python comea a contagem a #artir de ? e n$o de H!
- vari)vel sys.path contém a lista de nomes de diret+rios de onde os m+dulos s$o im#ortados! .bserve
%ue a #rimeira string em sys.path est) va4ia * esta string va4ia indica %ue o diret+rio corrente é também
#arte de sys.path a %ual é a mesma %ue a vari)vel de ambiente Pv)*2P")! Bsso significa %ue voc(
#ode im#ortar diretamente m+dulos locali4ados no diret+rio corrente! /e n$o for o caso, voc( ter) %ue
colocar seu m+dulo em um dos diret+rios listados emsys.path!
-r%uivos !#yc yte*com#ilados
- im#orta$o de m+dulos é uma a$o relativamente custosa, de modo %ue Python reali4a alguns tru%ues
#ara torn)*la mais r)#ida! ma maneira é a cria$o de ar%uivos byteompilados com a e&tens$o .pyc %ue é
uma forma intermedi)ria em %ue Python transforma o #rograma 0lembre*se da se$o de introdu$o em
Como Python FuncionaY7! ste ar%uivo.pyc é Ltil %uando voc( im#ortar o m+dulo a #r+&ima ve4 de um
#rograma diferente * ser) muito mais r)#ido #ois uma #arte do #rocedimento re%uerido #ara a
im#orta$o do m+dulo j) est) feita! -lém disso, estes ar%uivos byte*com#ilados s$o inde#endentes da
#lataforma!
Nota
bloco
a#enas#rinci#al 0main7 da%uele
se o #rograma m+dulo
for usado #or si é
s+e&ecutado! @+ #odemos
e n$o %uando usar #or
for im#ortado esseoutro
conceito #araBsso
m+dulo! e&ecutar o bloco
#ode ser
alcanado usando o atributo__name__ do m+dulo!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: using'name.py
i8 __name__ // '^^main^^':
print0'ste #rograma est) sendo e&ecutado #or si s+'7
else:
print0'u estou sendo im#ortado de outro m+dulo'7
/a6da
$ python using_name.py
$ python
FFF
Como Funciona
3odo m+dulo em Python tem o seu __name__ definido e se este é __main__, isso im#lica %ue o m+dulo
est) sendo e&ecutado #or si s+ #elo usu)rio e n+s #oderemos adotar as aIes a#ro#riadas!
Produ4indo os /eus Pr+#rios M+dulos
- cria$o de seus #r+#rios m+dulos é f)cil, #ois voc( j) tem feito isso o tem#o todoE Bsso é #or%ue todo
#rograma em Python é também um m+dulo! 8oc( a#enas tem %ue se assegurar %ue #ossua a
e&tens$o .py! . #r+&imo e&em#lo deve tornar isso claro!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: mymodule.py
de8 sayhi07:
print0'.l), este é meu m+dulo falando!'7
__#ersion__ / '?!H'
# Fim de mymodule.py
. c+digo acima é um m2dulo de amostra! Como voc( #ode ver, n$o e&iste nada #articularmente es#ecial a
res#eito dele em com#ara$o com os nossos #rogramas usuais em Python! 8eremos agora como usar
este m+dulo em nossos outros #rogramas em Python!
embre*se %ue os m+dulos devem ser colocados no mesmo diret+rio %ue o #rograma %ue os im#orta, ou
ent$o deve estar em um dos diret+rios listados em sys.path!
#!/usr/bin/python
# 6ome do ar%uivo: mymodule'demo.py
import mymodule
mymodule.sayhi07
print '8ers$o'= mymodule.__#ersion__
/a6da
$ python mymodule_demo.py
Como Funciona
@ote %ue n+s em#regamos a nota$o dos #ontos #ara acessar os membros do m+dulo! Python utili4a
bastante a mesma nota$o %ue lhe d) a caracter6stica 'Pythonica' a ela, e modo %ue n$o temos %ue ficar
a#rendendo novas maneiras de fa4er as coisas!
-%ui est) a vers$o utili4ando a sinta&e from..import!
#!/usr/bin/python
# 6ome do ar%uivo: mymodule'demo?.py
sayhi07
print0'8ers$o'= __#ersion__7
- sa6da de mymodule_demo.py é a mesma %ue a sa6da de mymodule_demo.py!
@ote %ue j) houvesse um nome __#ersion__ declarado no m+dulo %ue im#orta mymodule, haveria uma
colis$o! Bsso é altamente #rov)vel #ois é #r)tica comum #ara cada m+dulo declarar*se a sua vers$o
usando esse nome! :a6 é sem#re recomendado o#tar #elo comando import, mesmo se tornar o seu
#rograma um #ouco mais longo!
Ben de Python
m dos #rinc6#ios*guia de Python é %ue '&#licito é melhor do %ue im#l6cito'! &ecute import
this #ara a#render mais!
- Fun$o dir
8oc( #ode usar a fun$o interna 0built*in7dir #ara listar os indetificadores %ue um objeto define! Por
e&em#lo, #ara um m+dulo, os identificadores incluem as funIes, classes e vari)veis definidas na%uele
m+dulo!
5uando voc( fornece o nome do m+dulo [ fun$o dir68, ela retorna a lista dos nomes definidos na%uele
m+dulo! 5uando nenhum argumento é fornecido, ela retorna a lista de nomes definidos no m+dulo
corrente!
&em#lo
$ python
UUU import sys # 5btenha a lista de atributos; neste aso; do m2dulo sys
UUU dir0sys7
Q'^^dis#layhoo^^'= '^^doc^^'= '^^e&ce#thoo^^'= '^^name^^'= '^^#acage^^'= '^^s
tderr^^'= '^^stdin^^'= '^^stdout^^'= '^clear^ty#e^cache'= '^com#act^freelists'=
'^current^frames'= '^getframe'= 'a#i^version'= 'argv'= 'builtin^module^names'= '
byteorder'= 'call^tracing'= 'callstats'= 'co#yright'= 'dis#layhoo'= 'dllhandle'
= 'dont^2rite^bytecode'= 'e&c^info'= 'e&ce#thoo'= 'e&ec^#refi&'= 'e&ecutable'=
'e&it'= 'flags'= 'float^info'= 'getchecinterval'= 'getdefaultencoding'= 'getfil
esystemencoding'= 'get#rofile'= 'getrecursionlimit'= 'getrefcount'= 'getsi4eof'=
'gettrace'= 'get2indo2sversion'= 'he&version'= 'intern'= 'ma&si4e'= 'ma&unicode
'= 'meta^#ath'= 'modules'= '#ath'= '#ath^hoos'= '#ath^im#orter^cache'= '#latfor
m'= '#refi&'= '#sH'= '#s;'= 'setchecinterval'= 'set#rofile'= 'setrecursionlimit
'= 'settrace'= 'stderr'= 'stdin'= 'stdout'= 'subversion'= 'version'= 'version^in
fo'= '2arno#tions'= '2inver'
UUU dir07
Q'^^builtins^^'= '^^doc^^'= '^^name^^'= '^^#acage^^'= 'a'= 'sys'
UUU dir07
Q'^^builtins^^'= '^^doc^^'= '^^name^^'= '^^#acage^^'= 'sys'
UUU
Como Funciona
Primeiro n+s vemos o uso de dir sobre o m+dulo im#ortado! Podemos ver a enorme lista de atributos %ue
ele contém!
m seguida, n+s vemos a fun$o dir sem nenhum #armetro #assado a ela! Por #adr$o, ela retorna a
lista dos atributos do m+dulo corrente! @ote %ue a lista dos m+dulos im#ortados também fa4 #arte dessa
lista!
- fim de observar a a$o de dir, n+s definimos uma nova vari)vel e atribu6mos um valor a ela e ent$o
verificamos %ue e&iste um valor adicional na lista, com o mesmo nome da vari)vel! @+s removemos a
vari)vel1atributo do m+dulo corrente usando o comando del e a altera$o é refletida novamente na sa6da
da fun$odir!
ma nota sobre del * este comando é usado #ara deletar a vari)vel1nome e de#ois de e&ecutado o
comando, neste caso del a, voce n$o #oder) acessar a vari)vel a * é como se ela nunca tivesse e&istido
antes!
@ote %ue a fun$o dir68 funciona #ara %ual%uer objeto! Por e&em#lo, e&ecutedir6print8 #ara conhecer os
atributos da fun$o #rint, ou dir6str8 #ara os atributos da classe str!
Pacages
@esse #onto, voc( j) deve ter comeado a observar a hierar%uia da organi4a$o de seus #rogramas! -s
vari)veis usualmente v$o dentro das funIes! FunIes e vari)veis globais usualmente v$o dentro dos
m+dulos! 5ue tal se voc( %uisesse organi4ar os m+dulosY ste o momento em %ue entram em cena as
#acages 0#acotes7!
Pacages s$o a#enas #astas contendo m+dulos com um ar%uivo __init__.py%ue indica a Python %ue
esta #asta é es#ecial #or%ue contém m+dulos de Python!
8amos di4er %ue voc( %uer criar uma #acage denominada '2orld' com as sub#acages 'asia', 'africa',
etc! e estas sub#acages #or sua ve4 cont(m m+dulos como 'india', 'madagascar', etc!
sta é como voc( estruturaria as #astas
- alguma pasta presente em the sys.pathF
- Dorld
- __init__.py
- asia
- __init__.py
- india
- __init__.py
- foo.py
- africa
- __init__.py
- madagascar
- __init__.py
- bar.py
Pacages s$o a#enas uma conveni(ncia #ara organi4ar m+dulos hierar%uicamente! @+s veremos muitos
e&em#los disso em biblioteca #adr$o!
Resumo
:a mesma forma %ue funIes s$o #artes reutili4)veis de #rogramas, os m+dulos s$o #rogramas
reutili4)veis! Pacages s$o uma outra hierar%uia #ara organi4ar m+dulos! - biblioteca #adr$o %ue vem
com Python re#resenta um e&em#lo de tais conjuntos de #acages e m+dulos!
@+s vimos como usar esses m+dulos e criar os nossos #r+#rios m+dulos!
- seguir, a#renderemos sobre interessantes conceitos denominados estruturas de dados!
Python pt-br:Estruturas de Dados
Bntrodu$o
struturas de dados s$o basicamente isso * s$o estruturas %ue #odem conter alguns dados juntos! m outras
#alavras, elas s$o utili4adas #ara guardar uma cole$o de dados relacionados entre si!
&istem %uatro estruturas de dados internas 0built*in7 em Python * lista, tu#la, dicion)rio e conjunto 0set7!
@+s veremos como usar cada uma delas e de %ue modo elas nos facilitam a vida!
ista
ma list 0lista7 é uma estrutura de dados %ue contém uma cole$o ordenada de itens, ou seja, voc(
#ode guardar uma se%u&nia de itens em uma lista! Bsso é f)cil de imaginar se voc( #ensar em uma lista de
com#ras na %ual voc( tem uma lista de itens #ara com#rar, e&ceto %ue voc( #rovavelmente ter) cada
item em uma linha se#arada, ao #asso %ue Python coloca uma v6rgula entre eles!
- lista de itens dever) estar dentro de colchetes 0s%uare bracets7, de modo %ue Python entende %ue
voc( est) es#ecificando uma lista! ma ve4 %ue voc( criou a lista, #ode adicionar, remover ou fa4er
buscas #or itens dela! :esde %ue n+s #odemos adicionar e remover itens, di4emos %ue uma lista é um
ti#o mutvel de dados, ous seja, este ti#o #ode ser alterado!
R)#ida Bntrodu$o a .bjetos e Classes
mbora eu tenha retardado a discuss$o sobre objetos e classes até agora, uma #e%uena e&#lana$o
torna*se imediatamente necess)ria, tal %ue voc( #ossa entender melhor as listas! &#loraremos esse
t+#ico em mais detalhes em seu #r+#rio ca#6tulo!
ma lista é um e&em#lo de utili4a$o de objetos e classes! 5uando n+s usamos a vari)vel i e atribu6mos
um valor, digamos, inteiro < a ela, voc( #ode raciocinar como se criasse um o!#eto 0isto é uma
instncia7 i de uma classe 0ou seja ti#o7int! :e fato, voc( #ode ler help6int8 #ara melhor entender
isso!
ma classe #ode ter m9todos ou seja funIes definidas #ara uso com res#eito unicamente [%uela classe!
8oc( #ode usar essas #eas de funcionalidade a#enas %uando tem um objeto da%uela classe! Por
e&em#lo, Python fornece um método append #ara a classe list, o %ue #ermite a voc( adicionar um item
ao final da lista! Por e&em#lo, minhalista.append6um item8 adicionar) a%uela string ao final da
lista minhalista! @ote o em#rego da nota$o dos #ontos #ara acessar métodos dos objetos!
ma classe #ode também #ossuir campos %ue n$o s$o nada mais do %ue vari)veis definidas #ara uso
com res#eito unicamente [%uela classe! 8oc( #ode utili4ar a%uelas vari)veis1nomes a#enas %uando tem
um objeto da%uela classe! Cam#os s$o também acessados com a nota$o dos #ontos, #or
e&em#lo,minhalista.campo!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: using'list.py
Como Funciona
- vari)vel shoplista é uma lista de com#ras #ara alguém %ue est) indo ao mercado! m shoplista n+s
guardamos strings do nomes dos itens a serem com#rados, mas voc( #ode adicionar %ual%uer espie de
obeto a uma lista, incluindo nLmeros e até mesmo outras listas!
@+s também em#regamos o lao for..in #ara iterar sobre os itens da lista! -gora voc( deve ter
#ercebido %ue uma lista é também uma se%u(ncia! - es#ecialidade das se%u(ncias ser) discutida em
uma se$o #osterior!
.bserve o uso da #alavra*chave end como argumento na fun$o print, #ara indicar %ue n+s %ueremos
terminar a sa6da com um es#ao, ao invés da costumeira %uebra*de*linha!
m seguida, n+s adicionamos um item [ lista usando o método append do objeto lista, como j) foi
discutido antes! nt$o, n+s verificamos %ue o item foi efetivamente acrescentado [ lista através da
im#ress$o do conteLdo da lista, obtida sim#lesmente #assando a lista ao comando print, %ue a im#rime
sem #roblemas!
:a6 n+s ordenamos a lista #or meio do método sort do objeto lista! T im#ortante com#reender %ue este
método afeta a a #r+#ria lista e %ue n$o retorna uma lista modificada * isso é diferente da maneira #ela
%ual a string funciona! T o %ue n+s %ueremos salientar %uando di4emos %ue as listas s$o mutveis e as
strings s$oimutveis!
- seguir, %uando n+s terminamos de com#rar um item no mercado, %ueremos retir)*lo da lista!
-lcanamos isso #or meio do comando del! -%ui n+s mencionamos %ual o item da lista %ue desejamos
su#rimir e o comando del o remove da lista #ara n+s! s#ecificamos %ue %ueremos remover o #rimeiro
item da lista ent$o usamos del shoplistB0C 0lembre*se %ue Python comea a contagem a #artir do ?!7
/e voc( %uiser conhecer todos os métodos definidos #ara o objeto lista, veja help6list8 #ara os detalhes!
3u#la
3u#las 0tu#les7 s$o e&atamente como listas, e&ceto %ue s$o imutáveis, como as strings, isto é, voc( n$o
#ode modificar tu#las! 3u#las s$o definidas es#ecificando itens se#arados #or v6rgulas dentro de um #ar
de #ar(nteses! -s tu#las s$o costumeiramente usadas em casos em %ue um comando ou uma fun$o
definida #elo usu)rio #ode seguramente assumir %ue uma cole$o de valores, ou seja, a tu#la de valores
n$o ser) alterada!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: using'tuple.py
$ python using_tuple.py
Como Funciona
- vari)vel Goo refere*se a uma tu#la de itens! @+s vemos %ue a fun$o Goo #ode ser utili4ada #ara se
obter o com#rimento da tu#la! Bsso também indica %ue a tu#la também é uma se%u(ncia!
@+s estamos mudando a%ueles animais #ara um novo 4oo, uma ve4 %ue o antigo est) #ara ser fechado!
:essa forma, a tu#la no#o_Goo contém alguns animais %ue j) estavam l), juntamente com a%ueles
tra4idos do velho 4oo! :e volta a realidade, observe %ue uma tu#la dentro de outra tu#la n$o #erde a sua
indentidade!
Podemos acessar os itens em uma tu#la es#ecificando a #osi$o do item dentro de um #ar de colchetes
e&atamente como n+s fi4emos #ara listas! sse é chamado o#erador de indexação! @+s acessamos o
terceiro item em no#o_Goo#ela es#ecifica$o no#o_GooBC e acessamos o terceiro item dentro do terceiro
item na tu#la no#o_Goo es#ecificando no#o_GooBCBC! T muito sim#les uma ve4 %ue voc( domine o
jeito!
1uplas com 0 ou item
ma tu#la va4ia é constru6da com um #ar de #ar(nteses como #aGia / 68! ntretanto, com
um Lnico item j) n$o é t$o sim#les! 8oc( deve es#ecificar usando uma v6rgula em seguida ao
#rimeiro 0e Lnico7 item, tal %ue Python #ossa diferenciar entre uma tu#la e um #ar de
#ar(nteses %ue cercam uma e&#ress$o, ou seja, voc( tem %ue es#ecificar singleton /
6 = 8, se %uiser uma tu#la contendo o item !
Nota para proramadores em Perl
ma lista dentro de uma lista n$o #erde sua identidade, listas n$o s$o "achatadas", como em
Perl! . mesmo se a#lica a uma tu#la dentro de uma tu#la, ou uma tu#la em uma lista, ou uma
lista em uma tu#la, etc! :o #onto de vista de Python, s$o a#enas objetos alocados usando um
outro objeto, a#enas isso!
:icion)rio
m dicion)rio 0dictionary7 é como uma agenda de endereos na %ual voc( #ode encontrar ou endereo ou
detalhes de contato de uma #essoa, conhecendo a#enas o nome dela, isto é, associamos as .eys
ab / N '/2aroo#' : 's2aroo#s2aroo#ch!com'=
'arry' : 'larry2all!org'=
'Matsumoto' : 'mat4ruby*lang!org'=
'/#ammer' : 's#ammerhotmail!com'
O
/a6da
$ python using_dict.py
Como Funciona
@+s criamos um dicion)rio ab usando a nota$o j) discutida! nt$o acessamos os #ares ey1value
es#ecificando a ey usando o o#erador de inde&a$o como discutido no conte&to de listas e tu#las!
.bserve a sinta&e sim#les!
@+s #odemos deletar os #ares ey1value usando nosso velho amigo * o comandodel! /im#lesmente
es#ecificamos o dicion)rio o o#erador de inde&a$o #ara a ey a ser removida e #assamos tudo ao
comando del! @$o h) a necessidade de conhecer o value corres#ondente [ ey #ara esta o#era$o!
m seguida, n+s acessamos cada #ar ey1value usando o método items do dicion)rio, o %ual retorna uma
lista de tu#las, em %ue cada tu#la contém um #ar de itens * a ey seguida #or um value! @+s
recu#eramos esse #ar e o atribu6mos as vari)veis name e address corres#ondentemente #ara cada #ar,
usando o lao de for..in e ent$o im#rimimos esses valores no bloco de for!
Podemos adicionar novos #ares ey1value, sim#lesmente em#regando o o#erador de inde&a$o #ara
acessar a ey e atribuirmos a%uele value, como fi4emos #ara Guido no caso acima!
@+ #odemos verificar se um #ar ey1value e&iste, usando o o#erador in ou mesmo o método has_key da
classe dict! 8oc( #ode ver a documenta$o #ara a lista com#leta de métodos da classe dict,
usando help6dict8!
Arumentos em ey<ord Dpalavras7chaveE e +icionários
na lista de
fun$o, #armetros
trata*se a#enasda
dedefini$o da fun$o
uma acesso e %uando
a ey de voc( acessa
um dicion)rio 0%ue évari)veis
chamadodentro de sua
de tabela de
s1mbolos em terminologia de com#iladores7!
/e%u(ncias
istas, tu#las, strings e ar%uivos s$o e&em#los de se%u(ncias, mas o %ue as se%u(ncias tem de t$o
es#ecialY :uas das #rinci#ais caracter6sticas de uma se%u(ncia s$o a o#era$o de inde%açãoGque nos
permite recuperarmos diretamente um item particular e a operação de 0fatiamento7 %ue nos #ermite
sliing
recu#erarmos uma fatia de uma se%u(ncia, ou seja, uma #arte da se%u(ncia!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: se%.py
tem 0 is apple
tem 1 is mango
tem is carrot
tem 3 is banana
tem -1 is banana
tem - is carrot
haracter 0 is s
characters 1 to 3 is Da
characters 1 to -1 is Daroo
Como Funciona
Primeiramente, n+s vemos como utii4ar os 6ndices #ara obter itens individuais de uma se%u(ncia! Bsso é
também conhecido como operação de subsrição! 5uando voc( es#ecifica um nLmero dentro de colchetes a
uma se%u(ncia, como mostrado acima, Python ir) recu#erar #ara voc( o item corres#ondente a%uela
#osi$o na se%u(ncia! embre*se %ue Python comea a contagem dos nLmeros a #artir do ?!
:a6, shoplistB0C retorna o #rimeiro item e shoplistB3C retorna o %uarto item na se%u(ncia shoplist!
. 6ndice #ode também ser um nLmero negativo, em cujo caso, a #osi$o é calculada a #artir do fim da
se%u(ncia! -ssim, shoplistB-1C refere*se ao Lltimo item da se%u(ncia e shoplistB-C recuoera o
#enLltimo item da se%u(ncia!
- o#era$o de slicing é em#regada es#ecificando*se o nome da se%u(ncia seguido de um #ar o#cional de
nLmeros se#arados #or 'dois #ontos' dentro de colchetes! @ote %ue isso é bem similar a o#era$o de
inde&a$o %ue voc( vem usando até agora! embre*se %ue os nLmeros s$o o#cionais mas o 'dois #ontos'
n$o é!
. #rimeiro nLmero 0antes do 'dois #ontos'7 na o#era$o de slicing refere*se a #osi$o de onde a fatia
comea e o segundo nLmero 0de#ois do 'dois #ontos'7 indica onde a fatia terminar)! /e o #rimeiro nLmero
n$o for es#ecificado, Python comear) no in6cio da se%u(ncia! /e o segundo nLmero n$o e&istir, Python
terminar) no final da se%u(ncia! @ote %ue a fatia retornada omeça na #osi$o de in6cio e termina
imediatamente antes da #osi$o do im, ou seja, a #osi$o de in6cio é inclu6da, mas a #osi$o do fim é
e&clu6da na fatia da se%u(ncia!
nt$o, shoplistB1:3C retorna uma fatia de uma se%u(ncia %ue comea na #osi$o H, inclui a #osi$o ;
mas #ara na #osi$o = e assim uma atia de dois itens é retornada! /imilarmente, shoplistB:C retorna
uma c+#ia da se%u(ncia toda!
8oc( #ode também efetuar slicing com nLmeros negativos! .s nLmeros negativos s$o usados #ara
#osiIes a #artir do fim da se%u(ncia! Por e&em#lo,shoplistB:-1C retornar) uma fatia da se%u(ncia %ue
e&clui o Lltimo item da se%u(ncia mas contém todo o resto dela!
&#erimente v)rias combinaIes de es#ecificaIes de slicing usando interativamente o inter#retador de
Python, ou seja, o #rom#t, de modo %ue voc( #ossa ver os resultados imediatamente! ma grande coisa a
res#eito de se%u(ncias e %ue voc( #ode acessar tu#las, listas e strings todas da mesma maneiraE
Conjuntos
Conjuntos 0/ets7 s$o coleIes não ordenadas de objetos sim#les! les s$o usados %uando a e&ist(ncia de um
objeto em uma cole$o é mais im#ortante do %ue a ordem em %ue est) ou o nLmero de ve4es em %ue
ocorre!
sando sets, voc( #ode testar #ara #ertencimento a um conjunto, verificar se um conjunto é um
subconjunto de outro, encontrar a interse$o entre dois conjuntos, e assim #or diante!
UUU bri / set0Q'brasil'= 'russia'= 'india'7
UUU 'india' in bri
3rue
UUU 'usa' in bri
False
UUU bric / bri.co#y07
UUU bric.add0'china'7
UUU bric.issu#erset0bri7
3rue
UUU bri.remove0'russia'7
UUU bri bric # 5 bri.intersetion(bri)
N'brasil'= 'india'O
Como Funciona
. e&em#lo é ra4oavelmente auto*e&#licativo, #ois envolve teoria b)sica de conjuntos ensinada na escola!
Refer(ncias
5uando voc( cria um objeto e o atribui a uma vari)vel, esta a#enas se reere ao objeto e n$o re#resenta o
objeto em si mesmoE Bsto é, o nome da vari)vel a#onta #ara a%uela #arte da mem+ria do seu com#utador
na %ual o objeto est) arma4enado! Bsso é chamado vinulação (binding)do nome ao objeto!
m geral voc( n$o #recisa ficar #reocu#ado com isso, mas e&iste um efeito sutil devido a refer(ncias ao
%ual voc( #recosa ficar atento
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: reerene.py
print0'-tribui$o /im#les'7
shoplist / Q'a##le'= 'mango'= 'carrot'= 'banana'
mylist / shoplist # mylist apenas um outro nome apontando para o mesmo obeto!
"tribuiYo !imples
Como Funciona
- maior #arte da e&#lica$o est) dis#on6vel nos #r+#rios coment)rios!
. %ue voc( #recisa lembrar é %ue %uiser fa4er uma c+#ia de uma lista ou tais es#écies de se%u(ncias ou
objetos com#le&os 0n$o obetos sim#les como inteiros7, ent$o voc( deve utili4ar a o#era$o de slicing #ara
efetuar uma c+#ia! /e voc( a#enas atribuir o nome da vari)vel a outro nome, ent$o ambos se reerirão ao
mesmo objeto e isso #ode ser um #roblema se voc( n$o for cuidadoso!
Nota para proramadores em Perl
embre*se %ue um comando de atribui$o #ara listas não cria uma c+#ia! 8oc( dever) usar a
o#era$o de slicing #ara efetuar uma c+#ia da se%u(ncia!
i8 name.starts2ith0'/2a'7:
print0'/im, a string comea com "/2a"'7
i8 'a' in name:
print0'/im, ela contém a string "a"'7
i8 name.find0'2ar'7 E/ -H:
print0'/im, ela contém a string "2ar"'7
delimitador / '^^'
mylist / Q'rasil'= 'RLssia'= 'ndia'= 'China'
print0delimitador.join0mylist77
.ut#ut
$ python str_methods.py
,rasil_U_Kssia_U_ndia_U_hina
Como Funciona
-%ui, n+s vemos um bocado de métodos da string em a$o! . método startsDith é usado #ara descobrir
se a string comea com uma dada string! . o#erador in é usado #ara verificar se uma dada string é uma
#arte de uma string!
. método find é usado #ara achar a #osi$o de uma dada string em uma string ou retorna *H se n$o for
bem
uma sucedido em
se%u(ncia, achar
com a substring!
a string atuando-como
classedelimitador
str tem também um elegante método #ara oin os itens de
entre cada item da se%u(ncia e retorna uma
string muito maior #rodu4ida com isso!
Resumo
@+s es&#loramos detalhadamente as v)rias estruturas internas 0built*in7 de Python! stas estruturas
ser$o essenciais #ara escrever #rogramas de um tamanho ra4o)vel!
-gora %ue n+s j) temos sob controle o b)sico de Python, veremos a seguir como #rojetar e escrever
#rogramas do mundo real em Python!
Python pt-br:Resolucao de Problemas
@+s e&#loramos v)rias #artes da linguagem Python e agora daremos uma olhada em como essas #artes
se ajustam entre si, #rojetando e escrevendo um #rograma %ue fa4 algo Ltil! - idéia é a#render a escrever
o seu #r+#rio scri#t em Python!
. Problema
. #roblema é Eu deseo esrever um programa %ue ria um ba-up de todos os meus ar%uivos importantes
mbora esse seja um #roblema sim#les, n$o e&iste informa$o suficiente #ara %ue #ossamos dar in6cio a
uma solu$o! m #ouco mais de análise é necess)ria! Por e&em#lo, como #oder6amos es#ecificar %uais os
ar%uivos cujo bacu# deveria ser feitoY omo eles est$o alocadosY 5nde eles est$o alocadosY
:e#ois de analisarmos a#ro#riadamente o #roblema, n+s pro#etamos o nosso #rograma! @+s elaboramos
uma lista de coisas a res#eito de como o nosso #rograma deveria o#erar! @este caso em #articular, criei a
lista %ue se segue, com base em como eu %uero %ue ele funcione! /e voc( desenvolver o #rojeto, #oder)
surgir com outro ti#o de an)lise, uma ve4 %ue cada #essoa tem o seu #r+#rio modo de fa4er as coisas, o
%ue é #erfeitamente leg6timo!
H! .s ar%uivos e diret+rios objeto do bacu# est$o es#ecificados em uma lista!
;! . bacu# deve ser colocado em um diret+rio #rinci#al de bacu#!
=!
Z! . bacu#dodeve
. nome ser colocado
ar%uivo emeuma
4i# é a data ar%uivo
a hora do ti#o 4i#!
correntes!
5. saremos o comando Gip dis#on6vel #or default em %ual%uer distribui$o inu&1ni& #adr$o! .s
usu)rios de 9indo2s #odem instalar da #)gina do #rojeto e adicionar :'"rQui#os de
Programas'7nuJin3'bin a vari)vel de ambiente do sistema P-3K, de modo an)logo ao%ue
fi4emos #ara %ue o comando #ython fosse reconhecido! @ote %ue voc( #ode utili4ar %ual%uer
comando de ar%uivamento %ue desejar, desde %ue #ossua uma interface através de linha de
comando, de forma %ue #ossamos #assar argumentos a ele #or meio de nosso scri#t!
- /olu$o
ma ve4 %ue o #rojeto de nosso #rograma encontra*se agora ra4oavelmente est)vel, #odemos escrever o
c+digo %ue re#resenta uma im#lementa$o de nossa solu$o!
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'ver,.py
import os
import time
# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# bem*sucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er1.py
-gora, n+s nos encontramos em uma fase de testes, %uando n+s verificamos %ue o nosso #rograma
funciona de forma a#ro#riada! /e ele n$o se com#ortar como es#erado, ent$o n+s temos %ue de!uar o
nosso #rograma, ou seja, remover osbugs 0erros7 do #rograma!
/e o #rograma acima n$o funcionar #ara voc(, colo%ue um print6comando Gip8imediatamente antes da
chamada #ara os.system e e&ecute o #rograma! -gora co#ie1cole o comando^4i# im#resso no '#rom#t'
do shell e veja se ele e&ecuta ade%uadamente #or si mesmo! /e o comando falhar, verifi%ue no manual
do comando 4i# o %ue #oderia estar errado! /e o comando for bem sucedido, ent$o verifi%ue se o
#rograma em Python corres#onde e&atamente ao #rograna escrito acima!
Como funciona
8oc( notar) como n+s convertemos o nosso #rojeto em um #rocedimento #asso*a*#asso!
@+s fa4emos uso dos m+dulos os e time, antes de tudo im#ortando*os! nt$o, n+s es#ecificamos os
ar%uivos e diret+rios cujo bacu# deve ser reali4ado na lista ttUsrcem1ttU! . diret+rio alvo é onde n+s
arma4enamos todos os ar%uivos do bacu# e este est) es#ecificado #ela vari)vel dir_al#o! . nome do
ar%uivo 4i# %ue iremos criar é a data e hora correntes, os %uais n+s obtemos utili4ando a
fun$o time.strftime68! le receber) também a e&tens$o 4i# e ser) #osto no diret+rio dir_al#o!
.bserve o uso da vari)vel os.sep * esta fornece o se#arador de diret+rios de acordo com o sistema
o#eracional, ou seja, ser) em inu&, ni&, ser) ''em 9indo2s e : em Mac ./! . uso de os.sep,
ao invés desses caracteres diretamente, tornar) o nosso #rograma #ort)vel e ca#a4 de o#erar sob
a%ueles sistemas!
- fun$o time.strftime68 recebe uma es#ecifica$o tal como a %ue usamos no #rograma acima! -
es#ecifica$o v ser) substitu6da #elo ano sem o século! - es#ecifica$o m ser) substitu6da #elo mes
como um nLmero decimal entre 01 e1 e assim #or diante! - lista com#leta de tais es#ecificaIes #ode
ser encontrada no Python Reference Manual0Manual de Refer(ncia de Python7!
@+s criamos o nome do ar%uivo alvo 4i# utili4ando o o#erador adi$o, o %ualonatena as strings, isto é,
combina conjuntamente as strings e retorna uma nova string! nt$o, n+s criamos uma
string comando_Gip %ue contém o comando %ue iremos e&ecutar! 8oc( #ode verificar se esse comando
funciona, e&ecutando*o no shell 0terminal de inu& ou no '#rom#t' do :./7!
-o comando Gip %ue n+s estamos usando, s$o #assadas algumas o#Ies e #armetros! - o#$o 3he -Q é
em#regada #ara indicar %ue o comando 4i# deve o#erar de forma silenciosa 0 'uiet7! - o#$o *r es#ecifica
%ue o comando 4i# deve trabalhar recursivamente sobre os diret+rios, ou seja, dever) incluir todos os
subdiret+rios e ar%uivos! -s duas o#Ies s$o combinadas e es#ecificadas como -Qr! -s o#Ies s$o
seguidas #elo nome de um ar%uivo 4i# a ser criado seguido #ela lista de ar%uivos e diret+rios a reali4ar o
bacu#! @+s convertemos a lista srcem em uma string, usando o método oin de strings, o %ual j) vimos
como em#regar!
nt$o, n+s finalmente exeutamos o comando usando a fun$o os.system, %ue e&ecuta o comando como se
o estivesse fa4endo #elo sistema o#eracional, isto é, no shell * ele retorna 0 se o comando foi bem
sucedido, retornando um nLmero de erro, em caso contr)rio!
:e#endendo do resultado do comando, n+s im#rimimos a mensagem a#ro#riada se o bacu# falhou ou se
foi bem sucedido!
nt$o é isso, n+s criamos um scri#t #ara reali4ar um bacu# de nossos ar%uivos im#ortantesE
Nota aos 6suários de Hindo<s
-o invés de se%u(ncias de esca#e com du#lo 'bacslash' voc( #ode também ee#regar ra2
strings! Por e&em#lo, use:''4ocumentos our:'4ocumentos!
ntretanto, não utili4e :'4ocumentos, uma ve4 %ue voc( vai acabar encontrando uma
se%u(ncia desconhecida de esca#e '4!
-gora %ue n+s temos um scri#t de bacu# o#eracional, #odemos us)*lo em %ual%uer situa$o em %ue
desejamos obter um bacu# de ar%uivos! .s usu)rios de inu&1ni& s$o aconselhados a em#regar
o metodo^e&ecutavel como discutido anteriormente de modo %ue #ossam e&ecutar o scri#t de bacu# a
%ual%uer momento e em %ual%uer lugar! sta é chamada a fase de operação ou de empreo do
soft2are!
. #rograma acima funciona a#ro#riadamente, mas 0usualmente7 os #rimeiros #rogramas n$o o#eram
e&atamente como voc( es#era! Por e&em#lo, #oderiam haver #roblemas se voc( n$o tivesse #rojetado o
#rograma ade%uadamente ou se voc( tivesse cometido um erro ao digitar o c+digo, etc!
-#ro#riadamente, voc( ter) %ue voltar [ fase de #rojeto ou ter) %ue 'debugar' o seu #rograma!
/egunda 8ers$o
- #rimeira vers$o do nosso scri#t funciona! ntretanto, n+s #odemos im#lementar certos refinamentos a
ele, de modo a %ue #ossa funcionar ainda melhor dia a#+s dia! sta é chamada a fase de manutenção do
soft2are!
m dos refinamentos %ue eu achei %ue seria Ltil é um mecanismo mais ade%uado de atribui$o do nome
#ara os ar%uivos * usar a hora como o nome do ar%uivo dentro de um diret+rio com a data corrente como
um diret+rio no diret+rio #rinci#al de bacu#! - #rimeira vantagem é %ue os seus bacu#s estar$o
arma4enados de uma forma hier)r%uica e assim muito mais f)cil de gerenciar! - segunda vantagem é %ue
o com#rimento dos nomes dos ar%uivos ser) muito menor! - terceira vantagem é %ue diret+rios
se#arados o ajudar$o a facilmente verificar se voc( j) reali4ou o bacu# do dia, uma ve4 %ue o diret+rio
s+ ser) criado se voc( tiver efetuado o bacu# da%uele dia!
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'ver?.py
import os
import time
# ,. 5s ar%uivos e os diret2rios uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.
# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er.py
$ python backup_#er.py
Como funciona
- maior #arte do #rograma #ermanece a mesma! -s alteraIes s$o a%uelas nas %uais verificamos se
e&iste um diret+rio com o dia corrente como nome dentro do diret+rio #rinci#al utili4ando a
fun$o os.eOists! /e n$o e&istir, n+s o criamos #or meio da fun$o os.mkdir!
3erceira 8ers$o
- segunda vers$o funciona muito bem %uando eu efetuo muitos bacu#s, mas %uando h) um nLmero
muito grande de bacu#s, eu estou achando dif6cil diferenciar #ara %ue ra4$o s$o os bacu#sE Por
e&em#lo, eu #oderia ter feito algumas alteraIes significativas a um #rograma ou a#resenta$o, ent$o eu
gostaria a ra4$o #ara a%uelas alteraIes ao nome do ar%uivo 4i#! Bsso #ode ser facilmente obtido
associando*se um coment)rio fornecido #elo usu)rio ao nome do ar%uivo 4i#!
Nota
. #rograma a seguir n$o funciona, ent$o n$o #recisa ficar alarmado, #or favor acom#anhe a
discuss$o, #ois nela e&iste uma li$o!
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'ver*.py
import os
import time
# ,. 5s ar%uivos e os diret2rios uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.
# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er3.py
#artir da%uela
Mediante uma linha!
observa$o mais cuidadosa, n+s verificamos %ue a Lnica linha l+gica foi dividida em duas
linhas f6sicas, mas n+s n$o es#ecificamos %ue essas duas linhas f6sicas est$o conectadas uma a outra!
asicamente, Python encontrou o o#erador de adi$o 0N7 sem %ual%uer o#erando na%uela linha l+gica e
da6 n$o sabe como #rosseguir! embre*se %ue n+s #odemos es#ecificar %ue a linha l+gica continua na
#r+&ima linha f6sica através do uso de um 'bacslash' no final da linha f6sica! -ssim, n+s efetuamos essa
corre$o no nosso #rograma! - corre$o do #rograma %uando n+s encontramos erros é
denominada conserto de !us!
5uarta 8ers$o
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'verG.py
import os
import time
# ,. 5s ar%uivos e os diret2rios uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.
# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er@.py
$ python backup_#er@.py
Como funciona
ste #rograma agora funcionaE 8amos discutir os melhoramentos reais %ue fi4emos na vers$o =! @+s
coletamos o coment)rio do usu)rio usando a fun$o input e ent$o verificamos se o usu)rio efetivamente
entrou com alguma coisa, #or meio da determina$o do com#rimento da entrada usando a fun$o len!
/e o usu)rio a#enas #ressionou enter sem realmente haver entrado com algo 0talve4 tenha sido a#enas
um bacu# de rotina ou n$o haviam mudanas significativas7, ent$o n+s #rocedemos como hav6amos
feito antes!
ntretanto, se um coment)rio foi fornecido, ent$o ele é associado ao nome do ar%uivo imediatamente
antes da e&tens$o .Gip! .bserve %ue n+s estamos substituindo es#aos nos coment)rios #or
'underscores' 0sublinhados7 * isto #or%ue gerenciar ar%uivos sem es#aos é muito mais f)cil!
Mais Refinamentos
- %uarta vers$o é um scri#t %ue funciona satisfatoriamente #ara a maior #arte dos usu)rios, mas e&iste
es#ao #ara melhorias! Por e&em#lo, voc( #oderia incluir um n6vel de verbosidade #ara o #rograma, no %ual
voc( #oderia es#ecificar uma o#$o -# #ara tornar o seu #rograma mais informativo!
ma outra #oss6vel melhoria seria #ermitir ar%uivos e diret+rios adicionais a serem #assados ao scri#t na
linha de comando! @+s #odemos obter esses nomes da lista sys.arg# e adicion)*los a nossa
lista ssrcem utili4ando o métodoeOtend da classe list!
. refinamento mais im#ortante seria a n$o utili4a$o da via através de os.system#ara a cria$o dos
ar%uivos e ao invés disso lanar m$o dos m+dulos 'built*in'Gipfile ou tarfile #ara cri)*los! stes s$o
#arte da biblioteca #adr$o e #rontamente dis#on6veis #ara seu uso sem as de#end(ncias e&ternas do
#rograma 4i# %ue deve estar dis#on6vel no seu com#utador!
ntretanto, eu usei o caminho de os.system #ara criar um bacu# nos e&em#los acima #or ra4Ies
#uramente #edag+gicas, de modo %ue o e&em#lo fosse suficientemente sim#les #ara ser entendido #or
%ual%uer #essoa mas real o suficiente #ara ser Ltil!
8oc( #oderia tentar escrever a %uinta vers$o %ue utili4a o m+dulo 4i#file ao invés do recurso
ao os.systemY
. Processo de :esenvolvimento de /oft2are
@+s
como#assamos
segue #elas v)rias
8ases no #rocesso de escrever um soft2are! ssas fases #odem ser resumidas
Resumo
@+s vimos como criar os nossos #r+#rios #rogramas1scri#ts em Python e os v)rios est)gios envolvidos ao
escrever esses #rogramas! 8oc( #oder) achar Ltil criar o seu #o#rio #rograma da mesma maneira %ue
n+s fi4emos nesse ca#6tulo, de modo %ue voc( se fi%ue [ vontade n$o a#emnas com Python, mas
também com a resolu$o de #roblemas!
- seguir, discutiremos a #rograma$o orientada a objetos!
Python pt7!r?Proramacao "rientada a "!#etos
Introdução
*m todos os programas que escrevemos até agora' pro%etamos nosso programa em termos de funç(es'
isto é' blocos de declaraç(es que manipulam dados. *sta é a chamada maneira de programar orientada a
procedimentos. *iste outra maneira de organizar seu programa que combina dados e funcionalidades e
as empacota dentro de algo chamado ob%eto. *ste é o chamado paradigma de programação orientada a
objetos. /a maioria das vezes você pode usar a programação orientada a procedimentos' mas quando
estamos escrevendo grandes programas ou temos um problema que se adequa melhor a esse método'
você pode usar técnicas de programação orientadas a ob%etos.
8lasses e ob%etos são os dois principais aspectos da programação orientada a ob%etos. :ma classe cria
um novo tipo onde obetos são instâncias da classe. :ma analogia é que você pode ter variáveis do
tipo int o que significa dizer que variáveis que armazenam inteiros são variáveis que são inst&ncias
3ob%etos4 da classe int.
Nota para Proramadores de Linuaens $státicas
@ote %ue mesmo os inteiros s$o tratados como objetos 0da classe int7! Bsso é diferente do C
e do Java 0antes da vers$o H!]7 onde os inteiros s$o ti#os #rimitivos nativos!
8eja help6int8 #ara mais detalhes sobre a classe!
. self em Python é e%uivalente ao #onteiro this em C e [ refer(ncia thisem Java e C!
Você deve estar intrigado sobre como Python atribui o valor para self e o porquê você não precisa
atribuir um valor para ele. :m eemplo tornará mais claro. Digamos que você tenha uma classe
chamada 9ylass e uma inst&ncia desta classe chamada 9y*bect. 2uando você invoca um método
deste ob%eto como 9y*bect.method6arg1= arg8' isto é convertido automaticamente pelo Python
em 9ylass.method69y*bect= arg1= arg8 # este é o sentido especial deself.
5sto também significa que' se você tem um método que não possui argumentos' então você ainda assim
deverá ter um argumento # o self.
Classes
! classe mais simples poss$vel é mostrada no seguinte eemplo.
#!/usr/bin/python
# 7r%uivo: simplestlass.py
class Person:
pass # Am bloo va"io
p / Person07
print0p7
+a$da"
$ python simplestclass.py
8omo Bunciona"
8riamos uma nova classe usando a instrução class e o nome da classe. /a sequência' temos um bloco
de instruç(es que formam o corpo da classe. /este caso' temos um bloco vazio que é indicado pela
instrução pass.
*m seguida' criamos um ob%etoJinst&ncia desta classe usando o nome da classe seguido por um par de
parênteses. 3!prenderemos mais sobre instancia$o na pr)ima seção4. Para verificação' confirmamos o
tipo da variável simplementes imprimindo#a 3 print4. 5sso nos diz que temos uma inst&ncia da
classe Person no m)dulo __main__.
Cbserve que o endereço de mem)ria onde seu ob%eto está armazenado também é impresso. C endereço
terá um valor diferente em seu computador' uma vez que o Python poderá armezenar o ob%eto onde quer
que ha%a espaço.
J9todos de "!#etos
Ká discutimos que classesJob%etos podem ter métodos eatamente como funç(es' eceto pelo fato de que
temos uma variável etra # self. Ve%amos um eemplo.
#!/usr/bin/python
# 7r%uivo: method.py
class Person:
de8 sayi0self7:
print0'Kello, ho2 are youY'7
p / Person07
p.sayKi07
8omo Bunciona"
!qui vemos o self em ação. Cbserve que o método sayi não possui qualquer par&metro mas' ainda
assim' temos o self na definição do método.
" m9todo KKinitKK
*istem vários nomes de métodos que possuem significado especial em classes Python. Veremos agora o
significado do método __init__.
C método __init__ é invocado pronta e automaticamente quando um ob%eto de uma classe é
instanciado. *ste método é 7til para realizar quaisquer iniciaçõesque você dese%ar fazer com o seu ob%eto.
Cbserve os sublinhados duplos' no in$cio e no final do nome.
*emplo"
#!/usr/bin/python
# 7r%uivo: lass'init.py
class Person:
de8 ^^init^^0self= name7:
self.name / name
de8 sayi0self7:
print0'Kello, my name is' = self.name7
p / Person0'/2aroo#'7
p.sayKi07
8omo Bunciona"
!qui' definimos o método __init__ com um par&metro name 3além do usual par&metro self4. *ntão'
simplesmente criamos um novo atributo também chamado name. Cbserve que tratam#se de variáveis
diferentes' embora tenham o mesmo nome 3FnameF4. ! notação por ponto nos permite diferenciar uma
variável da outra.
Aais importante ainda' observe que n)s não invocamos o método __init__eplicitamente' mas apenas
passamos os argumentos entre os parênteses ap)s o nome da classe' quando criamos uma nova
inst&ncia. *ste é o significado especial deste método.
!gora' podemos usar o atributo self.name em nossos métodos' como é demonstrado no método sayi.
Nota para Proramadores C554=ava4C>
class Kobot:
'''Re#resenta um rob` com um nome!'''
de8 ^^del^^0self7:
'''stou morrendo!'''
print0'N?O sendo destru6doE'.format0self.name77
Kobot.#o#ulation -/ H
i8 Kobot.#o#ulation // ?:
print0'N?O era o Lltimo!'.format0self.name77
else:
print0'&iste0m7 ainda N?dO rob`0s7 trabalhando!'.format0Kobot.#o#ulation77
de8 sayi0self7:
'''/audaIes do rob`!
de8 hoD9any0klass7:
'''Bm#rime a #o#ula$o atual!'''
print0'3emos um total de N?dO rob`0s7!'.format0Kobot.#o#ulation77
hoD9any / classmethod0hoD9any7
droid1 / Kobot0'R;*:;'7
droid1.sayKi07
Kobot.ho2Many07
droid / Kobot0'C*=P.'7
droid.sayKi07
Kobot.ho2Many07
Kobot.ho2Many07
+a$da"
6niciando K-48
6niciando -3P*8
!audazes= meus mestres me chamam -3P*.
8omo Bunciona"
*ste é um longo eemplo' mas a%uda a demonstrar a natureza das variáveis de classe e de inst&ncia.
!qui' population pertence 0 classe Kobot e' portanto' é uma variável de classe. !
variável name pertence ao ob%eto 3inst&ncia' pois é atribu$da usando self4 e' portanto' é uma variável de
inst&ncia.
!ssim' nos refer$mos 0 variável de classe population como Kobot.population e não
como self.population. Por outro lado' nos refer$mos 0 variável de inst&ncia name usando a
notação self.name' nos métodos daquele ob%eto. Iembre#se desta simples diferença entre variáveis de
classe e de inst&ncia. /ote também que' uma variável de inst&ncia com o mesmo nome de uma variável
de classe irá se sobrepor 0 variável de classe' escondendo#a,
C método hoD9any é' na verdade' um método de classe' e não um método de inst&ncia. Portanto' o
primeiro argumento é klass. /ote que escrevemos klasscom FF' por que não podemos reutilizar a
palavra class que é a palavra#chave usada para criar nova classes.
!inda não terminamos de definir Fho9AanyF' pois temos que tornar epl$cito que trata#se de um método
de classe. Para isso' empacotamos o método usando a função interna classmethod.
Podemos obter o mesmo efeito usando decorators"
xclassmethod
de8 hoD9any0klass7:
'''Bm#rime a #o#ula$o atual!'''
print0'3emos um total de N?dO rob`0s7!'.format0Kobot.#o#ulation77
Pense em decorators como sendo atalhos para uma chamada epl$cita a uma instrução' como vimos
neste eemplo.
/ote que o método __init__ é usado para iniciar a inst&ncia de Kobot com um nome. /a iniciação'
incrementamos em M a população 3population4 de robNs' uma vez que temos mais um robN adicionado.
Cbserve também que os valores de self.name são espec$ficos a cada ob%eto demonstrado a natureza das
variáveis de inst&ncia.
Iembre#se que você deve referir#se 0s variáveis e métodos de uma mesma inst&ncia somente em
con%unto com self. 5sto é chamado de referência ao atributo .
/este eemplo' também vemos o uso de docstrin%s para classes e também para métodos. Podemos
acessar a documentação da classe em tempo de eecução usando Kobot.__doc__ e a documentação de
um método usandoKobot.sayi.__doc__.
!ssim como o método __init__' há um outro método especial __del__ que é invocado com quando um
ob%eto está para ser eliminado' isto é' quando não será mais utilizado e será eliminado para que o
sistema reutilize o trecho de mem)ria que aquela inst&ncia estiver ocupando. /este método'
simplesmente decrementamos a população geral de robNs em M usando Person.population -/ 1.
C método __del__ será eecutado quando o ob%eto não estiver mais em uso e não há garantias
de quando o método será invocado. +e você dese%a vê#lo em ação' devemos utilizar a
instrução del eplicitamente' que é eatamente o que fizemos.
Nota para Proramadores C554=ava4C>
3odos os membros de classe 0incluindo dados * vari)veis7 s$o p4blios e todos os métodos
s$o virtual em Python!
K) uma e&ce$o /e voc( definir nomes #ara os membros #refi&ados comdois arateres de
sublinha como em __pri#ate#ar, Python altera esse nome internamente 0técnica
chamada namemangling7 #ara tornar a vari)vel, efetivamente, #rivada!
-ssim, segue*se a conven$o de %ue, %ual%uer vari)vel %ue deva ser utili4ada a#enas #ela
classe ou #ela instncia deve iniciar com um sublinhado e, todos os outros nomes s$o #Lblicos
e #odem ser utili4ados #or outras classes1objetos! embre*se de %ue esta é a#enas uma
conven$o e n$o é e&igido #elo Python 0e&ceto #ara #refi&os %ue iniciem com dois caracteres
de sublinhado7!
@ote também %ue o método __del__ é an)logo ao conceito de métodosdestrutor!
2erança
:m dos maiores benef$cios da programação orientada a ob%etos é reusabilidadede c)digo' e uma
maneiras de obter isto é através do mecanismo de herança. Lerança pode ser imaginada como a
implementação de um relacionamento tipo e subtipo entre classes.
+uponha que você deva escrever um programa para controle de professores e alunos em uma escola.
*les possuem caracter$sticas comuns tais como nome' idade e endereço. *les também possuem
caracter$sticas espec$ficas tais como salário' matérias e leaves para professores e notas e mensalidades
para alunos.
Você pode criar duas classes independentes' uma para tipo' mas adicionar uma nova carater$stica comum
significará adicionar nas duas classes independentes. 5sto torna#se rapidamente desa%eitado.
:m modo mais eficiente é criar uma classe comum chamada !chool9ember e então fazer outras duas
classes professor 3)eacher4 e aluno 3!tudent4 herdaremsuas caracter$stias' isto é' elas serão seus sub#
tipos' e então poderemos adicionar caracter$sticas espec$ficas para cada sub#tipo.
*istem muitas vantagens nesta abordagem. +e adicionarmos ou mudarmos qualquer funcionalidade
em !chool9ember' isto será automaticamente refletido em seus sub#tipos. Por eemplo' você poderá
adicionar um novo campo 5D para professores e alunos simpOesmente adicionando esse campo na
classe!chool9ember. *ntretanto' mudanças em sub#tipos não afetarão outros sub#tipos. Cutra vantagem
é que você pode se referir aos ob%etos professores e alunos como ob%etos !chool9ember' o que pode ser
7til em algumas situaç(es' tal como contar o n7mero total de membros. 5sto é chamado
de polimorfismo' onde um sub#tipo pode ser substitu$do em qualquer situação onde um super#tipo é
esperado' isto é' o ob%eto pode ser manipulado como se fosse uma inst&ncia da classe pai.
Cbserve também que n)s reutilizamos o c)digo da classe pai 3super#tipo4 e por isso não precisamos
repet$#lo nos sub#tipos' como ter$amos que fazer no caso de usarmos classes independentes.
! classe !chool9ember nesta situação é conhecida como classe base 3base class4 ou super classe.. !s
classes )eacher e !tudent são chamadas de classes derivadas3derived classes4 ou subclasses.
Vamos implementar o eemplo citado"
#!/usr/bin/python
# 7r%uivo: inherit.py
class !chool9ember:
'''Re#resenta %ual%uer membro da escola!'''
de8 ^^init^^0self= name= age7:
self.name / name
self.age / age
print0'0Bniciado /choolMember N?O7'.format0self.name77
de8 tell0self7:
'''Bm#rime os detalhes desta instncia!'''
print0'@ome"N?O" Bdade"NHO"' .format0self.name= self.age7= end/" "7
class )eacher0!chool9ember7:
'''Re#resenta um #rofessor!'''
de8 ^^init^^0self= name= age= salary7:
de8 tell0self7:
!chool9ember.tell0self7
print0'/al)rio "N?dO"'.format0self.salary77
class !tudent0!chool9ember7:
'''Re#resenta um aluno!'''
de8 ^^init^^0self= name= age= marks7:
!chool9ember.^^init^^0self= name= age7
self.mars / marks
print0'0Bniciado /tudent N?O7' .format0self.name77
de8 tell0self7:
!chool9ember.tell0self7
print0'@ota "N?dO"'.format0self.mars77
members / Qt= s
8or member in members:
member.tell07 # uniona tanto para Leahers omo para Ctudents
+a$da"
$ python inherit.py
8omo Bunciona"
Para usar herança' especificamos os nomes das classes base em uma tupla' logo ap)s o nome da classe
em sua declaração. *m seguida' observamos que o método __init__ da classe base é eplicitamente
invocado usando a variávelself' de tal maneira que podemos iniciar a porção da classe base do ob%eto. <
muito importante lembrar#se disto # Python não invocará automaticamente o construtor da classe base'
por isso você deverá invocá#lo eplicitamente.
Cbservamos também que podemos invocar métodos da classe base prefiando o nome da classe na
chamada do método e então passar como argumento a variável self além de quaisquer outros
argumentos.
/ote que podemos tratar inst&ncias de )eacher ou !tudent simplesmente como inst&ncias
de !chool9ember' tal como quando usamos o método tell da classe!chool9ember.
!inda' note que é invocado o método tell do sub#tipo e não o método tell da classe !chool9ember.
:ma maneira de enteder isto é que Python sempre procura pelo método invocado' primeiro no tipo real
do ob%eto' o que é verificado neste caso. +e o método invocado não puder ser encontrado' Python irá
procurar pelo método nas classes base 3especificadas na tupla onde a classe é declarada4 uma#a#uma na
ordem em que foram escritas.
:ma nota sobre terminologia # se mais de uma classe é fornecida na tupla de herança 3na declaração da
classe4' isto é chamado de herança m!ltipla.
Jetaclasses
Lá muito mais no vasto t)pico da programação orientada a ob%etos' mas tocaremos levemente em
apenas alguns poucos t)picos apenas para ficarmos sabendo que eistem.
!ssim como usamos classes para criar ob%etos' podemos utilizar metaclasses para criar classes.
Aetaclasses são usadas para modificar ou criar novos comportamentos em classes.
Vamos tomar um eemplo. +uponha que dese%emos ter certeza que sempre criaremos inst&ncias de
subclasses da classe !chool9ember e que não criaremos inst&ncias da classe !chool9ember em si.
Podemos garantir isso usando um conceito chamado de classe base abstrata3abstract base class4. 5sso
significa que a classe será abstrata o que quer dizer que a classe em si é um conceito' e não deve ser
utilizada como uma classe real 3ou se%a' não devem ser criados ob%etos # inst&ncias # dessa classe4.
Podemos declarar que a nossa classe é uma classe base abstrata usando a metaclasse interna
chamada ",9eta 3!8 # abstract base class 4.
#!/usr/bin/env python
# 7r%uivo: inherit'ab.py
class !chool9ember0metaclass/",9eta7:
'''Re#resenta um membro %ual%uer da escola!'''
de8 ^^init^^0self= name= age7:
self.name / name
self.age / age
print0'0Bniciado /choolMember N?O7'.format0self.name77
xabstractmethod
de8 tell0self7:
'''Bm#rime os dados da instncia!'''
print0'@ome"N?O" Bdade"NHO"' .format0self.name= self.age7= end/" "7
class )eacher0!chool9ember7:
'''Re#resenta um #rofessor!'''
de8 ^^init^^0self= name= age= salary7:
!chool9ember.^^init^^0self= name= age7
self.salary / salary
print0'0Bniciado 3eacher N?O7'.format0self.name77
de8 tell0self7:
!chool9ember.tell0self7
print0'/al)rio "N?dO"'.format0self.salary77
class !tudent0!chool9ember7:
'''Re#resenta um aluno!'''
de8 ^^init^^0self= name= age= marks7:
!chool9ember.^^init^^0self= name= age7
self.mars / marks
print0'0Bniciado /tudent N?O7' .format0self.name77
de8 tell0self7:
!chool9ember.tell0self7
print0'@ota "N?dO"'.format0self.mars77
m / !chool9ember0'abc'= H?7
m.tell07
members / Qt= s
8or member in members:
member.tell07 # uniona tanto para Leaher omo para Ctudent
+a$da"
6niciado !chool9ember: 9rs. !hri#idya8
m / !chool9ember6abc= 108
)ype&rror: ant instantiate abstract class !chool9ember Dith abstract methods tell
8omo funciona"
Podemos declarar o método tell da classe !chool9ember como sendo um método abstrato' assim'
automaticamente' não poderemos criar inst&ncias da classe !chool9ember.
*ntretanto' podermos
de !chool9ember ' por criar inst&ncias
que eles de )eacher e !tudent como se fossem inst&ncias
são subclasses.
Sumário
!cabamos de eplorar os vários aspectos de classes e ob%etos bem como várias terminologias
relacionadas. Vimos também os benef$cios e as armadilhas da programação orientada a ob%etos. Python é
fortemente orientado a ob%etos e compreender cuidadosamente estes conceitos o a%udarão muito a longo
prazo.
! seguir' aprenderemos a lidar com entrada e sa$da input
3 Joutput4 e sobre como acessar arquivos em
Python.
Python pt-br:Entrada e &aida
Kaver) situaIes em %ue seu #rograma dever) interagir com o usu)rio! Por e&em#lo, voc( #oderia
desejar obter alguma entrada do usu)rio e ent$o im#rimir algo! @+s #odemos fa4er isso usando as
funIes input68 e print68!
Para a sa6da, n+s também #odemos usar v)rios métodos da classe str 0string7! Por e&em#lo, voc( #ode
usar o método rust #ara tornar uma string justificada a direita em uma largura es#ecificada!
8eja help6str8!
.utro ti#o comum de entrada1sa6da é o uso de ar%uivos! - habilidade de criar, ler e escrever ar%uivos é
essencial #ara muitos #rogramas e n+s e&#loraremos este as#ecto neste ca#6tulo!
ntrada do usu)rio
#!/usr/bin/python
# user'input.py
de8 re#erse0teOto7:
return teOtoQ::-H
de8 is_palindrome0teOto7:
return teOto // re#erse0teOto7
$ python user_input.py
!im= S um palndromo
$ python user_input.py
!im= S um palndromo
Como funciona
@+s usamos um 'slicing' #ara inverter o te&to! @+s j) vimos como #odemos fa4(*lo 'slices' de
se%u(ncias usando o c+digo seQBa:bC iniciando da #osi$o a #ara a #osi$o b! @+s também #odemos
fornecer um terceiro argumento %ue determina os passos #elos %uais o 'slicing' é feito! . #asso #adr$o é 1,
#ois assim ele retorna uma #arte cont6nua do te&to! :ando um #asso negativo, i!e! -1 o te&to ser)
retornado de forma invertida!
- fun$o input68 recebe uma string como argumento e a mostra #ara o usu)rio! nt$o ela es#era %ue o
usu)rio digite algo e #ressione a tecla de retorno 0nter7! Feito isso, a fun$o input68 ir) retornar o te&to!
@+s #egamos este te&to e o invertemos! /e o te&to srcinal e o invertido forem iguais, ent$o o te&to é
um #al6ndromo!
i$o de casa
8erificar se um te&to é um #al6ndromo deveria ignorar #ontua$o, es#aos e cai&as altas e bai&as! Por
e&em#lo, "/ocorram*me, subi no `nibus em MarrocosE" também é um #al6ndromo, mas nosso atual
#rograma n$o di4 isso! 8oc( #ode modificar o #rograma #ara reconhecer este #al6ndromoY
-r%uivos
8oc( #ode abrir e usar ar%uivos #ara leitura ou grava$o criando um objeto da classe file e usando seus
métodos read, readline ou Drite #ara ler ou escrever no ar%uivo! - #ossibilidade de ler ou escrever no
ar%uivo de#ende do modo %ue voc( es#ecificou em sua abertura! 5uando voc( acabar de usar o ar%uivo,
voc( #ode chamar o método close68 #ara di4er #ara o Python %ue n+s terminamos de usar o ar%uivo!
&em#lo
#!/usr/bin/python
# Filename: usando'ar%uivo.py
poema / '''
Programar é divertido
5uando o trabalho est) #ronto
se voc( %uer tornar seu trabalho divertido
use PythonE
'''
f / o#en0'#oema!t&t'7 # se nenhum modo espeiiado; o modo leitura (>r>ead) aberto por padrão
<hile 3rue:
linha / f.readline07
i8 len0linha7 // ?: # Lamanho M india E5F (im do ar%uivo End 5 File)
!rea.
print0linha= end/''7
f.close07 # eha o ar%uivo
/a6da
$ python usando_arQui#o.py
Programar S di#ertido
use PythonM
Como funciona
Bnicialmente, abrimos um ar%uivo usando a fun$o embutida open e es#ecificando o nome do ar%uivo e o
modo no %ual %ueremos abri*lo! .s modos #odem ser de leitura 0 r7, grava$o 0D7 ou adicionar 0a7!
@+s também #odemos trabalhar com um ar%uivo de te&to 0 t7 ou um ar%uivo bin)rio 0b7! @a verdade
e&istem muito mais m+dulos dis#on6veis, digitar help6open8 dar) a voc( mais detalhes sobre eles! Por
#adr$o, open68 consideradas o ar%uivo como um 't'e&to e o abre no modo leitura 0'r'ead7!
m nosso e&em#lo, n+s #rimeiro abrimos o ar%uivo em modo te&to #ara grava$o, ent$o usamos o
método Drite do objeto ar%uivo #ara escrever o te&to e, finalmente, fechamos o ar%uivo com o
método close!
m seguida, n+s abrimos o mesmo ar%uivo novamente #ara leitura! @+s n$o es#ecificamos o modo #ois o
modo #adr$o é 'ar%uivo te&to #ara leitura'! @+s lemos cada linha usando o método readline em um loo#!
ste método retorna uma linha com#leta, incluindo o car)cter de nova linha no final! 5uando uma
string va"ia é retornada, significa %ue n+s atingimos o fim do ar%uivo e, ent$o, 'interrom#emos' 0brea7 o
loo#!
Por #adr$o, a fun$o print68 im#rime o te&to com uma nova linha na tela! @+s evitamos a nova linha
es#ecificando end/ #ois a linha %ue é lida do ar%uivo j) termina com um car)cter de nova linha!
Finalmente, n+s fechamos o ar%uivo!
-gora, verifi%ue o conteLdo do ar%uivo poema.tOt #ara se certificar de %ue o #rograma escreveu e leu o
ar%uivo!
Picle
Python fornece um m+dulo #adr$o chamado pickle, %ue #ermite %ue voc( arma4ene 'ual'uer objeto de
Python em um ar%uivo e ent$o o #egue novamente mais tarde! Bsto é chamado de arma4enar o
objetopermanentemente!
&em#lo
#!/usr/bin/python
# Filename: pi-ling.py
import #icle
# Esrevendo no ar%uivo
f / o#en0arQui#o_listadecompras= '2b'7
#icle.dum#0listadecompras= f7 # desarrega o obeto em um ar%uivo
f.close07
Como funciona
Para arma4enar um objeto em um ar%uivo, n+s devemos inicialmente abrir o ar%uivo com o
m+dulo open em modo de grava$o 0'2'rite7 e 'b'in)rio, #ara ent$o chamar a fun$o dump do
m+dulo pickle! ste #rocesso é chamado pi-ling!
- seguir, n+s recu#eramos o objeto, usando a fun$o load do m+dulo pickle %ue retorna o objeto! ste
#rocesso é chamado unpi-ling!
/um)rio
@+s discutimos v)rios ti#os de entrada1sa6da e também o manuseio de ar%uivos usando o m+dulo pi-le!
- seguir, n+s e&#loraremos o conceito de e&ceIes!
Python pt7!r?$%cecoes
Introdução
*ceç(es ocorrem quando determinadas situaç(es -ecepcionais- ocorrem em seu programa. Por
eemplo' que tal se você estiver para ler um arquivo e este não eistirQ Cu que tal se você
acidentalmente deletou#o durante a eecução do programaQ ?ais situaç(es são manipuladas
uitizando exce'(es.
De modo análogo' que tal se o seu programa tivesse comandos inválidosQ 5sso é manipulado por Python'
que le"anta 3raise4 as mãos e avisa a você que eiste um erro.
$rros
+uponha uma simples chamada da função printttF. Wue tal se nws escre#ssemos errado como
ttFprint ou PrintttFX *bser#e a capitaliGaYo. 2este caso= Python levanta um erro de
sintaOe.
Print6ello Jorld8
ello Jorld
*bser#e Que um ttF2ame&rror é levantado e também que a localização onde o erro foi detetado é
impressa. 5sso é o que um error handler para este erro faz.
$%ceç;es
/)s tentaremos 3try4 ler a entrada do usuário. Digite ctrl-d e ve%a o que acontece.
FFF s / input6&ntre com alguma coisa --F 8
Python levanta um erro chamado &*I&rror o qual basicamente significa que encontrou um s$mbolo end
of file 3fim do arquivo4 3representado por ctrl-d4 quando não esperaria vê#lo.
Janipulando $%ceç;es
/)s podemos manipular eceç(es usando o comando try..eOcept. /)s basicamente colocamos os
comandos costumeiros dentro do bloco do try e dipomos os nossos manipuladores de erros no bloco do
ecept.
#!/usr/bin/python
# 6ome do ar%uivo: try'exept.py
try :
teOto / in#ut0'ntre com alguma coisa **U 7'
e%cept .Frror:
print0'Por %ue voc( jogou um .F em mimY'7
e%cept peyboardBnterru#t:
print0'8oc( cancelou a o#era$o!'7
else:
print0'8oc( entrou com N?O'.format0teOto77
+a$da"
$ python try_eOcept.py
$ python try_eOcept.py
$ python try_eOcept.py
8omo Bunciona"
/)s colocamos todos os comandos que poderiam levantar eceç(es dentro do bloco do try e então os
FhandlersF para os errosJeceç(es na cláusulaJbloco eOcept. a cláusula eOcept pode manipular um 7nico
erro ou eceção especificada' ou uma lista de errosJeceç(es entre parênteses. +e nenhum nome de erro
ou eceção for fornecido' manipulará todos os erros ou eceç(es.
/ote que deve haver pelo menos uma cláusula eOcept associada com cada cláusula try. Cu não haveria
razão para um bloco de try.
+e um erro ou eceção não é manipulada' então é invocado o Python handler padrão que interrompe a
eecução do programa e emite uma mensagem de erro. /)s vimos isso em ação acima.
/)s podemos também ter uma cláusula else associada a um bloco try..catch. ! cláusula else é
eecutada se nenhuma eceção ocorrer.
/o pRoimo eemplo' n)s veremos como obter um ob%eto eceção de modo que n)s possamos recuperar
informação adicional.
Levantando $%ceç;es
Você pode le"antar eceç(es com o comandoraise fornecendo o nome do erroJeceção e o ob%eto
eceção que deverá ser lançado 3thro"n4.
C erro ou eceção que você pode levantar deverá ser uma classe que direta ou indiretamente deve ser
uma classe derivada da classe &Oception.
#!/usr/bin/python
# 6ome do ar%uivo: raising.py
class !hortnput&Oception0&ce#tion7:
'''ma classe e&ce$o definida #elo usu)rio!'''
de8 ^^init^^0self= length= atleast7:
&ce#tion.^^init^^0self7
self.length / length
self.atleast / atleast
try :
teOt / in#ut0'ntre com alguma coisa **U 7'
i8 len0teOt7 =:
raise !hortnput&Oception0len0teOt7= =7
# Demais tareas podem ontinuar omo usualmente a%ui...
e%cept .Frror:
print0'Por %ue voc( jogou um .F em mimY'7
e%cept !hortnput&Oception as eO:
print0'/hortBn#ut&ce#tion - entrada teve o com#rimento N?O, o es#erado era #elo menos NHO''
.format0eO.length= eO.atleast77
else:
print0'@enhuma e&ce$o foi levantada!'7
+a$da"
$ python raising.py
$ python raising.py
8omo Bunciona"
!qui n)s estamos criando o nosso pr)prio tipo de *ceção. *ste novo tipo de eceção é
chamado !hortnput&Oception. *le tem dois campos # length que é o comprimento da entrada
fornecida e atleast que é o m$nimo comprimento da entrada que o programa estava esperando.
/a cláusula eOcept' n)s mencionamos a classe de erro que será guardada as3como4 o nome da variable
que irá manter o ob%eto erroJeceção correspondente. 5sto é análogo aos par&metros e argumentos em
uma chamada de função. Dentro dessa particular cláusula eOcept clause' n)s usamos os
campos length e atleast do ob%eto eceção para imprimir uma mensagem apropriada ao usuário.
1ry -- Finally
+uponha que você estivesse lendo um arquivo em seu programa. 8omo você poderia assegurar#se que o
ob%eto arquivo estivesse fechado adequadamente' fosse ou não levantada uma eceçãoQ 5sso pode ser
obtido usando#se o blocofinally. /ote que você pode empregar uma cláusula eOcept %untamente com o
bloco finally para o mesmo correspondente bloco try. Você terá que imergir um dentro do outro se
quiser utilizar ambos.
#!/usr/bin/python
# 6ome do ar%uivo: inally.py
import time
try :
f / o#en0'#oema!t&t'7
<hile 3rue: # nossa usual linguagem de leitura de ar%uivo
line / f.readline07
i8 len0line7 // ?:
!rea.
print0line= end/''7
time.slee#0;7 # 7ssegurar %ue levar algum tempo exeutando
e%cept peyboardBnterru#t:
print0'EE
8oc( cancelou a leitura do ar%uivo!'7
8inally:
f.close07
print0'0im#ando tudo Fechado o ar%uivo7'7
+a$da"
$ python finally.py
Programming is fun
8omo Bunciona"
/)s efetuamos a tradicional rotina de leitura do arquivo' mas introduzimos arbitrariamente uma pausa
3FsleepingF4 de @ segundos depois da impressão de cada linha' usando a função time.sleep de modo que
o programa eecute lentamente 3Python é muito rápido por natureza4. *nquanto o programa estiver
eecutando' digite ctrl-c para interromperJcancelar o programa.
Cbserve que a eceção Heyboardnterrupt é lançada e o programa termina. *ntretanto' antes da sa$da
Dith opened0"#oema!t&t"7 as f:
8or line in f:
print0line= end/''7
8omo Bunciona"
! sa$da deverá ser a mesma do eemplo anterior. ! diferença aqui está em que n)s estamos usando a
função opened com o comando Dith.
5sto não congestiona o processamento do arquivo e focaliza no que estamos fazendo com ele. /)s
deiamos o fechamento do arquivo a ser realizado automaticamente por opened.
)esumo
/)s discutimos o uso dos comandos try..eOcept e try..finally. Vimos como criar o nosso pr)prio tipo
de eceção e também como levantar eceç(es.
*m seguida' eploraremos a Python +tandard Iibrary 3ibioteca Padrão do Python4.
Python pt7!r?&i!lioteca Padrao
Introdução
! iblioteca Padrão do Python contém um vasto n7mero de m)dulos 7teis e é parte de todas as
instalaç(es de Python. < importante conhece#la' uma vez que muitos problemas podem ser resolvidos
rapidamente se você estiver familiarizado com o grande n7mero de coisas que estas bibliotecas podem
fazer.
/)s iremos eplorar alguns dos m)dulos mais usados desta biblioteca. Você pode encontar detalhes
completos para todos os m)dulos da iblioteca Padrão do Python na se$o 'ibrary Reference' da
documentação que vem com sua instalação do Python.
Vamos eplorar alguns m)dulos 7teis.
Nota
/e voc( achar estes t+#icos muito avanados, voc( #ode #ular este ca#6tulo! @o entanto, eu
realmente recomendo %ue voc( volte #ara estudar este ca#6tulo %uando voc( estiver
familiari4ado com a #rograma$o usando Python!
Jódulo sys
C m)dulo sys contém funcionalidades espec$ficas do sistema. /)s %á vimos que a lista sys.arg# contém
os argumentos
+uponha dadese%emos
que n)s linha de comando.
checar a versão do Python que está sendo usada para se assegurar que
estamos usando a versão =. C m)dulo sys nos dá tal funcionalidade.
UUU import sys
UUU sys.version^info
0== ?= ?= 'beta'= ;7
UUU sys.version^infoQ? U/ =
3rue
8omo funciona"
C m)dulo sys tem a tupla #ersion_info que nos dá informaç(es sobre a versão do Python. C primeiro
valor é a versão principal. /)s podemos verificar a versão' por eemplo' para garantir que o programa s)
rode sob o Python =.>"
#!/usr/bin/python
# Filename: hearversao.py
import sys= 2arnings
i8 sys.version^infoQ? =:
2arnings.2arn0"@ecess)rio Python =!? #ara rodar este #rograma"=
Runtime9arning7
else:
print0'Prosseguir normalmente'7
+a$da"
$ python.< checar#ersao.py
KuntimeJarning8
$ python3 checar#ersao.py
Prosseguir normalmente
8omo funciona"
/)s usamos um outro m)dulo da biblioteca padrão chamado Darnings' que é usado pra mostrar avisos
para o usuário final. +e a versão do Python não for =.> ou superior' n)s mostramos o aviso
correspondente.
Jódulo loin
* se você dese%ar armazenar mensagens de depuração ou outras mensagens importantes' de forma que
você possa verificar se seu programa está rodando da forma que você esperavaQ 8omo armazenar estas
mensagensQ 5sso pode ser feito usando o m)dulo logging.
#!/usr/bin/python
# Filename: use'logging.py
import os= #latform= logging
i8 #latform.#latform07.starts2ith0'9indo2s'7:
logging_file / os.#ath.join0os.getenv0':BR3qRB.B@BCB-'7= os.getenv0'C-MB@K.'7= 'test!log'7
else:
logging_file / os.#ath.join0os.getenv0'K.M'7= 'test!log'7
logging.basicConfig0
le#el/logging.:G=
format/'0asctime7s 0levelname7s 0message7s'=
filename / logging_file=
filemode / '2'=
7
logging.debug0"Bn6cio do #rograma"7
logging.info0"Fa4endo alguma coisa"7
logging.2arning0"3erminando agora"7
+a$da"
$python use_logging.py
5ogging to :'(sers'sDaroop'test.log
8omo funciona"
/)s usamos três m)dulos da biblioteca padrão # o m)dulo os para interagir com o sistema operacional' o
m)dulo platform para informaç(es sobre a plataforma' i.e. o sistema operacional' e o
m)dulo logging para registrar informaç(es.
5nicialmente' n)s verificamos qual o sistema operacional que estamos usando' verificando a string
retornada por platform.platform68 3para mais informaç(es' ve%a import platform
help6platform8 no interpretador Python4. +e for o Sindo9s' n)s apontamos o diret)rio inicial' o
caminho e o nome do arquivo no qual queremos armazenar a informação. Kuntando estas três partes'
n)s teremos a localização completa do arquivo. Para outras plataformas' n)s precisamos conhecer
apenas a pasta home do usuário e assim teremos a localização completa do arquivo.
/)s usamos a função os.path.oin68 para %untar estas três partes da localização. C motivo de usar uma
função especial ao inves de apenas somar as strings' é que esta função se assegura de que a localização
completa este%a de acordo com o formato esperado pelo sistema operacional.
/)s configuramos o m)dulo logging para escrever todas as mensagens no arquivo especificado' num
formato espec$fico.
Binalmente' n)s podemos armazenar mensagens 7teis para depuração' informação' avisos ou mensagens
cr$ticas. :ma vez que o programa tenha rodado' n)s podemos verificar este arquivo e' assim' saberemos
o que aconteceu no programa' mesmo que nenhuma informação tenha sido mostrada para o usuário
durante seu funcionamento.
Jódulos urlli! e #son
/ão seria divertido se n)s pudéssemos escrever nossos pr)prios programas de busca para internetQ
Vamos descobrir como fazê#los.
5sto pode ser feito usando#se alguns m)dulos. Primeiro o m)dulo urllib que podemos usar para obter
qualquer página da internet. Poderemos usar o 1ahoo, +earch para pesquisar resultados e' por sorte' eles
podem nos dar os resultados num formato chamado K+C/' que podemos analisar facilmente graças ao
m)dulo embutido son da biblioteca padrão.
Nota
ste #rograma ainda n$o funciona devido ao %ue #arece ser um bug no Python =!? beta ;!
#!/usr/bin/python
# Filename: yahoo'searh.py
import sys
i8 sys.version^infoQ? E/ =:
sys.e&it0'ste #rograma #recisa do Python =!?'7
import son
import urllib= urllib.#arse= urllib.re%uest= urllib.res#onse
class vahoo!earch&rror0&ce#tion7:
pass
# 5btido de http://developer.yahoo.om/python/pythonson.html
de8 search0Query= results/;?= start/H= kDargs7:
kDargs.u#date0N
'a##id': v"**_"PP_4=
'%uery': Query=
'results': results=
'start': start=
'out#ut': 'json'
O7
url / !&"K_,"!& N 'Y' N urllib.#arse.urlencode0kDargs7
result / son.load0urllib.re%uest.urlo#en0url77
i8 'rror' in result:
raise vahoo!earch&rror0resultQ'rror'7
return resultQ'Result/et'
ste método é chamado imediatamente antes %ue o novo objeto criado esteja #ronto #ara utili4a$o!
^^del^^0self7
Chamado imediatamente antes %ue o objeto seja destru6do!
^^str^^0self7
^^lt^^0self, other7
Chamado %uando o o#erador 'menor do %ue' 07 é usado! /imilarmente, e&istem métodos es#eciais #ara
todos os o#eradores 0, U, etc!7
^^getitem^^0self, ey7
^^len^^0self7
Formas ambda
ma forma lambda é em#regada #ara criar novos objetos funIes e retorn)*los em tem#o de e&ecu$o
0'runtime'7!
H! E1usr1bin1#ython
;! @ome do ar%uivo lambda!#y
def cria^re#etidor0n7
return lambda s: s U n
dobro cria^re#etidor0;7
#rint0dobro0'#alavra'77 #rint0dobro0]77
/a6da
$ python lambda.py
pala#rapala#ra
10
Como Funciona
-%ui n+s desenvolvemos uma fun$o cria^re#etidor #ara fabricar novos objetos funIes em tem#o de
e&ecu$o e retorn)*los! m comando lambda é utili4ado #ara criar o objeto fun$o! ssencialmente
lambda recebe um #armetro seguido de a#enas uma Lnica e&#ress$o, a %ual se torna o cor#o da fun$o
e o valor dessa e&#ress$o é retornado #ela nova fun$o! @ote %ue mesmo um comando #rint DPython
-%E n$o #ode ser usado no interior de uma forma lambda, a#enas e&#ressIes!
- /R FB3.
Podemos realiGar uma list.sort68 fornecendo uma funYo de comparaYo criada usando
lambdaX
ist Com#rehension
'ist com#rehensions' s$o em#regadas #ara obter*se uma nova lista de uma lista e&istente! /u#onha %ue
voc( tenha uma lista de nLmeros e deseje obter uma nova lista com todos os nLmeros multi#licados #or
dois a#enas %uando o nLmero #or sua ve4 for maior do %ue ;! 'ist com#rehensions' s$o ideais #ara tais
situaIes!
H! E1usr1bin1#ython
;! @ome do ar%uivo list^com#rehension!#y
listaum Q;, =, Z listadois Q;i for i in listaum if i U ; #rint0listadois7
/a6da
Q;, , S
Como Funciona
-%ui n+s obtemos uma nova lista através da es#ecifica$o da mani#ula$o a ser efetuada %uando alguma
condi$o for satisfeita 0if i U ;7! @ote %ue a lista srcinal #ermanece inalterada!
- vantagem de usar 'list com#rehensions' é %ue redu4 a %uantidade de c+digo #adr$o 0'boiler#late'7
re%uerido %uando n+s usamos laos #ara #rocessar cada elemento de uma lista e adicion)*lo em uma
nova lista!
. Comando -ssert
. comando assert é em#regado #ara assegurar*se de %ue alguma coisa é verdadeira! Por e&em#lo, se
voc( est) bem certo %ue ter) #elo menos um elemento em uma lista %ue voc( est) usando e %uer
verificar esse fato e levantar 0'raise'7 um erro se isso n$o for verdade, ent$o o comando assert é ideal
#ara essa situa$o! 5uando um comando assert falha, um -ssertionrror é levantado!
UUU mylist Q'item'
UUU assert len0mylist7 U H
UUU mylist!#o#07
'item'
UUU mylist
Q
UUU assert len0mylist7 U H
3racebac 0most recent call last7
Iile EstdinFE= line 1= in moduleF
-ssertionrror
. comando assert deve ser usado com cautela! @a maior #arte dos casos, é melhor ca#turar e&ceIes,
seja mani#ulando o #roblema, ou emitindo uma mensagem de erro #ara o usu)rio e saindo do #rograma!
- Fun$o Re#r
- fun$o re#r é utili4ada #ara obter*se uma re#resenta$o #or meio de uma string can`nica do objeto! -
#arte interessante é %ue voc( ter) eval0re#r0objeto77 objeto em %uase todos os casos!
UUU i Q
UUU i!a##end0'item'7
UUU re#r0i7
"Q'item'"
UUU eval0re#r0i77
Q'item'
UUU eval0re#r0i77 i
3rue
asicamente, a fun$o re#r é em#regada #ara obter*se uma re#resenta$o im#rim6vel do objeto! 8oc(
#ode controlar o %ue a sua classe retorna sob a fun$o re#r, definindo o método ^^re#r^^ em sua classe!
Resumo
@+s abordamos algumas funcionalidades adicionais de Python neste ca#6tulo e mesmo assim n$o
cobrimos todas elas! Porém, a essa eta#a, n+s a#resentamos a maior #arte do %ue voc( ir) em#regar na
#r)tica! Bsso é suficiente #ara %ue voc( #ossa iniciar com %uais%uer #rogramas %ue for #rodu4ir!
- seguir, n+s discutiremos como e&#lorar Python ainda mais!
Python pt-br:Em &e%uida
/e voc( leu este livro com#letamente até agora e #raticou escrevendo muitos #rogramas, ent$o deve
estar se sentindo confort)vel e familiari4ado com Python! 8oc( #rovavelmente também criou diversos
#rogramas em Python #ara reali4ar alguns e&#erimentos e e&ercitar suas habilidades em Python! /e voc(
n$o fe4 isso ainda, deveria t(*lo feito! - %uest$o agora é ". 5ue Fa4er m /eguidaY"!
u sugiro %ue voc( ata%ue o seguinte #roblema
Crie o seu #r+#rio #rograma "address^boo" usando linha de comando, com o %ual voc( #oder)
adicionar, modificar, deletar ou reali4ar buscas #elos seus contatos, tais como amigos, familiares e
colegas, bem como #elas suas informaIes, tais como endereos de email e1ou nLmeros de telefone! .s
detalhes devem ser arma4enados #ara #osterior recu#era$o!
Bsto se torna ra4oavelmente f)cil se voc( #ensar em termos de todo o material %ue n+s encontramos até
agora! /e voc( ainda assim deseja instruIes de como #roceder, a%ui est) uma sugest$o!
Suestão DNão leiaE
Crie uma classe %ue re#resente a informa$o sobre cada #essoa! se um dicion)rio #ara
guardar os objetos #essoais com o nome de cada uma como chave! tili4e o m+dulo #icle
#ara guardar os objetos de forma #ersistente em seu disco r6gido! m#regue os métodos
internos do dicion)rio #ara adicionar, deletar e modificar as #essoas!
ma ve4 %ue voc( seja ca#a4 de reali4ar isso, voc( #ode #roclamar*se #rogramador em Python! -gora,
imediatamente envie um email me agradecendo #or este grande livro V*7! ste #asso é o#cional mas
recomendado! :a mesma forma, #or favor, considere reali4ar uma doa$o, contribuir com melhoramentos
ou voluntariar*se #ara traduIes #ara a#oiar o cont6nuo desenvolvimento deste livro!
/e voc( achou muito f)cil a%uele #rograma, a%ui est) um outro
Bm#lemente o comando re#lace! ste comando substituir) uma string #or outra em uma lista
de ar%uivos fornecida!
. comando re#lace #ode ser t$o sim#les ou sofisticado %uanto voc( desejar, desde sim#les substitui$o
de strings, até a busca #or #adrIes 0e&#ressIes regulares7!
:e#ois disso, a%ui est$o alguns caminhos #ara #rosseguir a sua jornada com Python
&em#los de Programas
- melhor maneira de a#render uma linguagem de #rograma$o é escrever muitos #rogramas e ler um
monte deles
• Re#osit)rio de #rogramas Rosetta
• &em#los de Python e&am#les em java;s
• Python Cooboo é uma cole$o e&tremamente valiosa de receitas ou sugestIes em como
resolver certas es#écies de #roblemas utili4ando Python! sta é uma leitura indis#ens)vel #ara
todos os usu)rios de Python!
• Python rasil! ste é o #rinci#al site brasileiro de Python!
Perguntas e Res#ostas
• .ficial Python :os e :on'ts 0Faa Bsso e @$o Faa -%uilo7
• Python F-5 .ficial
• ista de @orvig das Bnfre%uently -sed 5uestions 0Perguntas Raramente Feitas7
•
ntrevista em Python 5 -
• Perguntas /tac.verflo2 marcadas com #ython
3i#s and 3rics 0/ugestIes e 3ru%ues7
• Python 3i#s 3rics
• -dvanced /oft2are Car#entry using Python
• Charming Python é uma e&celente série de artigos de :avid Mert4 relacionados com Python!
ivros, PublicaIes, 3utoriais, 86deos
. #r+&imo #asso l+gico de#ois deste livro é a leitura do e&traordin)rio livro de Mar Pilgrim :ive Bnto
Python 0Mergulhando em Python7 o %ual voc( #ode também ler inteiramente on line! sse livro e&#lora
t+#icos como e&#ressIes regulares, #rocessamento AM, servios 2eb, teste unit)rio 0unit testing7, etc!
em detalhes!
.utros recursos adicionais s$o
• v6deos /ho2Me:o sobre Python
• ista com#leta de -2arete dos tutoriais em Python
• 3he ffbot's Python Done
• ins no fim de cada Python*RE email
• Python Pa#ers
:iscuss$o
/e voc( #arece inca#a4 de resolver um #roblema de Python, e n$o sabe a %uem #erguntar, ent$o a
lista com#!lang!#ython discussion grou#é o melhor lugar #ara colocar a sua %uest$o!
Certifi%ue*se de fa4er sua 'li$o de casa' e de haver tentado resolver o seu #roblema #or voc( mesmo
antes de mais nada!
Mae sure you do your home2or and have tried solving the #roblem yourself first!
@ovidades
/e voc( %uiser conhecer as Lltimas novidades no mundo de Python, ent$o acom#anhe o Python Planet
oficial e1ou o Python Planet n$o*oficial!
Bnstalando ibliotecas
&iste um nLmero enorme de bibliotecas o#en*source no Python Pacage Bnde&as %uais voc( #ode
em#regar em seus #r+#rios #rogramas!
Para instalar a%uelas bibliotecas, voc( #ode usar o e&celente asyBnstall tool de Phili# by!
/oft2are Gr)fico
/u#onha %ue voc( %ueira criar seus #r+#rios #rogramas gr)ficos usando Python! Bsso #ode ser feito #or
meio de um biblioteca GB 0Gra#hical ser Bnterface7 com suas interfaces v6nculos 0bindings7 com Python!
Bnterfaces s$o o %ue #ermite %ue voc( escreva #rogramas em Python e utili4e as bibliotecas %ue, #or sua
ve4, s$o escritas em C, C ou outras linguagens!
&istem um grande nLmero de o#Ies #ara GB usando Python
Py*t
sta é a interface em Python #ara o G3p toolit %ue é a funda$o sobre a %ual Gnome foi
#rodu4ido! G3p #ossui muitos #e%uenos #roblemas #ara o seu uso, mas uma ve4 %ue voc( se
torna confort)vel, #oder) criar a#licativos com GB ra#idamente! - interface gr)fica Glade é
indis#ens)vel! - documenta$o ainda deve ser emlhorada! G3p funciona bem em inu&, mas
a sua vers$o #ara 9indo2s est) incom#leta! 8oc( #ode criar soft2ares tanto livres, como
#ro#riet)rios usando G3p! Para iniciar, leia o PyG3p tutorial!
<%Python
ste é a interface em Python #ara o 2&9idgets toolit! 2&Python tem uma curva de
a#rendi4agem associada! ntretanto, é bem #ort)vel e e&ecuta em inu&, 9indo2s, M-C e
mesmo em #lataformas imersas 0embedded7! &istem muitas B:s dis#on6veis em 2&Python as
%uais incluem GB designers, tais como /P 0/tani's Python ditor7 e a construtora de
GBs 2&Glade! 8oc( #ode criar soft2are tanto livre como #ro#riet)rio usando 2&Python! Para
iniciar, leia o 2&Python tutorial!
1.Inter
ste é dos mais antigos GB toolits em e&ist(ncia! /e voc( tem utili4ado B:, j) viu o
#rograma 3Bnter em a$o! @$o oferece uma das melhores sensaIes #ara o usu)rio, devido a
sua a#ar(ncia anti%uada! 3Bnter é #ort)vel e e&ecuta tanto em inu&1ni&, %uanto em
9indo2s! Mas im#ortante %ue tuso, 3Bnter é #arte integrante da distribui$o #adr$o de
Python! Para iniciar, leia o 3inter tutorial!
Para mais o#Ies, veja o 2ii GuiProgramming no 2ebsite oficial de Python!
Resumo das Ferramentas GB
Bnfeli4mente, n$o e&iste uma ferramenta GB #adr$o em Python! u sugiro %ue voc( escolha uma das
anteriores, de#endendo de sua situa$o! . #rimeiro fator é se voc( est) dis#osto a #agar #ara usar
%ual%uer uma das ferramentas GB! . segundo fator é se voc( %uer %ue seu #rograma e&ecute a#enas
em 9indo2s ou em M-C e inu&, ou em todos eles! . terceiro fator, se inu& for a #lataforma escolhida,
se voc( é um usu)rio de p: ou de G@.M!
Para uma an)lise mais detalhada e com#leta, veja a #)gina ; de 3he Python Pa#ers, 8olume =, Bssue H!
8)rias Bm#lementaIes
Aistem usualmente duas #artes em uma linguagem de #rograma$o * a linguagem e o soft2are! -
linguagem é "como" n+s escrevemos algo! . soft2are é "o %ue" realmente e&ecuta o nossos #rogramas!
@+s vimos uitli4ando o soft2are "CPython" #ara e&ecutar os nossos #rogramas! ste é referenciado como
CPython, #ois é escrito na linguagem C e é o "Bnter#retador Python Cl)ssico"!
&istem adicionalmente outros soft2ares %ue #odem e&ecutar seus #rogramas em Python
=ython
ma im#lementa$o de Python %ue e&ecuta na #lataforma Java! Bsso significa %ue voc( #ode
usar as bibliotecas e classes em Java dentro da linguagem Python e vice*versa!
IronPython
ma im#lementa$o de Python %ue e&ecuta em #lataforma !@3! Bsso significa %ue voc( #ode
usar as bibliotecas e classes !@3 dentro da linguagem Python e vice*versa!
PyPy
ma im#lementa$o de Python escrita em PythonE ste é um #rojeto de #es%uisa #ara tornar
mais f)cil e r)#ido o inter#retador, uma ve4 %ue o #o#rio inter#retador est) escrito em uma
linguagem dinmica 0em o#osi$o a linguagens est)ticas, tais como C, Java, ou C nas
im#lementaIes acima7!
Stac.less Python
ma im#lementa$o %ue é es#eciali4ada em #erformance baseada em threads!
&istem também outras tais como CPython * uma im#lementa$o de Python escrita em Common is#
e BronMoney, %ue é uma im#lementa$o de BronPython #ara o#erar sobre um inter#retador Java/cri#t, o
%ue #oderia significar %ue voc( #oderia usar Python 0ao invés de Java/cri#t7 #ara escrever os seus
#rogramas 2eb*bro2ser 0"-ja&"7!
Cada uma dessas im#lementaIes t(m a sua #r+#ria )rea es#eciali4ada na %ual s$o Lteis!
Resumo
@+s chegamos ao final deste livro, mas, como se di4 comumente, este é "o comeo do fim"E 8océ é,
agora, um )vido usu)rio de Python e est) sem dLvida #ronto #ara resolver muitos #roblemas utili4ando
Python! 8oc( #ode iniciar #or automati4ar o seu com#utador #ara reali4ar toda es#écie de coisas %ue
se%uer #odiam ser imaginadas anteriormente, ou #or escrever seus #r+#rios jogos e muito, muito mais!
-ssim, #ode comearE
Python pt-br:)pendice F*O&&
/oft2are Gratuito e ivre 0Free1ibré and .#en /ource /oft2are
* F.//7
F.// est) baseado no conceito de uma comunidade, %ue #or sua ve4 est) fundamentado no conceito de
com#artilhamento, e #articularmente com#artilhamento de conhecimento! F.// s$o livres #ara uso,
modifica$o e redistribui$o!
/e voc( j) leu este livro, ent$o j) est) familiari4ado com F.//, desde %ue voc( vem
em#regando Python ao longo dele e Python é um soft2are de fonte aberta 0o#en source7E
-%ui est$o alguns e&em#los de F.// #ara dar*lhe uma idéia do ti#o de coisas %ue a constru$o e
com#artilhamento comunit)rio #ode criar
• Linu%! ste é um sistema o#eracional F.// %ue o mundo inteiro est) lentamente adotandoE
Comeou com inus 3orvalds en%uanto um estudante! -gora, est) com#etindo com o Microsoft
9indo2s! Q inu& pernel
• 6!untu! sta é uma distribui$o gerenciada #ela comunidade, #atrocinada #ela Canonical e é a
distribui$o de inu& mais #o#ular hoje em dia! Permite %ue voc( instale uma %uantidade enorme
de F.// dis#on6veis e isso em uma maneira f)cil de usar e f)cil de instalar! Melhor %ue tudo,
voc( #ode a#enas reiniciar o seu com#utador e e&ecutar inu& diretamente do C:E Bsto #ermite
%ue voc( e&#erimente com#letamente o novo /. antes de instalar no seu com#utador! Q buntu
inu&
• "pen"88ice-or! sta é uma e&celente suite de escrit+rio com com#onentes #ara #rocessamento
de documento, a#resenta$o, #lanilhas, desenho, entre outras coisas! 8oc( #ode até mesmo abrir
e editar ar%uivos de M/ 9ord e M/ Po2erPoint com facilidade! la e&ecuta em %uase todas as
#lataformas! Q .#en.ffice
• Jo,illa Fire8o%! sta é a pNoxima gera$o de navegadores #ara a 2eb %ue est) com#etindo com o
Bnternet &#lorer! T bastante r)#ida e tem recebido aclama$o cr6tica #elos suas +timas e
atraentes caracter6sticas! . conceito de e&tensIes #ermite o em#rego de %ual%uer es#écie de
#lugin!
• . seu #roduto com#anheiro 3hunderbird é um e&celente cliente de email %ue torna muito f)cil a
leitura de emails! Q Mo4illa Firefo&, Mo4illa 3hunderbird
• Jono! sta é uma im#lementa$o de fonte aberta da #lataforma !@3 da Microsoft! Permite %ue
as a#licaIes
outras !@3 sejam
#lataformas! criadas
Q Mono, e e&ecutadas
CM-,Microsoft em inu&, 9indo2s, Free/:, Mac ./ e muitas
!@3
• Servidor de <e! Apache! ste é um #o#ular servidor de 2eb! :e fato, é omais #o#ular servidor
de 2eb do #lanetaE le e&ecuta em um #ouco mais do %ue a metade de todos os sites 2eb %ue
e&istem! /im, isso mesmo * -#ache gerencia mais sites 2eb do %ue toda a concorr(ncia 0incluindo
Microsoft BB/7 combinada! Q -#ache
• JyS*L! ste é um servidor de bancos de dados e&tremamente #o#ular! T muito famoso #ela
grande velocidade! T o M na famosa #ilha -MP subjacente na maior #arte dos sites 2eb na
internet! Q My/5
• 3LC Player! ste é o tocador de v6deo %ue #ode tocar %ualu%er coisa de :ivA a MP= a .GG, a
8C:s e :8:s a !!! %ue disse %ue soft2are aberto n$o seria divertidoY V*7 Q 8C media #layer
• Oee%&o% é uma distribui$o de inu& %ue é #rojetada #ara tocar filmes assim %ue voc( reinicia
do C:E Q Gee&o&
sta lista tem a#enas a inten$o de dar*lhe uma breve idéia * e&istem muitos mais e&celentes F.//
dis#on6veis, tais como a linguagem PR, a linguagem PKP, os sistemas de gerenciamento de conteLdo
#ara sites 2eb P.@ e :ru#al, o servidor de banco de dados Postgre/5, o jogo de corridas 3.RC/, a
B: p:evelo#, o tocador de filmes Aine, o editor 8BM, o editor 5uanta, o tocador de )udio anshee, o
#rograma de edi$o de imagens GBMP !!! sta lista #oderia n$o terminar jamais!
Para obter as Lltimas not6cias sobre o mundo F.//, verifi%ue os seguintes sites 2eb
• linu&!com
• inu&3oday
• @e2sForge
• :istro9atch
8isite os seguintes sites 2eb #ara maiores informaIes sobre F.//
• /ourceForge
• FreshMeat
-ssim, v) em frente e e&#lore o vasto, livre e aberto mundo de F.//E
Python pt-br:)pendice &obre
C+lofon
5use todos os soft2ares %ue eu usei na cria$o deste livro s$o sot$ares livres e abertos!
@ascimento do ivro
@o #rimeiro esboo deste livro, eu usei inu& Red Kat >!? como a funda$o da minha estrutura e no se&to
esboo eu usei inu& Fedora Core = como a base do meu es%uema!
Bnicialmente, eu estava usando p9ord #ara escrever o livro 0como e&#licado em i$o de Kist+ria no
#ref)cio7!
ra -dolescente
Mais tarde, eu mudei #ara :ocoo AM usando pate mas eu achei muito mon+tono! -ssim, eu mudei
#ara .##en.ffice, %ue era e&celente com o n6vel de controle %ue fornecia #ara formata$o, assim como a
gera$o de P:F, mas #rodu4ia um #éssimo K3M do documento!
Finalmente, eu descobri Amacs e reescrevi o livro desde o comeo em :ocoo AM 0novamente7 de#ois
de decidir %ue a%uele formato era a solu$o de longo #ra4o!
@o se&to esboo, eu decidi usar 5uanta #ara reali4ar toda a edi$o! -s stylesheets %ue vieram junto
com o inu&C//
documento Fedora
#araCore = foram
fornecer corutili4adas,
e estilo [sassim como
#)ginas as fontes
K3M! #adr$o!
u havia escritontreanto,
também um eu havia escrito
analisador um
lé&ico
grosseiro, em Python, %ue automaticamente forneceu (nfase na sinta&e #ara as todas as listagens dos
#rogramas!
-gora
Para este sétimo esboo, eu estou usando Media9ii como a base do meu setu#! -gora, eu edito tudo
online e os leitores #odem diretamente ler1editar1discutir dentro do site 2ii!
u ainda uso 8im #ara edi$o graas a 8ie2/ource9ith e&tens$o #ara Firefo&%ue integra*se com 8im!