Você está na página 1de 95

Introdução

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 sintae 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 sintae 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.

Vou detalhar a maioria dessas caracter$sticas na pr)ima seção.


Nota

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ódio A!erto

Python é um e&em#lo de F.// 0Free1ibre 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!
Linuaem de Alto Nível

5uando voc( escreve #rogramas em Python, n$o h) necessidade de se #reocu#ar com


detalhes de bai&o n6vel tais como mani#ular a mem+ria utili4ada #elo #rograma, etc!
Portá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 mudanas, 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&9ors, Play/tation,
/har# Daurus, 9indo2s C e até mesmo no PocetPCE
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 C7 #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 lineditor1carregador co#ia o #rograma do disco r6gido #ara a mem+ria e comea a
e&ecut)*lo!
Python, #or sua ve4, n$o necessita de com#ila$o #ara c+digo bin)rio! 8oc( sim#lemente

e&ecuta o #rograma diretamente do c+digo*fonte! Bnternamente, Python converte o c+digo*


fonte em um formato intermedi)rio chamado bytecode, o tradu4 #ara a linguagem nativa do
seu com#utador e ent$o o e&ecuta! 3udo isso, na verdade, torna Python muito mais f)cil, uma
ve4 %ue voc( n$o #recisa se #reocu#ar com a com#ila$o do #rograma, certificar*se %ue as
bibliotecas necess)rias est$o todas lineditadas e carregadas etc, etc! Bsto também torna seus
#rogramas em Python muito mais #ort)veis, j) %ue voc( #ode sim#lesmente co#iar seu
#rograma em Python em outro com#utador e e&ecut)*loE
"rientada a "!#etos

Python su#orta tanto #rograma$o #rocedural 0estruturada7 %uanto orientada a objetos! m


linguagens #rocedurais, o #rograma é constru6do com base em #rocedimentos e funIes, %ue
nada mais s$o %ue trechos reutili4)veis de #rogramas! m linguagens orientadas a objeto, com
base em objetos %ue combinam dados e funcionalidade! Python tem uma maneira sim#les mas

#oderosa de im#lementar #rograma$o orientada a objetos, es#ecialmente %uando com#arada


a linguagens como C ou Java!
$%tensível

/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, GB 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 eata de
desempenho e caracter$sticas que fazem escrever programas em Python uma tarefa fácil e divertida.

Por 'ue não Perl(


+e você ainda não conhece' Perl é outra linguagem de programação interpretada e de c)digo aberto
etremamente popular.
+e você alguma vez tentou escrever um programa grande em Perl' você poderia ter respondido essa
pergunta sozinho, *m outras palavras' programas em Perl são fáceis quando eles são pequenos e são
ecelentes para pequenos -hacs- e scripts -pra fazer o serviço-. /o entanto' eles se tornam rapidamente
dif$ceis de manter 0 medida em que se tornam maiores. * estou falando isso com base na minha
eperiência no 1ahoo, escrevendo programas grandes em Perl.
2uando comparados a Perl' os programas em Python são definitivamente mais simples' claros' fáceis de
escrever e' consequentemente' mais leg$veis e fáceis de manter. *u admiro Perl e uso diariamente para
várias tarefas' mas toda vez que escrevo um programa' começo a pensar em termos de Python' porque
se tornou natural para mim. Perl passou por tantos hacs e mudanças que parece que a linguagem toda
é um grande 3mas )timo4 hac. 5nfelizmente' o futuro Perl 6 não parece trazer nenhuma melhoria quanto
a isso.
! 7nica e bastante significativa vantagem do Perl' na minha opinião' é sua enorme
biblioteca CP-@ 38omprehensive Perl !rchive /et9or4. 8omo o nome sugere' é uma imensa coleção de
m)dulos Perl e é simplesmente inacreditável' por causa de seu tamanho e profundidade # você pode fazer
praticamente qualquer coisa que se%a poss$vel de se fazer com um computador usando estes m)dulos.
:ma das raz(es pelas quais Perl tem mais bibliotecas que Python é o fato de eistir há muito mais
tempo. /o entanto' isto parece estar mudando com o crescimento do Python Pacage Bnde&.
Por 'ue não )u!y(
+e você ainda não sabia' ;uby é uma outra popular linguagem de programação de c)digo aberto.
+e você %á gosta e usa ;uby' então eu definitivamente recomendo que continue a usá#la.
Para as outras pessoas que ainda não a usaram e estão tentando escolher entre aprender Python ou
aprender ;uby' então eu recomendaria Python' unicamente pela perspectiva de facilidade de
aprendizado. Pessoalmente' achei dif$cil compreender a linguagem ;uby' mas todas as pessoas que
conseguem aprovam a beleza da linguagem. 5nfelizmente não tive tanta sorte.

" *ue "s Proramadores +i,em


< interessante ler o que grandes hacers como *+; têm a dizer sobre Python"
•$ric S- )aymond é o autor de '- Catedral e o a4ar' e também é o indiv6duo %ue cunhou o
termo '.#en /ource'! le di4 %ue Python se tornou sua linguagem de #rograma$o favorita! ste
artigo foi a real ins#ira$o #ara meu #rimeiro contato com Python!
•&ruce $c.el é o autor dos famosos livros '3hining in Java' e '3hining in C'! le di4 %ue
nenhuma outra linguagem o dei&ou t$o #rodutivo %uanto Python! :i4 ainda %ue Python é talve4 a
Lnica linguagem %ue se concentra em tornar as coisas mais f)ceis #ara o #rogramador! eia
a entrevista com#leta #ara mais detalhes!
•Peter Norvi é o conhecido autor do is# e :iretor de 5ualidade de usca no google 0obrigado a
Guido van Rossum #or avisar7! le di4 %ue Python sem#re foi #arte integrante do Google! sta
afirma$o #ode ser com#rovada verificando a #)gina do Google Jobs %ue lista conhecimento em
Python como re%uisito #ara os engenheiros de soft2are!
So!re Python /-0
Python =.> é a nova versão da linguagem que será lançada em breve. ?ambém é conhecida como Python
=>>> ou Py=.
! motivação principal para uma nova versão de Python é remover todos os pequenos problemas e
detalhes que foram se acumulando no decorrer dos anos e tornar a linguagem ainda mais limpa.
+e você %á tem muito c)digo Python @.' então eiste um utilit)rio #ara ajudar na convers$o de c+digo
;!& #ara =!&.

Aais detalhes em"


•Bntrodu$o #or Guido van Rossum
•. %ue h) de novo no Python ;! 0recursos significativamente diferentes das versIes anteriores
de Python ;!& e %ue #rovavelmente ser$o inclu6dos no Python =!?7
•. %ue h) de novo no Python =!?
•Cronograma de lanamento do Python ;! e =!?
• Python =??? 0a lista oficial de mudanas #ro#ostas7
• Planos diversos #ara Python =!?
• @ovidades do Python 0lista detalhada das mudanas7
Python pt-br:Instalacao

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

Para usu)rios inu& e /:


/e voc( est) usando uma distribui$o inu& como buntu, Fedora, .#en// ou Ncolo%ue sua escolha
a%u6O, ou um sistema /: tal como Free/:, ent$o é #rov)vel %ue voc( j) tenha o Python instalado em
seu sistema!
Para testar se o Python j) est) instalado em seu inu&, abra um shell 0comokonsole ou gnome-terminal7
e ent$o entre com o comando python -V como mostrado abai&o
$ python -V

Python 3.0b1

Nota

$ é o #rom#t do shell! le ser) diferente #ara voc( de#endendo das configuraIes 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

bash: Python: command not found

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 instruIes #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! Qsta o#$o estar) dis#on6vel a#+s o lanamento 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 "#anado *
U Vari%#eis de ambiente! Cli%ue na vari)vel chamadaPA12 na se$o '8ari)veis de /istema', ent$o
selecione &ditar e adicione VCWPython=? 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!

Python pt-br:Primeiros Passos

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!

sando o Prom#t do Bnter#retador


