Você está na página 1de 228

ndice

Prefcio
Introduo
Instalao
Primeiros Passos
Fundamentos
Operadores e Expresses
Controle de Fluxo
Funes
Mdulos
Estruturas de Dados
Resoluo de Problemas
Programao Orientada a Objetos
Entrada e Sada
Biblioteca Padro
Mais
Em Seguida
Apndice: FLOSS
Apndice: Sobre
Apndice: Histrico de Revises
Sobre a Traduo
Prefcio
Python provavelmente uma das poucas linguagens de programao que so ao mesmo tempo
simples e poderosas. Isso bom tanto para iniciantes quanto para programadores avanados e, mais
importante, divertida de programar. Este livro visa ajud-lo a aprender essa linguagem maravilhosa
e mostrar como fazer as coisas de modo rpido e indolor - de fato 'O Antdoto Perfeito para seus
problemas de programao'.
Contedo
1 A Quem Se Destina Este Livro
2 Lio de Histria
3 Status do Livro
4 Site Oficial
5 Licena
6 Feedback
7 Algo Para Pensar
A Quem Se Destina Este Livro
Este livro serve como guia ou tutorial da linguagem de programao Python. Ele destinado
principalmente a iniciantes, mas tambm til para programadores experientes.

O objetivo que, se tudo o que voc sabe sobre computadores como salvar arquivos de texto, ento
voc possa tambm aprender Python com este livro.

Se voc tem experincia prvia com programao, pode se interessar pelas diferenas entre Python e
sua linguagem de programao favorita - coloquei em destaque muitas delas. No entanto, uma
pequena advertncia: logo Python vai se tornar sua linguagem de programao favorita!
Lio de Histria
Primeiramente, eu iniciei no Python quando eu precisei escrever um instalador para um programa que
eu escrevi chamado 'Diamond', para que eu pudesse instal-lo facilmente. Eu tive que escolher entre
as referncias Python e Perl para a biblioteca Qt. Eu fiz algumas pesquisas na internet e encontrei um
artigo onde Eric S. Raymond, um hacker famoso e respeitado, falou como o Python tornou-se sua
linguagem de programao favorita. Eu tambm descobri que as referncias PyQt eram mais maduras
quando coparadas s Perl-Qt. Assim, eu decidi que o Python era a melhor linguagem para mim.

Logo, eu comecei a pesquisar por um bom livro sobre Python. Eu no consegui encontrar nenhum! Eu
achei alguns livros da O'Reilly, mas eles ou eram muito caros ou pareciam mais com um manual de
referncia do que com um guia. Assim, eu optei pela documentao que vinha com o Python.
Entretanto, ela era muito breve e pequena. Eu tive uma boa noo sobre o Python, mas no era
completa. Eu me sa bem, pois eu tinha uma experincia prvia em programao, mas a
documentao era inadequada para novatos.

Cerca de seis meses aps a minha primeira luta com o Python, eu instalei a (at ento) ltima
distribuio Linux, Red Hat 9.0, e eu estava aprendendo entusiasmado o KWord. Eu o adorei e
imediatamente tive a idia de escrever alguma coisa em Python. Eu comecei escrevendo umas poucas
pginas, mas elas tornaram-se rapidamente um documento de 30 pginas. Ento, eu tornei sria a
idia de transform-lo em algo mais til na forma de um livro. Aps uma "grande quantidade" de
reescritas, o livro atingiu um estgio onde ele se tornou um guia til de aprendizado da linguagem
Python. Eu considero que este livro minha contribuio e meu tributo comunidade do cdigo fonte
aberto.

Este livro comeou a partir das minhas notas pessoais em Python e eu ainda o considero da mesma
maneira, embora eu tenha consumido muito esforo para torn-lo mais agradvel aos outros. :)

No esprito verdadeiro do cdigo fonte aberto, eu recebi muitas sugestes construtivas, crticas e
comentrios de leitores entusiastas que me ajudaram muito a melhorar este livro.
Status do Livro
As mudanas desde a ltima grande reviso de Maro de 2005 so referentes atualizao para o
lanamento do Python 3.0 (esperado para Agosto/Setembro de 2008). Uma vez que a linguagem
Python 3.0 em si ainda no foi finalizada/disponibilizada, este livro estar passando por constantes
mudanas. No entanto, de acordo com o esprito da filosofia open source do "Release Early, Release
Often" (entregar cedo e com freqncia), o livro atualizado foi lanado e est sendo atualizado
constantemente.

O livro precisa da ajuda de leitores como vocs para apontar quaisquer partes do livro que no
estejam boas, incompreensveis ou simplesmente erradas. Por favor, escreva para o autor principal
ou para os respectivos tradutores com seus comentrios e sugestes.

um esforo constante equilibrar este livro entre as necessidades dos iniciantes e a tendncia no
sentido de completude da informao. Seria til se os leitores tambm dessem sua opiniao sobre o
quanto este livro deve se aprofundar.
Site Oficial
O site oficial do livro http://www.swaroopch.com/notes/Python . No site voc pode ler o livro na
ntegra ou pode baixar as suas ltimas verses e tambm me enviar sua opinio.
Licena
1. Este livro licenciado sob a licena Creative Commons Attribution-Noncommercial-Share
Alike 3.0 Unported.
Isto significa que:
Voc livre para Compartilhar, isto , distribuir e transmitir este livro.
Voc livre para Remixar, isto , adaptar este livro.
Sob as seguinte condies:
Atribuio. Voc deve atribuir o trabalho da maneira especificada pelo autor ou
licenciador (mas no de forma a sugerir que eles endossam voc ou o uso que fizer
deste livro).
Uso no comercial. Voc no pode usar este livro para fins comerciais.
Compartilhamento pela mesma Licena. Se voc alterar transformar ou se basear
neste trabalho, voc s pode distribuir a obra resultante por esta mesma licena.
Para qualquer reuso ou distribuio, os termos de licena deste livro devem estar claros.
Qualquer uma das condies acima pode ser desconsiderada caso voc obtenha a
permisso do detentor dos direitos.
Nada nesta licena limita ou restringe os direitos morais do autor.
2. A atribuio deve ser exibida atravs de link para http://www.swaroopch.com/notes/Python e a
indicao clara de que o texto original pode ser obtido neste local.
3. Todo o cdigo/scripts fornecidos neste livro esto licenciados sob a 3-clause BSD License, a
menos que indicado de outro modo.
4. Contribuies voluntrias para este livro original devem estar sob esta mesma licena e o
copyright deve ser atribudo para o autor principal deste livro.
Feedback
Coloquei um bocado de esforo para fazer este livro o mais interessante e preciso quanto foi
possvel. No entanto, caso voc ache que alguma parte do material esteja inconsistente, incorreta ou
simplesmente precise melhorar, ento por favor me informe, para que eu possa fazer as melhorias
cabveis. Voc pode me contactar atravs da minha pgina de usurio.
Algo Para Pensar
Existem duas maneiras de construir um projeto de software: uma faz-lo to simples a ponto
de que, obviamente, no haja deficincias; a outra faz-lo to complicado de modo que no
haja deficincias bvias.
-- C. A. R. Hoare

Sucesso na vida menos uma questo de talento e oportunidade quanto de concentrao e


perseverana.
-- C. W. Wendte
Introduo
Contedo
1 Introduo
2 Caractersticas de Python
3 Por que no Perl?
4 Por que no Ruby?
5 O Que Os Programadores Dizem
6 Sobre Python 3.0
Introduo
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 fcil se concentrar na soluo para o
problema em vez da sintaxe e estrutura da linguagem que voc est programando.

A introduo oficial para Python :

Python uma poderosa linguagem de programao fcil de aprender. Possui eficientes estruturas
de dados de alto-nvel e uma simples e efetiva abordagem para programao orientada a
objetos. A elegante sintaxe e a tipagem dinmica de Python, aliada a sua natureza interpretada,
faz dela uma linguagem ideal para criar scripts e desenvolver aplicaes de modo gil em
diversas reas e na maioria das plataformas.

Vou detalhar a maioria dessas caractersticas na prxima seo.

Nota
Guido van Rossum, criador da linguagem Python, cujo nome foi baseado na srie "Monty
Python's Flying Circus" da BBC. Ele, particularmente, no gosta de cobras que para se
alimentar, esmagam outros animais usando seu extenso corpo.
Caractersticas de Python
Simples

Python uma linguagem simples e minimalista. Ler um bom programa em Python quase como
ler em ingls, ainda que seja um ingls bem restrito. Este carter de pseudo-cdigo do Python
um de seus maiores pontos fortes. Ele permite que voc se concentre na soluo do problema e
no na linguagem em si.

Fcil de Aprender

Como voc ver, extremamente fcil iniciar-se em Python. A linguagem possui uma sintaxe
extraordinariamente simples, como j mencionado.

Livre e de Cdigo Aberto

Python um exemplo de FLOSS (Free/Libre and Open Source Software). Traduzindo, voc
pode distribuir livremente cpias deste software, ler seu cdigo-fonte, modific-lo, usar trechos
em novos programas livres e tudo o que voc quiser fazer. FLOSS baseado no conceito de
uma comunidade que compartilha conhecimento. Este um dos motivos pelos quais Python to
bom - ele vem sendo criado e constantemente melhorado por uma comunidade que simplesmente
quer ver a Python cada vez melhor.

Linguagem de Alto Nvel

Quando voc escreve programas em Python, no h necessidade de se preocupar com detalhes


de baixo nvel tais como manipular a memria utilizada pelo programa, etc.

Portvel

Por ser uma linguagem de cdigo aberto, Python foi portada (ou seja, modificada para
funcionar) em muitas plataformas. Todos os seus programas em Python podem rodar em
qualquer uma destas plataformas sem precisar de mudanas, desde que voc seja cuidadoso o
suficiente para evitar usar caractersticas que dependam do sistema.

Voc pode usar Python em Linux, Windows, FreeBSD, Macintosh, Solaris, OS/2, Amiga,
AROS, AS/$)), BeOS, OS/390, z/OS, Palm OS, QNX, VMS, Psion, Acorn RISC OS, VxWorks,
PlayStation, Sharp Zaurus, Windows CE e at mesmo no PocketPC!

Interpretada

Isto requer uma pequena explicao

Um programa escrito em uma linguagem compilada como C ou C++ convertido da linguagem


de origem (C ou C++) para a linguagem que falada por seu computador (cdigo binrio, ou
seja, 0s e 1s) usando um compilador com vrios flags e opes. Quando voc roda o programa,
o software linkeditor/carregador copia o programa do disco rgido para a memria e comea a
execut-lo.

Python, por sua vez, no necessita de compilao para cdigo binrio. Voc simplemente
executa o programa diretamente do cdigo-fonte. Internamente, Python converte o cdigo-fonte
em um formato intermedirio chamado bytecode, o traduz para a linguagem nativa do seu
computador e ento o executa. Tudo isso, na verdade, torna Python muito mais fcil, uma vez
que voc no precisa se preocupar com a compilao do programa, certificar-se que as
bibliotecas necessrias esto todas linkeditadas e carregadas etc, etc. Isto tambm torna seus
programas em Python muito mais portveis, j que voc pode simplesmente copiar seu programa
em Python em outro computador e execut-lo!

Orientada a Objetos

Python suporta tanto programao procedural (estruturada) quanto orientada a objetos. Em


linguagens procedurais, o programa construdo com base em procedimentos e funes, que
nada mais so que trechos reutilizveis de programas. Em linguagens orientadas a objeto, com
base em objetos que combinam dados e funcionalidade. Python tem uma maneira simples mas
poderosa de implementar programao orientada a objetos, especialmente quando comparada a
linguagens como C++ ou Java.

Extensvel

Se voc precisa que um trecho crtico de cdigo seja executado com muita rapidez ou quer que
parte de algum algoritmo no seja aberta, voc pode codific-los em C ou C++ e ento us-los a
partir de seu programa Python.

Embarcvel

Voc pode embarcar Pyhton em seus programas C/C++ para fornecer funcionalidades de
scripting aos usurios dos programas.

Bibliotecas Extensivas

A Biblioteca Padro do Python (Python Standard Library) de fato enorme. Ela pode ajud-lo a
fazer vrias coisas envolvendo expresses regulares, gerao de documentao, testes unitrios,
threading, acesso a bancos de dados, browsers web, CGi, FTP, e-mail, XML, XML-RPC,
HTML, arquivos WAV, criptografia, GUI (Interfaces Grficas com o Usurio), Tk e outras
coisas dependentes do sistema. Lembre-se de que tudo isto est disponvel onde quer que
Python esteja instalado. Esta a chamada filosofia das "Pilhas Includas" do Python.

Alm da biblioteca padro, existem vrias outras bibliotecas de alta qualidade, tais comos
wxPython , Twisted, Python Imaging Library e muitas outras.
Python , de fato, uma linguagem poderosa e empolgante. Ela possui a combinao exata de
desempenho e caractersticas que fazem escrever programas em Python uma tarefa fcil e divertida.
Por que no Perl?
Se voc ainda no conhece, Perl outra linguagem de programao interpretada e de cdigo aberto
extremamente popular.

Se voc alguma vez tentou escrever um programa grande em Perl, voc poderia ter respondido essa
pergunta sozinho! Em outras palavras, programas em Perl so fceis quando eles so pequenos e so
excelentes para pequenos "hacks" e scripts "pra fazer o servio". No entanto, eles se tornam
rapidamente difceis de manter medida em que se tornam maiores. E estou falando isso com base na
minha experincia no Yahoo! escrevendo programas grandes em Perl.

Quando comparados a Perl, os programas em Python so definitivamente mais simples, claros, fceis
de escrever e, consequentemente, mais legveis e fceis de manter. Eu admiro Perl e uso diariamente
para vrias tarefas, mas toda vez que escrevo um programa, comeo a pensar em termos de Python,
porque se tornou natural para mim. Perl passou por tantos hacks e mudanas que parece que a
linguagem toda um grande (mas timo) hack. Infelizmente, o futuro Perl 6 no parece trazer
nenhuma melhoria quanto a isso.

A nica e bastante significativa vantagem do Perl, na minha opinio, sua enorme biblioteca CPAN
(Comprehensive Perl Archive Network). Como o nome sugere, uma imensa coleo de mdulos
Perl e simplesmente inacreditvel, por causa de seu tamanho e profundidade - voc pode fazer
praticamente qualquer coisa que seja possvel de se fazer com um computador usando estes mdulos.
Uma das razes pelas quais Perl tem mais bibliotecas que Python o fato de existir h muito mais
tempo. No entanto, isto parece estar mudando com o crescimento do Python Package Index.
Por que no Ruby?
Se voc ainda no sabia, Ruby uma outra popular linguagem de programao de cdigo aberto.

Se voc j gosta e usa Ruby, ento eu definitivamente recomendo que continue a us-la.

Para as outras pessoas que ainda no a usaram e esto tentando escolher entre aprender Python ou
aprender Ruby, ento eu recomendaria Python, unicamente pela perspectiva de facilidade de
aprendizado. Pessoalmente, achei difcil compreender a linguagem Ruby, mas todas as pessoas que
conseguem aprovam a beleza da linguagem. Infelizmente no tive tanta sorte.
O Que Os Programadores Dizem
interessante ler o que grandes hackers como ESR tm a dizer sobre Python:

Eric S. Raymond o autor de 'A Catedral e o Bazar' e tambm o indivduo que cunhou o
termo 'Open Source'. Ele diz que Python se tornou sua linguagem de programao favorita. Este
artigo foi a real inspirao para meu primeiro contato com Python.

Bruce Eckel o autor dos famosos livros 'Thinking in Java' e 'Thinking in C++'. Ele diz que
nenhuma outra linguagem o deixou to produtivo quanto Python. Diz ainda que Python talvez a
nica linguagem que se concentra em tornar as coisas mais fceis para o programador. Leia a
entrevista completa para mais detalhes.

Peter Norvig o conhecido autor do Lisp e Diretor de Qualidade de Busca no google


(obrigado a Guido van Rossum por avisar). Ele diz que Python sempre foi parte integrante do
Google. Esta afirmao pode ser comprovada verificando a pgina do Google Jobs que lista
conhecimento em Python como requisito para os engenheiros de software.
Sobre Python 3.0
Python 3.0 a nova verso da linguagem que ser lanada em breve. Tambm conhecida como
Python 3000 ou Py3k.

A motivao principal para uma nova verso de Python remover todos os pequenos problemas e
detalhes que foram se acumulando no decorrer dos anos e tornar a linguagem ainda mais limpa.

Se voc j tem muito cdigo Python 2.x, ento existe um utilitrio para ajudar na converso de cdigo
2.x para 3.x.

Mais detalhes em:

Introduo por Guido van Rossum


O que h de novo no Python 2.6 (recursos significativamente diferentes das verses anteriores
de Python 2.x e que provavelmente sero includos no Python 3.0)
O que h de novo no Python 3.0
Cronograma de lanamento do Python 2.6 e 3.0
Python 3000 (a lista oficial de mudanas propostas)
Planos diversos para Python 3.0
Novidades do Python (lista detalhada das mudanas)
Instalao
Se voc j tem o Python 2.x instalado, no preciso remov-lo para instalar o Python 3.0. Voc pode
manter ambos instalados ao mesmo tempo.
Contedo
1 Para usurios Linux e BSD
2 Para usurios Windows
2.1 Prompt do DOS
3 Para usurios MAC OS X
4 Sumrio
Para usurios Linux e BSD
Se voc est usando uma distribuio Linux como Ubuntu, Fedora, OpenSUSE ou {coloque sua
escolha aqu}, ou um sistema BSD tal como FreeBSD, ento provvel que voc j tenha o Python
instalado em seu sistema.

Para testar se o Python j est instalado em seu Linux, abra um shell (como konsole ou gnome-
terminal) e ento entre com o comando python -V como mostrado abaixo:

$ python -V
Python 3.0b1

Nota
$ o prompt do shell. Ele ser diferente para voc dependendo das configuraes do seu
sistema operacional, portanto eu indicarei o prompt apenas pelo smbolo $.

Se voc v alguma informao sobre a verso, como mostrado acima, ento o Python j est
instalado.

Contudo, se voc obter uma mensagem como esta:


$ python -V
bash: Python: command not found

Ento o Python no est instalado. Isto altamente improvvel, mas possvel.

Neste caso, voc tem dois meios para instalar o Python em seu sistema:

Voc pode compilar o cdigo fonte do Python e ento instal-lo. As instrues para a
compilao so informadas no website do Python.
Instalar os pacotes binrios usando um gerenciador de pacotes que vem com o seu sistema
operacional, tal como apt-get no Ubuntu/Debian e outros Linux baseados em Debian, yum no
Fedora, pkg_add no FreeBSD, etc. Voc precisar de uma conexo com a internet para usar este
mtodo. Uma alternativa baixar os binrios de algum outro lugar e ento copi-los e instal-
los em seu PC. [Esta opo estar disponvel aps o lanamento final do Python 3.0]
Para usurios Windows
Visite o site http://www.python.org/download/releases/3.0/ e baixe a ltima verso, que era a verso
3.0 beta 1, quando este livro foi escrito. Ele tem apenas 12.8 MB, o que bem compacto quando
comparado com a maioria das outras linguagens ou programas.

Cuidado
Quando for dada a opo para voc desmarcar componentes opcionais, no desmaque nenhum!
Alguns destes componentes podesm ser teis para voc, especialmente IDLE.

Um fato interessante que usurios Windows so os que mais baixam os arquivos do Python. claro
que isso no fornece uma viso geral, uma vez que quase todos os usurios Linux j tm o Python
instalado por padro em seus sistema.

Prompt do DOS
Se voc quer ser capaz de usar o Python da linha de comando do Windows, i.e. o prompt do DOS,
ento voc precisa configurar a varivel PATH corretamente.

Pra usurios Windows 2000, XP ou 2003, clique em Painel de Controle -> Sistema ->
Avanado -> Variveis de ambiente. Clique na varivel chamada PATH na seo 'Variveis de
Sistema', ento selecione Editar e adicione ;C:\Python30 no fim do que j estiver l. claro que
voc deve usar o diretrio correto onde voc instalou o Python.

Para verses antigas do Windows, adicione as seguintes linhas no arquivo C:\AUTOEXEC.BAT :


'PATH=%PATH%;C:\Python30' (sem as aspas) e reinicie o sistema. Em Windows NT use o arquivo
AUTOEXEC.NT.
Para usurios MAC OS X
Usurios Mac OS X j encontraro o Python instalado em seu sistema. Abra o Terminal.app e rode
python - V, e siga os conselhos da seo para usurios Linux.
Sumrio
Em um sistema Linux, provvel que voc j tenha o Python instalado. Caso contrrio, voc pode
instal-lo usando o gerenciador de pacotes que vem com sua distribuio. Em um sistema Windows,
instalar o Python to fcil como baixar o instalador e clicar duas vezes sobre ele. Daqui para frente
ns assumiremos que voc j est com o Python instalado em seu sistema.

A seguir ns escreveremos nosso primeiro programa em Python.


Primeiros Passos
Contedo
1 Introduo
2 Usando o Prompt do Interpretador
3 Escolhendo um Editor
4 Usando um Arquivo Fonte
4.1 Como ele Funciona
4.2 Programas Executveis em Python
5 Obtendo Ajuda
6 Sumrio
Introduo
Ns veremos agora como rodar o tradicional programa 'Ol Mundo' em Python. Isto ensinar a voc
como escrever, salvar e rodar programas no Python.

H duas formas de usar o Python para rodar um programa - usando o prompt do interpretador
interativo ou usando um arquivo fonte. Ns veremos como usar os dois mtodos.
Usando o Prompt do Interpretador
Inicie o interpretador na linha de comando digitando python prompt do shell.

Em sistemas Windows, voc pode rodar o interpretador na linha de comando se a varivel PATH
estiver corretamente configurada.

Se voc est usando o IDLE, clique em Iniciar Programas Python 3.0 IDLE (Python
GUI).

Agora digite print('Ol Mundo') e em seguida pressione a tecla Enter. Voc ver as palavras
Ol Mundo como sada.

