Vous êtes sur la page 1sur 95

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)
Python pt-br:Instalacao

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.

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 (comokonsole 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 podem 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 chamadaPATH 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 arquivoC:\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 oTerminal.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.

Python pt-br:Primeiros Passos

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-zseguido 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 usandoVim 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 Pmaisculo 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 decomentrios - 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 comandopython 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 afuno 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 paraolamundo 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 ondeswaroop 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/mydironde '/home/swaroop/mydir' o diretrio que eu desejo
adicionar na varivelPATH.
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, rodehelp(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.
Python pt-br: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.

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
umaconstante 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 significa52.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
Voc 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 - \npara 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' our'\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 vriavelname 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 noso 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

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 icom
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 listasem 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. Executefrom __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 j est confortvel com o que voc leu nesse
captulo.
Python pt-br:Operadores e Expressoes

Introduo
A maioria das instrues (linhas lgicas) que voc escrever iro conterexpresses. 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
negativo ou a -5.2 retorna um nmero negativo. 50 -
- Subtrao
subtrao de um 24 retorna 26.
nmero por outro

Retorna o produto de
dois nmeros ou uma
2 * 3 retorna 6. 'la' *
* Multiplicao string repetida uma
3 retorna'lalala'.
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 retorna1.3333333333333333.

Retorna a parte inteira


// Diviso Inteira 4 // 3 retorna 1.
do quociente

Retorna o resto da
% Modulo 8 % 3 retorna 2. -25.5 % 2.25retorna 1.5.
diviso

Desloca os bits do
nmero para a 2 << 2 retorna 8. 2 representado
esquerda pelo nmero
Deslocamento por 10 em bits. Deslocando os bits do
de bits especificado.
<< de bits nmero esquerda por 2 bits
(Cada nmero
esquerda retorna 1000, que representa o nmero
representado na
decimal 8.
memria por bits ou
digitos binrios i.e. 0
and 1)

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


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

Bits configurados nos


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

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

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

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

Retorna se x menor
que y. Todos os
operadores de
5 < 3 retorna False e 3 < 5retorna True.
comparo
< Menor que Comparaes podem ser encadeadas
retornamTrue(verdadei
arbitrariamente: 3 < 5 < 7 retorna True.
ro) ou False(falso).
Note a capitalizao
dos nomes.

5 > 3 retorna True. Se os dois operadores


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

Menor ou igual Retorna se x menor


<= x = 3; y = 6; x <= y retornaTrue.
a ou igual a y

Maior ou igual Retorna se x maior


>= x = 4; y = 3; x >= 3 retornaTrue.
a ou igual a y

x = 2; y = 2; x == y retornaTrue.
x = 'str'; y = 'stR'; x ==
Compara se os objetos
== Igual a yretorna False.
so iguais
x = 'str'; y = 'str'; x ==
yretorna True.

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

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

x = False; y = True; x and


yretorna False desde que x seja False.
x and
Neste caso, Python no ir avaliar y desde
y retornaFalse se x
Operador que ele saiba que o lado esquerdo da
and False, seno ele
booleano AND espresso 'and' False o que implica que
retorna a avaliao de
toda a espresso ser False independente
y
do outro valor. isso chamado short-circuit
evaluation.

Se x True, ele x = True; y = False; x or


Operador retorna True, seno ele
or yretorna True. A Short-circuit evaluation se
booleano OR retorna a avaliao de
aplica aqui tambm.
y

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 Avaliaoabaixo 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 Operador 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 * breadthna 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.
Python pt-br:Controle de Fluxo

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 elifque, 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 instruoif..elif..else para


fazer a mesma coisa (e em alguns casos, usar umdicionrio 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 varivelrunning. 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 whilepara 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

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 noinclui o segundo nmero.
O loop for ento itera sobre esta faixa - for i in range(1,5) equivalente afor 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 instruobreak 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 chamadoPython 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 lenpara 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.
Python pt-br:Funcoes
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 argumentos.
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 comandoif..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 comandoglobal. 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 defunc_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 sejamopcionais 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 5determinando 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 brecebe 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 qualquernmero 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

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
calleddocumentation 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 incluirhelp(printMax) no seu programa. Lembre-se de
pressionar a tecla q para sair dohelp().
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.
Python pt-br:Modulos

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 mdulosys. 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 deargumentos 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'a
rgumentos' 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 emsys.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 comandofrom 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 comandoimport, 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 emsys.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 funodir.
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, executedir(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__.pyque 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.
Python pt-br:Estruturas de Dados

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 soimutveis.
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, vejahelp(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_zoopela 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.
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 comandodel. 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

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 mtodostartswith 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.
Python pt-br:Resolucao 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.

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 osbugs (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 e12 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 qualconcatena 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 listaorigem 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' our'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 funoinput 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 mtodoextend da classe list.
O refinamento mais importante seria a no utilizao da via atravs de os.systempara 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.
Python pt-br:Programacao Orientada a Objetos

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 deboxing 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 devariveis 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 thisem 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 deself.
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 iniciaesque 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 instncianame 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 klasscom '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 usandoRobot.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 comdois 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 mtodosdestructor.

Herana
Um dos maiores benefcios da programao orientada a objetos reusabilidadede 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) herdaremsuas 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
classeSchoolMember. 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 varivelself, 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 classeSchoolMember.
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 classeSchoolMember.
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.
Python pt-br:Entrada e Saida

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
objetopermanentemente.
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.
Python pt-br:Excecoes

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/blocoexcept. 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 blocofinally. 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).
Python pt-br:Biblioteca Padrao

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 funourllib.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.
Python pt-br:Mais
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.
Python pt-br: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:

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 Indexas 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 tutorialou 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!
Python pt-br:Apendice FLOSS
Software Gratuito e Livre (Free/Libr and Open Source Software
- 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, omais 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!
Python pt-br:Apendice Sobre
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 emLio de Histria no
prefcio).
Era Adolescente
Mais tarde, eu mudei para DocBook XML usando Kate mas eu achei muito montono. Assim, eu mudei
para OppenOffice, 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 Firefoxque integra-se com Vim.