Bnicie o inter#retador na linha de comando digitando python #rom#t do shell!
m sistemas 9indo2s, voc( #ode rodar o inter#retador na linha de comando se a vari)vel P") estiver
corretamente configurada!
/e voc( est) usando o B:, cli%ue em niciar X Programas X Python 3.0 X45& 6Python 7(8!
-gora digite print6*l% 9undo8 e em seguida #ressione a tecla &nter! 8oc( ver) as #alavras*l%
9undo como sa6da!

$ python

Python 3.0b 6r30b:;<10;= >ul 1? 00?= 1?:@@:1A8 B9! #.1<00 3 bit 6ntel8C on
Din3

)ype EhelpE= EcopyrightE= EcreditsE or ElicenseE for more information.

FFF print6*l% 9undo8

*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( fornea! -%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 comearmos 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 faa 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#aos ou
tabulaIes 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 omentrios * %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&1ni& %ue este #rograma deve ser rodado com este
inter#retador %uando voc( exeutar 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 aunção print %ue a#enas
im#rime o te&to *l% 9undo! @+s a#renderemos sobre funIes 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&1ni&, 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( conhea 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")

usrlocalbin:usrbin:bin:usr+11K;bin:homesDaroopbin

$ cp olamundo.py homesDaroopbinolamundo

$ 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 homesDaroopbin é 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"):homesDaroopmydironde homesDaroopmydir é 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

m Python, um #rograma ou um scri#t significam a mesma coisa!

.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 help6return8 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 é
umaonstante #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 0ouloats, #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 proramadores 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&nia de arateres! -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 proramadores e%perientes

@$o h) strings "somente em -/CBB" #or%ue o #adr$o nicode engloba o -/CBB!


Por conven$o, todas as stringas est$o em 3F*S!
u #osso garantir %ue voc( usar) strings em %uase todos os #rogramas %ue escrever em Python, #ortanto
#reste aten$o [ #r+&ima #arte sobre como usar strings em Python!
-s#as nit)rias
8oc( #ode es#ecificar as strings usando as#as unit)rias 0ou a#+strofes7 tais como (se aspas unit%rias
em mim! 3odos os es#aos em branco, isto é, es#aos e tabulaIes s$o #reservados no estado em %ue se
encontram!

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

&sta S a segunda linha.

EWual S o seu nomeXE= eu perguntei.

&le disse E,ond= >ames ,ond.E



/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 é Jhats your nameX! 8oc( n$o #ode escreverJhats your
nameX #or%ue o Python ficar) confuso sobre onde a string comea 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&nia de esape! 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 EJhats 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.'

&ssa S a segunda frase.E

e%uivale a E&ssa S a primeira frase. &ssa S a segunda frase.E !


/trings rutas
/e voc( #recisa escrever algumas strings onde nenhum #rocessamento es#ecial tais como as se%\(ncias
de esca#e s$o mani#uladas, ent$o o %ue voc( #recisa é escrever uma string bruta #refi&ando um r ou
um K [ string ! is um e&em#lo,rE2o#as linhas sYo indicadas por 'nE !
/trings /$o Bmut)veis
Bsso significa %ue uma ve4 %ue voc( tenha criado uma string, voc( n$o #ode mud)*la! mbora isso #area
como algo ruim, n$o é realmente! @+s veremos #or%ue isso n$o é uma limita$o nos diversos #rogramas
%ue n+s analisaremos mais adiante!
Concatena$o de iterais do 3i#o /tring
/e voc( colocar duas strings literais lado a lado, elas s$o automaticamente concatenadas #elo Python!
Por e&em#lo, Wual S  o seu nomeX é automaticamente convertido em EWual S o seu nomeXE !
Nota para proramadores C4C55

@$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 proramadores 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 )eular
/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#'

print0'N?Ois NHO years old' .format0name= age77


print0'9hy is N?O #laying 2ith that #ythonY'.format0name77
/a6da
$ python str_format.py

!Daroop is < years old

Jhy is !Daroop playing Dith that pythonX

Como isto funciona


ma string #ode utili4ar certas es#ecificaIes e sub conse%uentemente, o método ormat #ode ser
chamado de um substituto #ara estas es#ecificaIes corres#ondendo os argumentos ao método format!
.bserve %ue est) é a #rimeira ve4 %ue usamos Z0[ e isto corres#onde ) v)riavelname %ue é o #rimeiro
argumento ao método 'format'! /imilarmente, a segunda es#ecifica$o é Z1[ %ue corres#onde ) age %ue
é o segundo argumento ao método 'format'! . %ue o Python fa4 a%ui é substituir cada valor do argumento
no lugar da es#ecifica$o! 5ue #ode ter es#ecificaIes mais detalhadas como
UUU 'N?!=O'.format0H=7 # deimal (.) preision o * or loat
'?!==='
UUU 'N?^_HHO'.format0'hello'7 # ill $ith undersores (') $ith the text entered (+) to ,, $idth
'^^^hello^^^'
UUU 'NnameO 2rote NbooO'.format0name/'/2aroo#'= book/'- yte of Python'7 # -ey$ordbased
'/2aroo# 2rote - yte of Python'
:etalhes desta es#ecifica$o de formata$o s$o e&#licados na Python nhancement Pro#osal @o!
=H?H! File&am#le!j#g
8ari)veis
sar a#enas constantes literais #ode se tornar algo chato * n+s #recisamos de alguma maneira de
arma4enar %ual%uer informa$o, bem como mani#ul)*la! T a6 onde as variveis entram na jogada! 8ari)veis
s$o e&atamento o %ue seu nome significa * seu valor #ode variar, isto é, v`ce #ode arma4enar %ual%uer
coisa usando uma vari)vel! 8ari)veis s$o a#enas #artes da mem+ria do seu com#utador nas %uais voc(
arma4ena alguma informa$o! :iferentemente das constantes literais, voc( #recisa de alguma maneira
de acessar estas vari)veis e, #ortanto, voc( d) nomes a elas!
@omenclatura de Bdentificadores
8ari)veis s$o e&em#los de identificadores!Identiiadores s$o nomes dados de maneira a identificar algo!
&istem algumas regras %ue voc( ter) %ue seguir #ara dar nome aos identificadores

. #rimeiro caracter do identificador #recisa ser uma letra do alfabeto 0maiLsculo -/CBB ou
minLsculo -/CBB ou caracter nicode7 ou um undersore0'^'7!
• . restante do nome do identificador #ode consistir de letras 0maiLsculo -/CBB ou minLsculo -/CBB
ou caracter nicode7, undersores 0'^'7 ou d6gitos 0?*>7!
• @omes de idenficadores s$o asesensitive! Por e&em#lo, myname e my2ame nãos$o o mesmo! @ote o
minLsculo n no #rimeiro e o maiLsculo 2 no segundo!
• &em#los de nomes de
identificadores vlidos s$o i, __my_name, name_3,a1b_c3 and resum\]^\`\] \
\]^\\]j\_count!
• &em#los de nomes de idenficadores invlidos s$o things, este contSm espaos e my-name!
3i#os de :ados
8ari)veis #odem manter valores de diferentes ti#os, chamados de tipos de dados! .s ti#os b)sicos s$o
nLmeros e strings, %ue n+s j) discutimos! @os #r+&imos ca#6tulos, veremos como criar seus #r+#rios ti#os
usando classes!
.bjetos
embre*se de %ue Python se refere a %ual%uer coisa usada em um #rograma como um obeto, em sentido
geral! -o invés de di4er 'o alguma oisa', n+s de di4emos 'o obeto'!
Nota para os usuários de Proramação "rientada a "!#etos

Python é fortemente orientada a objetos, no sentido %ue tudo é um objeto, incluindo nLmeros,
strings e funIes!
-gora veremos como usar vari)veis juntamento com constantes literais! /alve o e&em#lo a seguir e
e&ecute o #rograma!
Como escrever proramas em Python

:a%ui em diante, o #rocedimento #adr$o #ara salvar e e&ecutar um #rograma Python é a


seguinte
H! -bra o seu editor favorito!
;! :igite o c+digo do #rograma dado no e&em#lo!
3. /alve*o como um ar%uivo com o nome mencionado no coment)rio! u sigo a conven$o
de ter todos os #rogramas em Python salvos com a e&tens$o .py!
4. &ecute o inter#retador com o comando python program.py ou use o B: #ara
e&ecutar os #rogramas! 8oc( também #ode usar ométodo e&ecut)vel como e&#licado
anteriormente!
&em#lo tili4ando vari)veis e constantes literais
# Filename : var.py

i / ]
print0i7

i / i N H
print0i7

s / '''sta é uma string de mLlti#las linhas!


sta é a segunda linha!'''
print0s7
.ut#ut
$ python #ar.py

<

&sta S uma string de mltiplas linhas.

sta é a segunda linha!


Como funciona
Como funciona
8eja como este #rograma funciona! Primeiro, vamos atribuir o valor constante literal < [ vari)vel i com o
o#erador de atribui$o 0 /7! sta linha é chamada de instru$o, #ois indica %ue algo deve ser feito e neste
caso, n+s estamos conectando o nome da vari)vel i ao valor <! m seguida, im#rimimos o valor de icom
o comando print, %ue, obviamente, a#enas im#rime o valor da vari)vel na tela!
nt$o somamos 1 ao valor arma4enado em i e arma4enmos de volta! m seguida, im#rimimos e, como
es#erado, obtemos o valor ttU1ttU!
:a mesma forma, atribu6mos a string literal #ara a vari)vel s e de#ois a im#rimimos!
Nota para proramadores de linuaens estáticas

As variáveis são usadas simplesmente atri!uindo7lhes um valor- Nenhuma declaração ou


de8inição de tipo de dados 9 necessária ou utili,ada-

inhas +gicas e F6sicas


ma linha f6sica a%uela %ue voc( v& %uando escreve o #rograma! ma linha l+gica é %ue o 0ython v& como
uma Lnica instru$o! Python im#licitamente assume %ue cada linha 1sia corres#onde a uma linha l2gia!
m e&em#lo de uma linha l+gica é uma instru$o como print6ello Jorld8 * se este estava em uma
linha #or si s+ 0como voc( v( no editor7, ent$o isso também corres#onde a uma linha f6sica!
Bm#licitamente, Python incentiva o uso de uma Lnica instru$o #or linha, o %ue torna o c+digo mais
leg6vel!
/e voc( %uiser es#ecificar mais de uma linha l+gica em uma Lnica linha f6sica, ent$o voc( tem %ue
es#ecificar e&#licitamente usando um #onto*e*v6rgula 0 7 %ue indica o fim de uma linha l+gica ou
instru$o! Por e&em#lo,
i / <

print6i8

é o mesmo %ue
i / <

print6i8

e o mesmo #ode ser escrito como


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 nuna 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. '

sto continua a string.

print6s8

Bsso nos d) a sa6da


sto S uma string. sto continua a string.
/imilarmente,
print'

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#aos s$o im#ortantes em Python! @a verdade, espaços no início da linha são importantes ! Bsto é
chamado de indentação! s#aos 0es#aos 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
instruIes
Bsto significa %ue as instruIes %ue v$o juntas devem ter a mesma indenta$o! Cada conjunto dessas
instruIes é 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! 0ereba um espaço no in1io da linha
print0'u
re#ito, o valor é ' = i7
5uando voc( e&ecuta isso, obtém o seguinte erro
Iile EDhitespace.pyE= line @

print6* #alor S = i8 L &rroM Perceba um espao no incio da linha

ndentation&rror: uneOpected indent

Perceba %ue h) um es#ao 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
iniiar novos bloos 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#aos #ara a indenta$o, #ois isso n$o funciona
ade%uadamente em diferentes #lataformas! u reomendo ortemente %ue voc( use um 4nio
tab ou %uatro espaços #ara cada n6vel de indenta$o!

scolha %ual%uer um desses dois estilos de indenta$o! Mais im#ortante, escolha um e


use consistentemente, isto é, use somente a%uele estilo de indenta$o!

Nota para proramadores de linuaens estáticas


Python sem#re utili4a indenta$o #ara blocos e nunca utili4a chaves! &ecutefrom __future__
import braces #ara a#render mais!
Resumo
-gora %ue n+s discutimos v)rios detalhes vitais, #odemos seguir #ara coisas mais interessantes como
declaraIes de controle de flu&o! Certifi%ue*se de %ue voc( j) est) confort)vel com o %ue voc( leu nesse
ca#6tulo!
Python pt-br:Operadores e Expressoes

Bntrodu$o
- maioria das instruIes 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

 -di$o /omadoisobjetos 3 N < retorna ?! a N bretorna ab!

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 retornalalala!
certa %uantidade de
ve4es!

Retorna & elevado [ 3 UU @ retorna ?1 0i!e! 3 U 3 U 3 U 3 7


 Pot(ncia
#ot(ncia de y

1 :ivis$o :ivide&#ory @  3 retorna1.3333333333333333!

11 :ivis$oBnteira Retorna a #arte inteira @  3 retorna 1!


do %uociente

Retorna o resto da ?  3 retorna ! -<.<  .<retorna 1.<!


 Modulo divis$o

: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

:esloca os bits do 11 FF 1 retorna <! 11 é re#resentado em


:eslocamento nLmero #ara a direita bits #or 1011%ue %uando os bits s$o
UU de bits [ #elo nLmero de bits
direita deslocados #ara a direita #or H bit
es#ecificado! retorna 101, %ue é o nLmero decimal <!

its configurados nos


.#erador bit a dois o#eradores s$o
 bit -@: configurados no < q 3 retorna 1!
resultado

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

Retorna se & é menor


%ue y! 3odos os
o#eradores de
<  3 retorna Ialse e 3  <retorna )rue!
com#ar$o
 Menor%ue retornam)rue0verdadei Com#araIes #odem ser encadeadas
arbitrariamente 3  <  A retorna )rue!
ro7 ou Ialse0falso7!
@ote a ca#itali4a$o
dos nomes!

< F 3 retorna )rue! /e os dois o#eradores


Retorna se & é maior forem nLmeros, eles s$o antes convertidos
U Maior%ue %ue y a um ti#o comum! :e outra maneira, ser)
sem#re retornado Ialse!

 Menor ou igual Retorna se & é menor O / 3 y / ; O / y retorna)rue!


a ou igual a y

Maior ou igual Retorna se & é maior O / @ y / 3 O F/ 3 retorna)rue!


U a ou igual a y

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!

E :iferentede Com#ara se os objetos O /  y / 3 O M/ y retorna)rue!


s$o diferentes

/e & é )rue, ele


.#erador retorna Ialse! /e & O / )rue not y retorna Ialse!
not booleano @.3
é Ialse, ele
retorna )rue!

O / Ialse y / )rue O and


yretorna Ialse desde %ue & seja False!
O and
y retornaIalse se &
@este caso, Python n$o ir) avaliar y desde
.#erador %ue ele saiba %ue o lado es%uerdo da
and éIalse, sen$o ele es#ress$o 'and' é Ialse o %ue im#lica %ue
booleano -@:
retorna a avalia$o de toda a es#ress$o ser) Ialse inde#endente
y
do outro valor! isso é chamado short*circuit
evaluation!
/e & é )rue, ele O / )rue y / Ialse O or
.#erador retorna 3rue, sen$o ele yretorna )rue! - /hort*circuit evaluation se
or booleano .R retorna a avalia$o de a#lica a%ui também!
y

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$oambda
or .#eradorooleano.R
and .#eradorooleano-@:
not& .#eradorooleano@.3

in, not in 3estes de membros1e&ist(ncia


is,isnot 3estesdeidentidade
, , U, U, E,  Com#araIes
 .#eradorbit*a*bit.R
_ .#eradorbit*a*bitA.R
 .#eradorbit*a*bit-@:
,UU :eslocamentosdebits
,* -di$oesubtra$o
, 1, 11,  Multi#lica$o, :ivis$o, :ivis$o inteira e Resto

&,*& Positivo,@egativo
& .#eradorbit*a*bit@.3
 &#onencia$o
&!atributo Referencia a atributo
&Q6ndice /ubscri$o
&Q6ndiceH6ndice; 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
Nchavedado, !!!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 preed&nia 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 / ;

area / length  breadth


print0'rea é'= area7
print0'Per6metro é'= ;  0length N breadth77
/a6da
$ python eOpressao.py

rea S 10

Perimetro S 1@

Como Funciona
. tamanho e am#litude do retngulo s$o arma4enados nas vari)veis length e breadth! @+s os utili4amos

#ara calcular
e&#ress$o a )reaUebreadth
length o #er6metro do retngulo
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#ao 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#aamento 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 declaraIes 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 faa diferentes coisas de#endendo das diferentes situaIes, como

im#rimir
Como voc( 'om :ia'
deve terou 'oa 3arde'
#ensando, istode#endendo
é alcanado da hora as
usando do instruIes
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 instruIes 0chamado de blooi(iblo-)7, senão ser) #rocessado outro bloco de instruIes 0chamado
de blooelse(elseblo-)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 bloo omeça a%ui
print0'0mas voc( n$o ganhou nenhum #r(mioE7'7 # 6ovo bloo termina a%ui
eli8 guess  number:
print0'@$o, era um #ouco maior %ue isso'7 # 5utro bloo
# 8o& pode a"er o %ue %uiser em um bloo ...
else:
print0'@$o, era um #ouco menor %ue isso'7
# 8o& deve adivinhar 9 n4mero a alançar a%ui

print0'Feito'7
# Esta 4ltima instrução  sempre exeutada; depois da instrução i ser exeutada
/a6da
$ python if.py

&ntre com um nmero inteiro : <0

2Yo= era um pouco menor Que isso

Ieito

$ python if.py

&ntre com um nmero inteiro : 

2Yo= era um pouco maior Que isso

Ieito
$ python if.py

&ntre com um nmero inteiro : 3

ParabSns= #oc ad#inhou.

6mas #oc nYo ganhou nenhum prmioM8

Ieito

Como Funciona
@este #rograma, recebemos tentativas de advinhaIes 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! FunIes s$o #eas 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 instruIes #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 instruIes!
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 instruIes if else-if
else relacionadas em uma instru$o if-elif-else combinada! Bsso torna o #rograma mais f)cil e redu4
%uantidade de indentaIes re%ueridas!
-s instruIes elif else devem, também, #ossuir 'dois #ontos' no final da linha l+gica, seguido #elo seu
bloco de instruIes 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
é print6Ieito8! :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 avanadas 0e sur#reendentemente sim#les #ara todos voc(s
com conhecimento em C1C7 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 proramadores 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 instruIes 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

&ntre com um nmero inteiro : <0

2Yo= S um pouco menor Que este.

&ntre com um nmero inteiro : 

2Yo= S um pouco maior Que este.

&nter an integer : 3

ParabSns= #oc ad#inhou.

* loop Dhile terminou.

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
2hile1em#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 instruIes no mesmo bloco
0como a instru$o Dhile7 de#ois da instru$o Dhile#ara conseguir o mesmo efeito!
Nota para proramadores 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

8or i in range0H= ]7:


print0i7
else:
print0'. loo# for terminou!'7
/a6da
$ python for.py


3

* loop for terminou.

Como funciona
@este #rograma, estamos im#rimindo uma se%u&nia 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 instriIes #ara cada valor de i! @este caso, n+s a#enas im#rimimos o valor no bloco
de instruIes!
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 proramadores 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

&ntre com alguma coisa: Programar S di#ertido

)amanho da string S 1

&ntre com alguma coisa: Wuando o trabalho est% feito

5ength of the string is ?

&ntre com alguma coisa: se #oc Quer tornar seu trabalho tambSm di#ertido:

)amanho da string S <1

&ntre com alguma coisa: use PythonM

)amanho da string S 1

&ntre com alguma coisa: sair

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#hasisUbrea1em#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

Wuando o trabalho est% feito

se #oc Quer tornar seu trabalho tambSm di#ertido:

use PythonM

- Bnstru$o continue
- instru$o continue é usada #ara di4er ao Python %ue #ule as intruIes restantes do bloco de loo#

corrente e #ara continuar 0 ontinue7 na itera$o seguinte do loo#!


&em#lo
#!/usr/bin/python
# 7r%uivo: ontinue.py

<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 proesso a%ui...
/a6da
$ python continue.py

&ntre com algo : a

9uito peQueno

&ntre com algo : 1

9uito peQueno

&ntre com algo : abc

" entrada S de tamanho suficiente

&ntre com algo : sair

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 instruIes no bloco utili4ando a instru$o continue! /en$o, o resto das instruIes
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 instruIes de controle de flu&o * if, Dhile and for, em conjunto com suas
instruIes 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 eplorar 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 eemplo abaio irá
mostrar que isto é realmente muito simples"
*emplo"
#!/usr/bin/python
# Filename: unao,.py

de8 diga*la07:
print0'.l) MundoE'7 # bloo pertenente < unção
# Fim da unção

diga*la07 # hamando a unção


diga*la07 # hamando a unção denovo
Cutput"
$ python funcao.py

*l% 9undoM

*l% 9undoM

8omo isto funciona"


Definimos a função chamada diga*la usando a sintae como eplicado abaio. *sta função não recebe
par&metros e conseqEentemente não há variáveis declaradas entre parênteses. Para as funç(es'
par&metros são somente uma entrada que podemos passar diferentes valores e receber resultados
correspondentes.
;epare que podemos chamar a mesma função duas vezes' o que significa que não temos que escrever o
mesmo c)digo de novo.
Par@metros da Função
:ma função pode receber par&metros' que são valores fornecidos 0 função para que a mesma
possa fazer algo 7til com os mesmos. *stes par&metros são como variáveis' eceto que os valores destas
variáveis são definidos quando chamamos a função e %á estão atribu$dos quando a função é eecutada.
Par&metros são especificados dentro do par de parênteses na definição da função' separados por
v$rgulas. 2uando chamamos a função' passamos os valores da mesma maneira. /ote a terminologia
utilizada # os nomes dados na definição da função são chamados de parâmetros enquanto que os valores
que fornecemos na chamada da função são chamados de argumentos.
*emplo"
#!/usr/bin/python
# Filename: un'param.py

de8 print9aO0a= b7:


i8 a U b:
print0a= 'is ma&imum'7
else:
print0b= 'is ma&imum'7

print9aO0== Z7 # valores literais passados para a unção

O / ]
y / k

print9aO0O= y7 # passando variveis omo argumentos


+a$da"
$ python func_param.py

@ 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'loal.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

Vari%#el local O mudou para 

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 eterno.
*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

Vari%#el global O mudou para 

* #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
eemplo' 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 eecutável' você pode definir funç(es em qualquer lugar.
Ve%amos um eemplo"

#!/usr/bin/python
# Filename: un'nonloal.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 

* O local mudou para <

8omo funciona"
2uando estamos dentro de func_inner' o FF 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 arumentos
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 é eplicado em detalhes nos cap$tulos seguintes. Por
enquanto' basta lembrar disso.
*emplo"
#!/usr/bin/python
# Filename: un'deault.py

de8 say0message= times / H7:


print0message  times7

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 #armetros %ue estiverem no final da lista de #armetros #odem receber valores
#adr$o de argumento, ou seja, voc( n$o #ode ter um #armetro com valor de argumento
#adr$o antes de um #armetro sem um valor de argumento #adr$o na ordem dos #armetros
declarados na lista de #armetros da fun$o!
. motivo é %ue os valores s$o atribu6dos aos #armetros #or #osi$o! Por e&em#lo, def
func6a= b/<8 é v)lido, mas def func6a/<= b8 é não vlido!
Arumentos 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

de8 func0a= b/]= c/H?7:


print0'a é'= a= 'e b é'= b= 'e c é'= c7

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

a S 100 e b S < e c S <0

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 3arArs
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

de8 total0initial/]= numbers= keyDords7:


count / initial
8or number in numbers:
count N/ number
8or key in keyDords:
count N/ keyDordsQkey
return count

print0total0H?= H= ;= == #egetables/]?= fruits/H??77


+a$da"
$ python total.py

1;;

8omo funciona"
2uando declaramos um par&metro prefiado 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 prefiado 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 eplorar 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

de8 total0initial/]= numbers= #egetables7:


count / initial
8or number in numbers:
count N/ number
count N/ #egetables
return count

print0total0H?= H= ;= == #egetables/]?77
print0total0H?= H= ;= =77
# =evanta um erro; pois não orneemos um valor de argumento padrão para >vegetables>
+a$da"
$ python keyDord_only.py

;;

)raceback 6most recent call last8:


Iile Etest.pyE= line 1= in moduleF

print6total610= 1= = 388

)ype&rror: total68 needs keyDord-only argument #egetables

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 eecuçã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

de8 maOimum0O= y7:

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 eemplo' é 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 eecutando 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!
+ocStrins
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 mae use of since it helps to document the program better and maes it
more easy to understand. +urpreendentemente' podemos até obter a docstring de' digamos' uma
função' durante a eecução do programa,
*emplo"
#!/usr/bin/python
# Filename: un'do.py

de8 print9aO0O= y7:


'''Bm#rime o maior entre dois nLmeros!

.s dois valores devem ser inteiros!'''


O / int0O7 # onverte para inteiro; se poss1vel
y / int0y7

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

mprime o maior entre dois nmeros.

*s dois #alores de#em ser inteiros.

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 eplicaçã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 eibir para você de uma forma elegante. Você pode
eperimentá#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
anear 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 funIes!
5ue tal se voc( %uisesse reutili4ar um certo nLmero de funIes 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 funIes
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

print0'.s argumentos da linha de comando s$o'7


8or i in sys.argv:

print0i7

print0'nn. P3K.@P-3K é'= sys.#ath= 'n'7


/a6da
$ python using_sys.py nos somos argumentos

*s argumentos da linha de comando sYo:

test.py

nos

somos

argumentos

* Pv)*2P") S B:''tmp= :''Python30''python30.Gip=

:''Python30''455s= :''Python30''lib= :''Python30''lib''plat-Din=

:''Python30= :''Python30''lib''site-packagesC

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.pycomo sys.arg#B0C, nos como sys.arg#B1C, somos como sys.arg#BC ea
rgumentos como sys.arg#B3C! @ote %ue Python comea 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 byteompilados 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

sses ar%uivos .pyc s$o usualmente criados no mesmo diret+rio dos


ar%uivos .py corres#ondentes! /e Python n$o tiver #ermiss$o #ara escrever ar%uivos na%uele
diret+rio, ent$o os ar%uivos .pyc n$o ser$o criados!
. Comando from !! im#ort
/e voc( %uiser im#ortar diretamente a vari)vel arg# no seu #rograma 0#ara evitar ficar
digitando sys. todas as ve4es7, ent$o voc( #ode usar o comandofrom sys import arg#! /e voc( %uiser
im#ortar todos os nomes usados no m+dulo sys, ent$o voc( #ode usar o oomando from sys import U!
Bsso funciona com %ual%uer m+dulo!
m geral, voc( deve evitar o uso desse comando e, ao invés, utili4ar o comandoimport, #ois dessa forma
voc( evitar) colis$o de nomes e seu #rograma ficar) mais leg6vel!
. ^^name^^ de um M+dulo
3odo m+dulo tem um nome e comandos em um m+dulo #odem encontr)*lo! Bsso é conveniente na
situa$o #articular em %ue se #roecisa descobrir se o m+dulo est) sendo e&ecutado #or si s+ ou est)
sendo im#ortado! Como mencionado anteriormente, %uando um m+dulo é im#ortado #ela #rimeira ve4, o

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
alcanado 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

&ste programa est% sendo eOecutado por si sw

$ python

FFF import using_name

&u estou sendo importado de outro mwdulo

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 aIes 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

*l%= este S mymodule falando.


VersYo 0.1

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

8rom mymodule import sayhi= __#ersion__


# 7lternativa:
# rom mymodule import @

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 funIes, 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^^'= '^^#acage^^'= '^^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'= 'getchecinterval'= 'getdefaultencoding'= 'getfil
esystemencoding'= 'get#rofile'= 'getrecursionlimit'= 'getrefcount'= 'getsi4eof'=
'gettrace'= 'get2indo2sversion'= 'he&version'= 'intern'= 'ma&si4e'= 'ma&unicode
'= 'meta^#ath'= 'modules'= '#ath'= '#ath^hoos'= '#ath^im#orter^cache'= '#latfor
m'= '#refi&'= '#sH'= '#s;'= 'setchecinterval'= 'set#rofile'= 'setrecursionlimit
'= 'settrace'= 'stderr'= 'stdin'= 'stdout'= 'subversion'= 'version'= 'version^in
fo'= '2arno#tions'= '2inver'

UUU dir07 # obtenha a lista dos atributos do m2dulo orrente


Q'^^builtins^^'= '^^doc^^'= '^^name^^'= '^^#acage^^'= 'sys'
UUU a / ] # ria uma nova varivel >a>

UUU dir07
Q'^^builtins^^'= '^^doc^^'= '^^name^^'= '^^#acage^^'= 'a'= 'sys'

UUU del a # delete/remove um nome

UUU dir07
Q'^^builtins^^'= '^^doc^^'= '^^name^^'= '^^#acage^^'= '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 #armetro #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!
Pacages
@esse #onto, voc( j) deve ter comeado a observar a hierar%uia da organi4a$o de seus #rogramas! -s
vari)veis usualmente v$o dentro das funIes! FunIes 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
#acages 0#acotes7!
Pacages 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 #acage denominada '2orld' com as sub#acages 'asia', 'africa',
etc! e estas sub#acages #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

Pacages 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 funIes s$o #artes reutili4)veis de #rogramas, os m+dulos s$o #rogramas
reutili4)veis! Pacages 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 #acages 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&nia 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 bracets7, 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 mutvel 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
instncia7 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 funIes definidas #ara uso com res#eito unicamente [%uela classe!
8oc( #ode usar essas #eas 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.append6um item8 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

# Esta  a minha lista de ompras


shoplista / Q'ma$'= 'manga'= 'cenoura'= 'banana'

print0'u tenho'= len0shoplista7= 'itens #ara com#rar!'7

print0'stes itens s$o'= end/' '7


8or item in shoplista:
print0item= end/' '7

print0'n3ambém tenho %ue com#rar arro4!'7


shoplista.a##end0'arro4'7
print0'Minha lista de com#ras é agora'= shoplista7
print0'8ou colocar a minha lista em ordem agora'7
shoplista.sort07
print0'- minha lista ordenada é' = shoplista7

print0'. #rimeiro item %ue com#rarei é' = shoplistaQ?7


olditem / shoplistaQ?
del shoplistaQ?

print0'u com#rei o'= olditem7


print0'Minha lista de com#ras é agora'= shoplista7
/a6da
$ python using_list.py

&u tenho @ itens para comprar.

&stes itens sYo: maY manga cenoura banana

)ambSm tenho Que comprar arroG.

9inha lista de compras S agora BmaY= manga= cenoura= banana= arroGC

Vou colocar a minha lista em ordem agora

" minha lista ordenada S BarroG= banana= cenoura= maY= manga C

* primeiro item Que comprarei S arroG

&u comprei o arroG

9inha lista de compras S agora banana= cenoura= maY= manga C

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 espie de
obeto a uma lista, incluindo nLmeros e até mesmo outras listas!
@+s também em#regamos o lao 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#ao, 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 mutveis e as
strings s$oimutveis!
- seguir, %uando n+s terminamos de com#rar um item no mercado, %ueremos retir)*lo da lista!
-lcanamos 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 comea 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

Goo / 0'lobo'= 'elefante'= '#inguim'7


print0'. @Lmero de animais no 4oo é'= len0Goo77

no#o_Goo / 0'macaco'= 'golfinho'= Goo7


print0'. @Lmero de animais no novo 4oo é'= len0no#o_Goo77
print0'3odos os animais no novo 4oo s$o'= no#o_Goo7
print0'.s animais tra4idos do antigo 4oo s$o' = no#o_GooQ;7
print0'. Lltimo animal tra4ido do antigo 4oo é' = no#o_GooQ;Q;7
.ut#ut

$ python using_tuple.py

* 2mero de animais no Goo S 3

* 2mero de animais no no#o Goo S 3

)odos os animais no no#o Goo sYo 6macaco= golfinho= 6lobo= elefante=


pinguim88

*s animais traGidos do antigo Goo sYo 6lobo= elefante= pinguim8

* ltimo animal traGido do antigo Goo S pinguim

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_GooBC e acessamos o terceiro item dentro do terceiro
item na tu#la no#o_Goo es#ecificando no#o_GooBCBC! 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 proramadores 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 endereos na %ual voc( #ode encontrar ou endereo ou
detalhes de contato de uma #essoa, conhecendo a#enas o nome dela, isto é, associamos as .eys

DchavesE 0nome7 com values DvaloresE


voc( n$o #oder) encontrar a informa$o0detalhes7! @ote %ue aduas
correta se houverem ey deve ser com
#essoas Lnica, da mesma oforma
e&atamente %ue
mesmo
nome!
.bserve %ue voc( #ode utili4ar somente objetos imut)veis 0como strings7 como eys de um dicion)rio,
mas #ode usar objetos imut)veis e mut)veis como values do dicion)rio! Bsso basicamente se tradu4 em
%ue voc( deve usar a#enas objetos sim#les como eys!
Pares de eys e values s$o es#ecificados em um dicion)rio #ela nota$o d / Zkey1 : #alue1= key :
#alue [! .bserve %ue os #ares ey1value est$o se#arados #or uma v6rgula e todo o conjunto est) dentro
de um #ar de chaves!
embre*se %ue os #ares ey1value em um dicion)rio n$o est$o de forma alguma ordenados! /e %uiser um
ordem #articular, voc( mesmo ter) %ue orden)*los antes de us)*los!
.s dicion)rios %ue voc( utili4ar) s$o instncias1objetos da classe dict!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: using'dit.py

# >ab>  diminutivo para >a>ddress>b>oo-

ab / N '/2aroo#' : 's2aroo#s2aroo#ch!com'=
'arry' : 'larry2all!org'=
'Matsumoto' : 'mat4ruby*lang!org'=
'/#ammer' : 's#ammerhotmail!com'
O

print0"/2aroo#'s address is"= abQ'/2aroo#'7

# Deletando um par -ey/value


del abQ'/#ammer'

print0'n3here are N?O contacts in the address*boon'.format0len0ab777

8or name= address in ab.items07:


print0'Contact N?O at NHO'.format0name= address77

# 7dionando um par -ey/value


abQ'Guido' / 'guido#ython!org'

i8 'Guido' in ab: # 5A ab.has'-ey(>Buido>)


print0"nGuido's address is"= abQ'Guido'7

/a6da
$ python using_dict.py

!Daroops address is sDaroopxsDaroopch.com


)here are 3 contacts in the address-book

ontact !Daroop at sDaroopxsDaroopch.com

ontact 9atsumoto at matGxruby-lang.org

ontact 5arry at larryxDall.org

7uidos address is guidoxpython.org

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 lao 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!
Arumentos em ey<ord Dpalavras7chaveE e +icionários

m um t+#ico distinto, se voc( tiver em#regado argumentos em ey2ords em suas funIes,


voc( j) usou dicion)riosE Pense um #ouco sobre isso * o #ar ey1value é es#ecificado #or voc(

na lista de
fun$o, #armetros
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
sliing
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

shoplist / Q'a##le'= 'mango'= 'carrot'= 'banana'


name / 's2aroo#'

# 5peração de Indexação ou >Cubsrição>


print0'Btem ? is'= shoplistQ?7
print0'Btem H is'= shoplistQH7
print0'Btem ; is'= shoplistQ;7
print0'Btem = is'= shoplistQ=7
print0'Btem *H is'= shoplistQ-H7
print0'Btem *; is'= shoplistQ-;7
print0'Character ? is'= nameQ?7

# Cliing (atiamento) sobre uma lista


print0'Btem H to = is' = shoplistQH:=7
print0'Btem ; to end is'= shoplistQ;:7
print0'Btem H to *H is' = shoplistQH:-H7
print0'Btem start to end is'= shoplistQ:7

# Cliing (atiamento) sobre uma string


print0'characters H to = is'= nameQH:=7
print0'characters ; to end is'= nameQ;:7
print0'characters H to *H is'= nameQH:-H7
print0'characters start to end is' = nameQ:7
/a6da
$ python seQ.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

tem 1 to 3 is Bmango= carrotC

tem  to end is Bcarrot= bananaC

tem 1 to -1 is Bmango= carrotC

tem start to end is Bapple= mango= carrot= bananaC

characters 1 to 3 is Da

characters  to end is aroop

characters 1 to -1 is Daroo

characters start to end is sDaroop

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 subsriçã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 comea 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
comea 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 comear) 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 comea 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
#osiIes 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 combinaIes de es#ecificaIes 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 coleIes 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.intersetion(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 reere 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 vinulaçã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: reerene.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 obeto!

del shoplistQ? # Eu omprei o primeiro item ; então eu o removo da lista

print0'sho#list is'= shoplist7


print0'mylist is'= mylist7
# note omo tanto shoplist e mylist ambas imprimem a mesma lista; sem >apple>; onirmando %ue apontam para o mesmo obeto.

print0'Co#ie #or meio de uma fatia com#leta'7


mylist / shoplistQ: # eetue uma 2pia por meio de uma atia ompleta
del mylistQ? # remova o primeiro item

print0'sho#list is'= shoplist7


print0'mylist is'= mylist7
# note %ue agora as duas listas são distintas
/a6da
$ python reference.py

"tribuiYo !imples

shoplist is Bmango= carrot= bananaC

mylist is Bmango= carrot= bananaC

opie por meio de uma fatia completa

shoplist is Bmango= carrot= bananaC

mylist is Bcarrot= bananaC

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 obetos 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 reerirão ao
mesmo objeto e isso #ode ser um #roblema se voc( n$o for cuidadoso!
Nota para proramadores 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!

Mais /obre /trings


@+s j) discutimos strings em detalhes antes! . %ue mais h) #ara se conhecerY em, voc( sabia %ue
strings s$o também objetos e %ue tem métodos %ue fa4em de tudo, desde verificar #artes de uma string
até retirar os es#aos em brancoE
-s strings %ue voc( usa em seu #rograma s$o todas objetos da classe str! -lguns métodos Lteis dessa
classe s$o demonstrados no #r+&imo e&em#lo! Para uma lista com#leta de tais métodos, veja
em help6str8!
&em#lo
#!/usr/bin/python
# 6ome do ar%uivo: str'methods.py

name / '/2aroo#' # Este  um obeto string

i8 name.starts2ith0'/2a'7:
print0'/im, a string comea 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

!im= a string comea com E!DaE

!im= ela contSm a string EaE

!im= ela contSm a string EDarE

,rasil_U_Kssia_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 comea 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 deseo esrever 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 bacu# 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 bacu# est$o es#ecificados em uma lista!
;! . bacu# deve ser colocado em um diret+rio #rinci#al de bacu#!

=!
Z! . bacu#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&1ni& #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

# ,. 5s ar%uivos e os diret2rios a sorerem ba-up estão espeiiados em uma lista.


srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.

# ?. 5 ba-up deve ser oloado em um diret2rio de ba-up prinipal.


dir_al#o / 'acu#' # =embrese de alterar para a%uele %ue vo& estiver utili"ando.

# *. 5 ba-up deve ser oloado em uma ar%uivo do tipo "ip.


# G. 5 nome do ar%uivo "ip  a data e a hora orrentes.
al#o / dir_al#o N os.se# N time.strftime0'mdKM/'7 N '!4i#'

# H. Asamos o omando "ip para oloar os ar%uivos em um ar%uivo "ip.


comando_Gip / "4i# *%r N?O NHO".format0al#o= ' '.join0srcem 77

# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# bem*sucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er1.py

,ackup bem-sucedido em &:',ackup'00?0A01?<0@0.Gip

-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!uar 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 bacu# deve ser reali4ado na lista ttUsrcem1ttU! . diret+rio alvo é onde n+s
arma4enamos todos os ar%uivos do bacu# 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#ecificaIes #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 %ualonatena 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 #armetros! - 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
bacu#! @+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 exeutamos 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 bacu# falhou ou se
foi bem sucedido!
nt$o é isso, n+s criamos um scri#t #ara reali4ar um bacu# 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 'bacslash' 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 bacu# o#eracional, #odemos us)*lo em %ual%uer situa$o em %ue
desejamos obter um bacu# de ar%uivos! .s usu)rios de inu&1ni& s$o aconselhados a em#regar
o metodo^e&ecutavel como discutido anteriormente de modo %ue #ossam e&ecutar o scri#t de bacu# a
%ual%uer momento e em %ual%uer lugar! sta é chamada a fase de operação ou de empreo 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 bacu#! - #rimeira vantagem é %ue os seus bacu#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 bacu# do dia, uma ve4 %ue o diret+rio
s+ ser) criado se voc( tiver efetuado o bacu# da%uele dia!
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'ver?.py

import os
import time

# ,. 5s ar%uivos e os diret2rios uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.

# ?. 5 ba-up deve ser oloado em um diret2rio de ba-up prinipal.


dir_al#o / 'acu#' # =embrese de alterar para a%uele %ue vo& estiver utili"ando.

# *. 5 ba-up deve ser oloado em uma ar%uivo do tipo "ip.


# G. 5 dia orrente  o nome do subdiret2rio no diret2rio prinipal.
hoe / dir_al#o N os.se# N time.strftime0'md'7
# 7 hora orrente  o nome do ar%uivo "ip
agora / time.strftime0'KM/'7

# rie o diret2rio se ainda não estiver l


i8 not os.#ath.e&ists0hoe7:
os.mdir0hoe7 # rie diret2rio
print0'em*/ucedida Cria$o do :iret+rio'= hoe7

# 5 nome do ar%uivo "ip


al#o / hoe N os.se# N agora N '!4i#'

# H. Asamos o omando "ip para oloar os ar%uivos em um ar%uivo "ip


comando_Gip / "4i# *%r N?O NHO".format0al#o= ' '.join0srcem 77

# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er.py

,em-!ucedida riaYo do 4iretwrio &:',ackup'00?0A0

,ackup ,em-!ucedido em &:',ackup'00?0A0'0311.Gip

$ python backup_#er.py

,ackup ,em-!ucedido em &:',ackup'00?0A0'03<.Gip

Como funciona
- maior #arte do #rograma #ermanece a mesma! -s alteraIes 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 bacu#s, mas %uando h) um nLmero
muito grande de bacu#s, eu estou achando dif6cil diferenciar #ara %ue ra4$o s$o os bacu#sE Por
e&em#lo, eu #oderia ter feito algumas alteraIes significativas a um #rograma ou a#resenta$o, ent$o eu
gostaria a ra4$o #ara a%uelas alteraIes 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 uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.

# ?. 5 ba-up deve ser oloado em um diret2rio de ba-up prinipal.


dir_al#o / 'acu#' # =embrese de alterar para a%uele %ue vo& estiver utili"ando.

# *. 5 ba-up deve ser oloado em uma ar%uivo do tipo "ip.


# G. 5 dia orrente  o nome do subdiret2rio no diret2rio prinipal.
hoe / dir_al#o N os.se# N time.strftime0'md'7
# 7 hora orrente  o nome do ar%uivo "ip
agora / time.strftime0'KM/'7

# eeba um omentrio do usurio para riar o nome do ar%uivo "ip


coment / in#ut0'ntre com um coment)rio **U '7
i8 len0coment7 // ?: # verii%ue se entrou um omentrio
al#o / hoe N os.se# N agora N '!4i#'
else:
al#o / hoe N os.se# N agora N '^' N
coment.re#lace0' '= '^'7 N '!4i#'

# rie o diret2rio se ainda não estiver l


i8 not os.#ath.e&ists0hoe7:
os.mdir0hoe7 # rie diret2rio
print0'em*/ucedida Cria$o do :iret+rio'= hoe7
# H. Asamos o omando "ip para oloar os ar%uivos em um ar%uivo "ip
comando_Gip / "4i# *%r N?O NHO".format0al#o= ' '.join0srcem 77

# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er3.py

Iile Ebackup_#er3.pyE= line <

al#o / hoe N os.sep N agora N _ N

!yntaO&rror: in#alid syntaO

Como 0n$o7 funciona


Este programa não uniona! Python
est) di4endo %ue e&iste um erro de sinta&e o %ue significa %ue o scri#t n$o
satisfa4 a estrutura %ue Python es#era encontrar! 5uando n+s observamos o erro dado #or Python, ele
também nos a#onta o local onde detetou o erro! nt$o n+s comeamos a debugar o nosso #rograma a

#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 'bacslash' 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 !us!
5uarta 8ers$o
#!/usr/bin/python
# 6ome do ar%uivo: ba-up'verG.py

import os
import time

# ,. 5s ar%uivos e os diret2rios uo ba-up ser eetuado estarão espeiiados em uma lista.
srcem / Q'"CMeus :ocumentos"'= 'CCode'
# 6ote %ue n2s tivemos %ue usar aspas duplas dentro da string devido aos nomes om espaços dentro dela.

# ?. 5 ba-up deve ser oloado em um diret2rio de ba-up prinipal.


dir_al#o / 'acu#' # =embrese de alterar para a%uele %ue vo& estiver utili"ando.

# *. 5 ba-up deve ser oloado em uma ar%uivo do tipo "ip.


# G. 5 dia orrente  o nome do subdiret2rio no diret2rio prinipal.
hoe / dir_al#o N os.se# N time.strftime0'md'7
# 7 hora orrente  o nome do ar%uivo "ip
agora / time.strftime0'KM/'7

# eeba um omentrio do usurio para riar o nome do ar%uivo "ip


coment / in#ut0'ntre com um coment)rio **U '7
i8 len0coment7 // ?: # verii%ue se entrou um omentrio
al#o / hoe N os.se# N agora N '!4i#'
else:
al#o / hoe N os.se# N agora N '^' N'
coment.re#lace0' '= '^'7 N '!4i#'

# rie o diret2rio se ainda não estiver l


i8 not os.#ath.e&ists0hoe7:
os.mdir0hoe7 # rie diret2rio
print0'em*/ucedida Cria$o do :iret+rio'= hoe7

# H. Asamos o omando "ip para oloar os ar%uivos em um ar%uivo "ip


comando_Gip / "4i# *%r N?O NHO".format0al#o= ' '.join0srcem 77

# Exeute o ba-up
i8 os.system0comando_Gip7 // ?:
print0'acu# em*/ucedido em'= al#o7
else:
print0'acu# F-K.'7
/a6da
$ python backup_#er@.py

&ntre com um coment%rio --F no#os eOemplos adicionados

,ackup ,em-!ucedido em &:',ackup'00?0A0'0?3;_no#os eOemplos_adicionados.Gip

$ python backup_#er@.py

&ntre com um coment%rio --F

,ackup ,em-!ucedido em &:',ackup'00?0A0'0?3R.Gip

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 bacu# de rotina ou n$o haviam mudanas 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#aos nos coment)rios #or
'underscores' 0sublinhados7 * isto #or%ue gerenciar ar%uivos sem es#aos é 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#ao #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 lanar 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 bacu# 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

H! :escubra o 5u( 0-n)lise7


;! /aiba Como 0Projeto7
=! Faa 0Bm#lementa$o7
Z! 3este 03estando and ':ebugando'7
]! se 0.#era$o or m#rego7
! Mantenha 0Refinamento7
ma forma recomendada de escrever #rogramas é o #rocedimento %ue n+s seguimos ao criar o scri#t de
bacu# Reali4e a an)lise e o #rojeto! Comece #or im#lementar uma vers$o mais sim#les! 3este*a e
conserte os seus 'bugs'! se a vers$o #ara certificar*se %ue o#era como es#erada! -gora, acrescente
algumas funcionalidades %ue voc( %ueira e continue a re#etir o ciclo Faa*3este*se tantas ve4es %uanto
necess)rio! embre*se, So8t<are 9 desenvolvido não vem pronto!

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?Proramacao "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 obetos 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 Proramadores de Linuaens $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!

Programadores C e Java H!] encontrar$o semelhanas com os conceitos de boxing e unboxing!


Cb%etos podem armazenar dados utilizando variáveis comuns que pertencem ao ob%eto. Variáveis que
pertencem a um ob%eto o classe são chamadas de campos. Cb%etos também podem ter funcionalidade
por meio de funç(es que pertencem a uma classe. ?ais funç(es são chamadas dem!todos da classe.
*sta terminologia é importante porque nos a%uda a diferencias entre funç(es e variáveis que são
independentes e as que pertencem a uma classe ou ob%eto. 8oletivamente' os campos ou métodos
podem ser considerados atributos da classe.
Cs campos podem ser de dois tipos # eles podem pertencer a cada inst&nciaJob%eto ou podem pertencer 0
classe em si. *las são chamadas de "ari#"eis de inst$ncia e "ari#"eis de classe' respectivamente.
:ma classe é criada usando a palavra#chave class. Cs campos e métodos da classe são listados em um
bloco indentado.
" sel8
Cs métodos
primeiro temetra
nome apenas
queuma
devediferença espec$fica
ser inclu$do no in$cioem
darelação
lista deapar&metros'
funç(es comuns" eles devem
mas você ter um
não deve atribuir
um valor a esse par&metro quando chama o método' pois o Python o fornece implicitamente. *ssa
variável em particular refere#se ao próprio ob%eto e' por convenção' é chamada de self.
*mbora se%a poss$vel dar qualquer nome a este par&metro' é fortemente recomendado que você use o
nome self. *istem muitas vantagens um usar um nome padrão # qualquer leitor do seu programa irá
reconhecê#lo imediatamente e mesmo 5D*s especializadas podem a%udá#lo se você usar self.
Nota para Proramadores C554=ava4C>

. 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 eemplo tornará mais claro. Digamos que você tenha uma classe
chamada 9ylass e uma inst&ncia desta classe chamada 9y*bect. 2uando você invoca um método
deste ob%eto como 9y*bect.method6arg1= arg8' isto é convertido automaticamente pelo Python
em 9ylass.method69y*bect= arg1= arg8 # 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 eemplo.
#!/usr/bin/python
# 7r%uivo: simplestlass.py

class Person:
pass # Am bloo va"io

p / Person07
print0p7
+a$da"
$ python simplestclass.py

__main__.Person obect at 0O01RI?<I0F

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 eatamente como funç(es' eceto pelo fato de que
temos uma variável etra # self. Ve%amos um eemplo.
#!/usr/bin/python
# 7r%uivo: method.py

class Person:
de8 sayi0self7:
print0'Kello, ho2 are youY'7

p / Person07
p.sayKi07

# Este pe%ueno exemplo tambm pode ser esrito omo 0erson().sayi()


+a$da"
$ python method.py

ello= hoD are youX

8omo Bunciona"
!qui vemos o self em ação. Cbserve que o método sayi 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 sayi0self7:
print0'Kello, my name is' = self.name7

p / Person0'/2aroo#'7
p.sayKi07

# Este exemplo tambm pode ser esrito omo 0erson(>C$aroop>).sayi()


+a$da"
$ python class_init.py

ello= my name is !Daroop

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__eplicitamente' 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 sayi.
Nota para Proramadores C554=ava4C>

. método __init__ é an)logo a um onstrutor em C, Java ou C!


3ariáveis de Classe e "!#eto
Ká discutimos a respeito do lado funcional de classes e ob%etos 3i.e. métodos4' agora vamos aprender
sobre dados. Dados 3i.e. campos ou atributos4 são nada mais que variáveis comuns que
estão associadas ao espaço de nomes3namespace4 de uma classe eJou ob%eto. 5sto significa que esses
nomes são válidos apenas no conteto de uma classe eJou ob%eto particular. Por isso são chamados
de espaços de nomes 3name spaces4.
*istem dois tipos de atributos 3ou campos4 # variáveis de classe e variáveis de ob%eto' que são
classificados dependendo de quem # a classe ou o ob%eto # possui essas variáveis.
Variáveis de classe são compartilhadas # elas podem ser acessadas por todas as inst&ncias daquela
classe. Lá apenas uma c)pia de uma variável de classe e quando qualquer inst&ncia daquela classe
modifica o seu valor' essa mudança será vista por todas as outras inst&ncias.
Variáveis de objeto são particulares a cada inst&ncia individual de uma classe. /este caso' cada ob%eto
possui a sua pr)pria c)pia' ou se%a' elas não são compartilhadas e não estão relacionadas de qualquer
maneira 0 outras variáveis com o mesmo em outras inst&ncias. :m eemplo tornará mais fácil de
entender"
#!/usr/bin/python
# 7r%uivo: obvar.py

class Kobot:
'''Re#resenta um rob` com um nome!'''

# Ama varivel de lasse; para ontar o n4mero de robJs.


population / ?

de8 ^^init^^0self= name7:


'''Bnicia os dados!'''
self.name / name
print0'0Bniciando N?O7'.format0self.name77

# Kuando este robJ  riado ele  ontabili"ado


# na população geral de robJs
Kobot.#o#ulation N/ H

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 sayi0self7:
'''/audaIes do rob`!

/im, eles #odem fa4er isso!'''


print0'/audaIes, meus mestres me chamam N?O!' .format0self.name77

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

print0"nRob`s #odem reali4ar algum trabalho a%ui!n"7