$ python
Python 3.0b2 (r30b2:65106, Jul 18 2008, 18:44:17) [MSC v.1500 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Ol Mundo')
Ol Mundo
>>>

Perceba que o Python mostra a sada da linha imediatamente! O que voc acabou de digitar uma
simples instruo. Ns usamos print para imprimir qualquer valor que voc fornea. Aqui, ns
estamos fornecendo o texto Ol Mundo e este imediatamente impresso na tela.

Como Sair do Interpretador


Para sair do prompt, pressione ctrl-d se voc est usando o IDLE ou o shell do Linux/BSD.
No caso do prompt de comando do Windows, pressione ctrl-z seguido da tecla enter.
Escolhendo um Editor
Antes de comearmos a escrever programas em arquivos fonte, ns precisamos de um editor para
escrever estes arquivos. A escolha de um editor crucial. Voc deve escolher o editor como se voc
fosse escolher um carro novo. Um bom editor o ajudar a escrever programas para Python
facilmente, fazendo sua jornada mais confortvel e te ajudando a chegar em seu destino (atingindo
seu objetivo) de uma forma fcil e segura.

Uma das necessidades mais bsicas o destaque de sintaxe que torna colorida todas as diferentes
partes de seu programa, de forma que voc possa ver seu programa e visualizar seu funcionamento.

Se voc est usando o Windows, eu sugiro que voc use o IDLE. O IDLE destaca a sintaxe e permite
que voc rode seus programas dentro dele mesmo, alm de fazer outras coisas. Uma observao
especial: No use o Notepad - uma m escolha pois ele no destaca a sintaxe e tambm no tem
suporte a indentao do texto, que muito importante no nosso caso, como veremos adiante. Bons
editores tais como o IDLE (e tambm o VIM) automaticamente o ajudaro a fazer isso.

Se voc est usando Linux/FreeBSD, ento voc tem diversas escolhas para um editor. Se voc um
programador experiente, ento voc j deve estar usando Vim ou Emacs. desnecessrio dizer que
estes so dois dos mais poderosos editores e que voc ser beneficiado por us-los para escrever
seus programas em Python. Eu pessoalmente uso Vim para a maioria de meus programas. Se voc
um programador iniciante, voc pode usar o Kate, que um dos meus favoritos. No caso de voc ter
tempo para aprender Vim ou Emacs, ento eu realmente recomendo que voc aprenda a usar um deles,
pois ser de grande utilidade para voc em sua longa jornada.

Neste livro, ns usaremos o IDLE, nosso IDE (Integrated Development Environment - Ambiente
Integrado de Desenvolvimento) como editor. O IDLE instalado por padro com os instaladores
Python para Windows e Mac OS X. Ele tambm est disponvel para instalao em Linux e BSDs
nos seus respectivos repositrios.

Ns exploraremos como usar o IDLE na prxima seo. Para mais detalhes, por favor veja a
documentao do IDLE.

Se voc ainda deseja explorar outras escolhas para um editor, veja a ampla lista de editores para
Python e faa sua escolha. Voc tambm pode escolher um IDE para Python. Veja a ampla lista de
IDEs que suportam Python para mais detalhes. Uma vez que voc passe a escrever grandes
programas em Python, IDEs podem ser muito teis.

Eu repito novamente, por favor escolha um editor apropriado - ele pode fazer a elaborao de
programas em Python mais fcil e divertida.

Para usurios do Vim


H uma boa introduo sobre como tornar o Vim um poderoso IDE para Python por John M
Anderson.
Para usurios do Emacs
H uma boa introduo sobre como tornar o Emacs um poderoso IDE para Python por Ryan
McGuire.
Usando um Arquivo Fonte
Agora vamos voltar a programao. H uma tradio de que quando voc aprende uma nova
linguagem de programao, o primeiro programa que voc escreve e roda o 'Ol Mundo' - tudo que
ele faz apenas dizer 'Ol Mundo' quando voc o roda. Como Simon Cozens [1] diz, ele uma
'tradicional invocao para os deuses da programao ajudarem voc a aprender melhor a
linguagem' :) .

Inicie o editor escolhido, digite o seguinte programa e salve-o como olamundo.py

Se voc est usando o IDLE, clique sobre File New Window e ento entre com o seguinte
programa. Ento clique sobre File Save.
#!/usr/bin/python
#Filename: olamundo.py
print('Ol Mundo')

Rode este programa abrindo o shell (terminal Linux ou prompt do DOS) e entre com o comando
python olamundo.py.

Se voc est usando o IDLE, use o menu Run Run Module ou o atalho F5.

A sada semelhante a seguinte:


$ python olamundo.py
Ol Mundo

Se voc obter uma sada como acima, parabns! - voc rodou com sucesso seu primeiro programa
para Python.

No caso de um erro, pro favor digite o programa acima exatamente como mostrado e rode o
programa novamente. Note que Python case-sensitive i.e. print no o mesmo que Print - note o
p minsculo na primeira instruo e o P maisculo na segunda. Alm disso, assegure-se que no haja
espaos ou tabulaes antes do primeiro carcter de cada linha - ns veremos por que isso
importante mais tarde.

Como ele Funciona


Vamos considerar as duas primeiras linhas do programa. Elas so chamadas de comentrios -
qualquer coisa a direita do smbolo # um comentrio e usado principalmente como notas para o
leitor do programa.

Python no usa os comentrio, exceto para o caso especial da primeira linha. Ela chamada de linha
de organizao - sempre que os dois primeiros caracteres do arquivo fonte so #! seguidos pela
localizao de um programa, isto diz para seu sistema Linux/Unix que este programa deve ser rodado
com este interpretador quando voc executar o programa. Isto explicado em detalhes na prxima
seo. Note que voc sempre pode rodar o programa em qualquer plataforma especificando o
interpretador diretamente na linha de comando, como o comando python olamundo.py .

Importante
Use comentrio em seu programa de forma sensata, para explicar algum detalhe importante de
seu programa - isto til para que os leitores de seu programa possam entender facilmente o
que ele est fazendo. Lembre-se, est pessoa pode ser voc mesmo depois de seis meses!

Os comentrio so seguidos por uma instruo de Python. Aqui ns chamamos a funo print que
apenas imprime o texto 'Ol Mundo'. Ns aprenderemos sobre funes em um captulo posterior, o
que voc deve entender agora que o que voc colocar nos parnteses ser impresso na tela. Neste
caso, ns fornecemos 'Ol Mundo' que se refere a uma string - no se preocupe, ns vamos explorar
essas terminologias em detalhes mais tarde.

Programas Executveis em Python


Isto funciona apenas para usurios Linux/Unix, mas usurios do Windows podem estar curiosos sobre
a primeira linha do programa. Inicialmente, devemos dar ao programa a permisso para executar
usando o comando chmod e ento rodar o programa fonte.
$ chmod a+x olamundo.py
$ ./olamundo.py
Ol Mundo

O comando chmod usado aqui para mudar ('ch'ange) o modo ('mod'e) do arquivo dando permisso
para todos ('a'll) os usurio do sistema o executar (e'x'ecute). Ento, ns executamos o programa
diretamente especificando a localizao do arquivo fonte. Ns usamos o ./ para indicar que o
programa est no diretrio atual.

Para tornar as coisas mais divertidas, voc pode renomear o arquivo para olamundo e rod-lo com
./olamundo e ele ainda funcionar, uma vez que o sistema sabe que ele tem de rodar o programa
usando o interpretador cuja localizao especificada na primeira linha do arquivo fonte.

Agora voc capaz de rodar o programa desde que voc conhea o caminho exato para o arquivo
fonte - mas e se voc desejar rodar o arquivo de qualquer lugar? Voc pode fazer isso armazenando
o programa em um dos diretrios listados na varivel de ambiente PATH. Sempre que voc roda
qualquer programa, o sistema procura por aquele programa em cada diretrio listado na varivel de
ambiente PATHe ento roda aquele programa. Ns podemos tornar este programa disponvel em
qualquer lugar simplesmente copiando este arquivo fonte para um dos diretrios listados no PATH.
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/swaroop/bin
$ cp olamundo.py /home/swaroop/bin/olamundo
$ olamundo
Ol Mundo
Ns podemos mostrar a varivel PATH usando o comando echo e incluindo o prefixo $ para indicar
para o shell que ns precisamos do valor desta varivel. Ns vemos que /home/swaroop/bin um
dos diretrios na varivel PATH onde swaroop o nome de usurio que eu estou usando em meu
sistema. Provavelmente existe um diretrio similar para seu nome de usurio para seu sistema.
Alternativamente, voc pode adicionar um diretrio de sua escolha para a varivel PATH - isto pode
ser feito rodando PATH=$PATH:/home/swaroop/mydir onde '/home/swaroop/mydir' o diretrio
que eu desejo adicionar na varivel PATH.

Este mtodo muito til se voc deseja escrever scripts teis que voc queira rodar de qualquer
lugar, a qualquer hora. como criar seu prprio comando, semelhante ao cd ou qualquer outro
comando que voc use no terminal linux ou no prompt do DOS.

Cuidado
Em Python, um programa ou um script significam a mesma coisa.
Obtendo Ajuda
Se voc precisar de informao sobre alguma funo ou instruo em Python, ento voc pode usar a
funo embutida help. Isto muito til especialmente quando estiver usando o prompt do
interpretador. Por exemplo, rode help(print) - isto mostra a ajuda para a funo print que usada
para imprimir coisas na tela.

Nota
Pressione q para sair da ajuda.

De forma similar, voc pode obter informao sobre quase qualquer coisa em Python. Use help()
para aprender mais usando o prprio help!

No caso de voc precisar de ajuda para operadores como return, ento voc deve coloc-los dentro
de aspas como em help('return') dessa forma Python no se confunde com o que ns queremos
fazer.
Sumrio
Agora voc capaz ou de escrever,salvar e rodar programas em Python facilmente. Agora que voc
um usurio Python, vamos aprender alguns conceitos de Python.

References:

1. O autor do maravilhoso livro 'Beginning Perl'


Fundamentos
Imprimir 'Ol mundo' no suficiente, ou ? Voc quer fazer mais que isso - voc quer inserir dados,
manipul-los e obter alguma resposta a partir deles. Ns podemos conseguir isso em Python usando
constantes e variveis.
Contedo
1 Constantes Literais
2 Nmeros
3 Strings
3.1 Aspas Unitrias
3.2 Aspas Duplas
3.3 Aspas Triplas
3.4 Seqncias de Escape
3.5 Strings Brutas
3.6 Strings So Imutveis
3.7 Concatenao de Literais do Tipo String
3.8 O mtodo 'format'
4 Variveis
5 Nomenclatura de Identificadores
6 Tipos de Dados
7 Objetos
7.1 Exemplo: Utilizando variveis e constantes literais
8 Linhas Lgicas e Fsicas
9 Indentao
10 Resumo
Constantes Literais
Um exemplo de uma constante literal um nmero como 5, 1.23, 9.25e-3 ou uma string (sequncia
de caracteres) como 'Esta uma string' ou " uma string!". Ela denominada literal porque
literal - voc usa seu valor literalmente. O nmero 2 sempre representa a si mesmo e nada alm
disso - ele uma constante pois seu valor no pode ser mudado. Logo, todos esses valores referem-
se a constantes literais.
Nmeros
Os nmeros em Python so so de trs tipos - inteiros, ponto flutuante e complexos.

2 um exemplo de inteiro, os inteiros so os nmeros redondos.


3.23 e 52.3E-4 so exemplos de nmeros de ponto flutuante (ou floats, para abreviar). A
notao E indica as potncias de 10. Neste caso, 52.3E-4 significa 52.3 * 10-4.
(-5+4j) e (2.3 - 4.6j) so exemplos de nmeros complexos.

Nota para programadores experientes


No h o tipo 'long int' (inteiro longo) em separado. O tipo inteiro padro pode assumir
qualquer valor grande.
Strings
Uma string uma sequncia de caracteres. As strings so basicamente um amontoado de palavras.
As palavras podem estar em ingls ou em qualquer lngua que seja suportada pelo padro Unicode,
que atende a quase todas as lnguas do mundo.

Nota para programadores experientes


No h strings "somente em ASCII" porque o padro Unicode engloba o ASCII.
Por conveno, todas as stringas esto em UTF-8.

Eu posso garantir que voc usar strings em quase todos os programas que escrever em Python,
portanto preste ateno prxima parte sobre como usar strings em Python.

Aspas Unitrias

Vsoc pode especificar as strings usando aspas unitrias (ou apstrofes) tais como 'Use aspas
unitrias em mim'. Todos os espaos em branco, isto , espaos e tabulaes so preservados no
estado em que se encontram.

Aspas Duplas
As strings em aspas duplas trabalham exatamente da mesma maneira que as strings em aspas
unitrias. Eis um exemplo: "Qual o seu nome?"

Aspas Triplas
Voc pode especificar strings que ocupam vrias linhas usando aspas triplas - (""" ou '''). Voc pode
usar aspas unitrias e aspas duplas livremente para formar as aspas triplas. Eis um exemplo:

'''Esta uma string multi-linha. Esta a primeira linha.


Esta a segunda linha.
"Qual o seu nome?", eu perguntei.
Ele disse "Bond, James Bond."
'''

Seqncias de Escape
Suponha que voc queira obter uma string que contenha um apstrofe ('), como voc escrever essa
string? Por exemplo, a string What's your name?. Voc no pode escrever 'What's your
name?' porque o Python ficar confuso sobre onde a string comea e onde termina. Logo, voc ter
que especificar que este apstrofe no indica o fim da string. Isso pode ser feito com a ajuda do que
denominada uma sequncia de escape. Voc especifica o apstrofe como \' - note a barra invertida.
Agora, voc pode escrever a string como 'What\'s your name?'.

Uma outra maneira de escrever essa string especfica seria "What's your name?", isto , usando
aspas duplas. Da mesma maneira, voc pode usar uma sequncia de escape para inserir aspas duplas
em uma string limitada por aspas duplas. Voc tambm pode inserir a prpria barra invertida usando
a seqncia de escape \\.

O que fazer se voc quer escrever uma string de duas linhas? Uma soluo usar uma string limitada
por aspas triplas conforme foi ensinado previamente ou voc pode utilizar uma seqncia de escape
para o caracter de nova linha - \n para indicar o incio da nova linha. Eis um exemplo, Essa a
primeira linha\nEssa a segunda linha. Uma outra seqncia de escape til a ser conhecida
a tabulao - \t. H muitas outras seqncias de escape, mas eu mencionei aqui somente as mais
teis.

importante observar que numa string, uma nica barra invertida no fim da linha indica que a string
continua na prxima linha, mas nenhuma linha nova adicionada. Por exemplo:

"Essa a primeira frase.\


Essa a segunda frase."

equivale a "Essa a primeira frase. Essa a segunda frase.".

Strings Brutas
Se voc precisa escrever algumas strings onde nenhum processamento especial tais como as
seqncias de escape so manipuladas, ento o que voc precisa escrever uma string bruta
prefixando um r ou um R string . Eis um exemplo, r"Novas linhas so indicadas por \n".

Strings So Imutveis
Isso significa que uma vez que voc tenha criado uma string, voc no pode mud-la. Embora isso
parea como algo ruim, no realmente. Ns veremos porque isso no uma limitao nos diversos
programas que ns analisaremos mais adiante.

Concatenao de Literais do Tipo String


Se voc colocar duas strings literais lado a lado, elas so automaticamente concatenadas pelo
Python. Por exemplo, 'Qual ' 'o seu nome?' automaticamente convertido em "Qual o
seu nome?".

Nota para programadores C/C++


No h tipo de dado char (caracter) separado em Python. No existe nenhum motivo real para
isto e eu tenho certeza que voc no esquecer isto.
Nota para programadores Perl/PHP
Lembre-se que strings com aspas simples e duplas so a mesma coisa - elas no diferem entre si
Nota para Usurios de Expresso Regular
Sempre use strings brutas quando estiver manipulando expresses regulares. Do contrrio, ser
necessrio muito uso de caracteres de escape. Por exemplo, referncias a barras invertidas
podem ser feitas como '\\1' ou r'\1'.

O mtodo 'format'
As vezes ns iremos querer construir strings de uma outra informao. Isto onde o mtodo
format() til

#!/usr/bin/python
# Filename: str_format.py

age = 25
name = 'Swaroop'

print('{0} is {1} years old'.format(name, age))


print('Why is {0} playing with that python?'.format(name))

Sada:
$ python str_format.py
Swaroop is 25 years old
Why is Swaroop playing with that python?

Como isto funciona:

Uma string pode utilizar certas especificaes e sub consequentemente, o mtodo format pode ser
chamado de um substituto para estas especificaes correspondendo os argumentos ao mtodo
format.

Observe que est a primeira vez que usamos {0} e isto corresponde vriavel name que o
primeiro argumento ao mtodo 'format'. Similarmente, a segunda especificao {1} que
corresponde age que o segundo argumento ao mtodo 'format'. O que o Python faz aqui
substituir cada valor do argumento no lugar da especificao. Que pode ter especificaes mais
detalhadas como:
>>> '{0:.3}'.format(1/3) # decimal (.) precision of 3 for float
'0.333'
>>> '{0:_^11}'.format('hello') # fill with underscores (_) with the text
centered (^) to 11 width
'___hello___'
>>> '{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python') #
keyword-based
'Swaroop wrote A Byte of Python'

Detalhes desta especificao de formatao so explicados na Python Enhancement Proposal No.


3101. File:Example.jpg
Variveis
Usar apenas constantes literais pode se tornar algo chato - ns precisamos de alguma maneira de
armazenar qualquer informao, bem como manipul-la. a onde as variveis entram na jogada.
Variveis so exatamento o que seu nome significa - seu valor pode variar, isto , vce pode
armazenar qualquer coisa usando uma varivel. Variveis so apenas partes da memria do seu
computador nas quais voc armazena alguma informao. Diferentemente das constantes literais,
voc precisa de alguma maneira de acessar estas variveis e, portanto, voc d nomes a elas.
Nomenclatura de Identificadores
Variveis so exemplos de identificadores. Identificadores so nomes dados de maneira a identificar
algo. Existem algumas regras que voc ter que seguir para dar nome aos identificadores:

O primeiro caracter do identificador precisa ser uma letra do alfabeto (maisculo ASCII ou
minsculo ASCII ou caracter Unicode) ou um underscore ('_').
O restante do nome do identificador pode consistir de letras (maisculo ASCII ou minsculo
ASCII ou caracter Unicode), underscores ('_') ou dgitos (0-9).
Nomes de idenficadores so case-sensitive. Por exemplo, myname e myName no so o mesmo.
Note o minsculo n no primeiro e o maisculo N no segundo.
Exemplos de nomes de identificadores vlidos so i, __my_name, name_23, a1b2_c3 and
resum _count.
Exemplos de nomes de idenficadores invlidos so 2things, este contm espaos e my-
name.
Tipos de Dados
Variveis podem manter valores de diferentes tipos, chamados de tipos de dados. Os tipos bsicos
so nmeros e strings, que ns j discutimos. Nos prximos captulos, veremos como criar seus
prprios tipos usando classes.
Objetos
Lembre-se de que Python se refere a qualquer coisa usada em um programa como um objeto, em
sentido geral. Ao invs de dizer 'o alguma coisa', ns de dizemos 'o objeto'.

Nota para os usurios de Programao Orientada a Objetos


Python fortemente orientada a objetos, no sentido que tudo um objeto, incluindo nmeros,
strings e funes.

Agora veremos como usar variveis juntamento com constantes literais. Salve o exemplo a seguir e
execute o programa.

Como escrever programas em Python


Daqui em diante, o procedimento padro para salvar e executar um programa Python a
seguinte:
1. Abra o seu editor favorito.
2. Digite o cdigo do programa dado no exemplo.
3. Salve-o como um arquivo com o nome mencionado no comentrio. Eu sigo a conveno de
ter todos os programas em Python salvos com a extenso .py.
4. Execute o interpretador com o comando python program.py ou use o IDLE para executar
os programas. Voc tambm pode usar o mtodo executvel como explicado anteriormente.

Exemplo: Utilizando variveis e constantes literais


# Filename : var.py

i = 5
print(i)
i = i + 1
print(i)

s = '''Esta uma string de mltiplas linhas.


Esta a segunda linha.'''
print(s)

Output:
$ python var.py
5
6
Esta uma string de mltiplas linhas.

Esta a segunda linha.

Como funciona:

Como funciona:
Veja como este programa funciona. Primeiro, vamos atribuir o valor constante literal 5 varivel i
com o operador de atribuio (=). Esta linha chamada de instruo, pois indica que algo deve ser
feito e neste caso, ns estamos conectando o nome da varivel i ao valor 5. Em seguida, imprimimos
o valor de i com o comando print, que, obviamente, apenas imprime o valor da varivel na tela.

Ento somamos 1 ao valor armazenado em i e armazenmos de volta. Em seguida, imprimimos e,


como esperado, obtemos o valor tt>6</tt>.

Da mesma forma, atribumos a string literal para a varivel s e depois a imprimimos.

Nota para programadores de linguagens estticas


As variveis so usadas simplesmente atribuindo-lhes um valor. Nenhuma declarao ou definio
de tipo de dados necessria ou utilizada.
Linhas Lgicas e Fsicas
Uma linha fsica aquela que voc v quando escreve o programa. Uma linha lgica que o Python v
como uma nica instruo. Python implicitamente assume que cada linha fsica corresponde a uma
linha lgica.

Um exemplo de uma linha lgica uma instruo como print('Hello World') - se este estava em
uma linha por si s (como voc v no editor), ento isso tambm corresponde a uma linha fsica.

Implicitamente, Python incentiva o uso de uma nica instruo por linha, o que torna o cdigo mais
legvel.

Se voc quiser especificar mais de uma linha lgica em uma nica linha fsica, ento voc tem que
especificar explicitamente usando um ponto-e-vrgula (;) que indica o fim de uma linha lgica ou
instruo. Por exemplo,
i = 5
print(i)

o mesmo que
i = 5;
print(i);

e o mesmo pode ser escrito como


i = 5; print(i);

ou ainda

i = 5; print(i)

No entanto, eu recomendo fortemente que voc se atenha a escrever somente uma nica linha
lgica para cada linha fsica. Use mais de uma linha fsica para uma nica linha lgica apenas se a
linha lgica for realmente comprida. A ideia evitar o ponto-e-vrgula tanto quanto possvel, uma
vez que isso conduz a um cdigo mais legvel. De fato, eu nunca utilizei ou sequer vi um ponto-e-
vrgula num programa Python.

Segue um exemplo da escrita de uma linha lgica se estendendo por muitas linhas fsicas. Nos
referimos a isso com juno explcita de linhas
s = 'Isto uma string. \
Isto continua a string.'
print(s)

Isso nos d a sada:


Isto uma string. Isto continua a string.

Similarmente,

print\
(i)

o mesmo que

print(i)

Em alguns casos no necessrio utilizar barra invertida. Nesses casos a linha lgica usa parnteses,
colchetes ou chaves. Isto se chama juno implcita de linha. Voc pode v-la em ao quando
escrevermos programas usando listas em captulos posteriores.
Indentao
Espaos so importantes em Python. Na verdade, espaos no incio da linha so importantes. Isto
chamado de indentao. Espaos (espaos e tabs) no incio da linha lgica so usados para
determinar o nvel de indentao da linha lgica, o qual por sua vez usado para determinar o
agrupamento de instrues

Isto significa que as instrues que vo juntas devem ter a mesma indentao. Cada conjunto dessas
instrues chamada de bloco. Veremos exemplos de como os blocos so importantes nos captulos
seguintes.

Uma coisa que voc deve lembrar que indentao inadequada pode ocasionar erros. Por exemplo:

i = 5
print('O valor ', i) # Erro! Perceba um espao no incio da linha
print('Eu repito, o valor ', i)

Quando voc executa isso, obtm o seguinte erro:


File "whitespace.py", line 4
print('O valor ', i) # Erro! Perceba um espao no incio da linha
^
IndentationError: unexpected indent

Perceba que h um espao no incio da segunda linha. O erro indicado pelo Python nos diz que a
sintaxe do programa invlida, isto , o programa no foi escrito direito. O que isso quer dizer que
voc no pode iniciar novos blocos de instrues arbitrariamente (exceto pelo bloco principal
padro que voc vem usando o tempo todo, claro). Casos nos quais voc pode usar novos blocos
sero detalhados em captulos posteriores, tais como o captulo sobre controle de fluxo.

Como indentar
No use uma mistura de tabs e espaos para a indentao, pois isso no funciona
adequadamente em diferentes plataformas. Eu recomendo fortemente que voc use um nico tab
ou quatro espaos para cada nvel de indentao.
Escolha qualquer um desses dois estilos de indentao. Mais importante, escolha um e use
consistentemente, isto , use somente aquele estilo de indentao.

Nota para programadores de linguagens estticas


Python sempre utiliza indentao para blocos e nunca utiliza chaves. Execute from __future__
import braces para aprender mais.
Resumo
Agora que ns discutimos vrios detalhes vitais, podemos seguir para coisas mais interessantes como
declaraes de controle de fluxo. Certifique-se de que voc Certifique-se de que voc j est
confortvel com o que voc leu nesse captulo.
Operadores e Expresses
Contedo
1 Introduo
2 Operadores
3 Precendncia de Operadores
4 Ordem de avaliao
5 Associatividade
6 Expresses
6.1 Usando Expresses
7 Sumrio
Introduo
A maioria das instrues (linhas lgicas) que voc escrever iro conter expresses. Um exemplo
simples de expresso 2 + 3. Uma expresso pode ser divida em operadores e operandos.

Operadores definem que operao ser realizada e podem ser representados por smbolos como + ou
por palavras-chave especiais. Operadores requerem dados para funcionar e tais dados so chamados
operandos. Neste caso, 2 e 3 so os operandos.
Operadores
Iremos dar uma breve olhada nos operadores e sua utilizao:

Perceba que voc pode testar as espresses dadas nos exemplos usando o interpretador interativo.
Por exemplo, para testar a expresso 2 + 3, use o interpretador interativo do Python:

>>> 2 + 3
5
>>> 3 * 5
15
>>>

Operadores e sua utilizao

Operador Nome Explicao Exemplos

+ Adio Soma dois objetos 3 + 5 retorna 8. 'a' + 'b' retorna 'ab'.

Torna um nmero
-5.2 retorna um nmero negativo. 50 - 24
- Subtrao negativo ou a subtrao
retorna 26.
de um nmero por outro

Retorna o produto de
dois nmeros ou uma
* Multiplicao 2 * 3 retorna 6. 'la' * 3 retorna 'lalala'.
string repetida uma certa
quantidade de vezes.

Retorna x elevado
** Potncia 3 ** 4 retorna 81 (i.e. 3 * 3 * 3 * 3)
potncia de y

/ Diviso Divide x por y 4 / 3 retorna 1.3333333333333333.

Diviso Retorna a parte inteira do


// 4 // 3 retorna 1.
Inteira quociente

Retorna o resto da
% Modulo 8 % 3 retorna 2. -25.5 % 2.25 retorna 1.5.
diviso
Desloca os bits do
nmero para a esquerda
pelo nmero de bits 2 << 2 retorna 8. 2 representado por 10 em
Deslocamento especificado. (Cada
bits. Deslocando os bits do nmero esquerda
<< de bits nmero representado na por 2 bits retorna 1000, que representa o
esquerda memria por bits ou nmero decimal 8.
digitos binrios i.e. 0 and
1)

Desloca os bits do 11 >> 1 retorna 5. 11 representado em bits


Deslocamento
nmero para a direita por 1011 que quando os bits so deslocados
>> de bits
pelo nmero de bits para a direita por 1 bit retorna 101, que o
direita
especificado. nmero decimal 5.

Bits configurados nos


sOperador bit dois operadores so
& 5 & 3 retorna 1.
a bit AND configurados no
resultado

Bits configurados em um
Operador bit ou outro operador so
| 5 | 3 retorna 7
a bit OR configurados no
resultado

Bits configurados em um
ou outro operador, mas
Operador bit
^ no em ambos, so 5 ^ 3 retorna 6
a bit XOR
configurados no
resultado

Bits configurados no
Operador bit operador no so
~ ~5 retorna -6.
a bit NOT configurados no
resultado e vice-versa.

Retorna se x menor que


y. Todos os operadores 5 < 3 retorna False e 3 < 5 retorna True.
de comparo retornam
< Menor que
True(verdadeiro) ou Comparaes podem ser encadeadas
False(falso). Note a arbitrariamente: 3 < 5 < 7 retorna True.
capitalizao dos nomes.

5 > 3 retorna True. Se os dois operadores


Retorna se x maior que forem nmeros, eles so antes convertidos a um
> Maior que
y tipo comum. De outra maneira, ser sempre
retornado False.

Menor ou Retorna se x menor ou


<= x = 3; y = 6; x <= y retorna True.
igual a igual a y

Maior ou Retorna se x maior ou


>= x = 4; y = 3; x >= 3 retorna True.
igual a igual a y

x = 2; y = 2; x == y retorna True.

x = 'str'; y = 'stR'; x == y retorna


Compara se os objetos
== Igual a False.
so iguais
x = 'str'; y = 'str'; x == y retorna
True.

Compara se os objetos
!= Diferente de x = 2; y = 3; x != y retorna True.
so diferentes

Operador Se x True, ele retorna


not booleano False. Se x False, ele x = True; not y retorna False.
NOT retorna True.

x = False; y = True; x and y retorna


False desde que x seja False. Neste caso,
Operador x and y retorna False Python no ir avaliar y desde que ele saiba
and booleano se x False, seno ele que o lado esquerdo da espresso 'and' False
AND retorna a avaliao de y o que implica que toda a espresso ser False
independente do outro valor. isso chamado
short-circuit evaluation.
or Operador Se x True, ele retorna x = True; y = False; x or y retorna
booleano OR True, seno ele retorna a True. A Short-circuit evaluation se aplica aqui
avaliao de y tambm.
Precendncia de Operadores
Se voc tem uma expresso como 2 + 3 * 4, ser realizada primeiro a adio ou a multiplicao?
A matemtica do nosso ensino mdio nos diz que a multiplicao deve ser realizada primeiro. Isso
significa que o operador de multiplicao possui maior precedncia que o operador de adio.

A tabela a seguir nos d a ordem de precedncia de operadores para o Python, do de menor


precedncia (least binding) ao de maior precedncia (most binding). Isto significa que em uma dada
expresso, Python ir primeiramente avaliar os operadores listados na base da tabela antes dos
operadores listados ao topo.

A tabela a seguir (tirada de Manual de referncia Python) proporcionada visando maior


entendimento. muito melhor usar parnteses para agrupar operadores e operandos apropriadamente
de maneira que fique clara a precedncia. Isso torna o programa mais legvel. Veja #Ordem de
Avaliao abaixo para detalhes.

Precedncia de Operadores

Operador Descrio

lambda Expresso Lambda

or Operador Booleano OR

and Operador Booleano AND

not x Operador Booleano NOT

in, not in Testes de membros/existncia

is, is not Testes de identidade

<, <=, >, >=, !=, == Comparaes

| Operador bit-a-bit OR
^ Operador bit-a-bit XOR

& Operador bit-a-bit AND

<<, >> Deslocamentos de bits

+, - Adio e subtrao

*, /, //, % Multiplicao, Diviso, Diviso inteira e Resto

+x, -x Positivo, Negativo

~x sOperador bit-a-bit NOT

** Exponenciao

x.atributo Referencia a atributo

x[ndice] Subscrio

x[ndice1:ndice2] Repartio

f(argumentos ...) Chamada de funo

(expresses, ...) Uniao ou exibio de tupla

[expresses, ...] Exibio de listas

{chave:dado, ...} Exibio de dicionrio


Os operadores que ainda no vimos sero explicados em captulos posteriores.

Operadores com a mesma precedncia so listados na mesma linha na tabela acima. Por exemplo, +
e - possuem a mesma precedncia.
Ordem de avaliao
Por padro, a tabela de precedncia dos operadores decide que operadores so avaliados primeiro.

Para tornar uma expresso mais legvel podemos usar parnteses. Por exemplo, 2 + (3 * 4) ,
definitivamente, mais fcil de entender que 2 + 3 * 4 que requer conhecimento da ordem de
precedncia dos operadores. Assim como todo o resto, parnteses devem ser usados conscientemente
(no sobrecarregue) e no devem ser redundantes (como em 2 + (3 + 4)).

Se voc quer mudar a ordem em que eles so avaliados, voc pode, novamente, usar parnteses. Por
exemplo, se voc quer que a adio seja realizada antes da multiplicao em uma expresso, ento
voc pode escrever algo como (2 + 3) * 4.
Associatividade
Operadores so, geralmente, associados da esquerda para a direita, isto , operadores com a mesma
procedncia so avaliados da esquerda para a direita. Por exemplo, 2 + 3 + 4 avaliado como (2
+ 3) + 4. Alguns operadores, como os de atribuio, possuem a associatividade da direira para a
esquerda, isto , a = b = c tratado como a = (b = c).
Expresses
Usando Expresses

Exemplo:
#!/usr/bin/python
# Nome do Arquivo: expressao.py

length = 5
breadth = 2

area = length * breadth


print('rea ', area)
print('Permetro ', 2 * (length + breadth))

Sada:
$ python expressao.py
rea 10
Perimetro 14

Como Funciona:

O tamanho e amplitude do retngulo so armazenados nas variveis length e breadth. Ns os


utilizamos para calcular a rea e o permetro do retngulo com a ajuda de expresses. Armazenamos
o resultado da expresso length * breadth na varivel area e ento o imprimimos usando a
funo print. No segundo caso, usamos o valor da expresso 2 * (length + breadth)
diretamente na funo print.

Perceba, tambm, como o Python faz a 'impresso elegante' (pretty-print) da sada. Mesmo que no
tenhamos especificao um espao entre 'rea ' e a varivel area, Python coloca-o para ns de uma
maneira que tenhamos uma sada limpa e bonita, e o programa muito mais legvel dessa maneira
(desde que no tenhamos que nos preocupar com espaamento na string que utilizamos para a sada).
Isto um exemplo de como o Python torna mais fcil a vida do programador.
Sumrio
Vimos como utilizar operadores, operandos e expresses - estes so os blocos de construo bsicos
de qualquer programa. A seguir, veremos como fazer uso deles em nossos programas atravs de
indicao.
Controle de Fluxo
Contedo
1 Introduo
2 A instruo IF
3 A instruo while
4 O loop for
5 A instruo break
5.1 Python Potico do Swaroop
6 A Instruo continue
7 Sumrio
Introduo
Nos programas que vimos at agora, houveram uma srie de declaraes e o Python executa-os na
mesma ordem. E se voc quisesse alterar o fluxo de seu funcionamento? Por exemplo, voc quer que
o programa tome algumas decises e faa diferentes coisas dependendo das diferentes situaes,
como imprimir 'Bom Dia' ou 'Boa Tarde' dependendo da hora do dia?

Como voc deve ter pensando, isto alcanado usando as instrues de controle de fluxo no Python -
if, for e while.
A instruo IF
A instruo if usada para verificar uma condio e se a condio verdadeira, ser executado um
bloco de instrues (chamado de bloco-if(if-block)), seno ser processado outro bloco de
instrues (chamado de bloco-else(else-block)). A clusula else opcional.

Exemplo:
#!/usr/bin/python
# Nome do aquivo: if.py

number = 23
guess = int(input('Entre com um nmero inteiro : '))

if guess == number:
print('Parabns, voc advinhou.') # Novo bloco comea aqui
print('(mas voc no ganhou nenhum prmio!)') # Novo bloco termina aqui
elif guess < number:
print('No, era um pouco maior que isso') # Outro bloco
# Voc pode fazer o que quiser em um bloco ...
else:
print('No, era um pouco menor que isso')
# Voc deve adivinhar > nmero a alcanar aqui

print('Feito')
# Esta ltima instruo sempre executada, depois da instruo if ser executada

Sada:
$ python if.py
Entre com um nmero inteiro : 50
No, era um pouco menor que isso
Feito

$ python if.py
Entre com um nmero inteiro : 22
No, era um pouco maior que isso
Feito

$ python if.py
Entre com um nmero inteiro : 23
Parabns, voc advinhou.
(mas voc no ganhou nenhum prmio!)
Feito

Como Funciona:

Neste programa, recebemos tentativas de advinhaes do usurio e verificamos se este igual ao


nmero que temos. Setamos a varivel number para qualquer inteiro que desejarmos, digamos 23.
Ento, pegamos a tentativa de advinhao do usurio usando a funo input(). Funes so peas
de programas reutilizveis. Iremos ler mais sobre elas no prximo captulo.
Ns fornecemos uma string para funo enbutida input que a imprime na tela e aguarda uma entrada
do usurio. Uma vez que entramos com algum valor e apertamos a tecla enter, a funo input()
retorna o valor que entramos, como uma string. Ns, ento, convetemos essa string para um inteiro
usando int e depois armazenamos na varivel guess. Na verdade, o int uma classe, mas tudo o
que vo precisa saber agora que voc pode us-la para converter uma string em um nmero inteiro
(assumindo que a string contm um nmero inteiro vlido no texto).

A seguir, comparamos a tentativa de adivinhao do usurio com o nmero que escolhemos. Se eles
forem iguais, imprimimos uma mensagem de sucesso. Note que utilizamos nveis de indentaopara
dizer ao Python que instrues pertencem a qual bloco. pos isso que a indentao to importante
no Python. Eu espero que voc esteja mantendo a regra da "indentao consistente". Voc est?

Perceba que a instruo if contm 'dois pontos' no final - ns estamos indicando ao Python que a
seguir h um bloco de instrues.

Ento, checamos se a tentativa de advinhao do usurio menor que o nmero da varivel number,
e se for verdadeiro, informamos ao usurio para tentar com um nmero um pouco maior que o
inserido. O que usamos aqui a clausula elif que, na verdade, combina duas instrues if else-
if else relacionadas em uma instruo if-elif-else combinada. Isso torna o programa mais fcil
e reduz quantidade de indentaes requeridas.

As instrues elif else devem, tambm, possuir 'dois pontos' no final da linha lgica, seguido pelo
seu bloco de instrues correspondente (com indentao apropriada, claro).

Voc pode ter outra instruo if dentro de um bloco-if de uma instruo if if a assim por diante -
isto chamado de instruo if aninhada

Lembre que as partes elif e else so opcionais. Uma instruo if mnima vlida :

if True:
print('Sim, verdadeiro')

Depois que python terminou de executar a instruo if completamente, junto com as clusulas elif e
else associadas, ele passa para a prxima instruo no bloco contendo a instruo if. Neste caso,
o bloco principal onde a execuo do programa inicia e a prxima instruo print('Feito').
Depois disso, Python v o final do programa e simplesmente termina.

Ainda que este seja um programa muito simples, eu estive apontando vrias coisas que voc deve
notar em programas assim. Todas elas so bem avanadas (e surpreendentemente simples para todos
vocs com conhecimento em C/C++) e requerem que voc esteja inicialmente ciente de todas elas,
mas depois disso, voc ir se familiarizar e isso ir se tornar 'natural' para voc.

Nota para os programadores de C/C++


No h a instruo switch no Python. Voc pode usar uma instruo if..elif..else para
fazer a mesma coisa (e em alguns casos, usar um dicionrio para faz-lo rapidamente)
A instruo while
A instruo while permite que voc execute repetidamente um bloco de instrues enquanto uma
condio for verdadeira. Uma instruo while um exemplo do que chamado de instruo de
looping. Uma instruo while pode ter uma clusula else opcional.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: while.py

number = 23
running = True

while running:
guess = int(input('Entre com um nmero inteiro : '))

if guess == number:
print('Parabns, voc advinhou.')
running = False # Isto faz o loop while parar
elif guess < number:
print('No, um pouco maior que este.')
else:
print('No, um pouco menor que este.')
else:
print('O loop while terminou.')
# Faa qualquer outra coisa que quiser aqui

print('Fim')

Sada:
$ python while.py
Entre com um nmero inteiro : 50
No, um pouco menor que este.
Entre com um nmero inteiro : 22
No, um pouco maior que este.
Enter an integer : 23
Parabns, voc advinhou.
O loop while terminou.
Fim

Como funciona:

Neste programa, ns ainda estamos jogando o jogo da advinhao, mas a vantagem que o usurio
pode continuar tentando advinhar at que ele acerte o nmero - no ha necessidade de rodar
novamente o programa para cada tentativa de adivinhao, como fizemos na seo anterior. Isto
demonstra o uso da instruo while.

Ns movemos oinput e a instruo if para dentro do loop while e setamos a varivel running
para True antes do loop while. Primeiro, ns checamos se a varivel running True(verdadeiro) e
ento seguimos para executar executar o <emphasis>bloco while</emphasis> correspondente.
Depois que o bloco executado, a condio novamente checada que neste caso a varivel
running. Se isso verdade, ns executamos o bloco while novamente, seno continuamos para
executar o bloco else optional e ento seguir para a prxima instruo.

O bloco else executado quando a condio do loop while se torna False(falso) - esta pode at
ser a primeira vez que a condio verificada. Se h alguma clusula else para um loop while, ele
sempre executado a menos que voc tenha um loop while que se executado para sempre sem sair
sequer uma vez!

Os valores True(verdadeiro) e False(falso) so chamados tipos Booleanos e voc pode consider-


los equivalentes aos valores 1 e 0 respectivamente.

O bloco else , na verdade, redundante a partir que voc pode colocar estas instrues no mesmo
bloco (como a instruo while) depois da instruo while para conseguir o mesmo efeito.

Nota para programadores de C/C++


Lembre que voc pode ter uma clusula else else para o loop while.
O loop for
A instruo for..in outra instruo de loop que itera sobre uma sequncia de objetos, por
exemplo, percorre cada item em uma sequncia. Iremos ver mais sobre sequncias em detalhes em
captlos posteriores. O que voc precisa saber agora que uma sequncia apenas uma coleo
ordenada de itens.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: for.py

for i in range(1, 5):


print(i)
else:
print('O loop for terminou.')

Sada:
$ python for.py
1
2
3
4
O loop for terminou.

Como funciona:

Neste programa, estamos imprimindo uma sequncia de nmeros. Ns geramos esta sequncia de
nmeros usando a funo interna range.

O que fazemos fornecer dois nmeros e range retorna uma sequncia de nmeros iniciando do
primeiro nmero e segue at o segundo nmero. Por exemplo, range(1,5) nos d a sequncia [1,
2, 3, 4]. Por padro, range d um passo contando de 1 em 1. Se fornecer-mos um terceiro nmero
para range, ento ele se torna o tamanho do passo. Por exemplo, range(1,5,2) nos d [1,3].
Lembre-se que range extende-se at o segundo nmero, ou seja, ele no inclui o segundo nmero.

O loop for ento itera sobre esta faixa - for i in range(1,5) equivalente a for i in [1, 2,
3, 4] que a mesma coisa que atribuir cada nmero (ou objeto) na sequncia a i, um de cada vez, e
ento executar o bloco de instries para cada valor de i. Neste caso, ns apenas imprimimos o
valor no bloco de instrues.

Lembre-se que a parte else opcional. Quando includa, ela ser sempre executada uma vez aps o
loop for ter terminado, a no ser que uma instruo break seja encontrada.

Lembre-se que o loop for..in funciona para qualquer sequncia. Aqui, temos uma lista de nmeros
gerados pela funo interna range, mas, no geral, podemos usar qualquer tipo de sequncia de
qualquer tipo de objeto! Iremos explorar essa idia em detalhes em captulos posteriores.

Nota para programadores de C/C++/Java/C#


O loop for do Python radicalmente diferente do loop for das linguagens C/C++.
Programadores da linguagem C# iro notar que o loop for no Python similar ao loop foreach
em C#. Programadores da linguagem Java iro notar que o mesmo similar a for (int i :
IntArray) em Java 1.5 .
Em C/C++, se voc quer escrever for (int i = 0; i < 5; i++), ento em Python voc
escreve apenas for i in range(0,5). Como voc pode ver, o loop for mais simples, mais
expressivo e menos propenso a erros no Python.
A instruo break
A instruo break usada para quebrar uma instruo de loop, ou seja, para a execuo de uma
instruo de loop, mesmo que a condio no tenha se tornado False ou a sequncia de itens tenha
sido iterada completamente.

Uma informao importante que se voc quebra um loop for ou while, qualquer bloco else
correspondente no executado.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: break.py

while True:
s = input('Entre com alguma coisa: ')
if s == 'sair':
break
print('Tamanho da string ', len(s))
print('Feito')

Sada:
$ python break.py
Entre com alguma coisa: Programar divertido
Tamanho da string 21
Entre com alguma coisa: Quando o trabalho est feito
Length of the string is 28
Entre com alguma coisa: se voc quer tornar seu trabalho tambm divertido:
Tamanho da string 51
Entre com alguma coisa: use Python!
Tamanho da string 12
Entre com alguma coisa: sair
Feito

Como funciona:

Neste programa, ns recebemos os dados de entrada do usurio repetidamente e imprimimos o


tamanho de cada entrada toda vez. Estamos provendo uma condio especial para parar o programa
verificando se a entrada do usurio 'sair'. Paramos o programa com
<emphasis>break</emphasis>, fazendo com que saiamos do loop e alcancemos o fim do programa.

O tamanho da entrada pode ser encontrado utilizando a funo interna len.

Lembre-se que a instruo break pode tambm ser usada com o loop for.

Python Potico do Swaroop


Os dados de entrada que utilizei aqui um mini poema que escrevi chamado Python Potico do
Swaroop:

Programar divertido
Quando o trabalho est feito
se voc quer tornar seu trabalho tambm divertido:
use Python!
A Instruo continue
A instruo continue usada para dizer ao Python que pule as intrues restantes do bloco de loop
corrente e para continuar (continue) na iterao seguinte do loop.

Exemplo:

#!/usr/bin/python
# Arquivo: continue.py

while True:
s = input('Entre com algo : ')
if s == 'sair':
break
if len(s) < 3:
print('Muito pequeno')
continue
print('A entrada de tamanho suficiente')
# Faa outros tipos de processo aqui...

Sada:
$ python continue.py
Entre com algo : a
Muito pequeno
Entre com algo : 12
Muito pequeno
Entre com algo : abc
A entrada de tamanho suficiente
Entre com algo : sair

Como funciona:

Neste programa, aceitamos entradas do usurio, mas as processamos somente se ela possurem pelo
menos 3 caracteres. Ento, utilizamos a funo interna len para pegar o tamanho e se este for menor
que 3, pulamos o resto das instrues no bloco utilizando a instruo continue. Seno, o resto das
instrues no loop so executadas e poderemos fazer qualquer tipo de processamento que quiser-mos
aqui.

Note que a instruo continue funciona, tambm, com o loop for.


Sumrio
Vimos como utilizar as trs instrues de controle de fluxo - if, while and for, em conjunto com
suas instrues break e continue associadas. Estas so algumas das partes mais utilizadas do
Python e outras, tornar-se confortvel com elas essencial.
Funes
Contedo
1 Introduo
2 Parmetros da Funo
3 Variveis Locais
4 Usando o comando global
5 Usando o comando nonlocal
6 Valores padro de argumentos
7 Argumentos Nomeados
8 Parmetros VarArgs
9 Parmetros apenas por palavra-chave
10 O comando return
11 DocStrings
12 Anotaes
13 Sumrio
Introduo
Funes so pedaos reutilizveis de programas. Elas permitem dar um nome para um bloco de
cdigo e rod-lo usando seu nome em qualquer lugar do programa, quantas vezes forem necessrias.
Isto conhecido como chamar a funo. Ns j usamos muitas funes internas como len e range.

O conceito de funo provavelmente o bloco de construo mais importante de qualquer programa


no-trivial (em qualquer linguagem de programao), portanto vamos explorar vrios aspectos das
funes neste captulo.

Funes so definidas usando a palavra-chave def. A mesma seguida pelo seu nome identificador,
um par de parnteses que podem conter ou no nomes de variveis separados por vrgula, e por dois
pontos ao final da linha. Em seguida o bloco de cdigo que faz parte desta funo. Um exemplo
abaixo ir mostrar que isto realmente muito simples:

Exemplo:
#!/usr/bin/python
# Filename: funcao1.py

def digaOla():
print('Ol Mundo!') # bloco pertencente funo
# Fim da funo

digaOla() # chamando a funo


digaOla() # chamando a funo denovo

Output:
$ python funcao.py
Ol Mundo!
Ol Mundo!

Como isto funciona:

Definimos a funo chamada digaOla usando a sintaxe como explicado abaixo. Esta funo no
recebe parmetros e conseqentemente no h variveis declaradas entre parnteses. Para as
funes, parmetros so somente uma entrada que podemos passar diferentes valores e receber
resultados correspondentes.

Repare que podemos chamar a mesma funo duas vezes, o que significa que no temos que escrever
o mesmo cdigo de novo.
Parmetros da Funo
Uma funo pode receber parmetros, que so valores fornecidos funo para que a mesma possa
fazer algo til com os mesmos. Estes parmetros so como variveis, exceto que os valores destas
variveis so definidos quando chamamos a funo e j esto atribudos quando a funo
executada.

Parmetros so especificados dentro do par de parnteses na definio da funo, separados por


vrgulas. Quando chamamos a funo, passamos os valores da mesma maneira. Note a terminologia
utilizada - os nomes dados na definio da funo so chamados de parmetros enquanto que os
valores que fornecemos na chamada da funo so chamados de argusmentos.

Exemplo:

#!/usr/bin/python
# Filename: func_param.py

def printMax(a, b):


if a > b:
print(a, 'is maximum')
else:
print(b, 'is maximum')

printMax(3, 4) # valores literais passados para a funo

x = 5
y = 7

printMax(x, y) # passando variveis como argumentos

Sada:

$ python func_param.py
4 is maximum
7 is maximum

Como funciona:

Aqui definimos uma funo chamada printMax que recebe dois parmetros chamados a e b.
Encontramos o maior nmero usando um simples comando if..else e ento imprimindo o maior
nmero.

No primeiro uso de printMax, nos passamos diretamente os nmeros (argumentos). No segundo,


chamamos a funo usando variveis. printMax(x, y) faz com que o valor do argumento x seja
atribudo ao parmetro a e o valor do argumento y atribudo ao parmetro b. A funo printMax
funciona da mesma maneira em ambos os casos.
Variveis Locais
Quando voc declara variveis dentro de uma definio de funo, elas no esto relacionadas de
forma alguma com outras variveis com os mesmos nomes usados fora da funo, ou seja, variveis
locais em relao funo. Isto o que se chama de escopo da varivel. Todas as variveis tm o
escopo do bloco no qual so declaradas, a partir do ponto da definio do seu nome.

Exemplo:
#!/usr/bin/python
# Filename: func_local.py

def func(x):
print('x is', x)
x = 2
print('Varivel local x mudou para', x)

x = 50
func(x)
print('x continua', x)

Sada:
$ python func_local.py
x is 50
Varivel local x mudou para 2
x continua 50

Como funciona:

Na funo, a primeira vez que usamos o valor do nome x, o Python utiliza o valor do parmetros
declarado na funo.

Em seguida, atribumos o valor 2 a x. O nome x local nossa funo. Ento, quando mudamos o
valor de x na funo, o x definido no bloco principal permanece inalterado.

No ltimo comando print, confirmamos que o valor de x no bloco principal est de fato inalterado.
Usando o comando global
Se voc quer atribuit um valor a um nome definido no nvel mais alto do programa, ou seja, fora de
qualquer tipo de escopo tal como funes ou classes, ento voc tem que dizer ao Python que o nome
no local, mas sim global. Fazemos isso usando o comando global. impossvel atribuir um valor
a uma varivel definida fora de uma funo sem utilizar o comando global.

Voc pode usar os valores dessas variveis globais definidas fora da funo, assumindo que no haja
nenhuma varivel com o mesmo nome dentro da funo. No entanto, isso no recomendado e deve
ser evitado, uma vez que no fica claro para o leitor do programa onde est a definio da varivel.
Usar o comando global torna claro que a varivel foi definida no block mais externo.

Exemplo:

#!/usr/bin/python
# Filename: func_global.py

def func():
global x

print('x ', x)
x = 2
print('Varivel global x mudou para', x)

x = 50
func()
print('O valor de x ', x)

Sada:
$ python func_global.py
x is 50
Varivel global x mudou para 2
O valor de x 2

Como funciona:

O comando global usado para declarar que x uma varivel global. Assim, quando vamos atribuir
um valor a x dentro da funo, essa mudana refletida quando usamos o valor de x no bloco
principal.

Voc pode especificar mais de uma varivel global usando o mesmo comando global. Por exemplo,
global x, y, z.
Usando o comando nonlocal
Vimos acima como acessar variveis nos escopos local e global. Existe outro tipo de escopo
chamado "nonlocal", que um meio termo entre esses dois tipos de escopo. Escopos nonlocal
ocorrem quando se definem funes dentro de funes.

Uma vez que tudo em Python cdigo executvel, voc pode definir funes em qualquer lugar.

Vejamos um exemplo:

#!/usr/bin/python
# Filename: func_nonlocal.py

def func_outer():
x = 2
print('x ', x)

def func_inner():
nonlocal x
x = 5

func_inner()
print('O x local mudou para', x)

func_outer()

Sada:
$ python func_nonlocal.py
x 2
O x local mudou para 5

Como funciona:

Quando estamos dentro de func_inner, o 'x' definido na primeira linha de func_outer no est,
relativamente, nem no escopo local, nem no global. Declaramos que estamos usando esse x por meio
de nonlocal x e assim temos acesso quela varivel.

Tente trocar o nonlocal x para global x e tambm remover o comando e observar a diferena de
comportamento nesses dois casos.
Valores padro de argumentos
Para algumas funes, voc pode querer que alguns dos seus parmetros sejam opcionais e usar
valores padro pr-definidos se o usurio no quiser fornecer valores para esses parmetros. Isto
feito com a ajuda de valores padro de argumentos. Voc pode especificar valores padro de
argumentos para parmetros colocando o operador de atribuio (=) aps o nome do parmetro na
definio da funo, seguifo pelo valor padro.

Note que o valor do argumento padro dever ser uma constante. Mais precisamente, o valor do
argumento padro deve ser imutvel. Isso explicado em detalhes nos captulos seguintes. Por
enquanto, basta lembrar disso.

Exemplo:

#!/usr/bin/python
# Filename: func_default.py

def say(message, times = 1):


print(message * times)

say('Ol')
say('Mundo', 5)

Sada:
$ python func_default.py
Ol
MundoMundoMundoMundoMundo

Como funciona:

A funo chamada say usada para imprimir uma string quantas vezes forem necessrias. Se ns no
fornecemos um valor, ento, por padro, a string impressa apenas uma vez. Conseguimos isso
especificando um valor de argumento padro 1 para o parmetro times.

No primeiro uso de say, fornecemos apenas a string e ele a imprime uma vez. No segundo uso de
say, fornecemos tanto a string quanto o argumento 5 5 determinando que queremos dizer a mensagem
5 vezes.

Importante
Apenas os parmetros que estiverem no final da lista de parmetros podem receber valores
padro de argumento, ou seja, voc no pode ter um parmetro com valor de argumento padro
antes de um parmetro sem um valor de argumento padro na ordem dos parmetros declarados
na lista de parmetros da funo.
O motivo que os valores so atribudos aos parmetros por posio. Por exemplo, def
func(a, b=5) vlido, mas def func(a=5, b) no vlido.
Argumentos Nomeados
Se voc tem funes com muitos parmetros e quer especificar apenas alguns deles, ento voc pode
passar valores para esse parmetros nomeando-os. Isto o que chamamos de argumentos nomeados.
Usamos o nome (palavra-chave) ao invs da posio (como viemos usando at agora) para
especificar os argumentos para a funo.

Existem duas vantagens nessa abordagem: primeiro, mais fcil usar a funo, uma vez que no
precisamos nos preocupar com a ordem dos argumentos. Segundo, podemos dar valores apenas para
os parmetros que quisermos, desde que os demais tenham valores padro de argumento.

Exemplo:
#!/usr/bin/python
# Filename: func_key.py

def func(a, b=5, c=10):


print('a ', a, 'e b ', b, 'e c ', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)

Sada:
$ python func_key.py
a 3 e b 7 e c 10
a 25 e b 5 e c 24
a 100 e b 5 e c 50

Como funciona:

A funo chamada func tem um parmetro sem valores padro de argumento, seguida por dois
parmetros sem valores padro de argumento.

No primeiro uso, func(3, 7), o parmetro a recebe o valor 3, o parametro b recebe o valor 5 e c
recebe o valor padro de 10.

No segundo uso func(25, c=24), a varivel a recebe o valor de 25 devido posio do argumento.
Ento, o parmetro c fica com o valor de 24 devido ao nome, ou seja, aos argumentos nomeados. A
varivel b fica com o valor padro de 5.

No terceiro uso func(c=50, a=100), utilizamos somente argumentos nomeados para especificar os
valores. Note que estamos especificando o valor para o parmetro c antes do valor do parmetro a
ainda que a tenha sido definido antes de c na definio da funo.
Parmetros VarArgs
TODO
Devo escrever sobre este assunto num captulo posterior, uma vez que ainda no falamos sobre
listas e dicionrios?

s vezes voc pode querer definir uma funo que possa receber qualquer nmero de parmetros.
Isso pode ser conseguido usando os asteriscos:
#!/usr/bin/python
# Filename: total.py

def total(initial=5, *numbers, **keywords):


count = initial
for number in numbers:
count += number
for key in keywords:
count += keywords[key]
return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

Sada:
$ python total.py
166

Como funciona:

Quando declaramos um parmetro prefixado com um asterisco, tal como *param, ento todos os
argumentos posicionais daquele ponto at o final so armazenados numa lista chamada 'param'.

De maneira similiar, quando declaramos um parmetro prefixado com dois asteriscos, tal como
**param, ento todos os argumentos nomeados, a partir daquele ponto at o final, sero armazenados
em um dicionrio chamado 'param'.

Vamos explorar as listas e dicionrios em um captulo mais frente.


Parmetros apenas por palavra-chave
Se quisermos especificar que certos parmetros por palavra-chave estejam disponveis somente por
palavra-chave e no como argumentos posicionais, estes pode ser declarados aps um parmetro
marcado com asterisco:
#!/usr/bin/python
# Filename: keyword_only.py

def total(initial=5, *numbers, vegetables):


count = initial
for number in numbers:
count += number
count += vegetables
return count

print(total(10, 1, 2, 3, vegetables=50))
print(total(10, 1, 2, 3))
# Levanta um erro, pois no fornecemos um valor de argumento padro para
'vegetables'

Sada:
$ python keyword_only.py
66
Traceback (most recent call last):
File "test.py", line 12, in <module>
print(total(10, 1, 2, 3))
TypeError: total() needs keyword-only argument vegetables

Como funciona:

Declarar parmetros aps um parmetro marcado com asterisco resulta em argumentos apenas por
palavra-chave. Se estes argumentos no so fornecidos com um valor padro, ento chamadas
funo levantaro um erro se o argumento por palavra-chave no fornecido, como visto acima.

Se voc quer ter apenas parmetros por palavra-chave mas no precisa de um parmetro marcado
com asterisco, ento simplesmente use um asterisco sem qualquer nome, tal como def
total(initial=5, *, vegetables).
O comando return
O comando return usado para retornar da execuo de uma funo, isto , sair da funo.
Podemos, opcionalmente, retornar um valor vindo da funo.

Exemplo:

#!/usr/bin/python
# Filename: func_return.py

def maximum(x, y):


if x > y:
return x
else:
return y

print(maximum(2, 3))

Sada:
$ python func_return.py
3

Como funciona:

A funo maximum retornar o maior valor entre os parmetros, neste caso, os nmeros fornecidos
para a funo. Ela usa um simples comando if..else para encontrar o maior valor e retorna esse
valor.

Note que um comando return sem um valor equivalente a return None. None um tipo especial
em Python que representa um valor nulo. Por exemplo, usado para indicar que uma varivel no
possui nenhum valor quando tem o valor None.

Cada funo implicitamente contm um comando return None no final, a menos que voc tenha
escrito seu seu prprio comando return. Voc pode confirmar isso executando a print
someFunction() onde a funo someFunction no usa o comando return, tal como:

def someFunction():
pass

O comando pass usado em Python para indicar um bloco de comandos vazio.

Nota
Existe uma funo embutida chamada max que j implementa a funcionalidade 'encontrar
mximo'. Portanto, use esta funo sempre que possvel.
DocStrings
Python possui um recurso chamado strings de documentao, usualmente conhecidas pelo seu nome
mais curto, docstrings. DocStrings so uma ferramenta importante da qual voc deve fazer uso, uma
vez que ela ajuda a documentar o programa e o torna mais fcil de entender. Python has a nifty feature
called documentation strings, usually referred to by its shorter name docstrings. DocStrings are an
important tool that you should make use of since it helps to document the program better and makes it
more easy to understand. Surpreendentemente, podemos at obter a docstring de, digamos, uma
funo, durante a execuo do programa!

Exemplo:
#!/usr/bin/python
# Filename: func_doc.py

def printMax(x, y):


'''Imprime o maior entre dois nmeros.

Os dois valores devem ser inteiros.'''


x = int(x) # converte para inteiro, se possvel
y = int(y)

if x > y:
print(x, ' o mximo')
else:
print(y, ' o mximo')

printMax(3, 5)
print(printMax.__doc__)

Sada:

$ python func_doc.py
5 o mximo
Imprime o maior entre dois nmeros.

Os dois valores devem ser inteiros.

Como funciona:

Uma string na primeira linha lgica de uma funo o docstring para essa funo. Note-se que
docstrings tambm se aplicam a mdulos e classes, que vamos aprender sobre nos respectivos
captulos.

A conveno seguida para um docstring uma string de mltiplas linhas onde a primeira linha
comea com uma letra maiscula e termina com um ponto. Em seguida, a segunda linha fica em
branco, seguida de uma explicao detalhada a partir da terceira linha. fortemente recomendado
que voc siga esta conveno para todos os seus docstrings em todas as suas funes no-triviais.
Podemos acessar a docstring da funo printMax usando o atributo (nome pertencente a) __doc__
(note o duplo sublinhado) da funo. Lembre-se que Python trata tudo como um objeto e isso inclui
funes. Vamos saber mais sobre os objetos no captulo sobre classes.

Se voc j usou o help() em Python, ento voc j viu o uso de docstrings! O que ele faz apenas
buscar o atributo __doc__ dessa funo e o exibir para voc de uma forma elegante. Voc pode
experiment-lo na funo acima - basta incluir help(printMax) no seu programa. Lembre-se de
pressionar a tecla q para sair do help().

Ferramentas automatizadas podem recuperar a documentao do seu programa desta maneira.


Portanto, eu recomendo fortemente que voc use docstrings para qualquer funo no-trivial que
voc escreva. O comando pydoc que vem com sua distribuio Python funciona de forma semelhante
a help() usando docstrings.
Anotaes
Funes possuem outra funcionalidade avanada chamada anotaes, que so um modo estiloso de
anexar informao adicional para cada um dos parmetros e tambm para o valor de retorno. Como o
interpretador Python no interpreta estas anotaes (tal funcionalidade responsabilidade de
bibliotecas de terceiros), pularemos esta funcionalidade desta discusso. Se voc est interessado
em ler mais sobre anotaes, por favor veja a Proposta de Melhoria do Python No. 3107.
Sumrio
Vimos vrios aspectos das funes mas note que no cobrimos todos os seus aspectos. Entretanto,
cobrimos a maioria das funes de Python que voc precisar dia aps dia.

E seguida, veremos como usar e criar mdulos de Python.

s
Mdulos
Contedo
1 Introduo
2 Arquivos .pyc Byte-compilados
3 O Comando from .. import
4 O __name__ de um Mdulo
5 Produzindo os Seus Prprios Mdulos
6 A Funo dir
7 Packages
8 Resumo
Introduo
Voc viu como pode reutilizar cdigos em seu programa atravs da definio apenas uma vez de
funes. Que tal se voc quisesse reutilizar um certo nmero de funes em outros programas que
voc escrever? Como voc poderia ter adivinhado, a resposta est em mdulos. Um mdulo
basicamente um arquivo contendo todas as funes e variveis que voc definiu.

Para reutilizar o mdulo em outros programas, o nome do mdulo deve ter uma extenso .py.

Um mdulo pode ser importado por um outro programa pra fazer uso da sua funcionalidade. Assim
tambm como ns podemos usar a biblioteca padro de Python. Primeiro, ns veremos como utilizar
os mdulos da biblioteca padro.

Exemplo:

#!/usr/bin/python
# Nome do arquivo: using_sys.py

import sys

print('Os argumentos da linha de comando so:')


for i in sys.argv:
print(i)

print('\n\nO PYTHONPATH ', sys.path, '\n')

Sada:
$ python using_sys.py nos somos argumentos
Os argumentos da linha de comando so:
test.py
nos
somos
argumentos

O PYTHONPATH ['C:\\tmp', 'C:\\Python30\\python30.zip',


'C:\\Python30\\DLLs', 'C:\\Python30\\lib', 'C:\\Python30\\lib\\plat-win',
'C:\\Python30', 'C:\\Python30\\lib\\site-packages']

Como Funciona:

Primeiro ns importamos o mdulo sys usando o comando import. Basicamente, isso se traduz em
ns dizermos a Python que queremos empregar este mdulo. O mdulo sys contm funcionalidade
relacionada ao interpretador de Python e o seu ambiente, ou seja, o systema.

Quando Python executa o comando import sys, procura pelo mdulo sys.py em um dos diretrios
listados na sua varivel sys.path. Se o arquivo encontrado, ento os comandos do bloco principal
(main) do mdulo so executados e o mdulo tornado disponvel para seu uso. Observe que a
inicializao realizada apenas a primeira vez que ns importamos o mdulo.

A varivel argv no mdulo sys acessada utilizando-se a notao por pontos (dotted) isto
sys.argv. Ela claramente indica que este nome parte do mdulo sys. Uma outra vantagem dessa
abordagem que o nome no colide com qualquer varivel argv usada em seu programa.

A varivel sys.argv uma lista de strings (listas (lists) so explicadas em detalhes em um captulo
posterior). Especificamente, sys.argv contm a lista de argumentos da linha de comando, ou seja,
os argumentos que so passados para o seu programa usando a linha de comando.

Se voc estiver usando uma IDE para escrever e executar esses programas, procure por uma forma
de especificar os argumentos da linha de comando ao seu programa nos menus.

Aqui, quando ns executamos python using_sys.py nos somos argumentos ns executamos o


mdulo using_sys.py com o comando python e as outras coisas que seguem so argumentos
passados ao programa. Python guarda os argumentos da linha de comando na varivel sys.argv para
nosso uso.

Lembre-se, o nome do script que est em execuo sempre o primeiro argumento na lista
sys.argv. assim, neste caso ns teremos 'using_sys.py' como sys.argv[0], 'nos' como
sys.argv[1], 'somos' como sys.argv[2] e 'argumentos' como sys.argv[3]. Note que Python
comea a contagem a partir de 0 e no de 1.

A varivel sys.path contm a lista de nomes de diretrios de onde os mdulos so importados.


Observe que a primeira string em sys.path est vazia - esta string vazia indica que o diretrio
corrente tambm parte de sys.path a qual a mesma que a varivel de ambiente PYTHONPATH.
Isso significa que voc pode importar diretamente mdulos localizados no diretrio corrente. Se no
for o caso, voc ter que colocar seu mdulo em um dos diretrios listados em sys.path.
Arquivos .pyc Byte-compilados
A importao de mdulos uma ao relativamente custosa, de modo que Python realiza alguns
truques para torn-la mais rpida. Uma maneira a criao de arquivos byte-compilados com a
extenso .pyc que uma forma intermediria em que Python transforma o programa (lembre-se da
seo de introduo em Como Python Funciona?). Este arquivo .pyc til quando voc importar o
mdulo a prxima vez de um programa diferente - ser muito mais rpido pois uma parte do
procedimento requerido para a importao do mdulo j est feita. Alm disso, estes arquivos byte-
compilados so independentes da plataforma.

Nota
Esses arquivos .pyc so usualmente criados no mesmo diretrio dos arquivos .py
correspondentes. Se Python no tiver permisso para escrever arquivos naquele diretrio, ento
os arquivos .pyc no sero criados.
O Comando from .. import
Se voc quiser importar diretamente a varivel argv no seu programa (para evitar ficar digitando
sys. todas as vezes), ento voc pode usar o comando from sys import argv. Se voc quiser
importar todos os nomes usados no mdulo sys, ento voc pode usar o oomando from sys import
*. Isso funciona com qualquer mdulo.

Em geral, voc deve evitar o uso desse comando e, ao invs, utilizar o comando import, pois dessa
forma voc evitar coliso de nomes e seu programa ficar mais legvel.
O __name__ de um Mdulo
Todo mdulo tem um nome e comandos em um mdulo podem encontr-lo. Isso conveniente na
situao particular em que se proecisa descobrir se o mdulo est sendo executado por si s ou est
sendo importado. Como mencionado anteriormente, quando um mdulo importado pela primeira
vez, o bloco principal (main) daquele mdulo executado. N podemos usar esse conceito para
executar o bloco apenas se o programa for usado por si s e no quando for importado por outro
mdulo. Isso pode ser alcanado usando o atributo __name__ do mdulo.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: using_name.py

if __name__ == '__main__':
print('Este programa est sendo executado por si s')
else:
print('Eu estou sendo importado de outro mdulo')

Sada:
$ python using_name.py
Este programa est sendo executado por si s

$ python
>>> import using_name
Eu estou sendo importado de outro mdulo
>>>

Como Funciona:

Todo mdulo em Python tem o seu __name__ definido e se este '__main__', isso implica que o
mdulo est sendo executado por si s pelo usurio e ns poderemos adotar as aes apropriadas.
Produzindo os Seus Prprios Mdulos
A criao de seus prprios mdulos fcil, pois voc j tem feito isso o tempo todo! Isso porque
todo programa em Python tambm um mdulo. Voc apenas tem que se assegurar que possua a
extenso .py. O prximo exemplo deve tornar isso claro.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: mymodule.py

def sayhi():
print('Ol, este meu mdulo falando.')

__version__ = '0.1'

# Fim de mymodule.py

O cdigo acima um mdulo de amostra. Como voc pode ver, no existe nada particularmente
especial a respeito dele em comparao com os nossos programas usuais em Python. Veremos agora
como usar este mdulo em nossos outros programas em Python.

Lembre-se que os mdulos devem ser colocados no mesmo diretrio que o programa que os importa,
ou ento deve estar em um dos diretrios listados em sys.path.
#!/usr/bin/python
# Nome do arquivo: mymodule_demo.py

import mymodule

mymodule.sayhi()
print 'Verso', mymodule.__version__

Sada:
$ python mymodule_demo.py
Ol, este mymodule falando.
Verso 0.1

Como Funciona:

Note que ns empregamos a notao dos pontos para acessar os membros do mdulo. Python utiliza
bastante a mesma notao que lhe d a caracterstica 'Pythonica' a ela, e modo que no temos que
ficar aprendendo novas maneiras de fazer as coisas.

Aqui est a verso utilizando a sintaxe from..import.


#!/usr/bin/python
# Nome do arquivo: mymodule_demo2.py
from mymodule import sayhi, __version__
# Alternativa:
# from mymodule import *

sayhi()
print('Verso', __version__)

A sada de mymodule_demo2.py a mesma que a sada de mymodule_demo.py.

Note que j houvesse um nome __version__ declarado no mdulo que importa mymodule, haveria
uma coliso. Isso altamente provvel pois prtica comum para cada mdulo declarar-se a sua
verso usando esse nome. Da sempre recomendado optar pelo comando import, mesmo se tornar
o seu programa um pouco mais longo.

Zen de Python
Um dos princpios-guia de Python que 'Explicito melhor do que implcito'. Execute import
this para aprender mais.
A Funo dir
Voc pode usar a funo interna (built-in) dir para listar os indetificadores que um objeto define.
Por exemplo, para um mdulo, os identificadores incluem as funes, classes e variveis definidas
naquele mdulo.

Quando voc fornece o nome do mdulo funo dir(), ela retorna a lista dos nomes definidos
naquele mdulo. Quando nenhum argumento fornecido, ela retorna a lista de nomes definidos no
mdulo corrente.

Exemplo:
$ python

>>> import sys # Obtenha a lista de atributos, neste caso, do mdulo sys

>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__s
tderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_compact_freelists',
'_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', '
byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle'
, 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable',
'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getfil
esystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof',
'gettrace', 'getwindowsversion', 'hexversion', 'intern', 'maxsize', 'maxunicode
', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platfor
m', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_in
fo', 'warnoptions', 'winver']

>>> dir() # obtenha a lista dos atributos do mdulo corrente


['__builtins__', '__doc__', '__name__', '__package__', 'sys']

>>> a = 5 # cria uma nova varivel 'a'

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys']

>>> del a # delete/remove um nome

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'sys']

>>>

Como Funciona:

Primeiro ns vemos o uso de dir sobre o mdulo importado. Podemos ver a enorme lista de
atributos que ele contm.
Em seguida, ns vemos a funo dir sem nenhum parmetro passado a ela. Por padro, ela retorna a
lista dos atributos do mdulo corrente. Note que a lista dos mdulos importados tambm faz parte
dessa lista.

A fim de observar a ao de dir, ns definimos uma nova varivel e atribumos um valor a ela e
ento verificamos que existe um valor adicional na lista, com o mesmo nome da varivel. Ns
removemos a varivel/atributo do mdulo corrente usando o comando del e a alterao refletida
novamente na sada da funo dir.

Uma nota sobre del - este comando usado para deletar a varivel/nome e depois de executado o
comando, neste caso del a, voce no poder acessar a varivel a - como se ela nunca tivesse
existido antes.

Note que a funo dir() funciona para qualquer objeto. Por exemplo, execute dir(print) para
conhecer os atributos da funo print, ou dir(str) para os atributos da classe str.
Packages
Nesse ponto, voc j deve ter comeado a observar a hierarquia da organizao de seus programas.
As variveis usualmente vo dentro das funes. Funes e variveis globais usualmente vo dentro
dos mdulos. Que tal se voc quisesse organizar os mdulos? Este o momento em que entram em
cena as packages (pacotes).

Packages so apenas pastas contendo mdulos com um arquivo __init__.py que indica a Python
que esta pasta especial porque contm mdulos de Python.

Vamos dizer que voc quer criar uma package denominada 'world' com as subpackages 'asia', 'africa',
etc. e estas subpackages por sua vez contm mdulos como 'india', 'madagascar', etc.

Esta como voc estruturaria as pastas:

- <alguma pasta presente em the sys.path>/


- world/
- __init__.py
- asia/
- __init__.py
- india/
- __init__.py
- foo.py
- africa/
- __init__.py
- madagascar/
- __init__.py
- bar.py

Packages so apenas uma convenincia para organizar mdulos hierarquicamente. Ns veremos


muitos exemplos disso em biblioteca padro.
Resumo
Da mesma forma que funes so partes reutilizveis de programas, os mdulos so programas
reutilizveis. Packages so uma outra hierarquia para organizar mdulos. A biblioteca padro que
vem com Python representa um exemplo de tais conjuntos de packages e mdulos.

Ns vimos como usar esses mdulos e criar os nossos prprios mdulos.

A seguir, aprenderemos sobre interessantes conceitos denominados estruturas de dados.


Estruturas de Dados
Contedo
1 Introduo
2 Lista
2.1 Rpida Introduo a Objetos e Classes
3 Tupla
4 Dicionrio
5 Sequncias
6 Conjuntos
7 Referncias
8 Mais Sobre Strings
9 Resumo
Introduo
Estruturas de dados so basicamente isso - so estruturas que podem conter alguns dados juntos. Em
outras palavras, elas so utilizadas para guardar uma coleo de dados relacionados entre si.

Existem quatro estruturas de dados internas (built-in) em Python - lista, tupla, dicionrio e conjunto
(set). Ns veremos como usar cada uma delas e de que modo elas nos facilitam a vida.
Lista
Uma list (lista) uma estrutura de dados que contm uma coleo ordenada de itens, ou seja, voc
pode guardar uma sequncia de itens em uma lista. Isso fcil de imaginar se voc pensar em uma
lista de compras na qual voc tem uma lista de itens para comprar, exceto que voc provavelmente
ter cada item em uma linha separada, ao passo que Python coloca uma vrgula entre eles.

A lista de itens dever estar dentro de colchetes (square brackets), de modo que Python entende que
voc est especificando uma lista. Uma vez que voc criou a lista, pode adicionar, remover ou fazer
buscas por itens dela. Desde que ns podemos adicionar e remover itens, dizemos que uma lista um
tipo mutvel de dados, ous seja, este tipo pode ser alterado.

Rpida Introduo a Objetos e Classes

Embora eu tenha retardado a discusso sobre objetos e classes at agora, uma pequena explanao
torna-se imediatamente necessria, tal que voc possa entender melhor as listas. Exploraremos esse
tpico em mais detalhes em seu prprio captulo.

Uma lista um exemplo de utilizao de objetos e classes. Quando ns usamos a varivel i e


atribumos um valor, digamos, inteiro 5 a ela, voc pode raciocinar como se criasse um objeto (isto
uma instncia) i de uma classe (ou seja tipo) int. De fato, voc pode ler help(int) para melhor
entender isso.

Uma classe pode ter mtodos ou seja funes definidas para uso com respeito unicamente quela
classe. Voc pode usar essas peas de funcionalidade apenas quando tem um objeto daquela classe.
Por exemplo, Python fornece um mtodo append para a classe list, o que permite a voc adicionar
um item ao final da lista. Por exemplo, minhalista.append('um item') adicionar aquela string
ao final da lista minhalista. Note o emprego da notao dos pontos para acessar mtodos dos
objetos.

Uma classe pode tambm possuir campos que no so nada mais do que variveis definidas para uso
com respeito unicamente quela classe. Voc pode utilizar aquelas variveis/nomes apenas quando
tem um objeto daquela classe. Campos so tambm acessados com a notao dos pontos, por
exemplo, minhalista.campo.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: using_list.py

# Esta a minha lista de compras


shoplista = ['ma', 'manga', 'cenoura', 'banana']

print('Eu tenho', len(shoplista), 'itens para comprar.')

print('Estes itens so:', end=' ')


for item in shoplista:
print(item, end=' ')

print('\nTambm tenho que comprar arroz.')


shoplista.append('arroz')
print('Minha lista de compras agora', shoplista)

print('Vou colocar a minha lista em ordem agora')


shoplista.sort()
print('A minha lista ordenada ', shoplista)

print('O primeiro item que comprarei ', shoplista[0])


olditem = shoplista[0]
del shoplista[0]
print('Eu comprei o', olditem)
print('Minha lista de compras agora', shoplista)

Sada:
$ python using_list.py
Eu tenho 4 itens para comprar.
Estes itens so: ma manga cenoura banana
Tambm tenho que comprar arroz.
Minha lista de compras agora ['ma', 'manga', 'cenoura', 'banana',
'arroz']
Vou colocar a minha lista em ordem agora
A minha lista ordenada ['arroz', 'banana', 'cenoura', 'ma', 'manga' ]
O primeiro item que comprarei arroz
Eu comprei o arroz
Minha lista de compras agora 'banana', 'cenoura', 'ma', 'manga' ]

Como Funciona:

A varivel shoplista uma lista de compras para algum que est indo ao mercado. Em
shoplista ns guardamos strings do nomes dos itens a serem comprados, mas voc pode adicionar
qualquer espcie de objeto a uma lista, incluindo nmeros e at mesmo outras listas.

Ns tambm empregamos o lao for..in para iterar sobre os itens da lista. Agora voc deve ter
percebido que uma lista tambm uma sequncia. A especialidade das sequncias ser discutida em
uma seo posterior.

Observe o uso da palavra-chave end como argumento na funo print, para indicar que ns
queremos terminar a sada com um espao, ao invs da costumeira quebra-de-linha.

Em seguida, ns adicionamos um item lista usando o mtodo append do objeto lista, como j foi
discutido antes. Ento, ns verificamos que o item foi efetivamente acrescentado lista atravs da
impresso do contedo da lista, obtida simplesmente passando a lista ao comando print, que a
imprime sem problemas.

Da ns ordenamos a lista por meio do mtodo sort do objeto lista. importante compreender que
este mtodo afeta a a prpria lista e que no retorna uma lista modificada - isso diferente da
maneira pela qual a string funciona. o que ns queremos salientar quando dizemos que as listas so
mutveis e as strings so imutveis.

A seguir, quando ns terminamos de comprar um item no mercado, queremos retir-lo da lista.


Alcanamos isso por meio do comando del. Aqui ns mencionamos qual o item da lista que
desejamos suprimir e o comando del o remove da lista para ns. Especificamos que queremos
remover o primeiro item da lista ento usamos del shoplist[0] (lembre-se que Python comea a
contagem a partir do 0.)

Se voc quiser conhecer todos os mtodos definidos para o objeto lista, veja help(list) para os
detalhes.
Tupla
Tuplas (tuples) so exatamente como listas, exceto que so imutveis, como as strings, isto , voc
no pode modificar tuplas. Tuplas so definidas especificando itens separados por vrgulas dentro de
um par de parnteses. As tuplas so costumeiramente usadas em casos em que um comando ou uma
funo definida pelo usurio pode seguramente assumir que uma coleo de valores, ou seja, a tupla
de valores no ser alterada.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: using_tuple.py

zoo = ('lobo', 'elefante', 'pinguim')


print('O Nmero de animais no zoo ', len(zoo))

novo_zoo = ('macaco', 'golfinho', zoo)


print('O Nmero de animais no novo zoo ', len(novo_zoo))
print('Todos os animais no novo zoo so', novo_zoo)
print('Os animais trazidos do antigo zoo so', novo_zoo[2])
print('O ltimo animal trazido do antigo zoo ', novo_zoo[2][2])

Output:
$ python using_tuple.py
O Nmero de animais no zoo 3
O Nmero de animais no novo zoo 3
Todos os animais no novo zoo so ('macaco', 'golfinho', ('lobo', 'elefante',
'pinguim'))
Os animais trazidos do antigo zoo so ('lobo', 'elefante', 'pinguim')
O ltimo animal trazido do antigo zoo pinguim

Como Funciona:

A varivel zoo refere-se a uma tupla de itens. Ns vemos que a funo zoo pode ser utilizada para se
obter o comprimento da tupla. Isso tambm indica que a tupla tambm uma sequncia.

Ns estamos mudando aqueles animais para um novo zoo, uma vez que o antigo est para ser
fechado. Dessa forma, a tupla novo_zoo contm alguns animais que j estavam l, juntamente com
aqueles trazidos do velho zoo. De volta a realidade, observe que uma tupla dentro de outra tupla no
perde a sua indentidade.

Podemos acessar os itens em uma tupla especificando a posio do item dentro de um par de
colchetes exatamente como ns fizemos para listas. Esse chamado operador de indexao. Ns
acessamos o terceiro item em novo_zoo pela especificao novo_zoo[2] e acessamos o terceiro
item dentro do terceiro item na tupla novo_zoo especificando novo_zoo[2][2]. muito simples
uma vez que voc domine o jeito.
s
Tuplas com 0 ou 1 item
Uma tupla vazia construda com um par de parnteses como vazia = (). Entretanto, com um
nico item j no to simples. Voc deve especificar usando uma vrgula em seguida ao
primeiro (e nico) item, tal que Python possa diferenciar entre uma tupla e um par de parnteses
que cercam uma expresso, ou seja, voc tem que especificar singleton = (2 , ), se quiser
uma tupla contendo o item 2.

Nota para programadores em Perl


Uma lista dentro de uma lista no perde sua identidade, listas no so "achatadas", como em
Perl. O mesmo se aplica a uma tupla dentro de uma tupla, ou uma tupla em uma lista, ou uma
lista em uma tupla, etc. Do ponto de vista de Python, so apenas objetos alocados usando um
outro objeto, apenas isso.
Dicionrio
Um dicionrio (dictionary) como uma agenda de endereos na qual voc pode encontrar ou
endereo ou detalhes de contato de uma pessoa, conhecendo apenas o nome dela, isto , associamos
as keys (chaves) (nome) com values (valores) (detalhes). Note que a key deve ser nica, da mesma
forma que voc no poder encontrar a informao correta se houverem duas pessoas com
exatamente o mesmo nome.

Observe que voc pode utilizar somente objetos imutveis (como strings) como keys de um
dicionrio, mas pode usar objetos imutveis e mutveis como values do dicionrio. Isso basicamente
se traduz em que voc deve usar apenas objetos simples como keys.

Pares de keys e values so especificados em um dicionrio pela notao d = {key1 : value1,


key2 : value2 }. Observe que os pares key/value esto separados por uma vrgula e todo o
conjunto est dentro de um par de chaves.

Lembre-se que os pares key/value em um dicionrio no esto de forma alguma ordenados. Se quiser
um ordem particular, voc mesmo ter que orden-los antes de us-los.

Os dicionrios que voc utilizar so instncias/objetos da classe dict.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: using_dict.py

# 'ab' diminutivo para 'a'ddress'b'ook

ab = { 'Swaroop' : 'swaroop@swaroopch.com',
'Larry' : 'larry@wall.org',
'Matsumoto' : 'matz@ruby-lang.org',
'Spammer' : 'spammer@hotmail.com'
}

print("Swaroop's address is", ab['Swaroop'])

# Deletando um par key/value


del ab['Spammer']

print('\nThere are {0} contacts in the address-book\n'.format(len(ab)))

for name, address in ab.items():


print('Contact {0} at {1}'.format(name, address))

# Adiconando um par key/value


ab['Guido'] = 'guido@python.org'

if 'Guido' in ab: # OU ab.has_key('Guido')


print("\nGuido's address is", ab['Guido'])
Sada:

$ python using_dict.py
Swaroop's address is swaroop@swaroopch.com

There are 3 contacts in the address-book

Contact Swaroop at swaroop@swaroopch.com


Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org

Guido's address is guido@python.org

Como Funciona:

Ns criamos um dicionrio ab usando a notao j discutida. Ento acessamos os pares key/value


especificando a key usando o operador de indexao como discutido no contexto de listas e tuplas.
Observe a sintaxe simples.

Ns podemos deletar os pares key/value usando nosso velho amigo - o comando del. Simplesmente
especificamos o dicionrio o operador de indexao para a key a ser removida e passamos tudo ao
comando del. No h a necessidade de conhecer o value correspondente key para esta operao.

Em seguida, ns acessamos cada par key/value usando o mtodo items do dicionrio, o qual retorna
uma lista de tuplas, em que cada tupla contm um par de itens - a key seguida por um value. Ns
recuperamos esse par e o atribumos as variveis name e address correspondentemente para cada
par, usando o lao de for..in e ento imprimimos esses valores no bloco de for.

Podemos adicionar novos pares key/value, simplesmente empregando o operador de indexao para
acessar a key e atribuirmos aquele value, como fizemos para Guido no caso acima.

N podemos verificar se um par key/value existe, usando o operador in ou mesmo o mtodo


has_key da classe dict. Voc pode ver a documentao para a lista completa de mtodos da classe
dict, usando help(dict).

Argumentos em Keyword (palavras-chave) e Dicionrios


Em um tpico distinto, se voc tiver empregado argumentos em keywords em suas funes, voc
j usou dicionrios! Pense um pouco sobre isso - o par key/value especificado por voc na
lista de parmetros da definio da funo e quando voc acessa variveis dentro de sua funo,
trata-se apenas de uma acesso a key de um dicionrio (que chamado de tabela de smbolos em
terminologia de compiladores).
Sequncias
Listas, tuplas, strings e arquivos so exemplos de sequncias, mas o que as sequncias tem de to
especial? Duas das principais caractersticas de uma sequncia so a operao de indexao'que
nos permite recuperarmos diretamente um item particular e a operao de slicing (fatiamento)
que nos permite recuperarmos uma fatia de uma sequncia, ou seja, uma parte da sequncia.

Exemplo:
#!/usr/bin/python
# Nome do arquivo: seq.py

shoplist = ['apple', 'mango', 'carrot', 'banana']


name = 'swaroop'

# Operao de Indexao ou 'Subscrio'


print('Item 0 is', shoplist[0])
print('Item 1 is', shoplist[1])
print('Item 2 is', shoplist[2])
print('Item 3 is', shoplist[3])
print('Item -1 is', shoplist[-1])
print('Item -2 is', shoplist[-2])
print('Character 0 is', name[0])

# Slicing (fatiamento) sobre uma lista


print('Item 1 to 3 is', shoplist[1:3])
print('Item 2 to end is', shoplist[2:])
print('Item 1 to -1 is', shoplist[1:-1])
print('Item start to end is', shoplist[:])

# Slicing (fatiamento) sobre uma string


print('characters 1 to 3 is', name[1:3])
print('characters 2 to end is', name[2:])
print('characters 1 to -1 is', name[1:-1])
print('characters start to end is', name[:])

Sada:
$ python seq.py
Item 0 is apple
Item 1 is mango
Item 2 is carrot
Item 3 is banana
Item -1 is banana
Item -2 is carrot
Character 0 is s
Item 1 to 3 is ['mango', 'carrot']
Item 2 to end is ['carrot', 'banana']
Item 1 to -1 is ['mango', 'carrot']
Item start to end is ['apple', 'mango', 'carrot', 'banana']
characters 1 to 3 is wa
characters 2 to end is aroop
characters 1 to -1 is waroo
characters start to end is swaroop

Como Funciona:

Primeiramente, ns vemos como utiizar os ndices para obter itens individuais de uma sequncia.
Isso tambm conhecido como operao de subscrio. Quando voc especifica um nmero dentro
de colchetes a uma sequncia, como mostrado acima, Python ir recuperar para voc o item
correspondente aquela posio na sequncia. Lembre-se que Python comea a contagem dos nmeros
a partir do 0. Da, shoplist[0] retorna o primeiro item e shoplist[3] retorna o quarto item na
sequncia shoplist.

O ndice pode tambm ser um nmero negativo, em cujo caso, a posio calculada a partir do fim
da sequncia. Assim, shoplist[-1] refere-se ao ltimo item da sequncia e shoplist[-2]
recuoera o penltimo item da sequncia.

A operao de slicing empregada especificando-se o nome da sequncia seguido de um par


opcional de nmeros separados por 'dois pontos' dentro de colchetes. Note que isso bem similar a
operao de indexao que voc vem usando at agora. Lembre-se que os nmeros so opcionais
mas o 'dois pontos' no .

O primeiro nmero (antes do 'dois pontos') na operao de slicing refere-se a posio de onde a fatia
comea e o segundo nmero (depois do 'dois pontos') indica onde a fatia terminar. Se o primeiro
nmero no for especificado, Python comear no incio da sequncia. Se o segundo nmero no
existir, Python terminar no final da sequncia. Note que a fatia retornada comea na posio de
incio e termina imediatamente antes da posio do fim, ou seja, a posio de incio includa, mas a
posio do fim excluda na fatia da sequncia.

Ento, shoplist[1:3] retorna uma fatia de uma sequncia que comea na posio 1, inclui a
posio 2 mas para na posio 3 e assim uma fatia de dois itens retornada. Similarmente,
shoplist[:] retorna uma cpia da sequncia toda.

Voc pode tambm efetuar slicing com nmeros negativos. Os nmeros negativos so usados para
posies a partir do fim da sequncia. Por exemplo, shoplist[:-1] retornar uma fatia da
sequncia que exclui o ltimo item da sequncia mas contm todo o resto dela.

Experimente vrias combinaes de especificaes de slicing usando interativamente o interpretador


de Python, ou seja, o prompt, de modo que voc possa ver os resultados imediatamente. Uma grande
coisa a respeito de sequncias e que voc pode acessar tuplas, listas e strings todas da mesma
maneira!
Conjuntos
Conjuntos (Sets) so colees no ordenadas de objetos simples. Eles so usados quando a
existncia de um objeto em uma coleo mais importante do que a ordem em que est ou o nmero
de vezes em que ocorre.

Usando sets, voc pode testar para pertencimento a um conjunto, verificar se um conjunto um
subconjunto de outro, encontrar a interseo entre dois conjuntos, e assim por diante.
>>> bri = set(['brasil', 'russia', 'india'])
>>> 'india' in bri
True
>>> 'usa' in bri
False
>>> bric = bri.copy()
>>> bric.add('china')
>>> bric.issuperset(bri)
True
>>> bri.remove('russia')
>>> bri & bric # OR bri.intersection(bric)
{'brasil', 'india'}

Como Funciona:

O exemplo razoavelmente auto-explicativo, pois envolve teoria bsica de conjuntos ensinada na


escola.
Referncias
Quando voc cria um objeto e o atribui a uma varivel, esta apenas se refere ao objeto e no
representa o objeto em si mesmo! Isto , o nome da varivel aponta para aquela parte da memria do
seu computador na qual o objeto est armazenado. Isso chamado vinculao (binding) do nome ao
objeto.

Em geral voc no precisa ficar preocupado com isso, mas existe um efeito sutil devido a referncias
ao qual voc precosa ficar atento:

Exemplo:
#!/usr/bin/python
# Nome do arquivo: reference.py

print('Atribuio Simples')
shoplist = ['apple', 'mango', 'carrot', 'banana']
mylist = shoplist # mylist apenas um outro nome apontando para o mesmo objeto!

del shoplist[0] # Eu comprei o primeiro item , ento eu o removo da lista


&nbssp;
print('shoplist is', shoplist)
print('mylist is', mylist)
# note como tanto shoplist e mylist ambas imprimem a mesma lista, sem 'apple',
confirmando que apontam para o mesmo objeto.

print('Copie por meio de uma fatia completa')


mylist = shoplist[:] # efetue uma cpia por meio de uma fatia completa
del mylist[0] # remova o primeiro item

print('shoplist is', shoplist)


print('mylist is', mylist)
# note que agora as duas listas so distintas

Sada:
$ python reference.py
Atribuio Simples
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copie por meio de uma fatia completa
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']

Como Funciona:

A maior parte da explicao est disponvel nos prprios comentrios.

O que voc precisa lembrar que quiser fazer uma cpia de uma lista ou tais espcies de sequncias
ou objetos complexos (no objetos simples como inteiros), ento voc deve utilizar a operao de
slicing para efetuar uma cpia. Se voc apenas atribuir o nome da varivel a outro nome, ento
ambos se referiro ao mesmo objeto e isso pode ser um problema se voc no for cuidadoso.

Nota para programadores em Perl

Lembre-se que um comando de atribuio para listas no cria uma cpia. Voc dever usar a
operao de slicing para efetuar uma cpia da sequncia.
Mais Sobre Strings
Ns j discutimos strings em detalhes antes. O que mais h para se conhecer? Bem, voc sabia que
strings so tambm objetos e que tem mtodos que fazem de tudo, desde verificar partes de uma
string at retirar os espaos em branco!

As strings que voc usa em seu programa so todas objetos da classe str. Alguns mtodos teis
dessa classe so demonstrados no prximo exemplo. Para uma lista completa de tais mtodos, veja
em help(str).

Exemplo:
#!/usr/bin/python
# Nome do arquivo: str_methods.py

name = 'Swaroop' # Este um objeto string

if name.startswith('Swa'):
print('Sim, a string comea com "Swa"')

if 'a' in name:
print('Sim, ela contm a string "a"')

if name.find('war') != -1:
print('Sim, ela contm a string "war"')

delimitador = '_*_'
mylist = ['Brasil', 'Rssia', 'ndia', 'China']
print(delimitador.join(mylist))

Output:

$ python str_methods.py
Sim, a string comea com "Swa"
Sim, ela contm a string "a"
Sim, ela contm a string "war"
Brasil_*_Rssia_*_ndia_*_China

Como Funciona:

Aqui, ns vemos um bocado de mtodos da string em ao. O mtodo startswith usado para
descobrir se a string comea com uma dada string. O operador in usado para verificar se uma dada
string uma parte de uma string.

O mtodo find usado para achar a posio de uma dada string em uma string ou retorna -1 se no
for bem sucedido em achar a substring. A classe str tem tambm um elegante mtodo para join os
itens de uma sequncia, com a string atuando como delimitador entre cada item da sequncia e
retorna uma string muito maior produzida com isso.
Resumo
Ns esxploramos detalhadamente as vrias estruturas internas (built-in) de Python. Estas estruturas
sero essenciais para escrever programas de um tamanho razovel.

Agora que ns j temos sob controle o bsico de Python, veremos a seguir como projetar e escrever
programas do mundo real em Python.
Resoluo de Problemas
Ns exploramos vrias partes da linguagem Python e agora daremos uma olhada em como essas
partes se ajustam entre si, projetando e escrevendo um programa que faz algo til. A idia aprender
a escrever o seu prprio script em Python.
Contedo
1 O Problema
2 A Soluo
3 Segunda Verso
4 Terceira Verso
5 Quarta Verso
6 Mais Refinamentos
7 O Processo de Desenvolvimento de Software
8 Resumo
O Problema
O problema "Eu desejo escrever um programa que cria um backup de todos os meus arquivos
importantes"

Embora esse seja um problema simples, no existe informao suficiente para que possamos dar
incio a uma soluo. Um pouco mais de anlise necessria. Por exemplo, como poderamos
especificar quais os arquivos cujo backup deveria ser feito? Como eles esto alocados? Onde eles
esto alocados?

Depois de analisarmos apropriadamente o problema, ns projetamos o nosso programa. Ns


elaboramos uma lista de coisas a respeito de como o nosso programa deveria operar. Neste caso em
particular, criei a lista que se segue, com base em como eu quero que ele funcione. Se voc
desenvolver o projeto, poder surgir com outro tipo de anlise, uma vez que cada pessoa tem o seu
prprio modo de fazer as coisas, o que perfeitamente legtimo.

1. Os arquivos e diretrios objeto do backup esto especificados em uma lista.


2. O backup deve ser colocado em um diretrio principal de backup.
3. O backup deve ser colocado em uma arquivo do tipo zip.
4. O nome do arquivo zip a data e a hora correntes.
5. Usaremos o comando zip disponvel por default em qualquer distribuio Linux/Unix padro.
Os usurios de Windows podem instalar da pgina do projeto e adicionar C:\Arquivos de
Programas\GnuWin32\bin a varivel de ambiente do sistema PATH, de modo anlogo ao que
fizemos para que o comando python fosse reconhecido. Note que voc pode utilizar qualquer
comando de arquivamento que desejar, desde que possua uma interface atravs de linha de
comando, de forma que possamos passar argumentos a ele por meio de nosso script.
A Soluo
Uma vez que o projeto de nosso programa encontra-se agora razoavelmente estvel, podemos
escrever o cdigo que representa uma implementao de nossa soluo.
#!/usr/bin/python
# Nome do arquivo: backup_ver1.py

import os
import time

# 1. Os arquivos e os diretrios a sofrerem backup esto especificados em uma


lista.
origem = ['"C:\\Meus Documentos"', 'C:\\Code']
# Note que ns tivemos que usar aspas duplas dentro da string devido aos nomes
com espaos dentro dela.

# 2. O backup deve ser colocado em um diretrio de backup principal.


dir_alvo = 'E:\\Backup' # Lembre-se de alterar para aquele que voc estiver
utilizando.

# 3. O backup deve ser colocado em uma arquivo do tipo zip.


# 4. O nome do arquivo zip a data e a hora correntes.
alvo = dir_alvo + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'

# 5. Usamos o comando zip para colocar os arquivos em um arquivo zip.


comando_zip = "zip -qr {0} {1}".format(alvo, ' '.join(origem))

# Execute o backup
if os.system(comando_zip) == 0:
print('Backup bem-sucedido em', alvo)
else:
print('Backup FALHOU')

Sada:
$ python backup_ver1.py
Backup bem-sucedido em E:\Backup\20080702185040.zip

Agora, ns nos encontramos em uma fase de testes, quando ns verificamos que o nosso programa
funciona de forma apropriada. Se ele no se comportar como esperado, ento ns temos que debugar
o nosso programa, ou seja, remover os bugs (erros) do programa.

Se o programa acima no funcionar para voc, coloque um print(comando zip) imediatamente


antes da chamada para os.system e execute o programa. Agora copie/cole o comando_zip impresso
no 'prompt' do shell e veja se ele executa adequadamente por si mesmo. Se o comando falhar,
verifique no manual do comando zip o que poderia estar errado. Se o comando for bem sucedido,
ento verifique se o programa em Python corresponde exatamente ao prograna escrito acima.

Como funciona:
Voc notar como ns convertemos o nosso projeto em um procedimento passo-a-passo.

Ns fazemos uso dos mdulos os e time, antes de tudo importando-os. Ento, ns especificamos os
arquivos e diretrios cujo backup deve ser realizado na lista tt>origem</tt>. O diretrio alvo onde
ns armazenamos todos os arquivos do backup e este est especificado pela varivel dir_alvo. O
nome do arquivo zip que iremos criar a data e hora correntes, os quais ns obtemos utilizando a
funo time.strftime(). Ele receber tambm a extenso zip e ser posto no diretrio dir_alvo.

Observe o uso da varivel os.sep - esta fornece o separador de diretrios de acordo com o sistema
operacional, ou seja, ser '/' em Linux, Unix, ser '\\' em Windows e ':' em Mac OS. O uso de
os.sep, ao invs desses caracteres diretamente, tornar o nosso programa portvel e capaz de operar
sob aqueles sistemas.

A funo time.strftime() recebe uma especificao tal como a que usamos no programa acima. A
especificao %Y ser substituda pelo ano sem o sculo. A especificao %m ser substituda pelo
mes como um nmero decimal entre 01 e 12 e assim por diante. A lista completa de tais
especificaes pode ser encontrada no Python Reference Manual(Manual de Referncia de Python).

Ns criamos o nome do arquivo alvo zip utilizando o operador adio, o qual concatena as strings,
isto , combina conjuntamente as strings e retorna uma nova string. Ento, ns criamos uma string
comando_zip que contm o comando que iremos executar. Voc pode verificar se esse comando
funciona, executando-o no shell (terminal de Linux ou no 'prompt' do DOS).

Ao comando zip que ns estamos usando, so passadas algumas opes e parmetros. A opo The
-q empregada para indicar que o comando zip deve operar de forma silenciosa (quiet). A opo -r
especifica que o comando zip deve trabalhar recursivamente sobre os diretrios, ou seja, dever
incluir todos os subdiretrios e arquivos. As duas opes so combinadas e especificadas como -qr.
As opes so seguidas pelo nome de um arquivo zip a ser criado seguido pela lista de arquivos e
diretrios a realizar o backup. Ns convertemos a lista origem em uma string, usando o mtodo join
de strings, o qual j vimos como empregar.

Ento, ns finalmente executamos o comando usando a funo os.system, que executa o comando
como se o estivesse fazendo pelo sistema operacional, isto , no shell - ele retorna 0 se o comando
foi bem sucedido, retornando um nmero de erro, em caso contrrio.

Dependendo do resultado do comando, ns imprimimos a mensagem apropriada se o backup falhou


ou se foi bem sucedido.

Ento isso, ns criamos um script para realizar um backup de nossos arquivos importantes!

Nota aos Usurios de Windows


Ao invs de sequncias de escape com duplo 'backslash' voc pode tambm eepregar raw
strings. Por exemplo, use 'C:\\Documentos' ou r'C:\Documentos'. Entretanto, no utilize
'C:\Documentos', uma vez que voc vai acabar encontrando uma sequncia desconhecida de
escape \D.
Agora que ns temos um script de backup operacional, podemos us-lo em qualquer situao em que
desejamos obter um backup de arquivos. Os usurios de Linux/Unix so aconselhados a empregar o
metodo_executavel como discutido anteriormente de modo que possam executar o script de backup a
qualquer momento e em qualquer lugar. Esta chamada a fase de operao ou de emprego do
software.

O programa acima funciona apropriadamente, mas (usualmente) os primeiros programas no operam


exatamente como voc espera. Por exemplo, poderiam haver problemas se voc no tivesse
projetado o programa adequadamente ou se voc tivesse cometido um erro ao digitar o cdigo, etc.
Apropriadamente, voc ter que voltar fase de projeto ou ter que 'debugar' o seu programa.
Segunda Verso
A primeira verso do nosso script funciona. Entretanto, ns podemos implementar certos
refinamentos a ele, de modo a que possa funcionar ainda melhor dia aps dia. Esta chamada a fase
de manuteno do software.

Um dos refinamentos que eu achei que seria til um mecanismo mais adequado de atribuio do
nome para os arquivos - usar a hora como o nome do arquivo dentro de um diretrio com a data
corrente como um diretrio no diretrio principal de backup. A primeira vantagem que os seus
backups estaro armazenados de uma forma hierrquica e assim muito mais fcil de gerenciar. A
segunda vantagem que o comprimento dos nomes dos arquivos ser muito menor. A terceira
vantagem que diretrios separados o ajudaro a facilmente verificar se voc j realizou o backup
do dia, uma vez que o diretrio s ser criado se voc tiver efetuado o backup daquele dia.

#!/usr/bin/python
# Nome do arquivo: backup_ver2.py

import os
import time

# 1. Os arquivos e os diretrios cujo backup ser efetuado estaro especificados


em uma lista.
origem = ['"C:\\Meus Documentos"', 'C:\\Code']
# Note que ns tivemos que usar aspas duplas dentro da string devido aos nomes
com espaos dentro dela.

# 2. O backup deve ser colocado em um diretrio de backup principal.


dir_alvo = 'E:\\Backup' # Lembre-se de alterar para aquele que voc estiver
utilizando.

# 3. O backup deve ser colocado em uma arquivo do tipo zip.


# 4. O dia corrente o nome do subdiretrio no diretrio principal.
hoje = dir_alvo + os.sep + time.strftime('%Y%m%d')
# A hora corrente o nome do arquivo zip
agora = time.strftime('%H%M%S')

# Crie o diretrio se ainda no estiver l


if not os.path.exists(hoje):
os.mkdir(hoje) # crie diretrio
print('Bem-Sucedida Criao do Diretrio', hoje)

# O nome do arquivo zip


alvo = hoje + os.sep + agora + '.zip'

# 5. Usamos o comando zip para colocar os arquivos em um arquivo zip


comando_zip = "zip -qr {0} {1}".format(alvo, ' '.join(origem))

# Execute o backup
if os.system(comando_zip) == 0:
print('Backup Bem-Sucedido em', alvo)
else:
print('Backup FALHOU')

Sada:

$ python backup_ver2.py
Bem-Sucedida Criao do Diretrio E:\Backup\20080702
Backup Bem-Sucedido em E:\Backup\20080702\202311.zip

$ python backup_ver2.py
Backup Bem-Sucedido em E:\Backup\20080702\202325.zip

Como funciona:

A maior parte do programa permanece a mesma. As alteraes so aquelas nas quais verificamos se
existe um diretrio com o dia corrente como nome dentro do diretrio principal utilizando a funo
os.exists. Se no existir, ns o criamos por meio da funo os.mkdir.
Terceira Verso
A segunda verso funciona muito bem quando eu efetuo muitos backups, mas quando h um nmero
muito grande de backups, eu estou achando difcil diferenciar para que razo so os backups! Por
exemplo, eu poderia ter feito algumas alteraes significativas a um programa ou apresentao, ento
eu gostaria a razo para aquelas alteraes ao nome do arquivo zip. Isso pode ser facilmente obtido
associando-se um comentrio fornecido pelo usurio ao nome do arquivo zip.

Nota
O programa a seguir no funciona, ento no precisa ficar alarmado, por favor acompanhe a
discusso, pois nela existe uma lio.
#!/usr/bin/python
# Nome do arquivo: backup_ver3.py

import os
import time

# 1. Os arquivos e os diretrios cujo backup ser efetuado estaro especificados


em uma lista.
origem = ['"C:\\Meus Documentos"', 'C:\\Code']
# Note que ns tivemos que usar aspas duplas dentro da string devido aos nomes
com espaos dentro dela.

# 2. O backup deve ser colocado em um diretrio de backup principal.


dir_alvo = 'E:\\Backup' # Lembre-se de alterar para aquele que voc estiver
utilizando.

# 3. O backup deve ser colocado em uma arquivo do tipo zip.


# 4. O dia corrente o nome do subdiretrio no diretrio principal.
hoje = dir_alvo + os.sep + time.strftime('%Y%m%d')
# A hora corrente o nome do arquivo zip
agora = time.strftime('%H%M%S')

# Receba um comentrio do usurio para criar o nome do arquivo zip


coment = input('Entre com um comentrio --> ')
if len(coment) == 0: # verifique se entrou um comentrio
alvo = hoje + os.sep + agora + '.zip'
else:
alvo = hoje + os.sep + agora + '_' +
coment.replace(' ', '_') + '.zip'

# Crie o diretrio se ainda no estiver l


if not os.path.exists(hoje):
os.mkdir(hoje) # crie diretrio
print('Bem-Sucedida Criao do Diretrio', hoje)

# 5. Usamos o comando zip para colocar os arquivos em um arquivo zip


comando_zip = "zip -qr {0} {1}".format(alvo, ' '.join(origem))

# Execute o backup
if os.system(comando_zip) == 0:
print('Backup Bem-Sucedido em', alvo)
else:
print('Backup FALHOU')

Sada:
$ python backup_ver3.py
File "backup_ver3.py", line 25
alvo = hoje + os.sep + agora + '_' +
^
SyntaxError: invalid syntax

Como (no) funciona:

Este programa no funciona! Python est dizendo que existe um erro de sintaxe o que significa que o
script no satisfaz a estrutura que Python espera encontrar. Quando ns observamos o erro dado por
Python, ele tambm nos aponta o local onde detetou o erro. Ento ns comeamos a debugar o nosso
programa a partir daquela linha.

Mediante uma observao mais cuidadosa, ns verificamos que a nica linha lgica foi dividida em
duas linhas fsicas, mas ns no especificamos que essas duas linhas fsicas esto conectadas uma a
outra. Basicamente, Python encontrou o operador de adio (+) sem qualquer operando naquela linha
lgica e da no sabe como prosseguir. Lembre-se que ns podemos especificar que a linha lgica
continua na prxima linha fsica atravs do uso de um 'backslash' no final da linha fsica. Assim, ns
efetuamos essa correo no nosso programa. A correo do programa quando ns encontramos erros
denominada conserto de bugs.
Quarta Verso
#!/usr/bin/python
# Nome do arquivo: backup_ver4.py

import os
import time

# 1. Os arquivos e os diretrios cujo backup ser efetuado estaro especificados


em uma lista.
origem = ['"C:\\Meus Documentos"', 'C:\\Code']
# Note que ns tivemos que usar aspas duplas dentro da string devido aos nomes
com espaos dentro dela.

# 2. O backup deve ser colocado em um diretrio de backup principal.


dir_alvo = 'E:\\Backup' # Lembre-se de alterar para aquele que voc estiver
utilizando.

# 3. O backup deve ser colocado em uma arquivo do tipo zip.


# 4. O dia corrente o nome do subdiretrio no diretrio principal.
hoje = dir_alvo + os.sep + time.strftime('%Y%m%d')
# A hora corrente o nome do arquivo zip
agora = time.strftime('%H%M%S')

# Receba um comentrio do usurio para criar o nome do arquivo zip


coment = input('Entre com um comentrio --> ')
if len(coment) == 0: # verifique se entrou um comentrio
alvo = hoje + os.sep + agora + '.zip'
else:
alvo = hoje + os.sep + agora + '_' +\
coment.replace(' ', '_') + '.zip'

# Crie o diretrio se ainda no estiver l


if not os.path.exists(hoje):
os.mkdir(hoje) # crie diretrio
print('Bem-Sucedida Criao do Diretrio', hoje)

# 5. Usamos o comando zip para colocar os arquivos em um arquivo zip


comando_zip = "zip -qr {0} {1}".format(alvo, ' '.join(origem))

# Execute o backup
if os.system(comando_zip) == 0:
print('Backup Bem-Sucedido em', alvo)
else:
print('Backup FALHOU')

Sada:
$ python backup_ver4.py
Entre com um comentrio --> novos exemplos adicionados
Backup Bem-Sucedido em E:\Backup\20080702\202836_novos
exemplos_adicionados.zip
$ python backup_ver4.py
Entre com um comentrio -->
Backup Bem-Sucedido em E:\Backup\20080702\202839.zip

Como funciona:

Este programa agora funciona! Vamos discutir os melhoramentos reais que fizemos na verso 3. Ns
coletamos o comentrio do usurio usando a funo input e ento verificamos se o usurio
efetivamente entrou com alguma coisa, por meio da determinao do comprimento da entrada usando
a funo len. Se o usurio apenas pressionou enter sem realmente haver entrado com algo (talvez
tenha sido apenas um backup de rotina ou no haviam mudanas significativas), ento ns
procedemos como havamos feito antes.

Entretanto, se um comentrio foi fornecido, ento ele associado ao nome do arquivo imediatamente
antes da extenso .zip. Observe que ns estamos substituindo espaos nos comentrios por
'underscores' (sublinhados) - isto porque gerenciar arquivos sem espaos muito mais fcil.
Mais Refinamentos
A quarta verso um script que funciona satisfatoriamente para a maior parte dos usurios, mas
existe espao para melhorias. Por exemplo, voc poderia incluir um nvel de verbosidade para o
programa, no qual voc poderia especificar uma opo -v para tornar o seu programa mais
informativo.

Uma outra possvel melhoria seria permitir arquivos e diretrios adicionais a serem passados ao
script na linha de comando. Ns podemos obter esses nomes da lista sys.argv e adicion-los a
nossa lista sorigem utilizando o mtodo extend da classe list.

O refinamento mais importante seria a no utilizao da via atravs de os.system para a criao dos
arquivos e ao invs disso lanar mo dos mdulos 'built-in' zipfile ou tarfile para cri-los. Estes
so parte da biblioteca padro e prontamente disponveis para seu uso sem as dependncias externas
do programa zip que deve estar disponvel no seu computador.

Entretanto, eu usei o caminho de os.system para criar um backup nos exemplos acima por razes
puramente pedaggicas, de modo que o exemplo fosse suficientemente simples para ser entendido
por qualquer pessoa mas real o suficiente para ser til.

Voc poderia tentar escrever a quinta verso que utiliza o mdulo zipfile ao invs do recurso ao
os.system?
O Processo de Desenvolvimento de Software
Ns passamos pelas vrias fases no processo de escrever um software. Essas fases podem ser
resumidas como segue:

1. Descubra o Qu (Anlise)
2. Saiba Como (Projeto)
3. Faa (Implementao)
4. Teste (Testando and 'Debugando')
5. Use (Operao or Emprego)
6. Mantenha (Refinamento)

Uma forma recomendada de escrever programas o procedimento que ns seguimos ao criar o script
de backup: Realize a anlise e o projeto. Comece por implementar uma verso mais simples. Teste-a
e conserte os seus 'bugs'. Use a verso para certificar-se que opera como esperada. Agora,
acrescente algumas funcionalidades que voc queira e continue a repetir o ciclo Faa-Teste-Use
tantas vezes quanto necessrio. Lembre-se, Software desenvolvido, no vem pronto.
Resumo
Ns vimos como criar os nossos prprios programas/scripts em Python e os vrios estgios
envolvidos ao escrever esses programas. Voc poder achar til criar o seu poprio programa da
mesma maneira que ns fizemos nesse captulo, de modo que voc se fique vontade no apemnas
com Python, mas tambm com a resoluo de problemas.

A seguir, discutiremos a programao orientada a objetos.


Programao Orientada a Objetos
Contedo
1 Introduo
2 O self
3 Classes
4 Mtodos de Objetos
5 O mtodo __init__
6 Variveis de Classe e Objeto
7 Herana
8 Metaclasses
9 Sumrio
Introduo
Em todos os programas que escrevemos at agora, projetamos nosso programa em termos de funes,
isto , blocos de declaraes que manipulam dados. Esta a chamada maneira de programar
orientada a procedimentos. Existe outra maneira de organizar seu programa que combina dados e
funcionalidades e as empacota dentro de algo chamado objeto. Este o chamado paradigma de
programao orientada a objetos. Na maioria das vezes voc pode usar a programao orientada a
procedimentos, mas quando estamos escrevendo grandes programas ou temos um problema que se
adequa melhor a esse mtodo, voc pode usar tcnicas de programao orientadas a objetos.

Classes e objetos so os dois principais aspectos da programao orientada a objetos. Uma classe
cria um novo tipo onde objetos so instncias da classe. Uma analogia que voc pode ter
variveis do tipo int o que significa dizer que variveis que armazenam inteiros so variveis que
so instncias (objetos) da classe int.

Nota para Programadores de Linguagens Estticas


Note que mesmo os inteiros so tratados como objetos (da classe int). Isso diferente do C++
e do Java (antes da verso 1.5) onde os inteiros so tipos primitivos nativos. Veja help(int)
para mais detalhes sobre a classe.
Programadores C# e Java 1.5 encontraro semelhanas com os conceitos de boxing e unboxing.

Objetos podem armazenar dados utilizando variveis comuns que pertencem ao objeto. Variveis
que pertencem a um objeto o classe so chamadas de campos. Objetos tambm podem ter
funcionalidade por meio de funes que pertencem a uma classe. Tais funes so chamadas de
mtodos da classe. Esta terminologia importante porque nos ajuda a diferencias entre funes e
variveis que so independentes e as que pertencem a uma classe ou objeto. Coletivamente, os
campos ou mtodos podem ser considerados atributos da classe.

Os campos podem ser de dois tipos - eles podem pertencer a cada instncia/objeto ou podem
pertencer classe em si. Elas so chamadas de variveis de instncia e variveis de classe,
respectivamente.

Uma classe criada usando a palavra-chave class. Os campos e mtodos da classe so listados em
um bloco indentado.
O self
Os mtodos tem apenas uma diferena especfica em relao a funes comuns: eles devem ter um
primeiro nome extra que deve ser includo no incio da lista de parmetros, mas voc no deve
atribuir um valor a esse parmetro quando chama o mtodo, pois o Python o fornece implicitamente.
Essa varivel em particular refere-se ao prprio objeto e, por conveno, chamada de self.

Embora seja possvel dar qualquer nome a este parmetro, fortemente recomendado que voc use
o nome self. Existem muitas vantagens um usar um nome padro - qualquer leitor do seu programa
ir reconhec-lo imediatamente e mesmo IDEs especializadas podem ajud-lo se voc usar self.

Nota para Programadores C++/Java/C#


O self em Python equivalente ao ponteiro this em C++ e referncia this em Java e C#.

Voc deve estar intrigado sobre como Python atribui o valor para self e o porqu voc no precisa
atribuir um valor para ele. Um exemplo tornar mais claro. Digamos que voc tenha uma classe
chamada MyClass e uma instncia desta classe chamada MyObject. Quando voc invoca um mtodo
deste objeto como MyObject.method(arg1, arg2), isto convertido automaticamente pelo Python
em MyClass.method(MyObject, arg1, arg2) - este o sentido especial de self.

Isto tambm significa que, se voc tem um mtodo que no possui argumentos, ento voc ainda
assim dever ter um argumento - o self.
Classes
A classe mais simples possvel mostrada no seguinte exemplo.

#!/usr/bin/python
# Arquivo: simplestclass.py

class Person:
pass # Um bloco vazio

p = Person()
print(p)

Sada:
$ python simplestclass.py
<__main__.Person object at 0x019F85F0>

Como Funciona:

Criamos uma nova classe usando a instruo class e o nome da classe. Na sequncia, temos um
bloco de instrues que formam o corpo da classe. Neste caso, temos um bloco vazio que indicado
pela instruo pass.

Em seguida, criamos um objeto/instncia desta classe usando o nome da classe seguido por um par
de parnteses. (Aprenderemos mais sobre instanciao na prxima seo). Para verificao,
confirmamos o tipo da varivel simplementes imprimindo-a (print). Isso nos diz que temos uma
instncia da classe Person no mdulo __main__.

Observe que o endereo de memria onde seu objeto est armazenado tambm impresso. O
endereo ter um valor diferente em seu computador, uma vez que o Python poder armezenar o
objeto onde quer que haja espao.
Mtodos de Objetos
J discutimos que classes/objetos podem ter mtodos exatamente como funes, exceto pelo fato de
que temos uma varivel extra - self. Vejamos um exemplo.
#!/usr/bin/python
# Arquivo: method.py

class Person:
def sayHi(self):
print('Hello, how are you?')

p = Person()
p.sayHi()

# Este pequeno exemplo tambm pode ser escrito como Person().sayHi()

Sada:
$ python method.py
Hello, how are you?

Como Funciona:

Aqui vemos o self em ao. Observe que o mtodo sayHi no possui qualquer parmetro mas,
ainda assim, temos o self na definio do mtodo.
O mtodo __init__
Existem vrios nomes de mtodos que possuem significado especial em classes Python. Veremos
agora o significado do mtodo __init__.

O mtodo __init__ invocado pronta e automaticamente quando um objeto de uma classe


instanciado. Este mtodo til para realizar quaisquer iniciaes que voc desejar fazer com o seu
objeto. Observe os sublinhados duplos, no incio e no final do nome.

Exemplo:
#!/usr/bin/python
# Arquivo: class_init.py

class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print('Hello, my name is', self.name)

p = Person('Swaroop')
p.sayHi()

# Este exemplo tambm pode ser escrito como Person('Swaroop').sayHi()

Sada:
$ python class_init.py
Hello, my name is Swaroop

Como Funciona:

Aqui, definimos o mtodo __init__ com um parmetro name (alm do usual parmetro self).
Ento, simplesmente criamos um novo atributo tambm chamado name. Observe que tratam-se de
variveis diferentes, embora tenham o mesmo nome ('name'). A notao por ponto nos permite
diferenciar uma varivel da outra.

Mais importante ainda, observe que ns no invocamos o mtodo __init__ explicitamente, mas
apenas passamos os argumentos entre os parnteses aps o nome da classe, quando criamos uma
nova instncia. Este o significado especial deste mtodo.

Agora, podemos usar o atributo self.name em nossos mtodos, como demonstrado no mtodo
sayHi.

Nota para Programadores C++/Java/C#


O mtodo __init__ anlogo a um construtor em C++, Java ou C#.
Variveis de Classe e Objeto
J discutimos a respeito do lado funcional de classes e objetos (i.e. mtodos), agora vamos aprender
sobre dados. Dados (i.e. campos ou atributos) so nada mais que variveis comuns que esto
associadas ao espao de nomes (namespace) de uma classe e/ou objeto. Isto significa que esses
nomes so vlidos apenas no contexto de uma classe e/ou objeto particular. Por isso so chamados
de espaos de nomes (name spaces).

Existem dois tipos de atributos (ou campos) - variveis de classe e variveis de objeto, que so
classificados dependendo de quem - a classe ou o objeto - possui essas variveis.

Variveis de classe so compartilhadas - elas podem ser acessadas por todas as instncias daquela
classe. H apenas uma cpia de uma varivel de classe e quando qualquer instncia daquela classe
modifica o seu valor, essa mudana ser vista por todas as outras instncias.

Variveis de objeto so particulares a cada instncia individual de uma classe. Neste caso, cada
objeto possui a sua prpria cpia, ou seja, elas no so compartilhadas e no esto relacionadas de
qualquer maneira outras variveis com o mesmo em outras instncias. Um exemplo tornar mais
fcil de entender:
#!/usr/bin/python
# Arquivo: objvar.py

class Robot:
'''Representa um rob com um nome.'''

# Uma varivel de classe, para contar o nmero de robs.


population = 0

def __init__(self, name):


'''Inicia os dados.'''
self.name = name
print('(Iniciando {0})'.format(self.name))

# Quando este rob criado ele contabilizado


# na populao geral de robs
Robot.population += 1

def __del__(self):
'''Estou morrendo.'''
print('{0} sendo destrudo!'.format(self.name))

Robot.population -= 1

if Robot.population == 0:
print('{0} era o ltimo.'.format(self.name))
else:
print('Existe(m) ainda {0:d} rob(s)
trabalhando.'.format(Robot.population))
def sayHi(self):
'''Saudaes do rob.

Sim, eles podem fazer isso.'''


print('Saudaes, meus mestres me chamam {0}.'.format(self.name))

def howMany(klass):
'''Imprime a populao atual.'''
print('Temos um total de {0:d} rob(s).'.format(Robot.population))
howMany = classmethod(howMany)

droid1 = Robot('R2-D2')
droid1.sayHi()
Robot.howMany()

droid2 = Robot('C-3PO')
droid2.sayHi()
Robot.howMany()

print("\nRobs podem realizar algum trabalho aqui.\n")

print("Robs terminaram seus trabalhos. Ento vamos destru-los.")


del droid1
del droid2

Robot.howMany()

Sada:
(Iniciando R2-D2)
Saudaes, meus mestres me chamam R2-D2.
Temos um total de 1 rob(s).
(Iniciando C-3PO)
Saudaes, meus mestres me chamam C-3PO.
Temos um total de 2 rob(s).

Robs podem realizar algum trabalho aqui.

Robs terminaram seus trabalhos. Ento vamos destru-los.


R2-D2 sendo destrudo!
Existe(m) ainda 1 rob(s) trabalhando.
C-3PO sendo destrudo!
C-3PO era o ltimo.
Temos um total de 0 rob(s).

Como Funciona:

Este um longo exemplo, mas ajuda a demonstrar a natureza das variveis de classe e de instncia.
Aqui, population pertence classe Robot e, portanto, uma varivel de classe. A varivel name
pertence ao objeto (instncia, pois atribuda usando self) e, portanto, uma varivel de instncia.

Assim, nos refermos varivel de classe population como Robot.population e no como


self.population. Por outro lado, nos refermos varivel de instncia name usando a notao
self.name, nos mtodos daquele objeto. Lembre-se desta simples diferena entre variveis de
classe e de instncia. Note tambm que, uma varivel de instncia com o mesmo nome de uma
varivel de classe ir se sobrepor varivel de classe, escondendo-a!

O mtodo howMany , na verdade, um mtodo de classe, e no um mtodo de instncia. Portanto, o


primeiro argumento klass. Note que escrevemos klass com 'k', por que no podemos reutilizar a
palavra class que a palavra-chave usada para criar nova classes.

Ainda no terminamos de definir 'howMany', pois temos que tornar explcito que trata-se de um
mtodo de classe. Para isso, empacotamos o mtodo usando a funo interna classmethod.

Podemos obter o mesmo efeito usando decorators:


@classmethod
def howMany(klass):
'''Imprime a populao atual.'''
print('Temos um total de {0:d} rob(s).'.format(Robot.population))

Pense em decorators como sendo atalhos para uma chamada explcita a uma instruo, como vimos
neste exemplo.

Note que o mtodo __init__ usado para iniciar a instncia de Robot com um nome. Na iniciao,
incrementamos em 1 a populao (population) de robs, uma vez que temos mais um rob
adicionado. Observe tambm que os valores de self.name so especficos a cada objeto
demonstrado a natureza das variveis de instncia.

Lembre-se que voc deve referir-se s variveis e mtodos de uma mesma instncia somente em
conjunto com self. Isto chamado de referncia ao atributo.

Neste exemplo, tambm vemos o uso de docstrings para classes e tambm para mtodos. Podemos
acessar a documentao da classe em tempo de execuo usando Robot.__doc__ e a documentao
de um mtodo usando Robot.sayHi.__doc__.

Assim como o mtodo __init__, h um outro mtodo especial __del__ que invocado com quando
um objeto est para ser eliminado, isto , quando no ser mais utilizado e ser eliminado para que o
sistema reutilize o trecho de memria que aquela instncia estiver ocupando. Neste mtodo,
simplesmente decrementamos a populao geral de robs em 1 usando Person.population -= 1.

O mtodo __del__ ser executado quando o objeto no estiver mais em uso e no h garantias de
quando o mtodo ser invocado. Se voc deseja v-lo em ao, devemos utilizar a instruo del
explicitamente, que exatamente o que fizemos.

Nota para Programadores C++/Java/C#


Todos os membros de classe (incluindo dados - variveis) so pblicos e todos os mtodos so
virtual em Python.
H uma exceo: Se voc definir nomes para os membros prefixados com dois caracteres de
sublinha como em __privatevar, Python altera esse nome internamente (tcnica chamada
name-mangling) para tornar a varivel, efetivamente, privada.
Assim, segue-se a conveno de que, qualquer varivel que deva ser utilizada apenas pela
classe ou pela instncia deve iniciar com um sublinhado e, todos os outros nomes so pblicos e
podem ser utilizados por outras classes/objetos. Lembre-se de que esta apenas uma conveno
e no exigido pelo Python (exceto para prefixos que iniciem com dois caracteres de
sublinhado).
Note tambm que o mtodo __del__ anlogo ao conceito de mtodos destructor.
Herana
Um dos maiores benefcios da programao orientada a objetos reusabilidade de cdigo, e uma
maneiras de obter isto atravs do mecanismo de herana. Herana pode ser imaginada como a
implementao de um relacionamento tipo e subtipo entre classes.

Suponha que voc deva escrever um programa para controle de professores e alunos em uma escola.
Eles possuem caractersticas comuns tais como nome, idade e endereo. Eles tambm possuem
caractersticas especficas tais como salrio, matrias e leaves para professores e notas e
mensalidades para alunos.

Voc pode criar duas classes independentes, uma para tipo, mas adicionar uma nova caraterstica
comum significar adicionar nas duas classes independentes. Isto torna-se rapidamente desajeitado.

Um modo mais eficiente criar uma classe comum chamada SchoolMember e ento fazer outras duas
classes professor (Teacher) e aluno (Student) herdarem suas caracterstias, isto , elas sero seus
sub-tipos, e ento poderemos adicionar caractersticas especficas para cada sub-tipo.

Existem muitas vantagens nesta abordagem. Se adicionarmos ou mudarmos qualquer funcionalidade


em SchoolMember, isto ser automaticamente refletido em seus sub-tipos. Por exemplo, voc poder
adicionar um novo campo ID para professores e alunos simpesmente adicionando esse campo na
classe SchoolMember. Entretanto, mudanas em sub-tipos no afetaro outros sub-tipos. Outra
vantagem que voc pode se referir aos objetos professores e alunos como objetos SchoolMember,
o que pode ser til em algumas situaes, tal como contar o nmero total de membros. Isto chamado
de polimorfismo, onde um sub-tipo pode ser substitudo em qualquer situao onde um super-tipo
esperado, isto , o objeto pode ser manipulado como se fosse uma instncia da classe pai.

Observe tambm que ns reutilizamos o cdigo da classe pai (super-tipo) e por isso no precisamos
repet-lo nos sub-tipos, como teramos que fazer no caso de usarmos classes independentes.

A classe SchoolMember nesta situao conhecida como classe base (base class) ou super classe..
As classes Teacher e Student so chamadas de classes derivadas (derived classes) ou sub-
classes.

Vamos implementar o exemplo citado:


#!/usr/bin/python
# Arquivo: inherit.py

class SchoolMember:
'''Representa qualquer membro da escola.'''
def __init__(self, name, age):
self.name = name
self.age = age
print('(Iniciado SchoolMember: {0})'.format(self.name))
def tell(self):
'''Imprime os detalhes desta instncia.'''
print('Nome:"{0}" Idade:"{1}"'.format(self.name, self.age), end=" ")

class Teacher(SchoolMember):
'''Representa um professor.'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print('(Iniciado Teacher: {0})'.format(self.name))

def tell(self):
SchoolMember.tell(self)
print('Salrio: "{0:d}"'.format(self.salary))

class Student(SchoolMember):
'''Representa um aluno.'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print('(Iniciado Student: {0})'.format(self.name))

def tell(self):
SchoolMember.tell(self)
print('Nota: "{0:d}"'.format(self.marks))

t = Teacher('Mrs. Shrividya', 40, 30000)


s = Student('Swaroop', 25, 75)

print() # imprime uma linha em branco

members = [t, s]
for member in members:
member.tell() # funciona tanto para Teachers como para Students

Sada:
$ python inherit.py
(Iniciado SchoolMember: Mrs. Shrividya)
(Iniciado Teacher: Mrs. Shrividya)
(Iniciado SchoolMember: Swaroop)
(Iniciado Student: Swaroop)

Nome:"Mrs. Shrividya" Idade:"40" Salrio: "30000"


Nome:"Swaroop" Idade:"25" Nota: "75"

Como Funciona:

Para usar herana, especificamos os nomes das classes base em uma tupla, logo aps o nome da
classe em sua declarao. Em seguida, observamos que o mtodo __init__ da classe base
explicitamente invocado usando a varivel self, de tal maneira que podemos iniciar a poro da
classe base do objeto. muito importante lembrar-se disto - Python no invocar automaticamente o
construtor da classe base, por isso voc dever invoc-lo explicitamente.

Observamos tambm que podemos invocar mtodos da classe base prefixando o nome da classe na
chamada do mtodo e ento passar como argumento a varivel self alm de quaisquer outros
argumentos.

Note que podemos tratar instncias de Teacher ou Student simplesmente como instncias de
SchoolMember, tal como quando usamos o mtodo tell da classe SchoolMember.

Ainda, note que invocado o mtodo tell do sub-tipo e no o mtodo tell da classe
SchoolMember. Uma maneira de enteder isto que Python sempre procura pelo mtodo invocado,
primeiro no tipo real do objeto, o que verificado neste caso. Se o mtodo invocado no puder ser
encontrado, Python ir procurar pelo mtodo nas classes base (especificadas na tupla onde a classe
declarada) uma-a-uma na ordem em que foram escritas.

Uma nota sobre terminologia - se mais de uma classe fornecida na tupla de herana (na declarao
da classe), isto chamado de herana mltipla.
Metaclasses
H muito mais no vasto tpico da programao orientada a objetos, mas tocaremos levemente em
apenas alguns poucos tpicos apenas para ficarmos sabendo que existem.

Assim como usamos classes para criar objetos, podemos utilizar metaclasses para criar classes.
Metaclasses so usadas para modificar ou criar novos comportamentos em classes.

Vamos tomar um exemplo. Suponha que desejemos ter certeza que sempre criaremos instncias de
subclasses da classe SchoolMember e que no criaremos instncias da classe SchoolMember em si.

Podemos garantir isso usando um conceito chamado de classe base abstrata (abstract base class).
Isso significa que a classe ser abstrata o que quer dizer que a classe em si um conceito, e no
deve ser utilizada como uma classe real (ou seja, no devem ser criados objetos - instncias - dessa
classe).

Podemos declarar que a nossa classe uma classe base abstrata usando a metaclasse interna
chamada ABCMeta (ABC - abstract base class).
#!/usr/bin/env python
# Arquivo: inherit_abc.py

from abc import *

class SchoolMember(metaclass=ABCMeta):
'''Representa um membro qualquer da escola.'''
def __init__(self, name, age):
self.name = name
self.age = age
print('(Iniciado SchoolMember: {0})'.format(self.name))

@abstractmethod
def tell(self):
'''Imprime os dados da instncia.'''
print('Nome:"{0}" Idade:"{1}"'.format(self.name, self.age), end=" ")

class Teacher(SchoolMember):
'''Representa um professor.'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print('(Iniciado Teacher: {0})'.format(self.name))

def tell(self):
SchoolMember.tell(self)
print('Salrio: "{0:d}"'.format(self.salary))

class Student(SchoolMember):
'''Representa um aluno.'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print('(Iniciado Student: {0})'.format(self.name))

def tell(self):
SchoolMember.tell(self)
print('Nota: "{0:d}"'.format(self.marks))

t = Teacher('Mrs. Shrividya', 40, 30000)


s = Student('Swaroop', 25, 75)

m = SchoolMember('abc', 10)

m.tell()

print() # imprime uma linha em branco

members = [t, s]
for member in members:
member.tell() # funciona tanto para Teacher como para Student

Sada:
(Iniciado SchoolMember: Mrs. Shrividya)
(Iniciado Teacher: Mrs. Shrividya)
(Iniciado SchoolMember: Swaroop)
(Iniciado Student: Swaroop)
Traceback (most recent call last):
File "C:\Users\swaroop\python\usingabc.py", line 44, in <module>
m = SchoolMember('abc', 10)
TypeError: Can't instantiate abstract class SchoolMember with abstract
methods tell

Como funciona:

Podemos declarar o mtodo tell da classe SchoolMember como sendo um mtodo abstrato, assim,
automaticamente, no poderemos criar instncias da classe SchoolMember.

Entretanto, podermos criar instncias de Teacher e Student como se fossem instncias de


SchoolMember, por que eles so subclasses.
Sumrio
Acabamos de explorar os vrios aspectos de classes e objetos bem como vrias terminologias
relacionadas. Vimos tambm os benefcios e as armadilhas da programao orientada a objetos.
Python fortemente orientado a objetos e compreender cuidadosamente estes conceitos o ajudaro
muito a longo prazo.

A seguir, aprenderemos a lidar com entrada e sada (input/output) e sobre como acessar arquivos em
Python.
Entrada e Sada
Contedo
1 Introduo
2 Entrada do usurio
3 Arquivos
4 Pickle
5 Sumrio
Introduo
Haver situaes em que seu programa dever interagir com o usurio. Por exemplo, voc poderia
desejar obter alguma entrada do usurio e ento imprimir algo. Ns podemos fazer isso usando as
funes input() e print().

Para a sada, ns tambm podemos usar vrios mtodos da classe str (string). Por exemplo, voc
pode usar o mtodo rjust para tornar uma string justificada a direita em uma largura especificada.
Veja help(str).

Outro tipo comum de entrada/sada o uso de arquivos. A habilidade de criar, ler e escrever
arquivos essencial para muitos programas e ns exploraremos este aspecto neste captulo.
Entrada do usurio
#!/usr/bin/python
# user_input.py

def reverse(texto):
return texto[::-1]

def is_palindrome(texto):
return texto == reverse(texto)

algo = input('Entre com o texto: ')


if (is_palindrome(algo)):
print("Sim, um palndromo")
else:
print("No, no um palndromo")

Sada:
$ python user_input.py
Entre com o texto: senhor
No, no um palndromo

$ python user_input.py
Entre com o texto: ana
Sim, um palndromo

$ python user_input.py
Entre com o texto: somavamos
Sim, um palndromo

Como funciona:

Ns usamos um 'slicing' para inverter o texto. Ns j vimos como podemos faz-lo 'slices' de
sequncias usando o cdigo seq[a:b] iniciando da posio a para a posio b. Ns tambm
podemos fornecer um terceiro argumento que determina os passos pelos quais o 'slicing' feito. O
passo padro 1, pois assim ele retorna uma parte contnua do texto. Dando um passo negativo, i.e. -
1 o texto ser retornado de forma invertida.

A funo input() recebe uma string como argumento e a mostra para o usurio. Ento ela espera que
o usurio digite algo e pressione a tecla de retorno (Enter). Feito isso, a funo input() ir retornar
o texto.

Ns pegamos este texto e o invertemos. Se o texto original e o invertido forem iguais, ento o texto
um palndromo.

Lio de casa:

Verificar se um texto um palndromo deveria ignorar pontuao, espaos e caixas altas e baixas.
Por exemplo, "Socorram-me, subi no nibus em Marrocos!" tambm um palndromo, mas nosso
atual programa no diz isso. Voc pode modificar o programa para reconhecer este palndromo?
Arquivos
Voc pode abrir e usar arquivos para leitura ou gravao criando um objeto da classe file e usando
seus mtodos read, readline ou write para ler ou escrever no arquivo. A possibilidade de ler ou
escrever no arquivo depende do modo que voc especificou em sua abertura. Quando voc acabar de
usar o arquivo, voc pode chamar o mtodo close() para dizer para o Python que ns terminamos
de usar o arquivo.

Exemplo:
#!/usr/bin/python
# Filename: usando_arquivo.py

poema = '''\
Programar divertido
Quando o trabalho est pronto
se voc quer tornar seu trabalho divertido:
use Python!
'''

f = open('poema.txt', 'w') # abrir para escrever ('w'riting)


f.write(poema) # escreve o texto no arquivo
f.close() # fecha o arquivo

f = open('poema.txt') # se nenhum modo especificado, o modo leitura ('r'ead)


aberto por padro
while True:
linha = f.readline()
if len(linha) == 0: # Tamanho 0 indica EOF (fim do arquivo - End Of File)
break
print(linha, end='')
f.close() # fecha o arquivo

Sada:
$ python usando_arquivo.py
Programar divertido
Quando o trabalho est pronto
se voc quer tornar seu trabalho divertido:
use Python!

Como funciona:

Inicialmente, abrimos um arquivo usando a funo embutida open e especificando o nome do arquivo
e o modo no qual queremos abri-lo. Os modos podem ser de leitura ('r'), gravao ('w') ou
adicionar ('a'). Ns tambm podemos trabalhar com um arquivo de texto ('t') ou um arquivo
binrio ('b'). Na verdade existem muito mais mdulos disponveis, digitar help(open) dar a voc
mais detalhes sobre eles. Por padro, open() consideradas o arquivo como um 't'exto e o abre no
modo leitura ('r'ead).
Em nosso exemplo, ns primeiro abrimos o arquivo em modo texto para gravao, ento usamos o
mtodo write do objeto arquivo para escrever o texto e, finalmente, fechamos o arquivo com o
mtodo close.

Em seguida, ns abrimos o mesmo arquivo novamente para leitura. Ns no especificamos o modo


pois o modo padro 'arquivo texto para leitura'. Ns lemos cada linha usando o mtodo readline
em um loop. Este mtodo retorna uma linha completa, incluindo o carcter de nova linha no final.
Quando uma string vazia retornada, significa que ns atingimos o fim do arquivo e, ento,
'interrompemos' (break) o loop.

Por padro, a funo print() imprime o texto com uma nova linha na tela. Ns evitamos a nova
linha especificando end='' pois a linha que lida do arquivo j termina com um carcter de nova
linha. Finalmente, ns fechamos o arquivo.

Agora, verifique o contedo do arquivo poema.txt para se certificar de que o programa escreveu e
leu o arquivo.
Pickle
Python fornece um mdulo padro chamado pickle, que permite que voc armazene qualquer objeto
de Python em um arquivo e ento o pegue novamente mais tarde. Isto chamado de armazenar o
objeto permanentemente.

Exemplo:
#!/usr/bin/python
# Filename: pickling.py

import pickle

# o nome do arquivo onde armazenaremos o objeto


arquivo_listadecompras = 'listadecompras.data'
# a lista de coisas a comprar
listadecompras = ['ma', 'manga', 'cenoura']

# Escrevendo no arquivo
f = open(arquivo_listadecompras, 'wb')
pickle.dump(listadecompras, f) # descarrega o objeto em um arquivo
f.close()

del listadecompras # destri a varivel listadecompras

# L o que foi armazenado


f = open(arquivo_listadecompras, 'rb')
lista_armazenada = pickle.load(f) # carrega o objeto do arquivo
print(lista_armazenada)

Sada:
$ python pickling.py
['ma', 'manga', 'cenoura']

Como funciona:

Para armazenar um objeto em um arquivo, ns devemos inicialmente abrir o arquivo com o mdulo
open em modo de gravao ('w'rite) e 'b'inrio, para ento chamar a funo dump do mdulo pickle.
Este processo chamado pickling.

A seguir, ns recuperamos o objeto, usando a funo load do mdulo pickle que retorna o objeto.
Este processo chamado unpickling.
Sumrio
Ns discutimos vrios tipos de entrada/sada e tambm o manuseio de arquivos usando o mdulo
pickle.

A seguir, ns exploraremos o conceito de excees.


Excees
Contedo
1 Introduo
2 Erros
3 Excees
4 Manipulando Excees
5 Levantando Excees
6 Try .. Finally
7 O Comando With
8 Resumo
Introduo
Excees ocorrem quando determinadas situaes "excepcionais" ocorrem em seu programa. Por
exemplo, que tal se voc estiver para ler um arquivo e este no existir? Ou que tal se voc
acidentalmente deletou-o durante a execuo do programa? Tais situaes so manipuladas uitizando
excees.

De modo anlogo, que tal se o seu programa tivesse comandos invlidos? Isso manipulado por
Python, que levanta (raise) as mos e avisa a voc que existe um erro.
Erros
Suponha uma simples chamada da funo print<tt>. Que tal se ns escrevssemos errado
como <tt>print ou Print<tt>? Observe a capitalizao. Neste caso, Python levanta
um erro de sintaxe.

>>> Print('Hello World')


Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
Print('Hello World')
NameError: name 'Print' is not defined
>>> print('Hello World')
Hello World

Observe que um <tt>NameError levantado e tambm que a localizao onde o erro foi detetado
impressa. Isso o que um error handler para este erro faz.
Excees
Ns tentaremos (try) ler a entrada do usurio. Digite ctrl-d e veja o que acontece.

>>> s = input('Entre com alguma coisa --> ')


Entre com alguma coisa -->
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
s = input('Entre com alguma coisa --> ')
EOFError: EOF when reading a line

Python levanta um erro chamado EOFError o qual basicamente significa que encontrou um smbolo
end of file (fim do arquivo) (representado por ctrl-d) quando no esperaria v-lo.
Manipulando Excees
Ns podemos manipular excees usando o comando try..except. Ns basicamente colocamos os
comandos costumeiros dentro do bloco do try e dipomos os nossos manipuladores de erros no bloco
do except.
#!/usr/bin/python
# Nome do arquivo: try_except.py

try:
texto = input('Entre com alguma coisa --> ')
except EOFError:
print('Por que voc jogou um EOF em mim?')
except KeyboardInterrupt:
print('Voc cancelou a operao.')
else:
print('Voc entrou com {0}'.format(texto))

Sada:
$ python try_except.py
Entre com alguma coisa --> # Press ctrl-d
Por que voc jogou um EOF em mim?

$ python try_except.py
Entre com alguma coisa --> # Press ctrl-c
Voc cancelou a operao.

$ python try_except.py
Enter something --> nenhuma exceo
Voc entrou com nenhuma exceo

Como Funciona:

Ns colocamos todos os comandos que poderiam levantar excees dentro do bloco do try e ento
os 'handlers' para os erros/excees na clusula/bloco except. a clusula except pode manipular
um nico erro ou exceo especificada, ou uma lista de erros/excees entre parnteses. Se nenhum
nome de erro ou exceo for fornecido, manipular todos os erros ou excees.

Note que deve haver pelo menos uma clusula except associada com cada clusula try. Ou no
haveria razo para um bloco de try.

Se um erro ou exceo no manipulada, ento invocado o Python handler padro que interrompe a
execuo do programa e emite uma mensagem de erro. Ns vimos isso em ao acima.

Ns podemos tambm ter uma clusula else associada a um bloco try..catch. A clusula else
executada se nenhuma exceo ocorrer.

No poximo exemplo, ns veremos como obter um objeto exceo de modo que ns possamos
recuperar informao adicional.
Levantando Excees
Voc pode levantar excees com o comando raise fornecendo o nome do erro/exceo e o objeto
exceo que dever ser lanado (thrown).

O erro ou exceo que voc pode levantar dever ser uma classe que direta ou indiretamente deve
ser uma classe derivada da classe Exception.
#!/usr/bin/python
# Nome do arquivo: raising.py

class ShortInputException(Exception):
'''Uma classe exceo definida pelo usurio.'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast

try:
text = input('Entre com alguma coisa --> ')
if len(text) < 3:
raise ShortInputException(len(text), 3)
# Demais tarefas podem continuar como usualmente aqui...
except EOFError:
print('Por que voc jogou um EOF em mim?')
except ShortInputException as ex:
print('ShortInputException: A entrada teve o comprimento {0}, o esperado era
pelo menos {1}'\
.format(ex.length, ex.atleast))
else:
print('Nenhuma exceo foi levantada.')

Sada:

$ python raising.py
Entre com alguma coisa --> a
ShortInputException: A entrada teve o comprimento 1, o esperado era pelo
menos 3

$ python raising.py
Enter something --> abc
Nenhuma exceo foi levantada.

Como Funciona:

Aqui ns estamos criando o nosso prprio tipo de Exceo. Este novo tipo de exceo chamado
ShortInputException. Ele tem dois campos - length que o comprimento da entrada fornecida e
atleast que o mnimo comprimento da entrada que o programa estava esperando.

Na clusula except, ns mencionamos a classe de erro que ser guardada as (como) o nome da
variable que ir manter o objeto erro/exceo correspondente. Isto anlogo aos parmetros e
argumentos em uma chamada de funo. Dentro dessa particular clusula except clause, ns usamos
os campos length e atleast do objeto exceo para imprimir uma mensagem apropriada ao
usurio.
Try .. Finally
Suponha que voc estivesse lendo um arquivo em seu programa. Como voc poderia assegurar-se
que o objeto arquivo estivesse fechado adequadamente, fosse ou no levantada uma exceo? Isso
pode ser obtido usando-se o bloco finally. Note que voc pode empregar uma clusula except
juntamente 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
# Nome do arquivo: finally.py

import time

try:
f = open('poema.txt')
while True: # nossa usual linguagem de leitura de arquivo
line = f.readline()
if len(line) == 0:
break
print(line, end='')
time.sleep(2) # Assegurar que levar algum tempo executando
except KeyboardInterrupt:
print('!! Voc cancelou a leitura do arquivo.')
finally:
f.close()
print('(Limpando tudo: Fechado o arquivo)')

Sada:
$ python finally.py
Programming is fun
When the work is done
if you wanna make your work also fun:
!! Voc cancelou a leitura do arquivo.
(Limpando tudo: Fechado o arquivo)

Como Funciona:

Ns efetuamos a tradicional rotina de leitura do arquivo, mas introduzimos arbitrariamente uma


pausa ('sleeping') de 2 segundos depois da impresso de cada linha, usando a funo time.sleep de
modo que o programa execute lentamente (Python muito rpido por natureza). Enquanto o programa
estiver executando, digite ctrl-c para interromper/cancelar o programa.

Observe que a exceo KeyboardInterrupt lanada e o programa termina. Entretanto, antes da


sada do programa, a clusula finally executada e o objeto arquivo sempre fechado.
O Comando With
Adquirir um recurso no bloco try e liber-lo no bloco finally um padro comum. Da existe
tambm o comando with que faz com que isso seja realizado de um modo bem mais claro:
#!/usr/bin/python
# Nome do arquivo: using_with.py

with opened("poema.txt") as f:
for line in f:
print(line, end='')

Como Funciona:

A sada dever ser a mesma do exemplo anterior. A diferena aqui est em que ns estamos usando a
funo opened com o comando with.

Isto no congestiona o processamento do arquivo e focaliza no que estamos fazendo com ele. Ns
deixamos o fechamento do arquivo a ser realizado automaticamente por opened.
Resumo
Ns discutimos o uso dos comandos try..except e try..finally. Vimos como criar o nosso
prprio tipo de exceo e tambm como levantar excees.

Em seguida, exploraremos a Python Standard Library (Bibioteca Padro do Python).


Biblioteca Padro
Contedo
1 Introduo
2 Mdulo sys
3 Mdulo logging
4 Mdulos urllib e json
5 O Mdulo da Semana
6 Sumrio
Introduo
A Biblioteca Padro do Python contm um vasto nmero de mdulos teis e parte de todas as
instalaes de Python. importante conhece-la, uma vez que muitos problemas podem ser resolvidos
rapidamente se voc estiver familiarizado com o grande nmero de coisas que estas bibliotecas
podem fazer.

Ns iremos explorar alguns dos mdulos mais usados desta biblioteca. Voc pode encontar detalhes
completos para todos os mdulos da Biblioteca Padro do Python na seo 'Library Reference' da
documentao que vem com sua instalao do Python.

Vamos explorar alguns mdulos teis.

Nota
Se voc achar estes tpicos muito avanados, voc pode pular este captulo. No entanto, eu
realmente recomendo que voc volte para estudar este captulo quando voc estiver
familiarizado com a programao usando Python.
Mdulo sys
O mdulo sys contm funcionalidades especficas do sistema. Ns j vimos que a lista sys.argv
contm os argumentos da linha de comando.

Suponha que ns desejemos checar a verso do Python que est sendo usada para se assegurar que
estamos usando a verso 3. O mdulo sys nos d tal funcionalidade.
>>> import sys
>>> sys.version_info
(3, 0, 0, 'beta', 2)
>>> sys.version_info[0] >= 3
True

Como funciona:

O mdulo sys tem a tupla version_info que nos d informaes sobre a verso do Python. O
primeiro valor a verso principal. Ns podemos verificar a verso, por exemplo, para garantir que
o programa s rode sob o Python 3.0:
#!/usr/bin/python
# Filename: checarversao.py
import sys, warnings
if sys.version_info[0] < 3:
warnings.warn("Necessrio Python 3.0 para rodar este programa",
RuntimeWarning)
else:
print('Prosseguir normalmente')

Sada:
$ python2.5 checarversao.py
checarversao.py:6: RuntimeWarning: Necessrio Python 3.0 para rodar este
programa
RuntimeWarning)

$ python3 checarversao.py
Prosseguir normalmente

Como funciona:

Ns usamos um outro mdulo da biblioteca padro chamado warnings, que usado pra mostrar
avisos para o usurio final. Se a verso do Python no for 3.0 ou superior, ns mostramos o aviso
correspondente.
Mdulo logging
E se voc desejar armazenar mensagens de depurao ou outras mensagens importantes, de forma que
voc possa verificar se seu programa est rodando da forma que voc esperava? Como armazenar
estas mensagens? Isso pode ser feito usando o mdulo logging.
#!/usr/bin/python
# Filename: use_logging.py
import os, platform, logging

if platform.platform().startswith('Windows'):
logging_file = os.path.join(os.getenv('DIRETRIOINICIAL'),
os.getenv('CAMINHO'), 'test.log')
else:
logging_file = os.path.join(os.getenv('HOME'), 'test.log')

logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s : %(levelname)s : %(message)s',
filename = logging_file,
filemode = 'w',
)

logging.debug("Incio do programa")
logging.info("Fazendo alguma coisa")
logging.warning("Terminando agora")

Sada:
$python use_logging.py
Logging to C:\Users\swaroop\test.log

Se ns verificarmos o contedo de test.log, veremos algomo como isto:

2008-09-03 13:18:16,233 : DEBUG : Incio do programa


2008-09-03 13:18:16,233 : INFO : Fazendo alguma coisa
2008-09-03 13:18:16,233 : WARNING : Terminando agora

Como funciona:

Ns usamos trs mdulos da biblioteca padro - o mdulo os para interagir com o sistema
operacional, o mdulo platform para informaes sobre a plataforma, i.e. o sistema operacional, e
o mdulo logging para registrar informaes.

Inicialmente, ns verificamos qual o sistema operacional que estamos usando, verificando a string
retornada por platform.platform() (para mais informaes, veja import platform;
help(platform) no interpretador Python). Se for o Windows, ns apontamos o diretrio inicial, o
caminho e o nome do arquivo no qual queremos armazenar a informao. Juntando estas trs partes,
ns teremos a localizao completa do arquivo. Para outras plataformas, ns precisamos conhecer
apenas a pasta home do usurio e assim teremos a localizao completa do arquivo.

Ns usamos a funo os.path.join() para juntar estas trs partes da localizao. O motivo de usar
uma funo especial ao inves de apenas somar as strings, que esta funo se assegura de que a
localizao completa esteja de acordo com o formato esperado pelo sistema operacional.

Ns configuramos o mdulo logging para escrever todas as mensagens no arquivo especificado,


num formato especfico.

Finalmente, ns podemos armazenar mensagens teis para depurao, informao, avisos ou


mensagens crticas. Uma vez que o programa tenha rodado, ns podemos verificar este arquivo e,
assim, saberemos o que aconteceu no programa, mesmo que nenhuma informao tenha sido mostrada
para o usurio durante seu funcionamento.
Mdulos urllib e json
No seria divertido se ns pudssemos escrever nossos prprios programas de busca para internet?
Vamos descobrir como faz-los.

Isto pode ser feito usando-se alguns mdulos. Primeiro o mdulo urllib que podemos usar para
obter qualquer pgina da internet. Poderemos usar o Yahoo! Search para pesquisar resultados e, por
sorte, eles podem nos dar os resultados num formato chamado JSON, que podemos analisar
facilmente graas ao mdulo embutido json da biblioteca padro.

Nota
Este programa ainda no funciona devido ao que parece ser um bug no Python 3.0 beta 2.
#!/usr/bin/python
# Filename: yahoo_search.py

import sys
if sys.version_info[0] != 3:
sys.exit('Este programa precisa do Python 3.0')

import json
import urllib, urllib.parse, urllib.request, urllib.response

# Obtenha seu prprio APP ID em http://developer.yahoo.com/wsregapp/


YAHOO_APP_ID =
'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr'
SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch'

class YahooSearchError(Exception):
pass

# Obtido de http://developer.yahoo.com/python/python-json.html
def search(query, results=20, start=1, **kwargs):
kwargs.update({
'appid': YAHOO_APP_ID,
'query': query,
'results': results,
'start': start,
'output': 'json'
})
url = SEARCH_BASE + '?' + urllib.parse.urlencode(kwargs)
result = json.load(urllib.request.urlopen(url))
if 'Error' in result:
raise YahooSearchError(result['Error'])
return result['ResultSet']

query = input('Pelo que voc quer procurar? ')


for result in search(query)['Result']:
print("{0} : {1}".format(result['Title'], result['Url']))

Como funciona:
Ns podemos obter resultados de um determinado site, fornecendo o texto que se deseja procurar em
um formato especfico. Ns devemos especificar diversas opes, que ns juntamos usando o
formato key1=value1&key2=value2, que usado pela funo urllib.parse.urlencode().

Ento, por exemplo, abra este link em seu navegador e voc vera 20 resultados, iniciando do
primeiro, para a busca das palavras "byte of python". Este endereo nos d os resultados no formato
JSON.

Ns realizamos a conexo a este URL usando a funo urllib.request.urlopen() e passando o


arquivo obtido para json.load() que ir ler seu contedo e simultneamente converte-li em um
objeto Python. Ento ns usamos um loop nestes resultados para mostr-los ao usurio final.
O Mdulo da Semana
H muito mais para ser explorado na biblioteca padro, tal como depurao, uso de opes em linha
de comando, expresses comuns e muito mais.

A melhor forma de se aprofundar na biblioteca padro ler os excelentes artigos 'Python Module of
the Week' de Doug Hellmann.
Sumrio
Ns vimos algumas das funcionalidades de alguns mdulos da Biblioteca Padro do Python.
recomendvel que voc navegue pela documentao da Biblioteca Padro do Python para ter uma
ideia de tudo que os mdulos so capazes de fazer.

A seguir, ns veremos vrios aspectos sobre Python que faro nosso tour mais completo.
Mais
Contedo
1 Introduo
2 Passando Tuplas Adiante
3 Mtodos Especiais
4 Blocos de Um nico Comando
5 Formas Lambda
6 List Comprehension
7 Recebendo Tuplas e Dicionrios em Funes
8 Os Comandos Exec E Eval
9 O Comando Assert
10 A Funo Repr
11 Resumo
Introduo
At agora ns cobrimos a maior parte dos diversos aspectos que ns usaremos. Neste captulo, ns
abordaremos algumas funcionalidades adicionais que tornaro o nosso conhecimento de Python mais
completo.
Passando Tuplas Adiante
Algumas vezes voc gostaria de poder retornar com dois valores diferentes de uma funo? Voc
pode. Tudo que precisa fazer usar uma tupla.

>>> def obtenha_detalhes_erro():


... return (2, 'detalhes do segundo erro')
...
>>> errnum, errstr = obtenha_detalhes_erro()
>>> errnum
2
>>> errstr
'detalhes do segundo erro'

Note que o uso de a,b = <alguma expressao> interpreta o resulatado da expresso como uma tupla
com dois valores.

Se quiser interpretar o resultado como (a, <todo o resto>), ento voc precisa acrescentar um
asterisco, como se fossem parmetros de uma funo:

>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]

Isso tambm significa que o modo mais rpido de trocar duas varaveis entre si em Python :

>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)
Mtodos Especiais
Existem certos mtodos tais como __init__ e __del__ que possuem significado especial em classes.

Os mtodos especiais so empregados para emular certos comportamentos dos tipos 'built-in'. Por
exemplo, se voc quiser usar a operao de indexao x[indice] para a sua classe (exatamente como
voc faria para listas e tuplas), ento tudo o que voc deve fazer implementar o mtodo
__getitem__() e est feito. Se voc refletir a respeito, isto o que Python faz no caso da prpria
classe das listas!

Alguns mtodos especiais teis esto listados na tabela que segue. Se voc quiser conhecer mais a
respeito de todos os mtodos especiais, veja o manual.

Alguns Mtodos Especiais

Nome

Explicao

__init__(self, ...)

Este mtodo chamado imediatamente antes que o novo objeto criado esteja pronto para utilizao.

__del__(self)

Chamado imediatamente antes que o objeto seja destrudo.

__str__(self)

Chamado quando ns usamos a funo print ou quando str() usado.

__lt__(self, other)

Chamado quando o operador 'menor do que' (<) usado. Similarmente, existem mtodos especiais
para todos os operadores (+, >, etc.)

__getitem__(self, key)
Chamado quando a operao de indexao x[key] usada.

__len__(self)

Chamado quando a funo 'built-in' len() utilizada para um objeto sequncia.


Blocos de Um nico Comando
Ns j vimos que cada bloco de comandos posto separadamente do resto pelo seu prprio nvel de
indentao. Bem, existem algumas excees. Se o seu bloco de comandos contm apenas um nico
comando, ento voc poder especific-lo na mesma linha de, digamos, um comando condicional ou
em lao. O seguinte exemplo dever tornar isso mais claro:

>>> flag = True


>>> if flag: print 'Sim'
...
Sim

Observe que o comando nico empregado no local e na mesma linha e no como um bloco
separado. Embora voc possa fazer uso disso para tornar menor o seu programa, eu aconselho a
evitar este procedimento em curto-circuito, exceto no caso de verficao de erro, uma vez que ficar
muito mais fcil acrescentar um comando a mais se voc estiver usando a indentao apropriada.
Formas Lambda
Uma forma lambda empregada para criar novos objetos funes e retorn-los em tempo de
execuo ('runtime').

1. !/usr/bin/python
2. Nome do arquivo: lambda.py

def cria_repetidor(n):
return lambda s: s * n

dobro = cria_repetidor(2)

print(dobro('palavra')) print(dobro(5))

Sada:
$ python lambda.py
palavrapalavra
10

Como Funciona:

Aqui ns desenvolvemos uma funo cria_repetidor para fabricar novos objetos funes em tempo
de execuo e retorn-los. Um comando lambda utilizado para criar o objeto funo.
Essencialmente lambda recebe um parmetro seguido de apenas uma nica expresso, a qual se torna
o corpo da funo e o valor dessa expresso retornado pela nova funo. Note que mesmo um
comando print (Python 2.x) no pode ser usado no interior de uma forma lambda, apenas expresses.

A SER FEITO
Podemos realizar uma list.sort() fornecendo uma funo de comparao criada
usando lambda?

pontos = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]

1. pontos.sort(lambda a, b : cmp(a['x'], b['x']))


List Comprehension
'List comprehensions' so empregadas para obter-se uma nova lista de uma lista existente. Suponha
que voc tenha uma lista de nmeros e deseje obter uma nova lista com todos os nmeros
multiplicados por dois apenas quando o nmero por sua vez for maior do que 2. 'List
comprehensions' so ideais para tais situaes.

1. !/usr/bin/python
2. Nome do arquivo: list_comprehension.py

listaum = [2, 3, 4] listadois = [2*i for i in listaum if i > 2] print(listadois)

Sada:

[2, 6, 8]

Como Funciona:

Aqui ns obtemos uma nova lista atravs da especificao da manipulao a ser efetuada quando
alguma condio for satisfeita (if i > 2). Note que a lista original permanece inalterada.

A vantagem de usar 'list comprehensions' que reduz a quantidade de cdigo padro ('boilerplate')
requerido quando ns usamos laos para processar cada elemento de uma lista e adicion-lo em uma
nova lista.
Recebendo Tuplas e Dicionrios em Funes
Existe um modo especial de atribuir parmetros a uma funo como uma tupla ou dicionrio, usando
os prefixos * e ** respectivamente. Isso muito til quando se considera um nmero varivel de
argumentos na funo.

>>> def powersum(power, *args):


... Retorna a soma de cada argumento elevada potncia especificada.
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100

Uma vez que temos um prefixo * na varivel args, todos os argumentos extra passados funo so
atribudos a args como uma tupla. Se ao invs disso, tivesse sido usado um prefixo **, os parmetros
extra seriam considerados como pares chave/valor de um dicionrio.
Os Comandos Exec E Eval
A funo exec empregada para executar comandos em Python que esto armazenados em uma string
ou arquivo, ao contrrio do que se estivessem no prprio programa. Por exemplo, ns podemos gerar
uma string contendo comandos em Python em tempo de execuo e ento execut-los utilizando a
funo exec:

>>> exec('print("Hello World"'))


Hello World

De modo anlogo, a funo eval utilizada para avaliar expresses vlidas em Python que esto
armazenadas em uma string. Um exemplo simples mostrado a seguir.

>>> eval('2*3')
6
O Comando Assert
O comando assert empregado para assegurar-se de que alguma coisa verdadeira. Por exemplo, se
voc est bem certo que ter pelo menos um elemento em uma lista que voc est usando e quer
verificar esse fato e levantar ('raise') um erro se isso no for verdade, ento o comando assert ideal
para essa situao. Quando um comando assert falha, um AssertionError levantado.

>>> mylist = ['item']


>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> mylist
[]
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>

AssertionError

O comando assert deve ser usado com cautela. Na maior parte dos casos, melhor capturar
excees, seja manipulando o problema, ou emitindo uma mensagem de erro para o usurio e saindo
do programa.
A Funo Repr
A funo repr utilizada para obter-se uma representao por meio de uma string cannica do
objeto. A parte interessante que voc ter eval(repr(objeto)) == objeto em quase todos os casos.

>>> i = []
>>> i.append('item')
>>> repr(i)
"['item']"
>>> eval(repr(i))
['item']
>>> eval(repr(i)) == i
True

Basicamente, a funo repr empregada para obter-se uma representao imprimvel do objeto.
Voc pode controlar o que a sua classe retorna sob a funo repr, definindo o mtodo __repr__ em
sua classe.
Resumo
Ns abordamos algumas funcionalidades adicionais de Python neste captulo e mesmo assim no
cobrimos todas elas. Porm, a essa etapa, ns apresentamos a maior parte do que voc ir empregar
na prtica. Isso suficiente para que voc possa iniciar com quaisquer programas que for produzir.

A seguir, ns discutiremos como explorar Python ainda mais.


Em Seguida
Se voc leu este livro completamente at agora e praticou escrevendo muitos programas, ento deve
estar se sentindo confortvel e familiarizado com Python. Voc provavelmente tambm criou
diversos programas em Python para realizar alguns experimentos e exercitar suas habilidades em
Python. Se voc no fez isso ainda, deveria t-lo feito. A questo agora "O Que Fazer Em
Seguida?".

Eu sugiro que voc ataque o seguinte problema:

Crie o seu prprio programa "address_book" usando linha de comando, com o qual voc poder
adicionar, modificar, deletar ou realizar buscas pelos seus contatos, tais como amigos,
familiares e colegas, bem como pelas suas informaes, tais como endereos de email e/ou
nmeros de telefone. Os detalhes devem ser armazenados para posterior recuperao.

Isto se torna razoavelmente fcil se voc pensar em termos de todo o material que ns encontramos
at agora. Se voc ainda assim deseja instrues de como proceder, aqui est uma sugesto.

Sugesto (No leia)


Crie uma classe que represente a informao sobre cada pessoa. Use um dicionrio para
guardar os objetos pessoais com o nome de cada uma como chave. Utilize o mdulo pickle para
guardar os objetos de forma persistente em seu disco rgido. Empregue os mtodos internos do
dicionrio para adicionar, deletar e modificar as pessoas.

Uma vez que voc seja capaz de realizar isso, voc pode proclamar-se programador em Python.
Agora, imediatamente envie um email me agradecendo por este grande livro ;-). Este passo
opcional mas recomendado. Da mesma forma, por favor, considere realizar uma doao, contribuir
com melhoramentos ou voluntariar-se para tradues para apoiar o contnuo desenvolvimento deste
livro.

Se voc achou muito fcil aquele programa, aqui est um outro:

Implemente o comando replace. Este comando substituir uma string por outra em uma lista de
arquivos fornecida.

O comando replace pode ser to simples ou sofisticado quanto voc desejar, desde simples
substituio de strings, at a busca por padres (expresses regulares).

Depois disso, aqui esto alguns caminhos para prosseguir a sua jornada com Python:
Contedo
1 Exemplos de Programas
2 Perguntas e Respostas
3 Tips and Tricks (Sugestes e Truques)
4 Livros, Publicaes, Tutoriais, Vdeos
5 Discusso
6 Novidades
7 Instalando Bibliotecas
8 Software Grfico
8.1 Resumo das Ferramentas GUI
9 Vrias Implementaes
10 Resumo
Exemplos de Programas
A melhor maneira de aprender uma linguagem de programao escrever muitos programas e ler um
monte deles:

Repositrio de programas Rosetta


Exemplos de Python examples em java2s
Python Cookbook uma coleo extremamente valiosa de receitas ou sugestes em como
resolver certas espcies de problemas utilizando Python. Esta uma leitura indispensvel para
todos os usurios de Python.
Python Brasil. Este o principal site brasileiro de Python.
Perguntas e Respostas
Oficial Python Dos e Don'ts (Faa Isso e No Faa Aquilo)
Python FAQ Oficial
Lista de Norvig das Infrequently Asked Questions (Perguntas Raramente Feitas)
Entrevista em Python Q & A
Perguntas StackOverflow marcadas com python
Tips and Tricks (Sugestes e Truques)
Python Tips & Tricks
Advanced Software Carpentry using Python
Charming Python uma excelente srie de artigos de David Mertz relacionados com Python.
Livros, Publicaes, Tutoriais, Vdeos
O prximo passo lgico depois deste livro a leitura do extraordinrio livro de Mark Pilgrim Dive
Into Python (Mergulhando em Python) o qual voc pode tambm ler inteiramente on line. Esse livro
explora tpicos como expresses regulares, processamento XML, servios web, teste unitrio (unit
testing), etc. em detalhes.

Outros recursos adicionais so:

vdeos ShowMeDo sobre Python


Lista completa de Awaretek dos tutoriais em Python
The Effbot's Python Zone
Links no fim de cada Python-URL! email
Python Papers
Discusso
Se voc parece incapaz de resolver um problema de Python, e no sabe a quem perguntar, ento a
lista comp.lang.python discussion group o melhor lugar para colocar a sua questo.

Certifique-se de fazer sua 'lio de casa' e de haver tentado resolver o seu problema por voc mesmo
antes de mais nada.

Make sure you do your homework and have tried solving the problem yourself first.
Novidades
Se voc quiser conhecer as ltimas novidades no mundo de Python, ento acompanhe o Python Planet
oficial e/ou o Python Planet no-oficial.
Instalando Bibliotecas
Existe um nmero enorme de bibliotecas open-source no Python Package Index as quais voc pode
empregar em seus prprios programas.

Para instalar aquelas bibliotecas, voc pode usar o excelente EasyInstall tool de Philip Eby.
Software Grfico
Suponha que voc queira criar seus prprios programas grficos usando Python. Isso pode ser feito
por meio de um biblioteca GUI (Graphical User Interface) com suas interfaces vnculos (bindings)
com Python. Interfaces so o que permite que voc escreva programas em Python e utilize as
bibliotecas que, por sua vez, so escritas em C, C++ ou outras linguagens.

Existem um grande nmero de opes para GUI usando Python:

PyQt
Esta a interface em Python para o Qt toolkit que a fundao sobre a qual KDE foi produzido.
Qt extremamente fcil de usar e muito poderosa, especialmente devido ao Qt Designer e a
incrivel documentao. PyOt livre se voc quiser criar software open-source (GPL) e pago, se
voc for desenvolver software proprietrio fechado. Para iniciar, leia o PyQt tutorial ou o PyQt
book.

PyGTK
Esta a interface em Python para o GTK+ toolkit que a fundao sobre a qual Gnome foi
produzido. GTK+ possui muitos pequenos problemas para o seu uso, mas uma vez que voc se
torna confortvel, poder criar aplicativos com GUI rapidamente. A interface grfica Glade
indispensvel. A documentao ainda deve ser emlhorada. GTK+ funciona bem em Linux, mas a
sua verso para Windows est incompleta. Voc pode criar softwares tanto livres, como
proprietrios usando GTK+. Para iniciar, leia o PyGTK tutorial.

wxPython
Este a interface em Python para o wxWidgets toolkit. wxPython tem uma curva de
aprendizagem associada. Entretanto, bem portvel e executa em Linux, Windows, MAC e
mesmo em plataformas imersas (embedded). Existem muitas IDEs disponveis em wxPython as
quais incluem GUI designers, tais como SPE (Stani's Python Editor) e a construtora de GUIs
wxGlade. Voc pode criar software tanto livre como proprietrio usando wxPython. Para
iniciar, leia o wxPython tutorial.

TkInter
Este dos mais antigos GUI toolkits em existncia. Se voc tem utilizado IDLE, j viu o
programa TkInter em ao. No oferece uma das melhores sensaes para o usurio, devido a
sua aparncia antiquada. TkInter portvel e executa tanto em Linux/Unix, quanto em Windows.
Mas importante que tuso, TkInter parte integrante da distribuio padro de Python. Para
iniciar, leia o Tkinter tutorial.

Para mais opes, veja o wiki GuiProgramming no website oficial de Python.

Resumo das Ferramentas GUI


Infelizmente, no existe uma ferramenta GUI padro em Python. Eu sugiro que voc escolha uma das
anteriores, dependendo de sua situao. O primeiro fator se voc est disposto a pagar para usar
qualquer uma das ferramentas GUI. O segundo fator se voc quer que seu programa execute apenas
em Windows ou em MAC e Linux, ou em todos eles. O terceiro fator, se Linux for a plataforma
escolhida, se voc um usurio de KDE ou de GNOME.

Para uma anlise mais detalhada e completa, veja a pgina 26 de The Python Papers, Volume 3, Issue
1.
Vrias Implementaes
EXistem usualmente duas partes em uma linguagem de programao - a linguagem e o software. A
linguagem "como" ns escrevemos algo. O software "o que" realmente executa o nossos
programas.

Ns vimos uitlizando o software "CPython" para executar os nossos programas. Este referenciado
como CPython, pois escrito na linguagem C e o "Interpretador Python Clssico".

Existem adicionalmente outros softwares que podem executar seus programas em Python:

Jython
Uma implementao de Python que executa na plataforma Java. Isso significa que voc pode
usar as bibliotecas e classes em Java dentro da linguagem Python e vice-versa.
IronPython
Uma implementao de Python que executa em plataforma .NET. Isso significa que voc pode
usar as bibliotecas e classes .NET dentro da linguagem Python e vice-versa.
PyPy
Uma implementao de Python escrita em Python! Este um projeto de pesquisa para tornar
mais fcil e rpido o interpretador, uma vez que o poprio interpretador est escrito em uma
linguagem dinmica (em oposio a linguagens estticas, tais como C, Java, ou C# nas
implementaes acima).
Stackless Python
Uma implementao que especializada em performance baseada em threads.

Existem tambm outras tais como CLPython - uma implementao de Python escrita em Common Lisp
e IronMonkey, que uma implementao de IronPython para operar sobre um interpretador
JavaScript, o que poderia significar que voc poderia usar Python (ao invs de JavaScript) para
escrever os seus programas web-browser ("Ajax").

Cada uma dessas implementaes tm a sua prpria rea especializada na qual so teis.
Resumo
Ns chegamos ao final deste livro, mas, como se diz comumente, este "o comeo do fim"! Voc ,
agora, um vido usurio de Python e est sem dvida pronto para resolver muitos problemas
utilizando Python. Voc pode iniciar por automatizar o seu computador para realizar toda espcie de
coisas que sequer podiam ser imaginadas anteriormente, ou por escrever seus prprios jogos e muito,
muito mais. Assim, pode comear!
Apndice: FLOSS
FLOSS est baseado no conceito de uma comunidade, que por sua vez est fundamentado no conceito
de compartilhamento, e particularmente compartilhamento de conhecimento. FLOSS so livres para
uso, modificao e redistribuio.

Se voc j leu este livro, ento j est familiarizado com FLOSS, desde que voc vem empregando
Python ao longo dele e Python um software de fonte aberta (open source)!

Aqui esto alguns exemplos de FLOSS para dar-lhe uma idia do tipo de coisas que a construo e
compartilhamento comunitrio pode criar:

Linux. Este um sistema operacional FLOSS que o mundo inteiro est lentamente adotando!
Comeou com Linus Torvalds enquanto um estudante. Agora, est competindo com o Microsoft
Windows. [ Linux Kernel ]
Ubuntu. Esta uma distribuio gerenciada pela comunidade, patrocinada pela Canonical e a
distribuio de Linux mais popular hoje em dia. Permite que voc instale uma quantidade
enorme de FLOSS disponveis e isso em uma maneira fcil de usar e fcil de instalar. Melhor
que tudo, voc pode apenas reiniciar o seu computador e executar Linux diretamente do CD! Isto
permite que voc experimente completamente o novo SO antes de instalar no seu computador.
[ Ubuntu Linux ]
OpenOffice.org. Esta uma excelente suite de escritrio com componentes para processamento
de documento, apresentao, planilhas, desenho, entre outras coisas. Voc pode at mesmo abrir
e editar arquivos de MS Word e MS PowerPoint com facilidade. Ela executa em quase todas as
plataformas. [ OpenOffice ]
Mozilla Firefox. Esta a poxima gerao de navegadores para a web que est competindo
com o Internet Explorer. bastante rpida e tem recebido aclamao crtica pelos suas timas e
atraentes caractersticas. O conceito de extenses permite o emprego de qualquer espcie de
plugin.
O seu produto companheiro Thunderbird um excelente cliente de email que torna muito fcil a
leitura de emails. [ Mozilla Firefox, Mozilla Thunderbird ]
Mono. Esta uma implementao de fonte aberta da plataforma .NET da Microsoft. Permite que
as aplicaes .NET sejam criadas e executadas em Linux, Windows, FreeBSD, Mac OS e
muitas outras plataformas. [ Mono, ECMA, Microsoft .NET ]
Servidor de web Apache. Este um popular servidor de web. De fato, o mais popular
servidor de web do planeta! Ele executa em um pouco mais do que a metade de todos os sites
web que existem. Sim, isso mesmo - Apache gerencia mais sites web do que toda a
concorrncia (incluindo Microsoft IIS) combinada. [ Apache ]
MySQL. Este um servidor de bancos de dados extremamente popular. muito famoso pela
grande velocidade. o M na famosa pilha LAMP subjacente na maior parte dos sites web na
internet. [ MySQL ]
VLC Player. Este o tocador de vdeo que pode tocar qualuqer coisa de DivX a MP3 a OGG,
a VCDs e DVDs a ... que disse que software aberto no seria divertido? ;-) [ VLC media
player ]
GeexBox uma distribuio de Linux que projetada para tocar filmes assim que voc reinicia
do CD! [ GeexBox ]

Esta lista tem apenas a inteno de dar-lhe uma breve idia - existem muitos mais excelentes FLOSS
disponveis, tais como a linguagem PERL, a linguagem PHP, os sistemas de gerenciamento de
contedo para sites web PLONE e Drupal, o servidor de banco de dados PostgreSQL, o jogo de
corridas TORCS, a IDE KDevelop, o tocador de filmes Xine, o editor VIM, o editor Quanta+, o
tocador de udio Banshee, o programa de edio de imagens GIMP ... Esta lista poderia no terminar
jamais.

Para obter as ltimas notcias sobre o mundo FLOSS, verifique os seguintes sites web:

linux.com
LinuxToday
NewsForge
DistroWatch

Visite os seguintes sites web para maiores informaes sobre FLOSS:

SourceForge
FreshMeat

Assim, v em frente e explore o vasto, livre e aberto mundo de FLOSS!


Apndice: Sobre
Contedo
1 Clofon
1.1 Nascimento do Livro
1.2 Era Adolescente
1.3 Agora
2 Sobre o Autor
Clofon
Quse todos os softwares que eu usei na criao deste livro so softwares livres e abertos.

Nascimento do Livro

No primeiro esboo deste livro, eu usei Linux Red Hat 9.0 como a fundao da minha estrutura e no
sexto esboo eu usei Linux Fedora Core 3 como a base do meu esquema.

Inicialmente, eu estava usando KWord para escrever o livro (como explicado em Lio de Histria
no prefcio).

Era Adolescente

Mais tarde, eu mudei para DocBook XML usando Kate mas eu achei muito montono. Assim, eu
mudei para OpenOffice, que era excelente com o nvel de controle que fornecia para formatao,
assim como a gerao de PDF, mas produzia um pssimo HTML do documento.

Finalmente, eu descobri XEmacs e reescrevi o livro desde o comeo em DocBook XML (novamente)
depois de decidir que aquele formato era a soluo de longo prazo.

No sexto esboo, eu decidi usar Quanta+ para realizar toda a edio. As stylesheets que vieram junto
com o Linux Fedora Core 3 foram utilizadas, assim como as fontes padro. Entreanto, eu havia
escrito um documento CSS para fornecer cor e estilo s pginas HTML. Eu havia escrito tambm um
analisador lxico grosseiro, em Python, que automaticamente forneceu nfase na sintaxe para as todas
as listagens dos programas.

Agora

Para este stimo esboo, eu estou usando MediaWiki como a base do meu setup. Agora, eu edito tudo
online e os leitores podem diretamente ler/editar/discutir dentro do site wiki.

Eu ainda uso Vim para edio graas a ViewSourceWith extenso para Firefox que integra-se com
Vim.
Sobre o Autor
http://www.swaroopch.com/about/
Apndice: Histrico de Revises
1.90
04/09/2008 e ainda em progresso.
Reavivado depois de um hiato de 3.5 anos!
Updating to Python 3.0
Reescrito usando MediaWiki (novamente)
1.20
13/01/2005
Completamente reescrito usando Quanta+ em FC3 com muitas correes e atualizaes.
Muitos exemplos novos. Reescrevi o meu DocBook desde o comeo.
1.15
28/03/2004
Revises menores
1.12
16/03/2004
Adies e correes.
1.10
09/03/2004
Mais correes de digitao, graas aos meus leitores entusisticos e colaborativos.
1.00
08/03/2004
Depois de uma enorme resposta e sugestes de meus leitores, eu fiz revises significativas
no contedo, juntamente com correes de digitao.
0.99
22/02/2004
Adicionei um novo captulo sobre mdulos. Acrescentei detalhes a respeito do nmero
varivel de argumentos em funes.
0.98
16/02/2004
Escrevi um script Python e um stylesheet CSS para melhorar a sada XML, incluindo um
grosseiro porm funcional analisador lxico para uma nfase automtica, no estilo de VIM,
na sintaxe de listagens de programas.
0.97
13/02/2004
Masi um rascunho completamente reescrito, em DocBook XML (novamente). O livro
melhorou muito - est agora mais coerente e legvel.
0.93
25/01/2004
Adicionei trechos em IDLE e material mais especificamente voltado a Windows.
0.92
05/01/2004
Mudanas em uns poucos exemplos.
0.91
30/12/2003
Erros de digitao corrigidos. Muitos tpicos improvisados.
0.90
18/12/2003
Mais dois captulos acrescentados. Formato de OppenOffice com revises.
0.60
21/11/2003
Completamente reescrito e expandido.
0.20
20/11/2003
Alguns erros, alguns de digitao, corrigidos.
0.15
20/11/2003
Convertido para DocBook XML.
0.10
14/11/2003
Rascunho inicial usando KWord.
Sobre a Traduo
Ao redor do mundo, vrias pessoas se ofereceram como voluntrias para traduzir o livro para seus
respectivos idiomas. A verso em portugus brasileiro ficou sob minha responsabilidade e logo
comecei a receber vrios emails de pessoas que tambm se ofereceram para ajudar, de forma que,
num pequeno intervalo de tempo, j tnhamos quase todo o texto traduzido. Portanto, gostaria de
agradecer s seguintes pessoas pela prestatividade e disposio:

Alvaro Netto
Daniel Bagatini
Daniel Gonalves
David Kwast
Emanuel R Woiski
Estvo Valado
verton Arruda
Lucas Castro
Rodrigo Haas

Se esqueci de algum, s avisar que incluo nos crditos.

Espero que a traduo seja til!

Rodrigo Amaral
http://rodrigoamaral.net/a-byte-of-python/