Beruflich Dokumente
Kultur Dokumente
Campo Grande - MS
Maio de 2015
Traduo da Verso 0.0.8-d2 de Charles Severance
Campo Grande - MS
Maio de 2015
Lista de ilustraes
3 Execuo Condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.1 Expresses Booleanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2 Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.3 Execuo condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4 Execuo alternativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.5 Condicionais em Cadeia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.6 Condicionais Agrupadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.7 Entendendo excees usando try e except . . . . . . . . . . . . . . . . . . . 48
3.8 Avaliaes de caminhos curtos de expresses lgicas . . . . . . . . . . . . . 50
3.9 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.10 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.1 Chamada de funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2 Funes Embutidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3 Funo de converso de tipo . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.4 Nmeros aleatrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.5 Funes matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.6 Adicionando novas funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.7 Definies e Modo de Utilizao . . . . . . . . . . . . . . . . . . . . . . . . 63
4.8 Fluxo de execuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.9 Parmetros e Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.10 Funes Produtivas e Funes Void . . . . . . . . . . . . . . . . . . . . . . 65
4.11 Por que utilizar funes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.12 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.13 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.14 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5 Iterao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.1 Atualizando variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2 A instruo while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3 Loops infinitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.4 Loops infinitos e o comando break . . . . . . . . . . . . . . . . . . . . . 75
5.5 Finalizando iteraes com continue . . . . . . . . . . . . . . . . . . . . . . 76
5.6 Laos usando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.7 Padres de Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.7.1 Loops de contagem e soma . . . . . . . . . . . . . . . . . . . . . . . 78
5.7.2 Loops de mximos e mnimos . . . . . . . . . . . . . . . . . . . . . 79
5.8 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.9 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.1 Uma string uma sequncia . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.2 Obtendo o comprimento de uma string usando len . . . . . . . . . . . . . . 84
6.3 Percorrendo uma string com um loop . . . . . . . . . . . . . . . . . . . . . 84
6.4 Fragmentando Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.5 Strings no podem ser mudadas . . . . . . . . . . . . . . . . . . . . . . . . 86
6.6 Estruturas de repetio e contadores . . . . . . . . . . . . . . . . . . . . . 86
6.7 O operador in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.8 Comparao entre strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.9 Mtodos de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.10 Analisando uma string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
6.11 Operador de formatao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.12 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.13 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6.14 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7 Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.1 Persistncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.2 Abrindo arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3 Arquivos de texto e linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
7.4 Lendo arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.5 Pesquisando em um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.6 Permitindo ao usurio escolher o nome do arquivo . . . . . . . . . . . . . . 104
7.7 Usando try, except e open . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
7.8 Escrevendo Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
7.9 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.10 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
7.11 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
8 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.1 Uma lista uma sequncia . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.2 Listas so mutveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.3 Leitura de uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
8.4 Operaes em listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.5 Fragmentando listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.6 Mtodos em listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
8.7 Deletando elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.8 Listas e funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.9 Listas e Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.10 Analisando linhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
8.11 Objetos e Valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
8.12 Pseudnimo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
8.13 Listas como Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.14 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
8.15 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
8.16 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
9 Dicionrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9.1 Dicionrio como um conjunto de contadores . . . . . . . . . . . . . . . . . 133
9.2 Dicionrios e arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
9.3 Estruturas de repetio e dicionrios . . . . . . . . . . . . . . . . . . . . . 136
9.4 Anlise avanada de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
9.5 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
9.6 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
9.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
10 Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.1 Tuplas so imutveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.2 Comparando tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
10.3 Atribuio de tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
10.4 Dicionrios e tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
10.5 Atribuio mltipla com dicionrios . . . . . . . . . . . . . . . . . . . . . . 148
10.6 As palavras mais comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
10.7 Usando tuplas como chaves em dicionrios . . . . . . . . . . . . . . . . . . 151
10.8 Sequncias: strings, listas and tuplas . . . . . . . . . . . . . . . . . . . . . 151
10.9 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
10.10Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
10.11Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
9
python words.py
Entre file: words.txt
to 16
Nosso assitente pessoal para anlise de informaes rapidamente nos disse que
a palavra to foi utilizada dezesseis vezes nos trs primeiros pargrafos deste captulo.
O fato de computadores serem bons em coisas que as pessoas no so o motivo
pelo qual voc deve ter habilidades em falar a linguagem do computador. Uma vez que
voc aprenda esta nova linguagem, voc pode delegar tarefas a seu parceiro (o computa-
dor), deixando mais tempo para que voc execute coisas que seja especialmente adequadas
a voc. Voc traz criatividade, intuio e inveno a esta parceria.
Segundo voc deve contar uma histria. Escrevendo uma histria voc combina
palavras e sentenas para transmitir uma ideia para o leitor. H habilidade e arte na
construo de uma histria e a habilidade de escrever histrias aprimorada cada
vez que se escreve e se obtm retorno sobre o que foi escrito. Em programao, nosso
programa a histria e o problema que se est tentando resolver a ideia.
Uma vez que voc aprenda uma linguagem de programao tal como Python,
voc achar bem mais fcil aprender uma segunda linguagem de programao, tais como
JavaScript ou C++. Uma nova linguagem de programao possui vocabulrio e gramtica
diferentes, mas uma vez que adquire habilidades para resolver problemas, eles sero os
mesmos, independente da linguagem de programao.
14 Captulo 1. Por que voc deve aprender a programar?
1
http://xkcd.com/231
1.5. Conversando com Python 15
O seja, ao contrrio dos cachorros, Python j treinada. Quando voc diz tente,
Python tentar toda vez que voc disser esta palavra sem falhas.
Aprenderemos estas palavras reeservadas e como as mesmas so utilizadas, mas
neste momento focaremos o equivalente a dizer (em uma linguagem de humano para
cachorros) faleem Python. O bom de dizer ao Python para falar que podemos tambm
informar o que dizer passando uma mensagem entre aspas:
Agora que sabemos uma palavra e uma sentena simples em Python, devemos
saber como comear uma conversa com Python para testar nossas habilidades na nova
linguagem.
Antes de comear a conversar com Python, voc primeiro deve instalar o software
Python e saber como inici-lo em seu computador. So muitos detalhes para colocar
neste captulo, portanto sugiro que consulte www.pythonlearn.com, onde esto instrues
detalhadas de como configurar e inciar Python nos sitemas Macintosh e Windows. Em
algum ponto, voc estar em um terminal ou janela de comandos, digitar python e
o interpretador Python iniciar a execuo em modo interativo: aparecer alguma coisa
como:
O prompt >>> o modo como o interpretador Python pergunta O que voc quer
que eu execute em seguida?. Python est pronto para ter uma conversa com voc. Tudo
o que voc precisa saber como falar a linguagem Python que poder ter uma conversa.
Digamos que voc no saiba nem mesmo as palavras e sentenas mais simples da
linguagem Python. Voc pode querer usar a linha que os astronautas usam quando eles
pousam em um planeta distante e tentam falar com os habitantes do planeta:
16 Captulo 1. Por que voc deve aprender a programar?
Isto no est indo to bem. A menos que voc pense em algo rapidamente, os ha-
bitantes do planeta esto suscetveis a esfaque-lo com suas lanas, coloc-lo num espeto,
ass-lo e com-lo no jantar.
Por sorte, voc trouxe uma cpia deste livro em suas viagens, folheou at est
pgina e tentou novamente:
> > > print You must be the legendary god that comes from the sky
You must be the legendary god that comes from the sky
> > > print We have been waiting for you for a long time
We have been waiting for you for a long time
> > > print Our legend says you will be very tasty with mustard
Our legend says you will be very tasty with mustard
> > > print We will have a feast tonight unless you say
File <stdin>, line 1
print We will have a feast tonight unless you say
^
SyntaxError: EOL while scanning string literal
> > >
A conversa estava indo muito bem por um instante, mas voc cometeu um erro
nfimo usando Python, e Python reclamou novamente.
Neste ponto, voc deve ter percebido que ao mesmo tempo que Python inclivel-
mente complexo, poderoso e rigoroso em relao sintaxe utilizada para se comunicar
com ele, Python no inteligente. Voc est tendo uma conversa consigo mesmo, mas
usando uma sintaxe apropriada.
Neste sentido, quando voc usa um programa escrito por outra pessoa, a conversa
entre voc e outros programadores com Python atuando como intermedirio. Python
uma forma para os criadores de programas expressarem como a conversa deveria proceder.
1.6. Terminologia: interpretador e compilador 17
E em mais alguns captulos, voc ser um destes programadores usando Python para
conversar com os usurios dos seus programas.
Antes de deixarmos nossa primeira conversa com o interpretador Python, voc pro-
vavelmente deve saber o modo apropriado de dizer at logo ao interagir com habitantes
do Planeta Python:
Voc perceber que o erro diferente das duas outras tentativas incorretas. O
segundo erro diferente porque if uma palavra reservada, o Python identificou a palavra
reservada e informou que estamos querendo dizer alguma coisa, mas a sintaxe da sentena
est incorreta.
A forma apropriada de dizer at logo para o Python is to enter quit()no prompt
>>> interativo. Provavelmente demorou um tempo para que voc percebesse que ter um
livro mo poderia ser til.
01010001110100100101010000001111
11100110000011101010010101101101
...
18 Captulo 1. Por que voc deve aprender a programar?
Neste exemplo, solicitamos ao Python para lembrar o valor seis e usamos o nome x
de maneira que possamos obter o valor posteriormente. Verificamos que Python realmente
lembrou o valor usando print. Em seguida, solicitamos ao Python obter o valor de x,
multiplic-lo por sete e armazenar o novo valor em y. Em seguida, solicitamos ao Python
para imprimir o valor atual de y.
Apesar de estarmos digitando estes comandos em Python uma linha por vez,
Python est tratando-os como uma sequncia ordenada de sentenas com as sentenas
1.6. Terminologia: interpretador e compilador 19
posteriores podendo obter os dados criados nas sentenas anteriores. Estamos escrevendo
nosso primeiro pargrafo com quatro sentenas em uma ordem lgica e significativa.
natural para um interpretador ser capaz de ter uma conversa interativa como
mostrado acima. Um compilador precisa que o programa esteja em um arquivo, ento
roda um processo para transformar o cdigo em alto nvel para linguagem de mquina e,
em seguida, o compilador armazena os dados em liguagem de mquina em um arquivo
para ser executado posteriormente.
Se voc utilizar o sistema operacional Windows, estes executveis tero a extenso
.exe ou .dll, que referem a executvel ou biblioteca carregada dinaminacamente
(dynamic loaded library), respectivamente. No Linux ou Macintosh, no h extenso
que identifica arquivos executveis.
Se voc abrir um arquivo executvel em um editor de texto, ele parece completa-
mente louco e ilegvel:
^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@xa0x82
^D^H4^@^@^@x90^]^@^@^@^@^@^@4^@ ^@^G^@(^@$^@!^@^F^@
^@^@4^@^@^@4x80^D^H4x80^D^Hxe0^@^@^@xe0^@^@^@^E
^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^Tx81^D^H^Tx81^D^H^S
^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A^D^HQVhTx83^D^Hxe8
....
C:Python27python.exe
20 Captulo 1. Por que voc deve aprender a programar?
Existem muito mais do que voc precisava saber para ser um programador Python,
mas algumas vezes no vale a pena responder a essas pequenas questes incmodas logo
no incio.
resolver o problema.
Suponha que voc est fazendo pesquisas em Computao Social nos posts do Fa-
cebook e est interessado na palavra usada mais frequentemente em uma srie de posts.
Voc poderia imprimir um fluxo de posts do Facebook e debruar-se sobre o texto procu-
rando pela palavra mais comum, mas isto pode levar muito tempo e ser muito propenso
a erros. Voc seria inteligente ao escrever um programa em Python para resolver a tarefa
rapidamente e com acurcia e, ento voc poderia passar o fim de semana fazendo algo
divertido.
Por exemplo, olhe para o seguinte texto sobre um palhao e um carro. Olhe para
o texto e descubra a palavra mais comum e quantas vezes ela ocorreu.
the clown ran after the car and the car ran into the tent
and the tent fell down on the clown and the car
Ento imagine que voc esteja fazendo esta tarefa olhando milhes de linhas de
texto. Francamente, seria mais rpido voc aprender Python e escrever um programa em
Python para contar as palavras do que procurar as palavras manualmente.
A notcia melhor ainda que eu trouxe um programa simples para achar a palavra
mais comum em um arquivo texto. Eu escrevi, testei e estou lhe fornecendo para que voc
possa economiza algum tempo.
Voc nem precisa saber Python para usar este programa. Voc precisaria ir ao
Captulo 10 deste livro para entender completamente as tcnicas em Python para fazer
este programa. Voc o usurio final, voc simplesmente usa o programa e se impressiona
com sua inteligncia e como salvou muito esforo manual de voc. Voc simplesmente
digita o cdigo em um arquivo chamado words.py e o executa ou faz o download do
cdigo fonte em http://pythonlearn.com/code/ e executa-o.
22 Captulo 1. Por que voc deve aprender a programar?
entrada: obtm dados do mundo externo. Isto pode ser feito lendo dados de um
arquivo, ou at mesmo por meio de um sensor como microfone ou GPS. Em nossos
primeiros programas, a entrada ser realizada por meio do usurio digitando dados
no teclado.
Parece ser muito simples para ser verdade e, claro, nem sempre to simples.
como dizer que andar simplesmente coloque um p na frente do outro. A arte de
escrever um programa integrar este elementos bsicos muitas vezes para produzir algo
que seja til para os usurios.
1.10. O que possivelmente pode dar errado? 23
O programa de contagem de palavras acima utiliza todos estes pades, exceto um.
ele est apenas abanando o rabo e dizendo Voc parece ter dito alguma coisa, mas eu
no entendo o que voc quis dizer, porm, continue falando comigo (> > >).
Na medida em que seus programas se tornem sofisticados, voc encontrar trs
tipos gerais de erros:
Erros de lgica: um erro de lgica ocorre quando o programa est com a sintaxe
correta, mas h um erro na ordem das sentenas e talvez um erro na relao entre
as sentenas. Um bom exemplo de erro de lgica pode ser, tome um gole de sua
garrafa de gua, coloque-a na sua mochila, v at a biblioteca e coloque novamente
a tampa na sua garrafa.
Mais uma vez, nos trs tipos de erros, Python est apenas tentando fazer exata-
mene o que voc solicitou.
no era problema para voc que nos primeiros anos voc apenas emitia apenas alguns
sons. E tambm estava tudo bem se levava seis meses para voc mudar de um simples
vocabulrio para sentenas simples e se levava mais 5 ou 6 anos para mudar de sentenas
para pargrafos, e alguns anos a mais para ser capaz de escrever sozinho uma pequena
histria completa.
Queremos que aprenda Python muito mais rpido, ento ensinamos a voc tudo
ao mesmo tempo nos prximos captulos. Mas como aprender uma nova lngua que leva
tempo para absorver e entender antes que a mesma se torne natural. Pode gerar algumas
confuses sempre que vemos e revemos tpicos para tentar mostra a voc o retrato todo
enquanto definimos pequenos fragmentos que formam o retrato. Apesar do livro ser escrito
linearmente, e se voc est fazendo um curso o mesmo progredir linearente, no hesite em
ser no linear na maneira como aborda o material. Olhe para frente e para trs e leia com
um pouco de cuidado. Olhando materiais mais avanados sem entender completamente
os detalhes, voc pode obter melhor entendimento do por que? programar. Revisando
materiais e at mesmo refazendo exerccios anteriores, voc perceber que aprendeu muita
coisa, mesmo que o material que est olhando parea ser impenetrvel.
Geralmente, quando voc est aprendendo sua primeira linguagem de programa-
o, existem alguns momentos Ah-hah! fantsticos que voc olha distante para uma
pedra com um martelo e uma talhadeira, e afasta-se e v que voc de fato est cons-
truindo uma bela escultura.
Se alguma coisa parece particularmente difcil, em geral no h sentido em perder o
sono olhando para ela por muito tempo. Respire, tire um cochilo, faa um lanche, explique
para alguma pessoa (ou quem sabe para seu cachorro) que voc est tendo um problema,
e ento retorne com a cabea fresca. Eu garanto que assim que voc aprender conceitos
de programao no livro, voc olhar para trs e ver que foi tudo muito fcil e elegante,
e que simplesmente levou algum tempo para voc absorver isto.
1.12 Glossrio
bug: um erro em um programa.
unidade central de processamento: o corao de todo computador. o que
roda o software que escrevemos; tambm chamada de UCP ou CPU ou o processador.
compile: traduzir um programa escrito em linguagem de alto nvel para uma
linguagem de baixo nvel uma vez, preparando para uma execuo posterior;
linguagem de alto nvel: uma linguagem de programao como Python, que
desenvolvida para ser fcil para as pessoas escreverem e lerem.
modo interactivo: uma forma de usar o interpretador Python digitando coman-
26 Captulo 1. Por que voc deve aprender a programar?
1.13 Exerccios
Exerccio 1.1 Qual a funo da memria secundria em um computador?
c) Armazenar informaes por um perodo longo, mesmo que ocorra queda de energia.
a) O interpretador Python
b) O teclado
x = 123
b) Memria principal
c) Memria secundria
d) Dispositivos de entrada
e) Dispositivos de sada
x = 43
x = x + 1
print x
a) 43
b) 44
c) x + 1
28 Captulo 1. Por que voc deve aprender a programar?
Exerccio 1.8 Explique cada um dos seguintes conceitos usando uma capacidade
humana: (1) Unidade Central de Processamento, (2) Memria principal, (3) Memria
secundria, (4) Dispositivo de entrada, (5) Dispositivo de sada. Por exemplo, O que
equivalente nas pessoas Unidade Central de Processamento?
Exerccio 1.9 Como voc corrige um Erro de Sintaxe (Syntax Error)?
29
python
> > > print 4
4
O que dizer de valores como 17 e 3.2? Eles se parecem nmeros, mas esto
entre aspas como strings. Logo, eles so strings.
30 Captulo 2. Variveis, expresses e sentenas
Quando voc digita um nmero muito grande, voc pode ficar tentado colocar
vrgulas entre grupos de trs dgitos, como em 1,000,000. Isso no um inteiro em
Python, mas permitido.
2.2 Variveis
Este exemplo faz trs atribuies. O primeiro atribui uma string para uma nova
varivel chamada mensagem; o segundo atribui o inteiro 17 para n; o terceiro atribui o
valor (aproximado) de para pi.
Para exibir o valor de uma varivel, voc pode usar o comando de impresso print.
76trombones invlido porque no comea com uma letra, mais@ invlido pois
contm um caracter invlido (@). Mas o que h de errado com class?
Isto ocorre porque class uma palavra-chave de Python. O interpretador usa
esses tipos de palavras para reconhecer a estrutura do programa, e elas no podem ser
usadas como nomes de variveis.
1
Python possui 31 palavra-chaves para serem utilizadas:
1
Em Python 3.0, exec no uma palavra-chave, mas nonlocal .
32 Captulo 2. Variveis, expresses e sentenas
bom que voc tenha esta lista em mos. Se o interpretador reclamar sobre um
dos nomes das variveis e voc no sabe o motivo, veja se o nome est nesta lista.
2.4 Sentenas
Uma sentena uma unidade de cdigo que o interpretador Python pode execu-
tar. Ns temos visto dois tipos de sentenas: impresso e atribuiao.
Quanto voc digita uma sentena no modo interativo, o interpretador executa e
exibe o resultado, se houver.
Um script geralmente contm uma sequncia de sentenas. Se existir mais de uma
sentena, os resultados aparecem cada vez que as declaraes so executadas.
Por exemplo, o script
print 1
x = 2
print x
1
2
piso da diviso 2 .
Quando os dois operandos so inteiros, o resultado um inteiro; a diviso piso
descarta a parte fracionria, ento no exemplo ele arredonda para zero.
Se os operandos so nmeros com ponto flutuante, Python realiza uma diviso
com ponto flutuante, e o resultado um nmero float.
2.6 Expresses
17
x
x+17
Mas em um cdigo, a expresso por si s no faz nada! Isso um erro comum para
os iniciantes.
Exerccio 2.1 Digite a seguinte declarao no interpretador de Python e veja o
que ele faz:
5
x = 5
x + 1
2
Em Python 3.0, o resultado desta diviso um float. Em Python 3.0 o novo operador // executa a
diviso inteira
34 Captulo 2. Variveis, expresses e sentenas
Em caso de dvida, sempre utilize parnteses nas expresses para ter certeza de
que as operaes sero realizadas na ordem que voc deseja.
Antes de receber a varivel fornecida pelo usurio, uma boa idia imprimir uma
mensagem dizendo o que o usurio deve fornecer. Voc pode passar uma string para
3
Em Python 3.0 esta funo chamada
36 Captulo 2. Variveis, expresses e sentenas
raw_input para ser visualizada pelo usurio antes de pausar e receber a varivel.
Mas se o usurio digita algo diferente do que voc espera, como uma string por
exemplo, voc receber um erro:
2.11 Comentrios
Assim que os programas se tornam maiores e mais complexos, eles tambm ficam
mais difceis de ler. Linguagens formais so densas e normalmente dificil olhar um
pedao de cdigo e descobrir o que ele faz ou porqu. Por esta razo, uma uma boa
ideia adicionar anotaes em seu programa para explicar, em uma linguagem natural, o
2.12. Escolhendo variveis com nomes mnemnicos 37
que o programa faz. Essas anotaes so chamadas de comentrios, e eles iniciam com
o smbolo #:
Neste caso, apenas o comentrio aparece na linha. Voc pode colocar comentrios
ao final de uma linha de comando:
v = 5 # v recebe 5
v = 5 # velocidade em metros/segundo
Bons nomes para variveis podem reduzir a necessidade de comentrios, mas nomes
longos podem transformar expresses complexas difceis de se ler.
a = 35.0
b = 12.50
c = a*b
print c
horas = 35.0
rate = 12.50
pay = hours * rate
printf pay
x1q3z9ahd = 35.0
x1q3z9afd = 12.50
x1q3p9afd = x1q3z9ahd * x1q3z9afd
print x1q3p9afd
O que est acontecendo aqui? Qual dessas palavras (for, palavras, in, etc.) so
palavras reservadas e quais so apenas nomes de variveis? O Python entende fundamen-
talmente o siginificado das palavras? Programadores iniciantes tm problemas em separar
quais partes do cdigo devem ser exatamente como no exemplo e quais partes do cdigo
so simples escolhas feitas pelo programador. O cdigo a seguir igual ao cdigo acima:
4
Veja http://en.wikipedia.org/wiki/Mnemonic para uma descrio estendida da palavra mnemonic.
2.13. Depurao 39
mais fcil para iniciantes avaliar esse cdigo e saber quais partes so palavras
reservadas definidas pelo Python e quais so simples nomes de variveis escolhidos pelo
programador. muito claro que o Python no possui entendimento sobre pizza nem sobre
fatias, nem mesmo sobre o fato de que uma pizza consiste em uma ou mais fatias.
Mas se nosso programa est realmente lendo e pesquisando palavras na memria,
pizza e fatia so nomes de variveis no mnemnicas. Escolher o nome das variveis
diverge do verdadeiro propsito do programa.
Aps um curto perodo de tempo voc saber as palavras reservadas mais comuns
e comear a v-las destacadas no programa.
As partes do cdigo que so definidas pelo Python (for, in, print, e :) esto
em negrito e as variveis escolhidas (palavra e palavras) no esto em negrito. Muitos
editores de texto reconhecem a sintaxe de Python e vo colorir automaticamente as pala-
vras reservadas para dar dicas e manter o nome das suas variveis e palavras reservadas
separadas. Depois de um tempo voc comear a ler cdigos em Python e rapidamente
determinar o que uma varivel e o que uma palavra reservada.
2.13 Depurao
Neste ponto os erros de sintaxe mais cometidos por voc so nomes de variveis
ilegais, como class e yield, que so palavras chaves, ou odd~job e US\$, que contm
caracteres invlidos. Se voc colocar espao em um nome de varivel, o Python reconhecer
como dois operandos sem um operador:
Mas a diviso acontece primeiro, ento voc iria calcular o valor de /2, que no
a mesma coisa! No h como o Python saber o que voc pretendia escrever, ento nesse
caso voc no recebe uma mensagem de erro; s receber uma resposta errada.
2.14 Glossrio
atribuio: uma sentena que atribui um valor a uma varivel.
concatenar: unir o final do primeiro operando com o incio do segundo operando.
comentrio: informao significativa em um programa para outros programadores
(ou qualquer leitor do cdigo-fonte) e no tem efeito sobre a execuo do programa.
avaliar: simplificar uma expresso, executando as operaes de modo a produzir
um nico valor.
expresso: uma combinao de variveis, operadores e valores que representam
um nico valor resultante.
ponto flutuante: um tipo de dado que representa nmeros com partes fracion-
rias.
piso da diviso: a operao que divide dois nmeros, desconsiderando a parte
fracionria.
inteiro: um tipo de dado que representa nmeros inteiros.
palavra-chave: uma palavra reservada que usada pelo compilador para analisar
um programa; voc no pode usar palavras-chaves como if, def, e while como nomes
de variveis.
mnemnico: um auxiliar de memria. Frequentemente damos nomes mnemnicos
para as variveis para nos ajudar a lembrar o que armazenado na varivel.
2.15. Exerccios 41
2.15 Exerccios
Exerccio 2.2 Escreva um programa que use raw_input para perguntar a ele qual
seu nome e d as boas vindas ao usurio.
Horas: 35
Valor/hora: 2.75
Salrio Bruto : 96.25
No vamos nos preocupar em fazer com que o nosso salrio tenha exatamente
dois dgitos depois do ponto decimal, por enquanto. Se voc quiser, voc pode brincar
com a funo round que j vem embutida em Python para deixar sempre o nmero com
exatamente duas casas decimais.
Exerccio 2.4 Assuma as seguintes declaraes de atribuio.
largura = 17
altura = 12.0
42 Captulo 2. Variveis, expresses e sentenas
Para cada expresso a seguir, escreva o valor da expresso e o tipo (do valor da
expresso).
1. largura/2
2. largura/2.0
3. altura/3
4. 1 + 2 *5
3 Execuo Condicional
Uma expresso booleana uma expresso que pode ser verdadeira ou falsa. Os
seguintes exemplos utilizam o operador ==, o qual compara dois operandos e produz True
se eles so iguais ou False caso contrrio:
True e False so valores especiais que pertencem ao tipo bool; eles no so strings:
Essa flexibilidade pode ser til, mas existem algumas construes que a tornam
confusas. Voc pode querer evit-los (a menos que saiba o que est fazendo).
if x > 0 :
print x positivo
pontos (:) seguido por um bloco identado. Sentenas como essas so chamadas sentenas
compostas porque elas se estendem por mais que uma linha.
No h limite do nmero de sentenas que podem aparecer no corpo da sentena
if, mas deve haver pelo menos uma. Ocasionalmente, pode ser necessrio ter um corpo
sem sentenas (usualmente para marcar o lugar de um cdigo que voc no escreveu
ainda). Nesse caso, voc pode usar a sentena pass, que no faz nada.
if x < 0 :
pass # preciso manipular valores negativos!
if x % 2 == 0 :
print x is even
else:
print x is odd
Dado que uma condio sempre verdadeira ou falsa, exatamente uma das alter-
nativas ser executada. As alternativas so chamadas branches, porque elas so ramos
do fluxo da execuo.
if x < y:
print x menor que y
elif x > y:
print x maior que y
else:
print x e y so iguais
elif uma abreviao de else if. Mais uma vez, exatamente um ramo ser
executado. No h limite do nmero de sentenas elif. Se h uma clusula else, ela
deve aparecer no final da construo da cadeia. Note, no entanto, que o else no
obrigatrio.
3.6. Condicionais Agrupadas 47
if choice == a:
print Bad guess
elif choice == b:
print Good guess
elif choice == c:
print Close, but not correct
if x == y:
print x e y so iguais
else:
if x < y:
print x menor que y
else:
print x maior que y
A condicional mais externa contm dois ramos. O primeiro ramo contm uma
sentena simples. O segundo ramo contm outra sentena if, a qual tem seus dois ramos
prprios. Esses dois ramos so ambos sentenas simples, entretanto eles tambm poderiam
48 Captulo 3. Execuo Condicional
if 0 < x:
if x < 10:
print x is a positive single-digit number.
python fahren.py
Enter Fahrenheit Temperature:72
22.2222222222
python fahren.py
Enter Fahrenheit Temperature:fred
Traceback (most recent call last):
File "fahren.py", line 2, in <module>
fahr = float(inp)
ValueError: invalid literal for float(): fred
H uma estrutura codicional de execuo no Python que pode lidar com esses tipos
de erros (esperados ou no esperados) chamados try / except. O objetivo do try e do
except , dado que voc sabe que erros podem ocorrer, permitir a adio de sentenas
para tratar tais erros. Essas sentenas extras (o bloco de exceo) so ignoradas se no
houver erro.
50 Captulo 3. Execuo Condicional
try e except podem ser entendidos como uma poltica de segurana do Python
em uma sequncia de sentenas. Ns poderamos reescrever o conversor de temperatura
como segue:
python fahren2.py
Enter Fahrenheit Temperature:72
22.2222222222
python fahren2.py
Enter Fahrenheit Temperature:fred
Please enter a number
Lidar com excees pelo uso do try chamado de capturar excees. Neste
exemplo, a clusula except imprime uma mensagem de erro. Em geral, capturar a exceo
d a voc a chance de consertar o problema, tentar novamente, ou pelo menos, terminar
o programa graciosamente.
no interpretador de Python:
3.9 Depurao
O traceback do Python exibido quando ocorre um erro contendo uma grande
quantidade de informaes. E isso pode ser um fator de complicao. Entretanto, as
partes fundamentais so:
Nesse exemplo, o problema que a segunda linha foi indentada com um espao.
Mas a mensagem de erro aponta para o y, erroneamente. Em geral, mensagens de erro
indicam onde o problema foi descoberto, mas o erro em questo ocorreu, de fato, antes
desse cdigo, algumas vezes na linha anterior. O mesmo verdade para erros em tempo
de execuo. Suponha que voc esteja tentando computar um sinal/rudo em decibis. A
frmula = 1010 ( / ). Em Python voc deve escrever:
import math
signal_power = 9
noise_power = 10
ratio = signal_power / noise_power
decibels = 10 * math.log10(ratio)
print decibels
3.10. Glossrio 53
A mensagem de erro indica a linha 5, mas no h nada de errado nessa linha. Para
achar o erro real, pode ser til imprimir o valor de ratio, que no caso 0. O problema
est na linha 4, porque dividindo-se dois inteiros, o resultado ser tambm um inteiro. A
soluo para representar um valor da potncia e do barulho, ambos em ponto flutuante.
Em geral, mensagens de erro dizem para voc onde o problema foi descoberto, mas
esse, geralmente, no o lugar onde o mesmo ocorreu.
3.10 Glossrio
corpo: sequncia de sentenas dentro de uma sentena composta.
condicional em cadeia: Uma sentena condicional com uma srie de ramos al-
ternativos.
traceback: Lista de funes que esto executando, impressa quando uma exceo
ocorre.
3.11 Exerccios
Exerccio 3.1 Reescreva seu clculo de pagamento para dar ao empregado 1,5
vezes o valor da hora para quem trabalhou acima de 40 horas.
3.11. Exerccios 55
Exerccio 3.2 Reescreva seu programa de pagamento usando try e except tal
que seu programa trate a entrada no numrica, imprimindo uma mensagem e finalizando
a execuo do mesmo neste caso. O trecho a seguir mostra duas execues do programa:
Digite as horas: 20
Digite o valor da hora: nine
Erro! Por favor, digite uma entrada numrica.
Exerccio 3.3 Escreva um programa que solicite um valor entre 0.0 e 1.0. Se o
valor est fora do intervalo imprima um erro. Se o valor est entre 0.0 e 1.0, imprima um
conceito de acordo com a tabela a seguir:
Score Grade
>= 0.9 A
>= 0.8 B
>= 0.7 C
>= 0.6 D
< 0.6 F
4 Funes
A funo max nos diz qual o maior caractere em uma string (o que retorna a
letra w para o exemplo anterior) e a funo min mostra qual o menor caractere, que
o espao, considerando a frase Hello world.
Outra funo embutida muito comum a funo len, a qual nos diz quantos
smbolos existem no argumento. Se o argumento para len uma string, ele retorna o
58 Captulo 4. Funes
int pode converter valores com ponto flutuante para inteiros, mas isso no arre-
donda o valor; s remove a parte fracionria do valor.
import random
Esse programa produz a seguinte lista de 10 nmeros aleatrios entre 0.0 e 1.0,
no incluindo o 1.0.
0.301927091705
0.513787075867
0.319470430881
0.285145917252
0.839069045123
0.322027080731
0.550722110248
0.366591677812
0.396981483964
0.838116437404
Exerccio 4.1 Execute este programa no seu sistema e veja quais nmeros foram
gerados. Execute o programa mais de uma vez e veja quais nmeros voc obteve.
60 Captulo 4. Funes
A funo random uma de muitas funes que fornecem nmeros aleatrios. A fun-
o randint recebe como parmetros valores correspondentes menor e maior e retorna
um inteiro neste intervalo (incluindo ambos).
O mdulo random s fornece funes para gerar valores aleatrios de uma distribuio
contnua incluindo Gaussiana e exponencial.
Esta sentena cria um objeto mdulo nomeado math. Se voc imprimir o objeto
mdulo, voc obter alguma informao sobre ele:
O objeto mdulo contm definies de funes e variveis. Para acessar uma dessas
funes, voc tem que especificar o nome do mdulo e o nome da funo separado por
um ponto. Esse formato chamado de notao de ponto.
4.6. Adicionando novas funes 61
def print_lyrics():
print Im a lumberjack, and Im okay.
print I sleep all night and i work all day.
def a palavra-chave que indica que uma funo ser definida. O nome dessa
funo print_lyrics. As regras para os nomes das funes so as mesmas dos nomes
62 Captulo 4. Funes
Para terminar a funo, voc tem que deixar uma linha em branco (isso no
necessrio no cdigo).
Definir uma funo cria uma varivel com o mesmo nome.
Uma vez definida a funo, voc pode us-la dentro de outra funo. Por exemplo,
para repitir o refro anterior, ns podamos escrever uma funo chamada repeat_lyrics:
4.7. Definies e Modo de Utilizao 63
def repeat_lyrics():
print_lyrics()
print_lyrics()
def print_lyrics():
print Im a lumberjack, and Im okay.
print I sleep all night and I work all day.
def repeat_lyrics():
print_lyrics()
print_lyrics()
repeat_lyrics()
def print_twice(bruce):
print bruce
print bruce
O argumento avaliado antes que a funo seja chamada, por isso, nos exemplos
as expresses Spam * 4 e math.cos(math.pi) s so avaliadas uma vez.
Voc tambm pode usar uma varivel como argumento:
x = math.cos(radians)
golden = (math.sqrt(5) + 1) / 2
66 Captulo 4. Funes
Quando voc chama uma funo no modo interativo, Python exibe o resultado:
math.sqrt(5)
O valor None no o mesmo que a string de None. um valor especial que possui
seu prprio tipo:
Para retornar um valor de uma funo, usamos o comando return na nossa funo.
Por exemplo, poderamos criar uma funo muito simples chamada addtwo que adiciona
dois nmeros e retorna um resultado.
x = addtwo(3, 5)
print x
dos dois nmeros e os coloca na varivel local chamada added e utiliza a instruo return
para enviar o valor calculado de volta para o local no cdigo onde a chamada foi realizada.
Este valor atribudo varivel x e, em seguida, impresso.
As funes podem fazer com que um programa tenha uma quantidade menor de
linhas por eliminar linhas de cdigo repetitivas. Se mais tarde voc precisar realizar
alguma mudana, basta fazer isso uma nica vez e em um s lugar.
Durante todo o resto do livro, muitas vezes, vamos utilizar a definio de funo
para explicar um conceito. Parte da habilidade de criar e utilizar funes exige que voc
entenda corretamente uma ideia como, por exemplo: encontrar o menor valor em uma
lista de valores. Mais tarde vamos mostrar o cdigo que encontra o menor valor em uma
lista de valores e apresentaremos a voc como uma funo chamada min que leva uma
lista de valores como seu argumento e retorna o menor valor na lista.
4.12 Debugging
Se voc est usando um editor de textos para escrever seus cdigos, voc poder ter
alguns problemas com a quantidade de espaos e tabulaes. A melhor maneira de evitar
esses problemas usar somente espaos e no usar tabulaes. A maioria dos editores de
textos que contm suporte para Phyton substituem o tab por quatro espaos, mas existem
editores que no fazem isso.
Tabs e espaos geralmente so invisveis, o que torna mais difcil corrigir os erros.
Procure um editor de textos que administre a identao para voc.
68 Captulo 4. Funes
4.13 Glossrio
Algoritmo: Um processo geral para resolver um tipo de problema.
Argumento: Um valor dado funo quando ela chamada. Esse valor atribudo
ao parmetro correspondente da funo.
Composio: Usar uma expresso como parte de uma expresso maior, ou uma sen-
tena como parte de uma sentena maior.
Determinstico: Relativo a um programa que faz a mesma coisa toda vez que exe-
cutado, dadas as mesmas entradas.
Notao de ponto: Sintaxe utilizada para chamar uma funo de um outro mdulo.
Tal chamada feita pela especificao do nome do mdulo seguido por um ponto e o
nome do mdulo.
Chamada de funo: Declarao que executa uma funo. Consiste do nome da funo
seguido de uma lista de argumentos.
4.14. Exerccios 69
Definio da funo: Declarao que cria uma nova funo, especificando o nome,
parmetro e as declaraes da funo.
Objeto de funo: Valor criado por uma instruo import que permite acesso aos
dados e cdigos definidos em um mdulo.
Objeto de mdulo: Valor criado pela declarao import, o que torna possvel aces-
sar funes e variveis definidas no mdulo.
Parmetro: Nome usado dentro de uma funo para se referir ao valor passado como
argumento para a funo.
4.14 Exerccios
def fred():
print Zap
def jane():
print ABC
jane()
fred()
jane()
Exerccio 4.7 Reescreva o programa de notas do captulo anterior usando uma funo
chamada computegrau que recebe uma pontuao como parmetro e retorna um grau,
sendo este ltimo uma string.
4.14. Exerccios 71
Score Grade
> 0.9 A
> 0.8 B
> 0.7 C
> 0.6 D
<= 0.6 F
Execuo do Programa:
5 Iterao
x = x + 1
Antes que voc possa atualizar uma varivel, voc tem que inicializ-la, geralmente
com uma simples atribuio:
n = 5
while n> 0:
print n
n = n-1
print Fim!
Voc quase pode ler o comando while como se fosse em Portugus. Significa:
Enquanto n for maior que 0, exibe o valor de n e, em seguida, reduz o valor de n em
1. Quando voc chega em 0 para o valor de x, saia do comando while e exiba a palavra
Fim!.
Mais formalmente, segue o fluxo de execuo para um comando while:
Este tipo de fluxo chamado de loop porque aps a terceiro passo volta-se ao incio
(passo 1). Cada vez que executamos o corpo do lao, chamamos isso de uma iterao.
Para o loop acima, diramos, Tinha cinco iteraes o que significa que o corpo do loop
foi executado cinco vezes.
O corpo do loop deveria alterar o valor de uma ou mais variveis, de modo que,
eventualmente, a condio se torna falsa e o loop termina. Chamamos a varivel que
muda cada vez que o loop executado e controla quando o loop finalizado de varivel
de iterao. Se no houver nenhuma varivel iterao, o loop repetir para sempre,
resultando em um loop infinito.
s vezes, voc no sabe que hora de acabar um loop at chegar ao meio do corpo
do loop. Nesse caso, voc pode escrever um loop infinito de propsito e, em seguida, usar
a declarao break para saltar para fora do loop.
Este loop , obviamente, um loop infinito porque a expresso lgica na sentena
while simplesmente a constante lgica True:
n = 10
while True:
print n,
n = n - 1
print Done!
Se voc cometer o erro e executar este cdigo, voc vai aprender rapidamente como
parar um processo Python que no para em seu sistema ou descobrir onde o boto de
desligar em seu computador. Este programa executar para sempre ou at que a bateria
se esgote porque a expresso lgica no topo do loop sempre verdadeira, em virtude do
fato de que a expresso o valor constante True.
Enquanto este um loop infinito disfuncional, ainda podemos usar este padro
para construir laos teis, enquanto ns adicionarmos cuidadosamente cdigo ao corpo
do loop para explicitamente sair do loop usando break, quando chegarmos condio de
sada.
Por exemplo, suponha que voc queira receber uma entrada do usurio at que ele
digite done.
Voc poderia escrever:
while True:
line = raw_input (> )
if line == done:
break
print line
print Done!
A condio do loop True, o que sempre verdade, de modo que o loop executado
repetidamente at que seja executado o comando break.
A cada iterao mostrado o smbolo > solicitando a entrada do usurio. Se
o usurio digitar done, a instruo break faz com que o loop seja interrompido. Caso
contrrio, o programa repete o que quer que o usurio digite e volta ao topo do loop.
Aqui est uma execuo simples:
76 Captulo 5. Iterao
Esta forma de escrever while comum, pois voc pode verificar a condio em
qualquer lugar do loop (e no apenas no incio do loop) e voc pode expressar a condio
de parada afirmativamente (parar quando isso acontece) ao invs de negativamente
(continuar at que isso acontea.).
while True:
line = raw_input (>)
if line [0] == #:
continue
if line == done:
break
print line
print Done!
Aqui est um exemplo de execuo deste novo programa com continue acrescen-
tado.
Todas as linhas so impressas, exceto aquela que comea com o caracte #, porque
quando o continue executado, ele termina a iterao atual e segue para o incio do
5.6. Laos usando for 77
Em Python, a varivel friends uma lista1 de trs strings e o loop for percorre
a lista e executa o corpo uma vez para cada uma das trs strings da lista resultando na
sada:
Traduzir o loop for para o Portugus, no to direto como o while, mas se voc
pensar em friends como um conjunto, se parece com: Execute as instrues no corpo
do loop for uma vez para cada friend no conjunto nomeado friends.. Olhando para
o loop for, for e in so palavras-chaves reservadas do Python, e friend e friends so
variveis.
count = 0
for intervar in [3, 41, 12, 9, 74, 15]:
count = count + 1
print Count: , count
Atribumos o valor zero varivel count antes do incio do loop, ento ns es-
crevemos um loop for para percorrer a lista de nmeros. Nossa varivel de iterao
chamada itervar e apesar de no usamos itervar no loop, ela controla o loop e faz com
que o corpo do loop seja executado uma vez para cada um dos valores da lista.
No corpo do loop, adiciona-se 1 ao valor atual de count para cada um dos valores
na lista. Enquanto o loop est em execuo, o valor de count o nmero de valores que
temos visto at o momento.
Uma vez que o loop termina, o valor da varivel count o nmero total de itens.
Assim, o nmero total de itens nos dado ao final do loop. Construmos o loop ento
temos o que queremos quando o lao termina.
Outro loop semelhante que calcula o total de um conjunto de nmeros o seguinte:
5.7. Padres de Loop 79
total = 0
for intervar in [3, 41, 12, 9, 74, 15]:
total = total + intervar
print Total: , total
largest = None
print Before: , largest
for itervar in [3, 41, 12, 9, 74, 15]:
if largest is None or itervar > largest:
largest = itervar
print Loop: , itervar, largest
print Largest: , largest
Before : None
Loop: 3 3
Loop: 41 41
Loop: 12 41
Loop: 9 41
Loop: 74 74
Loop: 15 74
Largest: 74
constante que podemos armazenar em uma varivel para marcar a varivel como vazia.
Antes do lao comear, o maior valor visto at o momento None, uma vez que
ainda no foram avaliados quaisquer valores. Enquanto o lao executado, se largest
None, ento tomamos o primeiro valor como o maior visto at agora. Voc pode ver na
primeira iterao quando o valor de itervar 3, uma vez que largest None, imedia-
tamente definimos largest como 3.
Aps a primeira iterao, largest no tem mais o valor None, de modo que a
segunda parte da expresso lgica verifica se itervar > largest e, caso verdadeiro,
troca o valor da varivel largest para o contedo armazenado em itervar. Quando
vemos um valor ainda maior, tomamos esse novo valor para largest. Voc pode ver na
sada do programa que largest progride de 3 para 41 e depois para 74.
No final do loop, verificamos todos os valores e a varivel largest agora contm
o maior valor da lista.
Para calcular o menor nmero, o cdigo muito semelhante, com uma pequena
alterao na expresso de comparao.
smallest = None
print Before: , smallest
for itervar in [3, 41, 12, 9, 74, 15]:
if smallest is None or itervar < smallest:
smallest = itervar
print Loop: , itervar, smallest
print Smallest: ,smallest
def min(values):
smallest = None
for value in values:
if smallest is None or value < smallest:
smallest = value
return smallest
5.8 Depurao
medida que voc comear a escrever programas maiores, voc pode encontrar-se
gastando mais tempo com depurao. Mais cdigo significa mais chances de cometer um
erro e mais lugares para bugs se esconderem.
Uma maneira de reduzir o tempo de depurao depurar por seo. Por exemplo,
se houver 100 linhas em seu programa e voc deseja chec-los um de cada vez, seriam
necessrios 100 passos.
Ao invs disso, tente dividir o problema ao meio. Tome a instruo central do
programa, ou perto disso. Adicione uma instruo de impresso (ou algo que tem um
efeito verificvel) e execute o programa.
Se a verificao do ponto mdio est incorreta, o problema deve estar na primeira
metade do programa. Se ele estiver correto, o problema na segunda metade.
Toda vez que voc executar uma verificao como esta, voc reduz pela metade
o nmero de linhas que deve ser verificada. Depois de seis etapas (o que muito menos
do que 100), voc teria uma ou duas linhas de cdigo restantes, pelo menos em teoria.
Na prtica, nem sempre claro o que o meio do programa e nem sempre possvel
verific-lo. No faz sentido contar linhas e encontrar o exato ponto mdio. Em vez disso,
pense sobre pontos do programa onde pode haver erros e lugares onde fcil inserir uma
instruo de impresso.
5.9 Glossrio
acumulador: varivel usada em um loop para adicionar ou acumular um resul-
tado.
contador: varivel usada em um loop para contar o nmero de vezes que alguma coisa
acontece. Ns inicializamos um contador com zero e ento incrementamos o contador a
cada vez que queremos contar alguma coisa.
inicializar: atribuio que d um valor inicial a uma varivel que ser atualizada poste-
riormente.
incremento: atualizao que aumenta o valor de uma varivel (em geral, em um).
loop infinito: loop em que a condio de trmino nunca satisfeita ou para o qual
82 Captulo 5. Iterao
5.10 Exerccios
Exerccio 5.1 Escreva um programa que leia nmeros repetidamente at que o
usurio informe done. Uma vez que done informado, imprima a soma, quantidade
e mdia dos nmeros. Se o usurio digita alguma coisa diferente de um nmero, detecte
o erro usando try e except e imprima uma mensagem de erro e pule para o prximo
nmero.
Digite um numero: 4
Digite um numero: 5
Digite um numero: bad data
Invalid input
Digite um numero: 7
Digite um numero: done
16 3 5.33333333333
Exerccio 5.2 Escreva um programa que pede por uma lista de nmeros e imprima
o maior e o menor dos nmeros. Sua entrada deve respeitar as condies impostas no
Exerccio 5.1.
83
6 Strings
Para acessar a ltima letra de uma string, voc deve estar pensando que pode
tentar algo como:
Voc tambm pode usar ndices negativos, que so contados de trs para frente. A
expresso fruta[-1] lhe dar a ltima letra, fruta[-2] a penltima, e assim por diante.
indice = 0
while indice < len(fruta)
letra = fruta[index]
print letra
indice = indice + 1
Essa estrutura de repetio percorre a string exibindo uma de suas letras em cada
linha. A condio dessa estrutura de repetio indice < len(fruta), ento quando o
ndice for igual ao comprimento da string, a condio ser falsa, e a estrutura de repetio
6.4. Fragmentando Strings 85
ter chegado ao seu fim. O ltimo caractere acessado foi o de ndice len(fruta)-1, que
o ltimo caractere da string.
Exerccio 6.1 Escreva uma estrutura de repetio usando o lao while que comece
no ltimo caractere da string e funcione de trs para frente at o primeiro caractere,
exibindo cada letra em uma linha separada.
Outro modo de se escrever um percurso sobre uma string usando uma estrutura de
repetio for:
Uma string vazia no contm caracteres e tem comprimento 0. Excluindo este fa-
tor, ela como qualquer outra string.
Exerccio 6.2 Sabendo que fruta uma string, o que fruta[:] significa?
O object nesse caso a string e o item o caractere que voc tentou atribuir.
Por agora, um object um valor, porm iremos redefin-lo mais frente. Um item um
dos valores em uma sequncia.
A razo desse erro que as strings so imutveis, isso significa que voc no pode
realizar mudanas em uma string j existente. O melhor a se fazer criar uma nova string
com as alteraes que eram desejadas na original:
palavra = banana
contador = 0
for letra in palavra:
if letra == a:
contador = contador + 1
print contador
6.7 O operador in
A palavra in um operador booleano que recebe duas strings e retorna True se a
primeira string aparace como sub-string da segunda:
if palavra == banana
print So bananas.
6.9 Mtodos de
Strings em Python so exemplos de objetos. Um objeto contm dados (a string
em si) e mtodos, que so funes embutidas sobre o objeto e que esto disponveis para
o objeto.
Python possui uma funo chamada dir que lista os mtodos disponveis para um
objeto. A funo type mostra o tipo de objeto.
capitalize(...)
S.capitalize() -> string
A funo dir lista os mtodos, e voc pode usar o help para conseguir uma
explicao superficial sobre algum mtodo. Para conseguir explicaes mais detalhadas
sobre mtodos de string acesse o site docs.python.org/library/string.html.
Chamar um mtodo similar a chamar uma funo - preciso enviar um argu-
6.9. Mtodos de 89
mento para que ele retorne um valor - mas a sintaxe diferente. Chama-se um mtodo
juntando o nome do mtodo com o nome da varivel atravs de um ponto que separa os
dois.
Por exemplo, o mtodo upper recebe uma string e retorna uma nova string com
todas as suas letras maisculas. Porm, no usada a sintaxe de funo upper(palavra),
e sim a de mtodo palavra.upper().
Nesse exemplo, invocamos find em palavra e passamos a letra que estamos pro-
curando como parmetro.
O mtodo find pode encontrar uma substring, e no apenas caracteres:
Tambm pode receber como segundo argumento um ndice, que indica de onde a
busca deve comear:
Voc ir notar que em certos casos, para usar o mtodo startswith do modo que
voc deseja, ter que usar o lower para transformar tudo em minsculo antes de comparar
as strings, como no caso a seguir:
> > > data = From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
> > > atpos = data.find(@)
> > > print atpos
21
> > > sppos = data.find( ,atpos)
> > > print sppos
31
> > > host = data[atpos+1:sppos]
> > > print host
uct.ac.za
> > >
Usamos uma verso do mtodo find de modo que ele apenas comeou a procurar
o que desejvamos a partir de uma posio especfica. Quando o fragmentamos, extramos
os caracteres de uma posio depois do @ at o caracter antes do espao em branco.
A explicao do mtodo find encontra-se no link1 .
O resultado foi a string 42, que no pode ser confundida com o inteiro de valor
42.
A sequncia de formatao pode aparecer em qualquer lugar da string, assim voc
pode inserir um valor em uma sentena:
1
docs.python.org/library/string.html
92 Captulo 6. Strings
6.12 Depurao
Uma habilidade que voc deve cultivar para melhorar em programao sempre
se perguntar, O que pode dar errado aqui?, ou talvez, Que loucura o meu usurio pode
fazer para estragar o meu programa?.
Por exemplo, veja o programa em que demonstramos a estrutura de repetio
while no captulo anterior:
2
docs.python.org/lib/typesseq-strings.html
6.13. Glossrio 93
while True:
linha = raw_input(> )
if linha[0] == # :
continue
if linha == Fim:
break
print linha
print Fim!
Veja o que acontece se o usurio enviar uma linha em branco como entrada:
> Ola
Ola
> # nao mostre isso
> imprima isso!
imprima isso!
>
Traceback (most recent call last):
File copytildone.py, line 3, in <module>
if line[0] == # :
Esse cdigo funciona muito bem at receber uma linha em branco como entrada.
Assim, no ter nenhum caractere na posio zero para rastrear. H duas solues para
isso.
Uma possvel soluo seria simplesmente usar o mtodo startswith que retorna
False se a string vazia.
if line.startswith(#):
Outro modo seria escrever um outro if e fazer com que a segunda expresso lgica
seja avaliada apenas quando h pelo menos um caractere na string:
6.13 Glossrio
contador: varivel usada para contar o nmero de ocorrncias de algum elemento
em um conjunto, geralmente inicializada em zero e depois incrementada em um.
string vazia: string que no possui nenhum caractere e tem comprimento zero, represen-
tada por duas aspas.
94 Captulo 6. Strings
cadeia de formatao: string usada com o operador de formatao, que contm sequn-
cias de formatao.
flag: varivel booleana usada para indicar quando uma condio verdadeira.
imutvel: propriedade de uma sequncia que impede que caracteres sejam alterados.
ndice: valor inteiro usado para selecionar um item em uma sequncia, tal como um
caractere em uma string.
objeto: algo a que uma varivel pode se referir. Por enquanto, os termos objeto e valor
podem ser utilizados sem distino.
sequncia: grupo ordenado, isso , grupo de valores onde cada um identificado atravs
de um ndice inteiro.
6.14 Exerccios
Exercicio 6.5 Dado o cdigo a seguir que armazena uma string:
6.14. Exerccios 95
Use o mtodo find e fragmente a string para extrair a poro da string depois dos
dois pontos e ento use a funo float para converter a string extrada em um nmero
com ponto flutuante.
Exercicio 6.6 Leia o documento sobre os mtodos de string no endereo3 . Voc
pode querer experimentar algum deles para ter certeza de que funcionam. strip e replace
so bastante teis.
A documentao disponvel no site usa uma sintaxe que pode confund-lo. Por
exemplo, em find(sub[,start[, end]]), os colchetes indicam argumentos opcionais.
Ento sub requerido, porm start opcional, e se voc incluir o start, ento o end
opcional.
3
docs.python.org/lib/string-methods.html
97
7 Arquivos
7.1 Persistncia
At agora, ns aprendemos como escrever programas e comunicar nossas intenes
CPU (Unidade Central de Processamento) usando condies, funes e iteraes.
Ns aprendemos como criar e usar estrutura de dados na memria principal. A CPU
e a memria so onde nosso software trabalha e executa. onde todo o pensamento
acontece. Veja o esquema da Figura 9.
Mas se voc se lembra das discusses da arquitetura de hardware, uma vez que a
energia desligada, qualquer coisa armazenada tanto na CPU como na memria principal
apagada. Ento, at agora, os nossos programas tm sido apenas exerccios divertidos
transitrios para aprender Python.
Se a funo open teve sucesso e o arquivo for aberto, o sistema operacional retor-
nar para ns o file handle. O file handle no so os dados atuais contidos no arquivo,
e sim um handle que podemos usar para ler os dados. Voc est dando um handle se
o arquivo solicitado existe e se voc tem permisses para ler o arquivo.
Depois, iremos usar o try e except para lidar da melhor forma com a situao em
que tentamos abrir um arquivo que no existe.
7.3. Arquivos de texto e linhas 99
Um arquivo de texto pode ser pensado como uma sequncia de linhas, assim como
uma string em Python pode ser pensada como uma sequncia de caracteres. Por exemplo,
este um simples arquivo de texto que registra a atividade de e-mail de uma equipe de
desenvolvimento de um projeto de cdigo aberto:
1
www.py4inf.com/code/mbox.txt
2
www.py4inf.com/code/mbox-short.txt
100 Captulo 7. Arquivos
Voc tambm pode ver que o comprimento da string XnY so trs caracteres
porque o caracter de nova linha um caracter simples.
Assim, quando olhamos para as linhas em um arquivo, precisamos imaginar que l
tem um caracter especial invisvel ao fim de cada linha que marca o fim da linha, chamado
de nova linha.
Portanto, o caracter de nova linha separa os caracteres no arquivo em linhas.
fhand = open(mbox.txt)
count = 0
for line in fhand:
count = count + 1
print Line Count:, count
python open.py
Line Count: 132045
Podemos usar o file handle como uma sequncia em uma estrutura de repetio
for. O for conta o nmero de linhas no arquivo e imprime o resultado. A traduo
aproximada para a estrutura de repetio for em Ingls , para cada linha no arquivo
representado pelo file handle, adicionar um a varivel count.
A razo pela qual a funo open no l o arquivo inteiro que o arquivo pode
ser bastante grande, com muitos gigabytes de dados. A sentena open gasta a mesma
quantidade de tempo independentemente do tamanho do arquivo. A estrutura de repetio
7.5. Pesquisando em um arquivo 101
com o prefixo "From:", podemos usar o mtodo startswith para selecionar aquelas que
se encaixam no critrio desejado.
fhand = open(mbox-short.txt)
for line in fhand:
if line.startswith(From:):
print line
From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
...
A sada parece tima, uma vez que as linhas apresentadas comeam com "From:",
mas porque vemos as linhas em branco? Isso se d, pelo caracter invisvel de nova linha.
Cada uma das linhas terminam com tal caractere. Assim, o comando print imprime a
string armazenada na varivel line, na qual includo o n, ento o comando adiciona
outra nova linha, resultando no espaamento duplo que vemos.
Ns poderiamos usar a quebra de linhas para imprimir toda string exceto o ltimo
caracter, mas uma abordagem mais simples usar o mtodo rstrip, que retira o espao
em branco do lado direito de uma string, como se segue:
fhand = open(mbox-short.txt)
for line in fhand:
line = line.rstrip()
if line.startswith(From:) :
print line
From: stephen.marquard@uct.ac.za
From: louis@media.berkeley.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
From: zqian@umich.edu
From: rjlowe@iupui.edu
From: cwen@iupui.edu
7.5. Pesquisando em um arquivo 103
fhand = open(mbox-short.txt)
for line in fhand:
line = line.rstrip()
# Skip uninteresting lines
if not line.startswith(From:) :
continue
# Process our interesting line
print line
fhand = open(mbox-short.txt)
for line in fhand:
line = line.rstrip()
if line.find(@uct.ac.za) == -1 :
continue
print line
Ns realmente no queremos editar nosso cdigo Python toda vez que queremos
processar um arquivo diferente. Seria mais vivel perguntar ao usurio qual arquivo deve-
mos processar ao comeo de cada execuo, de forma que os usurios podem usar nossos
programas sobre diferentes arquivos sem mudar o cdigo Python. Isto bem simples
utilizando o comando raw_input, do seguinte modo:
python search6.py
Enter the file name: mbox.txt
There were 1797 subject lines in mbox.txt
python search6.py
Enter the file name: mbox-short.txt
There were 27 subject lines in mbox-short.txt
python search6.py
Enter the file name: missing.txt
Traceback (most recent call last):
File search6.py, line 2, in <module>
fhand = open(fname)
IOError: [Errno 2] No such file or directory: missing.txt
python search6.py
Enter the file name: na na boo boo
Traceback (most recent call last):
File search6.py, line 2, in <module>
fhand = open(fname)
IOError: [Errno 2] No such file or directory: na na boo boo
No ria, usurios vo, eventualmente, fazer tudo que estiver ao seu alcance para
parar seus programas - seja com m inteno ou no. Na verdade, uma importante parte de
qualquer time de desenvolvimento de software uma pessoa, ou grupo, chamado Garantia
de Qualidade (GQ), cujo trabalho fazer as coisas mais loucas possveis na tentativa
de parar o software que foi desenvolvido.
O time de GQ responsvel por encontrar as falhas no programa antes de serem
entregues aos usurios, que pagaram pelo software ou nos pagaro para o desenvolvimento
de um software. Logo, o time de GQ o melhor amigo do programador.
Agora que vimos a falha no programa, podemos, elegantemente, consert-lo usando
a estrutura try/except. Precisamos assumir que o comando open pode falhar e adicionar
um cdigo de recuperao quando o comando falho, do seguinte modo:
count = 0
for line in fhand:
if line.startswith(Subject:) :
count = count + 1
print There were, count, subject lines in, fname
106 Captulo 7. Arquivos
A funo exit encerra o programa. uma funo que chamamos que nunca retorna
valor. Agora quando o usurio (ou o time de QG) digitar nomes errados, ns os pegamos
e nos recuperamos graciosamente.
python search7.py
Enter the file name: mbox.txt
There were 1797 subject lines in mbox.txt
python search7.py
Enter the file name: na na boo boo
File cannot be opened: na na boo boo
Quando voc terminar de escrever, voc precisa fechar o arquivo para ter certeza
que o ltimo bit do dado foi, fisicamente, escrito em disco, para no perd-lo se a energia
desligada.
Poderamos fechar o arquivo usado para leitura tambm, mas podemos ser um
pouco desleixados se estamos abrindo apenas alguns arquivos, visto que o Python garante
que todos os arquivos abertos so fechados ao trmino do programa. Quando estamos
escrevendo arquivos, queremos explicitamente fechar os arquivos, de modo a no deixar
nada ao acaso.
7.9 Depurao
Quando voc est fazendo a leitura, ou est escrevendo arquivos, voc pode se
deparar com problemas com espaos em branco. Esses erros podem ser difceis de depurar,
j que espaos, tabulaes e caracteres de nova linha so, normalmente, invisveis:
A funo embutida repr pode ajudar. Ela recebe qualquer objeto como argumento
e retorna uma string representando-o. Para strings, ele representa espao em branco como
sequncias de :
caractere nova linha representado como n. Outros usam r. Alguns usam ambos. Se voc
mover arquivos entre sistemas diferentes essa inconsistncia deve gerar erros.
Para a maioria dos sistemas, existem aplicaoes para converter de um sistema para
outro.
Voc pode encontr-los (e ler mais sobre tal problema) no link3 . Ou, claro, voc
pode escrever seu prprio conversor.
7.10 Glossrio
catch: previne uma exceo de terminar um programa usando os comandos try
e except.
nova linha: caractere especial usado em arquivos e strings para indicar o final de uma
linha.
Pythonic: tcnica que trabalha elegantemente em Python. Usar try e except uma
maneira Pythonic para finalizar um programa quando um arquivo inexistente informado.
7.11 Exerccios
Exerccio 7.1 Escreva um programa para ler um arquivo e imprimir o contedo do
arquivo (linha por linha), com todos os caracteres em maisculos. Executando o programa,
a sada deve ser como segue:
python shout.py
Enter a file name: mbox-short.txt
FROM STEPHEN.MARQUARD@UCT.AC.ZA SAT JAN 5 09:14:16 2008
RETURN-PATH: <POSTMASTER@COLLAB.SAKAIPROJECT.ORG>
RECEIVED: FROM MURDER (MAIL.UMICH.EDU [141.211.14.90])
BY FRANKENSTEIN.MAIL.UMICH.EDU (CYRUS V2.3.8) WITH LMTPA;
SAT, 05 JAN 2008 09:14:16 -0500
3
wikipedia.org/wiki/Newline
7.11. Exerccios 109
X-DSPAM-Confidence: 0.8475
Quando voc encontra uma linha que comea com X-DSPAM-Confidence: separe
a linha para extrair dela o nmero com ponto flutuante. Conte essas linhas e determine
o valor total mdio dos valores de confiana de spam a partir destas linhas. Quando voc
alcanar o fim do arquivo, imprima a confiana mdia de spam.
python egg.py
Enter the file name: mbox.txt
There were 1797 subject lines in mbox.txt
python egg.py
Enter the file name: missing.tyxt
File cannot be opened: missing.tyxt
python egg.py
Enter the file name: na na boo boo
NA NA BOO BOO TO YOU - You have been punkd!
8 Listas
O primeiro exemplo uma lista de quatro inteiros. O segundo uma lista de trs
strings. Os elementos de uma lista no precisam ser do mesmo tipo. A lista a seguir contm
elementos dos do tipo string, float e inteiro e (oh!) outra lista:
Diferente de strings, listas so mutveis porque voc consegue mudar a ordem dos
itens em uma lista ou alterar um item. Quando os colchetes aparecem do lado esquerdo
de uma atribuio, ele identifica o elemento da lista que ser trocado.
O elemento do ndice 1 da lista numeros, que anteriormente era 123, passa agora
a ser 5.
Voc pode imaginar a lista como uma relao entre os ndices e os elementos. Essa
relao chamada de mapping; cada ndice diz respeito a uma orientao para um dos
elementos da lista.
Os ndices de uma lista trabalham da mesma maneira que os ndices de uma string:
Se voc tenta ler ou escrever um elemento que no existe, voc obtm um erro do
tipo IndexError.
Isso funciona bem se voc apenas precisa ler os elementos da lista. Mas se voc
quer escrever ou atualizar os elementos, voc precisar dos ndices. O jeito mais comum
para fazer isso usando as funes range e len:
8.4. Operaes em listas 113
for i in range(len(numeros)):
numeros[i] = numeros[i] * 2
for x in vazio:
print Isso nunca acontecer.
No entanto, uma lista pode conter outra lista, a lista aninhada contada como
um nico elemento. O tamanho dessa lista quatro:
O primeiro exemplo repete a lista [0] quatro vezes. O segundo exemplo repete a
lista [1, 2, 3] trs vezes.
Se o primeiro ndice for omitido, a lista fatiada a partir do comeo. Se voc omitir
o segundo ndice, a lista fatiada at o final. Assim, se ambos os ndices forem omitidos
a fatia cortada uma cpia de toda a lista.
Como as listas so mutveis, por vezes til fazer uma cpia antes de fazer opera-
es que dobram e fragmentam listas. O operador slice do lado esquerdo de uma atribuio
pode atualizar mltiplos elementos.
O operador de fragmentao, quando aparece do lado esquerdo de uma operao
de atribuio, capaz de atualizar vrios elementos da lista de uma s vez.
Python fornece mtodos para operar em listas. Por exemplo, append adiciona um
novo elemento ao final de uma lista:
extend recebe uma lista como um argumento e adiciona todos os elementos desta
lista ao final da outra lista:
8.7. Deletando elementos 115
H muitas maneiras para apagar elementos de uma lista. Se voc sabe o ndice do
elemento que voc quer eliminar, voc pode usar o mtodo pop:
pop modifica a lista e retorna o elemento que foi removido. Se voc no informar
o ndice, ele apaga e retorna o ltimo elemento.
Se voc no precisar do valor a ser removido, voc pode usar o operador del:
Se voc sabe o elemento que quer remover (mas no sabe o ndice), voc pode usar
o remove:
116 Captulo 8. Listas
Existem algumas funes internas que podem ser usadas em listas. Tais funes
evitam a utilizao de estruturas de repetio:
total = 0
cont = 0
while ( True ) :
inp = raw_input(Digite um nmero: )
if inp == pronto : break
valor = float(inp)
total = total + valor
cont = cont + 1
numvet = list()
while ( True ) :
inp = raw_input(Digite um nmero: )
if inp == pronto : break
valor = float(inp)
numvet.append(valor)
Ns criamos uma lista vazia antes do while comear, e enquanto o usurio digita
um nmero, adiciona-se o nmero na lista. No final do programa, ns apenas calculamos a
soma dos nmeros da lista e dividimos pela quantidade de nmeros na lista para imprimir
a mdia. Fazemos isso utilizando as funes sum e len.
Uma string uma sequncia de caracteres e uma lista uma sequncia de valores,
mas uma lista de caracteres no o mesmo que uma string. Para converter uma string
para uma lista de caracteres, voc pode usar list:
Como list o nome da funo interna, voc deve evitar us-la como varivel.
Evite usar o caractere l porque se assemelha muito com o dgito l. Utilize, neste caso, o
caractere t.
A funo list quebra uma string em letras individuais. Se voc quer quebrar uma
string em palavras, voc pode utilizar o mtodo split:
Aps usar o split para quebrar uma string em uma lista de palavras, voc pode
usar o operador de ndice (os colchetes) para trabalhar com uma palavra especfica.
Voc pode usar o split com um argumento opcional chamado de delimitador,
que corresponde a um caractere a ser utilizado para para dividir as palavras. O exemplo
a seguir usa o hfen como delimitador:
O mtodo split muito eficaz quando se trata desse tipo de problema. Podemos
escrever um pequeno programa que avalia as linhas que comeam com a palavra From
e, ento, inicia um novo split nessas linhas e imprime a terceira palavra da linha:
fhand = open(mbox-short.txt)
for linha in fhand:
linha = linha.rstrip()
if not linha.startswith(From ) : continue
palavras = linha.split()
print palavras[2]
Sab
Sex
Sex
Sex
...
Mais adiante, aprenderemos tcnicas cada vez mais sofisticadas para escolher as
linhas para trabalhar e como extrair destas linhas a parte exata da informao que estamos
procurando.
Para verificar se duas variveis referem-se ao mesmo objeto, pode-se usar o opera-
dor is.
Nesse caso, diramos que as duas listas so equivalentes, pois elas possuem os
mesmos elementos, mas no idnticas, pois no so o mesmo objeto. Se dois objetos so
idnticos, eles tambm so equivalentes, mas se so equivalentes, no so necessariamente
idnticos.
At agora, usamos objeto e valor de forma permutvel, mas mais preciso
dizer que um objeto possui um valor. Se executarmos a = [1,2,3], a se refere a um
objeto lista cujo valor uma sequncia particular de elementos. Se outra lista tem os
mesmos elementos, ela tem o mesmo valor.
8.12 Pseudnimo
Se a se refere a um objeto e atribui-se b = a, ento ambas as variveis se referem
ao mesmo objeto:
Um objeto com mais de uma referncia tem mais de um nome, ento dizemos que
o objeto tem um pseudnimo.
Se o objeto que possui o pseudnimo mutvel, mudanas em um pseudnimo
afetam o outro:
Apesar desse comportamento ser til, ele propenso a erros e, por isso, mais
seguro evit-lo quando se trabalha com objetos mutveis.
Para objetos imutveis, como strings, pseudnimos no so um grande problema.
Nesse exemplo:
a = banana
b = banana
Quando se passa uma lista para uma funo, a funo recebe uma referncia lista.
Se a funo modifica os parmetros de uma lista, quem a chama percebe a mudana. Por
exemplo, delete_head remove o primeiro elemento de uma lista:
def delete_head(t):
del t[0]
Esta diferena importante quando se escreve funes que devem modificar listas.
Por exemplo, essa funo no deleta o comeo de uma lista:
def bad_delete_head(t):
t = t[1:] # !WRONG!
O operador slice cria uma nova lista e a atribuio faz o t se referir a ela, mas
nada disso tem efeito na lista que foi passada como um argumento.
Uma alternativa escrever uma funo que cria e retorna uma nova lista. Por
exemplo, tail retorna todos os elementos da lista, exceto o primeiro:
def tail(t):
return t[1:]
Exerccio 8.1 Escreva uma funo chamada chop que receba uma lista e a mo-
difique, removendo o primeiro e o ltimo elemento, e retorne None. Em seguida, escreva
uma funo chamada middle que receba uma lista e retorne uma nova lista que contem
todos exceto o primeiro e o ltimo elemento.
8.14. Depurao 123
8.14 Depurao
O uso negligente ou descuidado de listas (e outros objetos mutveis) pode levar a
longas horas em busca de um erro. Aqui esto algumas armadilhas e formas de evit-las:
palavra = palavra.strip()
t = t.sort() # !WRONG!
Antes de usar mtodos de listas e operadores, voc deve ler a documentao atenta-
mente e test-los no modo iterativo. Os mtodos e operadores que as listas compar-
tilham com outras sequncias (como strings) so documentados em (1 ). Os mtodos
e operadores que se aplicam apenas sequncias mutveis esto documentados em
docs.python.org/lib/typesseq-mutable.html.
Parte dos problemas com lista que h muitas formas de se fazer as coisas. Por
exemplo, para remover um elemento de uma lista, pode-se usar pop, remove, del,
ou at uma atribuio slice.
t.append(x)
t = t + [x]
t.append([x]) !WRONG!
t = t.append(x) !WRONG!
t + [x] !WRONG!
t = t + x !WRONG!
1
docs.python.org/lib/typesseq.html
124 Captulo 8. Listas
Experimente cada um desses exemplos no modo iterativo para ter certeza de que
entende o que eles fazem. Note que apenas o ltimo causa um runtime error; os
outros trs so legtimos (no causam erros de compilao), mas errados.
Se voc quer usar um mtodo como o sort, que modifica o argumento, mas precisa
manter a lista original, pode fazer uma cpia.
orig = t[:]
t.sort()
Nesse exemplo, poderia usar tambm a funo embutida sorted, que retorna uma
lista nova e organizada e no mexe na original. Mas nesse caso, evite usar sorted
como um nome de varivel!
Vamos revisitar o programa que busca o dia da semana nas linhas From do nosso
arquivo:
fhand = open(mbox-short.txt)
for line in fhand:
palavras = line.split()
if palavras[0] != From : continue
print palavras[2]
Isso parece bem mais simples e nem precisamos de rstrip para remover o final do
arquivo. Mas melhor?
8.14. Depurao 125
python search8.py
Sab
Traceback (most recent call last):
File search8.py, line 5, in <module>
if palavras[0] != From : continue
IndexError: list index out of range
Funciona mais ou menos e podemos ver o dia da primeira linha (Sab) mas ento
o programa falha com um traceback error. O que ocorreu de errado? Que dado
estragado fez com que o nosso elegante, inteligente e muito Pythonico programa
falhasse?
Voc poderia ficar olhando para o cdigo por um longo tempo e se perplexar ou
pedir ajuda a algum, mas a abordagem mais rpida e inteligente adicionar um
print para te responder o porqu da falha. O melhor lugar para coloc-lo logo
antes da linha onde o programa falhou e imprimir o dado que parece estar causando
a falha.
Essa abordagem pode gerar muitas linhas de sada mas voc ter imediatamente al-
guma pista de qual o problema. Ento adicionamos um print da varivel palavras
logo antes da linha cinco. At adicionamos um prefixo Debug: para que possamos
separar nossa sada normal da nossa sada de erros.
Quando se executa o programa, as vrias linhas impressas como sada fazem com
que a tela role, mas no final, vemos nossa impresso Debug e o traceback e, ento
sabemos o que aconteceu logo antes do erro.
X-DSPAM-Result: Innocent
X-DSPAM-Processed: Sab Jan 5 09:14:16 2008
X-DSPAM-Confidence: 0.8475
X-DSPAM-Probability: 0.0000
Detalhes: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
Os erros ocorrem quando o programa encontra uma linha em branco! Claro, h zero
palavras em uma linha em branco. Por que no pensamos nisso enquanto estvamos
escrevendo o cdigo?! Quando o cdigo procura pela primeira palavra (palavra[0])
para verificar se identifica-se com From, recebemos um erro index out of range.
claro que esse o lugar perfeito para se adicionar o cdigo guardio para evitar
verificar a primeira palavra se a primeira palavra no est ali. H muitos jeitos de
proteger esse cdigo, ns escolheremos checar o nmero de palavras antes de verificar
a primeira palavra:
fhand = open(mbox-short.txt)
count = 0
for line in fhand:
palavras = line.split()
# print Debug:, palavras
if len(palavras) == 0 : continue
if palavras[0] != From : continue
print palavras[2]
Exerccio 8.3 Reescreva o cdigo guardio no exemplo acima sem dois if. No
lugar, use uma expresso lgica composta usando o operador lgico and com apenas
um if.
8.15 Glossrio
delimitador: um caractere ou string usada para indicar onde uma string deve ser
dividida.
elemento: um dos valores em uma lista (ou outra sequncia), tambm chamado de item.
objeto: elemento ao qual uma varivel pode se referir. Possui um tipo e um valor.
8.16 Exerccios
Exerccio 8.4 Faa o download do arquivo de www.py4inf.com/code/romeo.txt
Escreva um programa que abra o arquivo romeo.txt e leia-o linha por linha. Para
cada linha, separe-a em uma lista de palavras usando a funo split.
Para cada palavra, cheque para ver se a palavra j est em uma lista. Se no estiver
na lista, adicione-a.
128 Captulo 8. Listas
Exerccio 8.5 Escreva um programa que leia os dados de uma caixa de e-mail
e quando encontrar a linha que comea com From, divida a linha em palavras usando
a funo split. Estamos interessados em quem mandou a mensagem, que a segunda
palavra na linha From.
Voc deve analisar a linha From e imprimir a segunda palavra de cada linha From e
ento contar o nmero de linhas que comeam com From e imprimir a contagem no final.
Esse um exemplo de sada com algumas linhas removidas:
ray@media.berkeley.edu
cwen@iupui.edu
cwen@iupui.edu
cwen@iupui.edu
27 linhas no arquivo possuem From como a primeira palavra
Exerccio 8.6 Reescreva o programa que pede ao usurio uma lista de nmeros e
imprime o maior e o menor dos nmeros lidos. A leitura deve terminar quando o usurio
digitar pronto. Escreva o programa para armazenar os nmeros que o usurio digita em
uma lista e use as funes max() e min() para calcular o maior e o menor nmero quando
a estrutura de repetio da leitura terminar.
8.16. Exerccios 129
Insira um nmero: 6
Insira um nmero: 2
Insira um nmero: 9
Insira um nmero: 3
Insira um nmero: 5
Insira um nmero: pronto
Maior: 9.0
Menor: 2.0
131
9 Dicionrios
As chaves, {}, representam um dicionrio vazio. Para adicionar itens a ele, voc
pode usar colchetes:
Essa linha cria um item que mapeia da chave one para o valor uno. Se impri-
mirmos o dicionrio novamente, vemos um par chave-valor com dois pontos entre a chave
e o valor:
Esse formato de sada tambm um formato de entrada. Por exemplo, voc pode
criar um dicionrio com trs itens:
> > > eng2sp = one: uno , two: dos, three: tres
A chave two sempre mapeia para o valor dos. Assim, a ordem dos itens no
importa.
Se a chave no est no dicionrio, voc tem uma exceo:
Para ver se algo aparece como um valor num dicionrio, deve-se usar o mtodo
values, que retorna os valores de um dicionrio armazenados como uma lista e, em
seguida, usar o operador in:
1. Voc poderia criar 26 variveis, uma para cada letra do alfabeto. Ento, poderia
examinar a string e, para cada caractere, incrementar o contador correspondente,
provavelmente usando uma condicional em cadeia.
2. Voc poderia criar uma lista com 26 elementos. Ento, voc poderia converter cada
caractere para um nmero (usando a funo j implementada ord), usar o nmero
como um ndice dentro da lista, e incrementar o contador apropriado.
3. Voc poderia criar um dicionrio com caracteres como chaves e contadores como
valores correspondentes. A primeira vez que voc visse um caractere, voc adiciona-
ria um item para o dicionrio. Depois disso, voc incrementaria o valor de um item
existente.
Cada uma dessas opes executa a mesma quantidade de computao, mas cada
uma delas implementa a computao de um modo difente.
Uma implementao uma maneira de realizar um clculo; algumas implemen-
taes so melhores que as outras. Por exemplo, uma vantagem da implementao do
dicionrio que no precisamos saber antes do tempo quais letras aparecem na string e
temos apenas que deixar espao para as letras que aparecem.
A seguir temos como o cdigo que implementa a opo 3 se parece:
134 Captulo 9. Dicionrios
word = brontosaurus
d = dict()
for c in word:
if c not in d:
d[c] = 1
else:
d[c] = d[c] + 1
print d
{ a : 1, b : 1, o : 2, n : 1, s : 2, r : 2, u : 2, t:1 }
Podemos usar get para escrever nossa estrutura de histograma mais concisa. Por-
que o mtodo get automaticamente cuida do caso em que a chave no est no dicionrio,
podemos reduzir quatro linhas de cdigo para uma nica linha e eliminar a declarao
if.
word = brontosaurus
d = dict()
for c in word:
d[c] = d.get(c, 0) + 1
print d
at o final do livro. Ento, voc deve gastar um tempo para comparar a estrutura de
repetio usando a declarao if e o operador in com a estrutura de repetio usando o
mtodo get. Eles fazem exatamente a mesma coisa, mas um mais resumido.
1
Agradecimentos a http://shakespeare.mit.edu/Tragedy/romeoandjuliet/romeo_juliet.2.2.html
136 Captulo 9. Dicionrios
print counts
python count1.py
Entre com o nome do arquivo: romeo.txt
{ and : 3, envious : 1, already : 1, fair : 1,
is : 3, through : 1, pale : 1, yonder : 1,
what : 1, sun : 2, Who : 1, But : 1, moon : 1,
window : 1, sick : 1, east : 1, breaks : 1,
grief : 1, with : 1, light : 1, It : 1, Arise : 1,
kill : 1, the : 3, soft : 1, Juliet : 1 }
2
www.py4inf.com/code/romeo.txt
9.3. Estruturas de repetio e dicionrios 137
jan 100
chuck 1
annie 42
A estrutura for itera atravs das chaves do dicionrio, ento devemos usar o ope-
rador indce para recuperar o valor correspondente para cada chave. A sada mostrada
a seguir:
jan 100
annie 42
Primeiro voc v a lista das chaves sem ordenao que obtivemos pelo mtodo
keys. Em seguida vemos os pares chave/valor em ordem impressos dentro da estrutura
for.
Como a funo split do Python procura por espaos e trata palavras como smbo-
los separados por espaos, trataramos as palavras soft! e soft como palavras diferentes
e criaramos uma entrada de dicionrio separada para cada palavra.
Considerando que o arquivo tem letras maisculas, trataramos who e Who
como palavras diferentes com contadores diferentes.
Podemos acabar com esses problemas usando os mtodos sobre string lower,
punctuation, e translate. O mtodo translate o mais sutil dos mtodos. Aqui est
a documentao para translate:
counts = dict()
for line in fhand:
line = line.translate(None, string.punctuation) # Novo cdigo
line = line.lower() # Novo cdigo
words = line.split()
for word in words:
if word not in counts:
count[word] = 1
else:
counts[word] += 1
print counts
Olhando para esta sada, ela ainda est desajeitada. Podemos usar Python para
nos dar exatamente o que estamos procurando, mas para fazer isso, precisamos aprender
sobre tuplas em Python. Vamos voltar a este exemplo uma vez que aprendermos sobre
tuplas.
9.5 Depurao
Quando voc trabalha com grandes conjuntos de dados pode se tornar complicado
realizar a depurao por meio de impresses e busca visual. Aqui esto algumas sugestes
para depurar grandes conjuntos de dados:
Escreva auto-verificaes: s vezes voc pode escrever o cdigo para verificar os erros
automaticamente. Por exemplo, se voc est calculando a mdia de uma lista de nme-
ros, voc pode conferir se o resultado no menor que o menor elemento nem maior que
o maior elemento. Isso chamado de uma verificao de sanidade porque detecta os
resultados que so completamente no lgicos.
Outro tipo de verificao compara os resultados de dois clculos diferentes para
ver se eles so consistentes. Isso chamado de verificao de consistncia.
9.6. Glossrio 141
De novo, o tempo que voc gasta construindo andaimes pode reduzir o tempo que voc
demora para depurar.
9.6 Glossrio
dicionrio: estrutura de mapeamento de um conjunto de chaves para seus valores
correspondentes.
funes hash: funo usada por uma hash table para computar a localizao de uma
chave.
chave: objeto que aparece em um dicionrio como a primeira parte de um par chave-valor.
valor: objeto que aparece em um dicionrio como a segunda parte de um par chave-
valor. Isso mais especfico que nosso uso anterior da palavra valor.
9.7 Exerccios
Exerccio 9.2 Escreva um programa que categorize cada mensagem de e-mail
pelo dia da semana que a submisso foi feita. Para fazer isso, procure por linhas que
comeam com From, e ento procure pela terceira palavra e assim continue executando
142 Captulo 9. Dicionrios
o contador para cada um dos dias da semana. No fim do programa imprima o contedo
de seu dicionrio (a ordem no importa).
Linha exemplo:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Execuo do exemplo:
python dow.py
Digite o nome do arquivo: mbox-short.txt
{ Fri : 20, Thu : 6, Sat : 1 }
Exerccio 9.4 Adicione linhas ao cdigo anterior a fim de descobrir quem tem
mais mensagens no arquivo.
Aps todos os dados serem lidos e o dicionrio ser criado, olhe no dicionrio usando
uma estrutura de repetio mxima (olhe a Seo 5.7.2), para descobrir quem tem mais
mensagens e imprima quantas mensagens a pessoa tem.
Exerccio 9.5 Escreva um programa que registre o nome de domnio (ao invs
do endereo) de onde a mensagem foi enviada ao invs de onde o e-mail veio (ou seja, o
endereo de e-mail inteiro). No final do programa imprima os contedos do dicionrio.
python schoolcount.py
Digite o nome do arquivo: mbox-short.txt
{media.berkeley.edu: 4, uct.ac.za: 6, umich.edu: 7,
gmail.com: 1, caret.cam.ac.uk: 1, iupui.edu: 8}
143
10 Tuplas
Para criar uma tupla de um nico elemento, deve-se acrescentar uma vrgula no
final:
Outro jeito de criar uma tupla usando a funo tuple. Sem nenhum argumento,
ele cria uma tupla vazia:
1
Fato engraado: A palavra tupla vem dos nomes dados a sequncia de nmeros de tamanhos vari-
ados: nica, dupla, tripla, qudrupla, quntupla, sxtupla, setupla, etc.
144 Captulo 10. Tuplas
Como tuple o nome de um construtor, voc deve evitar us-lo como nome de
varivel.
A maioria dos operadores de listas tambm funciona em tuplas. O operador col-
chetes indexa um elemento:
Mas se voc tentar modificar um dos elementos da tupla, voc ter um erro:
Voc no pode modificar os elementos de uma tupla, mas voc pode substituir
uma tupla por outra:
Decorate: adiciona uma ou mais chaves de ordenao em posies anteriores aos ele-
mentos da lista.
t.sort(reverse=True)
res = list()
for length, word in t:
res.append(word)
print res
A primeira estrutura de repetio constri uma lista de tuplas, onde cada tupla
uma palavra precedida pelo seu tamanho. sort compara o primeiro elemento, tamanho,
primeiro, e s considera o segundo elemento (a prpria palavra) em caso de empate. A
palavra chave reverse=True diz funo sort para executar em ordem decrescente.
A segunda estrutura de repetio percorre a lista de tuplas e constri uma lista de
palavras em ordem decrescente de tamanho. Entre as cinco palavras, elas so ordenadas
em uma ordem alfabtica reversa. Ento what aparece antes de soft na lista. A sada
do programa a seguinte:
146 Captulo 10. Tuplas
claro que as linhas perdem um pouco do seu impacto potico quando transfor-
mados em uma lista Python em ordem decrescente de tamanho.
2
Python no traduz a sintaxe literalmente. Por exemplo, se voc tentar isto com um dicionrio, voc
ter um resultado inesperado.
10.4. Dicionrios e tuplas 147
Ambos os lados desta sentena so tuplas, mas o lado esquerdo uma tupla de
variveis; o lado direito uma tupla de expresses. Cada valor no lado direito atribudo a
sua respectiva varivel no lado esquerdo. Todas as expresses no lado direito so avaliadas
antes que as atribuies sejam realizadas.
O nmero de variveis no lado esquerdo e direito tem de ser o mesmo:
De modo geral, o lado direito pode ser de qualquer tipo de seqncia (string, lista
ou tupla). Por exemplo, para dividir um endereo de e-mail em um nome de usurio e um
domnio, voc escreveria:
O valor de retorno do split uma lista com dois elementos; o primeiro elemento
atribuido para uname, o segundo para domain:
Esta estrutura de repetio tem duas variveis de iterao pois items retorna uma
lista de tuplas e key, val uma atribuio de tupla que repete sucessivamente por cada
um dos pares de chave/valor no dicionrio.
Para cada iterao atravs da estrutura de repetio, ambos, key e val, so avan-
ados para o prximo par chave/valor no dicionrio (ainda na ordem hash).
A sada do loop :
10 a
22 c
1 b
10.6. As palavras mais comuns 149
Mais uma vez, a ordem apresentada a ordem dada pala chave de hash (isto ,
nenhuma ordem particular).
Se combinarmos essas duas tcnicas, podemos imprimir o contedo de um dicio-
nrio ordenado pelo valor armazenado em cada par chave/valor.
Para fazer isso, primeiro crie uma lista de tuplas onde cada tupla corresponde a
um par (valor, chave). O mtodo items nos d uma lista de tuplas (chave, valor), mas
desta vez queremos classificar por valor, e no por chave. Uma vez que construmos a lista
com as tuplas valor/chave, uma simples questo de classificar a lista e imprimir a nova,
lista ordenada.
Ao construir cuidadosamente a lista de tuplas para ter o valor como o primeiro ele-
mento de cada tupla, podemos classificar a lista de tuplas e obter contedos do dicionrio
ordenados por valor.
import string
fhand = open(romeo-full.txt)
counts = dict()
for line in fhand:
line = line.translate(None, string.punctuation)
line = line.lower()
words = line.split()
for word in words:
if word not in counts:
counts[word] = 1
else:
counts[word] += 1
lst.sort(reverse=True)
61 i
42 and
40 romeo
34 to
34 the
32 thou
32 juliet
30 that
29 my
24 thee
O fato de que esta anlise e separao de dados complexos pode ser feita com 19
linhas fceis de entender, uma das razes do porque o Python uma boa escolha como
uma linguagem para explorar informaes.
directory[last,first] = number
sequncias.
Em muitos contextos, os diferentes tipos de sequncias (strings, listas e tuplas)
podem ser usados como sinnimos. Ento, como e por que voc escolhe um e no outro?
Comeando com o bvio, as strings so mais limitadas do que outras sequncias,
porque os elementos tm de ser caracteres. Elas tambm so imutveis. Se voc precisa
da capacidade de alterar os caracteres em uma string (ao invs de criar uma nova string),
voc pode querer usar uma lista de caracteres, e no uma string.
As listas so mais comuns do que as tuplas, principalmente porque eles so mut-
veis. Mas h alguns casos em que voc pode preferir tuplas:
2. Se voc quer usar uma sequncia como uma chave de dicionrio, voc tem que usar
um tipo imutvel como uma tupla ou string.
3. Se voc est passando uma sequncia como um argumento para uma funo, a
utilizao de tuplas reduz o potencial de um comportamento inesperado devido a
aliasing (apelido para variveis).
10.9 Depurao
Listas, dicionrios e tuplas so conhecidas genericamente como estruturas de
dados; neste captulo comeamos a ver estruturas de dados compostas, como listas de
tuplas, e dicionrios que contm tuplas como chaves e listas como valores. Estruturas de
dados compostas so teis, mas so propensas ao que eu chamo de erros de forma,
isto , erros causados quando a estrutura de dados tem um tipo, tamanho ou composio
errada ou talvez quando voc escreve algum cdigo e esquece a forma dos seus dados.
Por exemplo, se voc est esperando uma lista com um inteiro e lhe dado apenas
um inteiro (e no em uma lista), seu cdigo no ir funcionar.
Quando voc estiver verificando erros no programa, e especialmente se voc est
trabalhando em um erro grave, h quatro coisas para se tentar:
reading: Examine seu cdigo, leia-o para si mesmo e verifique se ele diz o que voc
10.9. Depurao 153
retreating: Em algum ponto, a melhor coisa a fazer voltar, desfazer mudanas re-
centes, at voc voltar em um programa que funciona e que voc compreenda. Ento voc
pode comear a reconstruir.
Programadores iniciantes, s vezes, ficam presos a uma dessas atividades e se
esquecem das outras. Cada atividade vem com meu prprio modo de falha.
Por exemplo, ler o seu cdigo deve ajudar se o problema um erro de digitao,
mas no ajuda se o problema um erro conceitual. Se voc no entende o que seu programa
faz, voc pode l-lo 100 vezes e nunca enxergar o erro, porque o erro est em sua cabea.
Executar experimentos pode ajudar, especialmente se voc executar testes peque-
nos e simples. Mas se voc executar experimentos sem pensar ou ler seu cdigo, voc pode
falhar em um padro que eu chamo de programao do passeio aleatrio, que o pro-
cesso de fazer mudanas aleatrias at que o programa faa a coisa certa. Desnecessrio
dizer que programao do passeio aleatrio pode tomar um longo tempo.
Voc precisa tomar um tempo para pensar. Depurao como uma cincia expe-
rimental. Voc deveria ter pelo menos uma hiptese sobre qual o problema. Se h duas
ou mais possibilidades, tente pensar em um teste que eliminaria um deles.
Fazer uma pausa ajuda com o pensamento. O mesmo acontece com a fala. Se
voc explicar o problema para outra pessoa (ou a si mesmo), s vezes voc encontrar a
resposta antes de terminar de fazer a pergunta.
Mas, mesmo assim, as melhores tcnicas de depurao falharo se houverem muitos
erros, ou se o cdigo que voc est tentando corrigir muito grande e complicado. s vezes,
a melhor opo recuar, simplificar o programa at que voc consiga algo que funcione e
que voc entenda.
Programadores iniciantes so muitas vezes relutantes a recuar porque eles no
podem aceitar excluir uma linha de cdigo (mesmo que seja errado). Se isso te faz sentir
melhor, copie seu programa em outro arquivo antes de comear a descart-lo para baixo.
154 Captulo 10. Tuplas
10.10 Glossrio
comparvel: tipo cujo valor pode ser checado para ver se maior, menor ou igual
a outro valor do mesmo tipo. Tipos que so comparveis podem ser colocados em uma
lista e ordenados.
hashable: tipo que possui uma funo hash associada. Tipos imutveis como inteiros,
floats e strings so hashtable; tipos mutveis como listas e dicionrios no so.
atribuio de tupla: atribuio com uma sequncia do lado direito e uma tupla de
variveis no lado esquerdo. O lado direito avaliado e ento seus elementos so atribudos
s variveis no lado esquerdo.
10.11 Exerccios
Exerccio 10.1 Revise o programa anterior como segue: Leia e analise as linhas
From e extraia os endereos de cada linha. Conte o nmero de mensagens de cada pessoa
usando um dicionrio.
Aps todos os dados terem sido lidos, imprima a pessoa com mais submisses
10.11. Exerccios 155
Exemplo de linha:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Exerccio 10.2 Este programa deve contar a distribuio das horas por dia para
cada uma das mensagens. Voc pode extrair a hora da linha From por encontrar a string
de tempo e ento divid-la em partes usando o caracter dois pontos (:). Uma vez que voc
acumulou o contador para cada hora, imprima o contador, um por linha, ordenado pelas
horas, como mostrado abaixo.
Exemplo de linha:
python timeofday.py
Digite o nome do arquivo: mbox-short.txt
04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1