print0"Rob`s terminaram seus trabalhos! nt$o vamos destru6*los!"7


del droid1
del droid

Kobot.ho2Many07
+a$da"
6niciando K-48

!audazes= meus mestres me chamam K-4.

)emos um total de 1 rob{6s8.

6niciando -3P*8
!audazes= meus mestres me chamam -3P*.

)emos um total de  rob{6s8.

Kob{s podem realiGar algum trabalho aQui.

Kob{s terminaram seus trabalhos. &ntYo #amos destru-los.

K-4 sendo destrudoM

&Oiste6m8 ainda 1 rob{6s8 trabalhando.

-3P* sendo destrudoM

-3P* era o ltimo.

)emos um total de 0 rob{6s8.

8omo Bunciona"
*ste é um longo eemplo' 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 FF' 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 epl$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 epl$cita a uma instrução' como vimos
neste eemplo.
/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 eemplo' 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 eecução usando Kobot.__doc__ e a documentação de
um método usandoKobot.sayi.__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á eecutado 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 eplicitamente' que é eatamente o que fizemos.
Nota para Proramadores C554=ava4C>

3odos os membros de classe 0incluindo dados * vari)veis7 s$o p4blios 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 arateres de
sublinha como em __pri#ate#ar, Python altera esse nome internamente 0técnica
chamada namemangling7 #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 instncia 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étodosdestrutor!
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 eemplo' 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 subclasses.
Vamos implementar o eemplo 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 instncia!'''
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.mars / marks
print0'0Bniciado /tudent N?O7' .format0self.name77

de8 tell0self7:
!chool9ember.tell0self7
print0'@ota "N?dO"'.format0self.mars77

t / )eacher0'Mrs! /hrividya'= Z?= =????7


s / !tudent0'/2aroo#'= ;]= k]7

print07 # imprime uma linha em brano

members / Qt= s
8or member in members:
member.tell07 # uniona tanto para Leahers omo para Ctudents
+a$da"
$ python inherit.py

6niciado !chool9ember: 9rs. !hri#idya8

6niciado )eacher: 9rs. !hri#idya8

6niciado !chool9ember: !Daroop8

6niciado !tudent: !Daroop8

2ome:E9rs. !hri#idyaE dade:E@0E !al%rio: E30000E

2ome:E!DaroopE dade:E<E 2ota: EA<E

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 é eplicitamente
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 eplicitamente.
Cbservamos também que podemos invocar métodos da classe base prefiando 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 eistem.
!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 eemplo. +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

8rom abc import 

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 instncia!'''
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.mars / marks
print0'0Bniciado /tudent N?O7' .format0self.name77

de8 tell0self7:
!chool9ember.tell0self7
print0'@ota "N?dO"'.format0self.mars77

t / )eacher0'Mrs! /hrividya'= Z?= =????7


s / !tudent0'/2aroo#'= ;]= k]7

m / !chool9ember0'abc'= H?7

m.tell07

print07 # imprime uma linha em brano

members / Qt= s
8or member in members:
member.tell07 # uniona tanto para Leaher omo para Ctudent
+a$da"
6niciado !chool9ember: 9rs. !hri#idya8

6niciado )eacher: 9rs. !hri#idya8

6niciado !chool9ember: !Daroop8

6niciado !tudent: !Daroop8

)raceback 6most recent call last8:

Iile E:'(sers'sDaroop'python'usingabc.pyE= line @@= in moduleF

m / !chool9ember6abc= 108

)ype&rror: ant 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 eplorar 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) situaIes 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
funIes 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 rust #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

algo / in#ut0'ntre com o te&to '7


i8 0is_palindrome0algo77:
print0"/im, é um #al6ndromo"7
else:
print0"@$o, n$o é um #al6ndromo"7
/a6da
$ python user_input.py

&ntre com o teOto: senhor

2Yo= nYo S um palndromo

$ python user_input.py

&ntre com o teOto: ana

!im= S um palndromo

$ python user_input.py

&ntre com o teOto: soma#amos

!im= S um palndromo

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 0nter7! 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#aos 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'= '2'7 # abrir para esrever (>$>riting)


f.2rite0poema7 # esreve o texto no ar%uivo
f.close07 # eha o ar%uivo

f / o#en0'#oema!t&t'7 # se nenhum modo  espeiiado; o modo leitura (>r>ead)  aberto por padrão
<hile 3rue:
linha / f.readline07
i8 len0linha7 // ?: # Lamanho M india E5F (im do ar%uivo  End 5 File)
!rea.
print0linha= end/''7
f.close07 # eha o ar%uivo
/a6da
$ python usando_arQui#o.py

Programar S di#ertido

Wuando o trabalho est% pronto

se #oc Quer tornar seu trabalho 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 r7, grava$o 0D7 ou adicionar 0a7!
@+s também #odemos trabalhar com um ar%uivo de te&to 0 t7 ou um ar%uivo bin)rio 0b7! @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' 0brea7 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!
Picle
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 #icle

# o nome do ar%uivo onde arma"enaremos o obeto


arQui#o_listadecompras / 'listadecom#ras!data'
# a lista de oisas a omprar
listadecompras / Q'ma$'= 'manga'= 'cenoura'

# Esrevendo no ar%uivo
f / o#en0arQui#o_listadecompras= '2b'7
#icle.dum#0listadecompras= f7 # desarrega o obeto em um ar%uivo
f.close07

del listadecompras # destr2i a varivel listadeompras

# =& o %ue oi arma"enado


f / o#en0arQui#o_listadecompras= 'rb'7
lista_armaGenada / #icle.load0f7 # arrega o obeto do ar%uivo
print0lista_armaGenada7
/a6da
$ python pickling.py

BmaY= manga= cenouraC

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&ceIes!
Python pt7!r?$%cecoes

Introdução
*ceç(es ocorrem quando determinadas situaç(es -ecepcionais- ocorrem em seu programa. Por
eemplo' que tal se você estiver para ler um arquivo e este não eistirQ Cu que tal se você
acidentalmente deletou#o durante a eecuçã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 eiste um erro.
$rros
+uponha uma simples chamada da função printttF. Wue tal se nws escre#ssemos errado como
ttFprint ou PrintttFX *bser#e a capitaliGaYo. 2este caso= Python levanta um erro de
sintaOe.

FFF Print6ello Jorld8

)raceback 6most recent call last8:

Iile EpyshellL0FE= line 1= in moduleF

Print6ello Jorld8

2ame&rror: name Print is not defined

FFF print6ello Jorld8

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

&ntre com alguma coisa --F

)raceback 6most recent call last8:

Iile EpyshellLFE= line 1= in moduleF

s / input6&ntre com alguma coisa --F 8

&*I&rror: &*I Dhen reading a line

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 eceç(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
ecept.
#!/usr/bin/python
# 6ome do ar%uivo: try'exept.py

try :
teOto / in#ut0'ntre com alguma coisa **U 7'
e%cept .Frror:
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

&ntre com alguma coisa --F L Press ctrl-d

Por Que #oc ogou um &*I em mimX

$ python try_eOcept.py

&ntre com alguma coisa --F L Press ctrl-c

Voc cancelou a operaYo.

$ python try_eOcept.py

&nter something --F nenhuma eOceYo

Voc entrou com nenhuma eOceYo

8omo Bunciona"
/)s colocamos todos os comandos que poderiam levantar eceç(es dentro do bloco do try e então os
FhandlersF para os errosJeceç(es na cláusulaJbloco eOcept. a cláusula eOcept pode manipular um 7nico
erro ou eceção especificada' ou uma lista de errosJeceç(es entre parênteses. +e nenhum nome de erro
ou eceção for fornecido' manipulará todos os erros ou eceç(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 eceção não é manipulada' então é invocado o Python handler padrão que interrompe a
eecuçã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 é
eecutada se nenhuma eceção ocorrer.
/o pRoimo eemplo' n)s veremos como obter um ob%eto eceção de modo que n)s possamos recuperar
informação adicional.

Levantando $%ceç;es
Você pode le"antar eceç(es com o comandoraise fornecendo o nome do erroJeceção e o ob%eto
eceção que deverá ser lançado 3thro"n4.
C erro ou eceçã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 !hortnput&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 !hortnput&Oception0len0teOt7= =7
# Demais tareas podem ontinuar omo usualmente a%ui...
e%cept .Frror:
print0'Por %ue voc( jogou um .F em mimY'7
e%cept !hortnput&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

&ntre com alguma coisa --F a

!hortnput&Oception: " entrada te#e o comprimento 1= o esperado era pelo menos 3

$ python raising.py

&nter something --F abc

2enhuma eOceYo foi le#antada.

8omo Bunciona"
!qui n)s estamos criando o nosso pr)prio tipo de *ceção. *ste novo tipo de eceção é
chamado !hortnput&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 erroJeceçã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 eceçã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 eceçã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 exeutando
e%cept peyboardBnterru#t:
print0'EE
8oc( cancelou a leitura do ar%uivo!'7
8inally:
f.close07
print0'0im#ando tudo Fechado o ar%uivo7'7
+a$da"
$ python finally.py

Programming is fun

Jhen the Dork is done

if you Danna make your Dork also fun:

MM Voc cancelou a leitura do arQui#o.

65impando tudo: Iechado o arQui#o8

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 eecute lentamente 3Python é muito rápido por natureza4. *nquanto o programa estiver
eecutando' digite ctrl-c para interromperJcancelar o programa.
Cbserve que a eceção Heyboardnterrupt é lançada e o programa termina. *ntretanto' antes da sa$da

do programa' a cláusula finally é eecutada e o ob%eto arquivo é sempre fechado.


" Comando Hith
!dquirir um recurso no bloco try e liberá#lo no bloco finally é um padrão comum. Da$ eiste também o
comando Dith que faz com que isso se%a realizado de um modo bem mais claro"
#!/usr/bin/python
# 6ome do ar%uivo: using'$ith.py

Dith opened0"#oema!t&t"7 as f:
8or line in f:
print0line= end/''7
8omo Bunciona"
! sa$da deverá ser a mesma do eemplo 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
deiamos 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 eceção e também como levantar eceç(es.
*m seguida' eploraremos a Python +tandard Iibrary 3ibioteca 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 eplorar 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 eplorar alguns m)dulos 7teis.
Nota

/e voc( achar estes t+#icos muito avanados, 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 eemplo' para garantir que o programa s)
rode sob o Python =.>"
#!/usr/bin/python

# Filename: hearversao.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

checar#ersao.py:;: KuntimeJarning: 2ecess%rio Python 3.0 para rodar este programa

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 loin
* 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':BR3qRB.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

+e n)s verificarmos o conte7do de test.log' veremos algomo como isto"

00?-0R-03 13:1?:1;=33 : 4&,(7 : ncio do programa

00?-0R-03 13:1?:1;=33 : 2I* : IaGendo alguma coisa

00?-0R-03 13:1?:1;=33 : J"K227 : )erminando agora

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'searh.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

# 5btenha seu pr2prio 700 ID em http://developer.yahoo.om/$sregapp/


v"**_"PP_4 / 'jl;;#sv8=ZK9hdfJbf:54lJ;]kpF/^%sZBS:?94]]^yCBH-2vS!l/fPh2r'
!&"K_,"!& / 'htt#11search!yahooa#is!com19eb/earch/ervice18H12eb/earch'

class vahoo!earch&rror0&ce#tion7:
pass

# 5btido de http://developer.yahoo.om/python/pythonson.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'

Query / in#ut0'Pelo %ue voc( %uer #rocurarY '7


8or result in search0Query7Q'Result':
print0"N?O  NHO".format0resultQ'3itle'= resultQ'rl'77
8omo funciona"
/)s podemos obter resultados de um determinado site' fornecendo o teto que se dese%a procurar em
um formato espec$fico. /)s devemos especificar diversas opç(es' que n)s %untamos usando o
formato key1/#alue1qkey/#alue' que é usado pela função urllib.parse.urlencode68.
*ntão' por eemplo' abra este lin em seu navegador e você vera @> resultados' iniciando do primeiro'
para a busca das palavras -byte of python-. *ste endereço nos dá os resultados no formato K+C/.
/)s realizamos a coneão a este :;I usando a função urllib.reQuest.urlopen68 e passando o arquivo
obtido para son.load68 que irá ler seu conte7do e simult&neamente converte#li em um ob%eto Python.
*ntão n)s usamos um loop nestes resultados para mostrá#los ao usuário final.

" Jódulo da Semana


Lá muito mais para ser eplorado na biblioteca padrão' tal como de#ura$o' uso de o#Ies em linha de
comando' e&#ressIes comuns e muito mais.
! melhor forma de se aprofundar na biblioteca padrão é ler os ecelentes artigos 'Python Module of the
9ee' de Doug Lellmann.
Sumário
/)s vimos algumas das funcionalidades de alguns m)dulos da iblioteca Padrão do Python. <
recomendável que você navegue pela documenta$o da iblioteca Padr$o do Python para ter uma ideia
de tudo que os m)dulos são capazes de fazer.
! seguir' n)s veremos vários aspectos sobre Python que farão nosso tour maiscompleto.
Python pt-br:Mais
Bntrodu$o
-té agora n+s cobrimos a maior #arte dos diversos as#ectos %ue n+s usaremos! @este ca#6tulo, n+s
abordaremos algumas funcionalidades adicionais %ue tornar$o o nosso conhecimento de Python mais
com#leto!

Passando 3u#las -diante


-lgumas ve4es voc( gostaria de #oder retornar com dois valores diferentes de uma fun$oY 8oc( #ode!
3udo %ue #recisa fa4er é usar uma tu#la!
UUU def obtenha^detalhes^erro07
!!! return 0;, 'detalhes do segundo erro'7
!!!
UUU errnum, errstr  obtenha^detalhes^erro07
UUU errnum
;
UUU errstr
'detalhes do segundo erro'
@ote %ue o uso de a,b  alguma e&#ressaoU inter#reta o resulatado da e&#ress$o como uma tu#la com
dois valores!
/e %uiser inter#retar o resultado como 0a, todo o restoU7, ent$o voc( #recisa acrescentar um asterisco,
como se fossem #armetros de uma fun$o
UUU a, b  QH, ;, =, Z
UUU a
H
UUU b
Q;, =, Z
Bsso também significa %ue o modo mais r)#ido de trocar duas var6aveis entre si em Python é
UUU a  ]V b  S
UUU a, b  b, a
UUU a, b
0S, ]7
Métodos s#eciais
&istem certos métodos tais como ^^init^^ e ^^del^^ %ue #ossuem significado es#ecial em classes!
.s métodos es#eciais s$o em#regados #ara emular certos com#ortamentos dos ti#os 'built*in'! Por
e&em#lo, se voc( %uiser usar a o#era$o de inde&a$o &Qindice #ara a sua classe 0e&atamente como
voc( faria #ara listas e tu#las7, ent$o tudo o %ue voc deve fa4er é im#lementar o método ^^getitem^^07 e
est) feito! /e voc( refletir a res#eito, isto é o %ue Python fa4 no caso da #r+#ria classe das listasE
-lguns métodos es#eciais Lteis est$o listados na tabela %ue segue! /e voc( %uiser conhecer mais a
res#eito de todos os métodos es#eciais, veja o manual!
-lguns Métodos s#eciais
@ome
&#lica$o
^^init^^0self, !!!7

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

Chamado %uando n+s usamos a fun$o #rint ou %uando str07 é usado!

^^lt^^0self, other7

Chamado %uando o o#erador 'menor do %ue' 07 é usado! /imilarmente, e&istem métodos es#eciais #ara
todos os o#eradores 0, U, etc!7

^^getitem^^0self, ey7

Chamado %uando a o#era$o de inde&a$o &Qey é usada!

^^len^^0self7

Chamado %uando a fun$o 'built*in' len07 é utili4ada #ara um objeto se%u(ncia!

locos de m nico Comando


@+s j) vimos %ue cada bloco de comandos é #osto se#aradamente do resto #elo seu #r+#rio n6vel de
indenta$o! em, e&istem algumas e&ceIes! /e o seu bloco de comandos contém a#enas um Lnico
comando, ent$o voc( #oder) es#ecific)*lo na mesma linha de, digamos, um comando condicional ou em
lao! . seguinte e&em#lo dever) tornar isso mais claro

UUU flag  3rue


UUU if flag #rint '/im'
!!!
/im
.bserve %ue o comando Lnico é em#regado no local e na mesma linha e n$o como um bloco se#arado!
mbora voc( #ossa fa4er uso disso #ara tornar menor o seu #rograma, eu aconselho a evitar este
#rocedimento em curto*circuito, e&ceto no caso de verfica$o de erro, uma ve4 %ue ficar) muito mais f)cil
acrescentar um comando a mais se voc( estiver usando a indenta$o a#ro#riada!

Formas ambda
ma forma lambda é em#regada #ara criar novos objetos funIes 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 funIes em tem#o de
e&ecu$o e retorn)*los! m comando lambda é utili4ado #ara criar o objeto fun$o! ssencialmente
lambda recebe um #armetro 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 FB3.
Podemos realiGar uma list.sort68 fornecendo uma funYo de comparaYo criada usando
lambdaX

#ontos  Q N '&'  ;, 'y'  = O, N '&'  Z, 'y'  H O 


H! #ontos!sort0lambda a, b  cm#0aQ' &', bQ'&'77

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
situaIes!
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 laos #ara #rocessar cada elemento de uma lista e adicion)*lo em uma
nova lista!

Recebendo 3u#las e :icion)rios em FunIes


&iste um modo es#ecial de atribuir #armetros a uma fun$o como uma tu#la ou dicion)rio, usando os
#refi&os  e  res#ectivamente! Bsso é muito Ltil %uando se considera um nLmero vari)vel de argumentos
na fun$o!
UUU def #o2ersum0#o2er, args7
!!! )etorna a soma de cada arumento elevada M potncia especi8icada-
!!! total  ?
!!! for i in args
!!! total  #o20i, #o2er7
!!! return total
!!!
UUU #o2ersum0;, =, Z7
;]
UUU #o2ersum0;, H?7
H??
ma ve4 %ue temos um #refi&o  na vari)vel args, todos os argumentos e&tra #assados [ fun$o s$o
atribu6dos a args como uma tu#la! /e ao invés disso, tivesse sido usado um #refi&o , os #armetros
e&tra seriam considerados como #ares chave1valor de um dicion)rio!
.s Comandos &ec  val
- fun$o e&ec é em#regada #ara e&ecutar comandos em Python %ue est$o arma4enados em uma string
ou ar%uivo, ao contr)rio do %ue se estivessem no #r+#rio #rograma! Por e&em#lo, n+s #odemos gerar uma
string contendo comandos em Python em tem#o de e&ecu$o e ent$o e&ecut)*los utili4ando a fun$o
e&ec
UUU e&ec0'#rint0"Kello 9orld"'77
Kello 9orld
:e modo an)logo, a fun$o eval é utili4ada #ara avaliar e&#ressIes v)lidas em Python %ue est$o
arma4enadas em uma string! m e&em#lo sim#les é mostrado a seguir!
UUU eval0';='7

. 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 -ssertionrror é 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 EstdinFE= line 1= in moduleF

-ssertionrror
. comando assert deve ser usado com cautela! @a maior #arte dos casos, é melhor ca#turar e&ceIes,
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 informaIes, tais como endereos 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 instruIes de como #roceder, a%ui est) uma sugest$o!
Suestã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 #icle
#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 traduIes #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 Cooboo é 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 0Faa Bsso e @$o Faa -%uilo7
• Python F-5 .ficial
• ista de @orvig das Bnfre%uently -sed 5uestions 0Perguntas Raramente Feitas7

ntrevista em Python 5  -
• Perguntas /tac.verflo2 marcadas com #ython
3i#s and 3rics 0/ugestIes e 3ru%ues7
• Python 3i#s  3rics
• -dvanced /oft2are Car#entry using Python
• Charming Python é uma e&celente série de artigos de :avid Mert4 relacionados com Python!
ivros, PublicaIes, 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, servios 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
• ins no fim de cada Python*RE 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!
Mae 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 Pacage 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 GB 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 GB usando Python
Py*t

sta é a interface emf)cil


5t é e&tremamente Python #arae omuito
de usar 5t toolit %ue ées#ecialmente
#oderosa, a funda$o sobre a %ual
devido ao p: foi #rodu4ido!
5t :esigner ea
incrivel documenta$o! Py.t é livre se voc( %uiser criar soft2are o#en*source 0GP7 e #ago, se
voc( for desenvolver soft2are #ro#riet)rio fechado! Para iniciar, leia o Py5t tutorialou o Py5t
boo!
PyO1

sta é a interface em Python #ara o G3p toolit %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 GB 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 toolit! 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 GB designers, tais como /P 0/tani's Python ditor7 e a construtora de
GBs 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 GB toolits em e&ist(ncia! /e voc( tem utili4ado B:, j) viu o
#rograma 3Bnter em a$o! @$o oferece uma das melhores sensaIes #ara o usu)rio, devido a
sua a#ar(ncia anti%uada! 3Bnter é #ort)vel e e&ecuta tanto em inu&1ni&, %uanto em
9indo2s! Mas im#ortante %ue tuso, 3Bnter é #arte integrante da distribui$o #adr$o de
Python! Para iniciar, leia o 3inter tutorial!
Para mais o#Ies, veja o 2ii GuiProgramming no 2ebsite oficial de Python!
Resumo das Ferramentas GB
Bnfeli4mente, n$o e&iste uma ferramenta GB #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 GB! . 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#lementaIes
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 dinmica 0em o#osi$o a linguagens est)ticas, tais como C, Java, ou C nas
im#lementaIes acima7!
Stac.less Python
ma im#lementa$o %ue é es#eciali4ada em #erformance baseada em threads!
&istem também outras tais como CPython * uma im#lementa$o de Python escrita em Common is#
e BronMoney, %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#lementaIes 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 comeo 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 comearE
Python pt-br:)pendice F*O&&
/oft2are Gratuito e ivre 0Free1ibré 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
Comeou 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#licaIes
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 8C 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 PR, 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 informaIes 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 sot$ares livres e abertos!

@ascimento do ivro
@o #rimeiro esboo deste livro, eu usei inu& Red Kat >!? como a funda$o da minha estrutura e no se&to
esboo 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 :ocoo 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 Amacs e reescrevi o livro desde o comeo em :ocoo AM 0novamente7 de#ois
de decidir %ue a%uele formato era a solu$o de longo #ra4o!
@o se&to esboo, 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 escritontreanto,
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 esboo, eu estou usando Media9ii como a base do meu setu#! -gora, eu edito tudo
online e os leitores #odem diretamente ler1editar1discutir dentro do site 2ii!
u ainda uso 8im #ara edi$o graas a 8ie2/ource9ith e&tens$o #ara Firefo&%ue integra*se com 8im!

Você também pode gostar