Sie sind auf Seite 1von 157

Traduo da Verso 0.0.

8-d2 de Charles Severance

Python para Informtica

Campo Grande - MS
Maio de 2015
Traduo da Verso 0.0.8-d2 de Charles Severance

Python para Informtica

Universidade Federal de Mato Grosso do Sul UFMS


Faculdade de Computao

Campo Grande - MS
Maio de 2015
Lista de ilustraes

Figura 1 Esquema de solicitao de servios de hardware. . . . . . . . . . . . . . 9


Figura 2 Uma viso de um PDA. . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Figura 3 Componentes de um computador. . . . . . . . . . . . . . . . . . . . . . 11
Figura 4 Componentes de um computador, incluindo o programador. . . . . . . 13

Figura 5 Execuo de uma sentena condicional . . . . . . . . . . . . . . . . . . 45


Figura 6 Execuo de uma sentena condicional alternativa . . . . . . . . . . . . 46
Figura 7 Execuo de uma condio em cadeia . . . . . . . . . . . . . . . . . . . 47
Figura 8 Execuo de uma sentena condicional agrupada . . . . . . . . . . . . . 48

Figura 9 Esquema de um computador genrico. . . . . . . . . . . . . . . . . . . 97


Sumrio

1 Por que voc deve aprender a programar? . . . . . . . . . . . . . . . . . . . 9


1.1 Criatividade e Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Arquitetura de Hardware do Computador . . . . . . . . . . . . . . . . . . 11
1.3 Entendendo Programao . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Palavras e sentenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5 Conversando com Python . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Terminologia: interpretador e compilador . . . . . . . . . . . . . . . . . . . 17
1.7 Escrevendo um programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.8 O que um programa? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.9 Os blocos de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.10 O que possivelmente pode dar errado? . . . . . . . . . . . . . . . . . . . . 23
1.11 A jornada de aprendizado . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.12 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.13 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2 Variveis, expresses e sentenas . . . . . . . . . . . . . . . . . . . . . . . . 29


2.1 Valores e tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3 Nome de variveis e palavras-chave . . . . . . . . . . . . . . . . . . . . . . 31
2.4 Sentenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5 Operadores e operandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.6 Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7 Ordem das operaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.8 Operador de mdulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.9 Operaes com strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.10 Perguntando ao usurio a entrada . . . . . . . . . . . . . . . . . . . . . . . 35
2.11 Comentrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.12 Escolhendo variveis com nomes mnemnicos . . . . . . . . . . . . . . . . . 37
2.13 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.14 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.15 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

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

1 Por que voc deve aprender a programar?

Escrever programas (ou programar) uma atividade muito criativa e recompen-


sadora. Voc pode escrever programas por muitas razes, variando desde fazer de sua
existncia solucionar um problema complexo de anlise de dados at se divertir ajudando
outra pessoa a resolver um problema. Este livro assume que todo mundo precisa saber
como programar e, uma vez que voc sabe como programar, voc poder solucionar o que
pretende utilizando sua habilidade recm descoberta.
Ns somos rodeados no nosso cotidiano com computadores que vo desde celulares
at notebooks. Podemos pensar nestes computadores como nossos assistentes pessoais
que podem estar ao nosso lado para tomar conta de muitas coisas. O hardware dos com-
putadores atuais essencialmente desenvolvido para nos perguntar O que voc quer que
eu faa em seguida?.

Figura 1: Esquema de solicitao de servios de hardware.

Programadores adicionam ao hardware um sistema operacional e um conjunto de


aplicativos e ns terminamos com um Assitente Pessoal Digital (Personal Digital Assitant
- PDA) til e capaz de nos ajudar em muitas coisas diferentes.
Nossos computadores so rpidos, possuem uma grande quantidade de memria
e podem ser muito teis para ns se soubssemos a linguagem para informar as tarefas
que queremos que seja executada em seguida. Se soubermos esta linguagem, podemos
informar aos computadores para executar tarefas que sejam repetitivas. Curiosamente, os
tipos de tarefas que os computadores podem realizar melhor so geralmente as coisas que
os humanos acham chatas.
Por exemplo, olhe para os trs primeiros pargrafos deste captulo e diga-me a
palavra mais utilizada e quantas vezes a mesma foi utilizada. Embora voc seja capaz de
10 Captulo 1. Por que voc deve aprender a programar?

ler e entender as palavras em poucos segundos, cont-las um pouco trabalhoso porque


este no um tipo de trabalho que a mente humana foi desenvolvida para resolver. Para
um computador, o oposto verdade, ler e entender um texto em um papel difcil para
um computador realizar, mas contar as palavras e dizer quantas vezes a palavra mais
utilizada apareceu no texto uma tarefa fcil para um computador:

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.

1.1 Criatividade e Motivao

Apesar deste livro no ser para programadores profissionais, programao como


profisso pode ser um trabalho recompensador, tanto financeiramente quanto pessoal-
mente. Construir programas teis, elegantes e inteligentes para outras pessaos usarem
uma atividade bastante criativa. Seu computador ou PDA geralmente contm muitos
programas diferentes de diversos grupos de programadores, cada um competindo por sua
ateno e interesse. Eles tentam ao mximo atender suas necessidades e proporcionar uma
tima experincia no processo. Em algumas situaces, quando voc escolhe um software,
os programadores so diretamente compensados pela sua escolha.
Se pensarmos em programas como uma sada para grupos de programadores, talvez
a Figura 2 seja uma verso mais sensvel de nosso PDA:
Por agora, nossa principal motivao no ganhar dinheiro ou agradar usurios,
mas sim em sermos mais produtivos em manusear dados e informaes que encontraremos
em nossa vida. No comeo, voc ser ao mesmo tempo o programador e o usurio final dos
sesu programas. medida que voc adquira mais habilidades como programador e tiver
mais critividade em programao, voc pode comear a pensar em desenvolver programas
para outros usurios.
1.2. Arquitetura de Hardware do Computador 11

Figura 2: Uma viso de um PDA.

1.2 Arquitetura de Hardware do Computador


Antes de comearmos a aprender a linguagem para dar instrues para compu-
tadores para desenvolver software, devemos aprender um pouco como computadores so
construdos. Se voc desmantelasse seu computador ou telefone celular e olhar por dentro,
encontrar as seguintes partes:

Figura 3: Componentes de um computador.

As definies em alto nvel destas so:

A Unidade Central de Processamento (UCP ou CPU) a parte do computador


12 Captulo 1. Por que voc deve aprender a programar?

desenvolvida para se preocupar com qual a prxima tarefa?. Se o seu computador


for de 3.0 Gigahertz, significa que ele vai te perguntar qual a prxima tarefa?
trs bilhes de vezes por segundo. Voc dever aprender como falar rpido para
acompanhar a CPU.

A memria principal usada para armazenar informaes que a CPU precisa


rapidamente. A memria principal quase to rpida quanto a CPU. Mas as in-
formaes armazenadas na memria principal desaparecem quando o computador
desligado.

A memria secundria tambm utilizada para armazenar informaes, mas


mais devagar que a memria principal. A vantagem da memria secundria que
pode armazenar informaes mesmo quando no ha energia para o computador.
Exemplos de memria secundria so discos rgidos (HDs) ou memria flash (tipi-
camente encontrados em pen drives e tocadores portteis de msica).

Os dispositivos de entrada e sada so a tela, teclado, mouse, microfone, altofa-


lante, touchpad, etc. Eles so todas as formas que interagimos com o computador.

Atualmente, a maioria dos computadores possuem tambm uma conexo de rede


para obter informaes por meio de uma rede. Podemos pensar numa rede como
um local muito lento para armazenar e obter informaes que nem sempre estaro
disponveis. Assim, uma rede uma forma mais lenta e s vezes no confivel de
memria secundria.

Apesar de ser melhor deixar os detalhes de como estes componentes funcionam


para fabricantes de computadores, ajuda conhecer alguma terminologia de maneira que
se possa falar sobre estas partes enquanto se desenvolve programas.
Como programador, seu trabalho usar e orquestrar cada um destes recursos para
solucionar o problema que precisa resolvendo e analisando os dados necessrios. Como
programador, voc estar principalmente falando com a CPU e dizendo que tarefa
executar em seguida. De vez em quando, voc dir CPU para usar a memria principal,
memria secundria, rede, ou dispositivos de entrada e sada.
Voc precisa ser a pessoa que informar para a CPU qual a prxima tarefa. Mas
seria muito desconfortvel encolh-lo at 5 mm e inseri-lo dentro do computador para
poder emitir comandos trs bilhoes de vezes por segundo. Ao invs disso, voc pode
escrever instrues. Chamamos estas instrues armazenadas de programa, e o ato de
escrev-las de maneira correta de programar.
1.3. Entendendo Programao 13

Figura 4: Componentes de um computador, incluindo o programador.

1.3 Entendendo Programao


No resto deste livro, tentaremos torn-lo uma pessoa habilidosa na arte de progra-
mar. No final voc ser um programador - talvez no um programador profissional, mas
ao menos ter habilidades para olhar para um problema de anlise de dados e desenvolver
um programa para solucion-lo.
De certo modo, voc precisa de duas habilidades para ser um programador:

Primeiro voc deve conhecer a linguagem de programao (Python) - voc deve


conhecer o vocabulrio e a gramtica. Voc deve ser capaz de soletrar as palavras
nesta nova linguagem corretamente e de saber construir sentenas bem formados
nessa nova linguagem.

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?

Voc aprender vocabulrio e sentenas do Python muito rapidamente. O que


vai levar mais tempo voc ser capaz de escrever um programa coerente para resolver um
problema desconhecido. Ensinamos programao muito parecido com como ensinamos a
escrever. Comeamos lendo e explicando programas e, em seguida, escrevemos programas
simples e, por fim, escrevemos programas cada vez mais complexos ao longo do tempo.
Em algum momento voc pega o jeito, identifica sozinho padres entre os programas
e naturalmente aprender como se deparar com um problema e escrever um programa
que resolva-o. E assim que chega neste ponto, programar se torna um processo bastante
prazeroso e criativo.
Comeamos com o vocabulrio e a estrutura de programas em Python. Seja paci-
ente quando lembrar dos programas simples da poca que estava comeando.

1.4 Palavras e sentenas


Ao contrrio das lnguas faladas, o vocabulrio do Python bastante reduzido.
Chamamos este vocabulrio de palavras reservadas. Estas so as palavras que possuem
um significado muito especial em Python. Quando o Python v estas palavras em um
programa, elas possuem um, e somente um significado em Python. Mais tarde, ao escrever
programas voc criar suas prprias palavras reservadas, chamadas de variveis. Voc
ter uma enrome liberadade para escolher nomes para suas variveis, mas no poder
usar nenhuma palavra reservada do Python como nome de varivel.
Quando treianamos um cachorro, utilizados palavras especias como, senta, fica
e busca. Alm disso, quando voc fala com um cachorro e no utiliza uma destas pala-
vras reservadas, ele fica olhando para voc como uma expresso de dvida at que voc
diga uma palavra reservada. Por exemplo, se voc disser eu gostaria que mais pessoas
andassem para melhorar a sade, o que a maioria dos cachorros vo ouvir bl bl bl
ande bl bl bl. Isto ocorre porque ande uma palavra reservada na linguagem canina.
Muitos sugerem que a linguagem entre pessoas e gatos no possuem palavras reservadas1 .
As palavras reservadas da linguagem Python incluem as seguintes:

and del for is raise


assert elif from lambda return
break else global not try
class except if or while
continue exec import pass yeld
def nally in print

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:

print Hello World!

Acabamos de escrever nossa primeira sentena em Python sinteticamente correta.


Nossa sentena comea com a palavra reservda print, seguida de uma string de texto de
nossa escolha entre aspas.

1.5 Conversando com Python

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:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)


[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type help, copyright, credits or license for more information.
> > >

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?

> > > I come in peace, please take me to your leader


File <stdin> , line 1
I come in peace, please take me to your leader
^
SyntaxError: invalid syntax
> > >

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 Hello world!


Hello world!

Isto parece muito melhor, ento voc tenta se comunicar mais:

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

> > > good-bye


Traceback (most recent call last):
File <stdin>, line 1, in <module>
NameError: name good is not defined

> > > if you dont mind, I need to leave


File <stdin>, line 1
if you dont mind, I need to leave
^
SyntaxError: invalid syntax

> > > quit()

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.

1.6 Terminologia: interpretador e compilador


Python uma linguagem de alto nvel cuja inteno ser relativamente direta
para pessoas lerem e escreverem e para computadores lerem e processarem. Outras lingua-
gens de alto nvel incluem: Java, C++, PHP, Ruby, Basic, Perl, javaScript e muitas outras.
O hardware da Unidade Central de Processamento (UCP) no entende estas linguagens
de alto nvel.
A UCP conhece a linguagem chamada linguagem de mquina. Linguagem de
mquina muito simples e francamenete muito cansativa para escrever porque repre-
sentada apenas por zeros e uns:

01010001110100100101010000001111
11100110000011101010010101101101
...
18 Captulo 1. Por que voc deve aprender a programar?

Linguagem de mquina parece ser superficialmente simples j que s existem zeros


e uns, mas sua sintaxe ainda mais complexa e mais intrigante do que Python. Assim,
pouqussimos programadores j escreveram em linguagem de mquina. Ao invs disso,
construmos diversos tradutores para permitir que programadores escrevam em linguagens
de alto nvel, tais como Python ou JavaScript, e esses tradutores convertem os programas
para linguagem de mquina para executarem pela UCP.
Como a linguagem de mquina est associada ao hardware do computador, lin-
guagem de mquina no portvel em diferentes tipos de hardware. Programas escritos
em linguagens de alto nvel podem ser utilizados em diferentes computadores, utilizando
um nterpretador diferente ou recompilando o cdigo para criar uma verso do programa
em linguagem de mquina para o novo computador.
Estes tradutores de linguagem de programao se encaixam em duas categorias
principais: (1) interpretadores e (2) compiladores.
Um interpretador l o cdigo fonte dos programas escritos pelos programado-
res, analisa-o, e interpreta as instrues em tempo real. Python um interpretador e
quando rodamos Python interativamente, podemos digitar uma linha de Python (uma
sentena), Python a processa imediatamente e fica pronta para digitarmos uma nova
linha em Python.
Algumas linhas de Python dizem ao Python que voc quer lembrar um valor poste-
riormente. Precisamos escolher um nome para lembrar o valor posteriormente e podemos
usar este nome simblico para obter o valor posteriormente. Usamos o termo varivel
para se referir aos nomes utilizados para armazenar dados.

> > > x = 6


> > > print x
6
> > > y = x * 7
> > > print y
42
> > >

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

No facil escrever ou ler cdigos em linguagem de mquina, portanto interes-


sante ter um interpretador ou compilador que permite escrevermos cdigo em lingua-
gens de alto nvel, como Python ou C.
Neste ponto da discusso sobre compiladores e interpretadores, voc deve conhecer
um pouco mais sobre o interpretador Python. Em que linguagem o cdigo est escrito?
construdo em uma linguagem compilada? Quando digitamos python, o que exatamente
acontece?
O interpretador Python escrito em uma linguagem de alto nvel conhecida como
C. Voc pode olhar o cdigo fonte atual do interpretador Python e a maneira de traba-
lhar o cdigo fonte acessando http://www.python.org . Ento, Python um programa e
compilado em um linguagem de mquina e quando voc instala Python no seu computa-
dor (ou o vendedor instalar para voc), voc copiou um cdigo em linguagem de mquina
do programa traduzido Python para seu sistema. No Windows, o cdigo de mquina
executvel para Python est em um arquivo com um nome parecido com:

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.

1.7 Escrevendo um programa


Digitar comandos no interpretador Python uma boa maneira de conhecer as ca-
racyersticas do Python, mas no recomendado para resolver problemas mais complexos.
Quado queremos escrever um programa, usamos um editor de texto para escrever
instrues em Python em um programa, denominado de script. Por conveno, Scripts
em Python possuem nomes terminados com .py.
Para executar um script, necessrio informar ao interpretador Python o nome do
arquivo. Em uma janela de comandos do Windows ou Unix, voc deveria python hello.py
como a seguir:

csev$ cat hello.py


print Hello world!
csev$ python hello.py
Hello world!
csev$

O csev$ o prompt do sistema operacional, e o comando cat hello.py est nos


mostrando que o arquivo hello.py um programa que contm um linha para imprimir
uma string.
Ns chamamos o interpretador Python e informa-o para ler o cdigo fonte do
arquivo hello.py ao invs de nos solicitar quatro linha interativamente.
Voc vai perceber que no h necessidade de ter quit() ao final do arquivo que
contm o programa em Python. Quando o Python est lendo o cdigo fonte de um arquivo,
ele sabe que tem que parar ao alcanar o final do arquivo.

1.8 O que um programa?


A definio de um programa de maneira mais simples uma sequncia de sen-
tenas em Python que foram criadas para fazer alguma coisa. Mesmo o script hello.py
um programa. um programa de uma nica linha e geramlmente no muito til, mas na
definio estrita, um programa em Python.
Pode ser mais fcil de entender o que um programa pensando sobre um problema
que pode ter um programa para resolv-lo, e ento olhar para o programa que deveria
1.8. O que um programa? 21

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.

name = raw_input(Enter file:)


handle = open(name, r)
text = handle.read()
words = text.split()
counts = dict()
for word in words:
counts[word] = counts.get(word,0) + 1
bigcount = None
bigword = None
for word,count in counts.items():
if bigcount is None or count > bigcount:
bigword = word
bigcount = count
print bigword, bigcount

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?

Este um bom exemplo de como o Python e a linguagem Python esto atuando


entre voc (usurio final) e eu (o programador). Python uma forma de para trocarmos
sequncias de instrues teis (ou seja, programas) em uma linguagem comum que pode
ser usada por qualquer um que instale Python em seu computador. Ento, nenhum de
ns est falando com Python, mas estamos nos comunicando por meio do Python.

1.9 Os blocos de programas


Nos prximo captulos, aprenderemos mais sobre vocabulrio, estrutura das sen-
tenas, estrutura dos pargrafos, e estrutura de histrias do Python. Aprenderemos sobre
as potentes capacidades do Python e como integrar esta capcidades para criao de pro-
gramas teis.
Existem alguns padres conceituais de baixo nvel que usamos para construo de
programas. Estas construes no so apenas para programas em Python, eles so parte
de todas as linguagens de programao, desde linguagem de mquina at linguagens de
alto nvel.

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.

sada: mostra os resultados dos programas na tela, ou armazena-os em um arquivo


talvez escreve-os em um dispositivo como um alto-falante para tocar uma msica
ou falar um texto.

execuo sequencial: executa as sentenas uma aps a outra na ordem em que


aparecem no script.

execuo condicional: verifica algumas condies e executa ou pula uma sequncia


de sentenas.

execuo de repetio: executa um conjunto de sentenas repetidamente, geral-


mente com alguma variao.

reuso: escrita de um conjunto de instrues uma vez, nomeando-as, e ento reusar


estas instrues quando preciso em todo o programa.

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.

1.10 O que possivelmente pode dar errado?


Como dissemos nas nossas conversas anteriores com Python, devemos nos comu-
nicar de maneira acurada quando escrevemos cdigo em Python. O menor desvio ou erro
far com que o Python desista de olhar seu programa.
Programadores iniciantes frequentemente consideram que Python no deixa espao
para erros e consideram isso como evidncia de que o Python seja desprezvel, detestvel e
cruel. Apesar de Python parecer gostar de todo mundo, Pythom os conhece pessoalmente
e mantm um rancor contra eles. Em razo deste rancor, Python pega nossos programas
perfeitamente escritos e rejeita-os como imprprio apenas para nos tormentar.

> > > primt Hello world!


File <stdin>", line 1
primt Hello world!

SyntaxError: invalid syntax


> > > primt Hello world!
File <stdin>", line 1
primt Hello World
^

SyntaxError: invalid syntax


> > > I hate you Python!
File <stdin>", line 1
I hate you Python!
^
SyntaxError: invalid syntax
> > > if you come out of there, I would teach you a lesson
File <stdin>", line 1
if you come out of there, I would teach you a lesson
^
SyntaxError: invalid syntax
> > >

No h nada a ganhar argumentando com o Python. Ele uma ferramente, no


tem emoo e est feliz e pronto para servi-lo sempre que necessrio. Suas mensagens de
erros parecem severas, mas so apenas chamados do Python por ajuda. Ele olhou para o
que voc digitou e simplesmente no entendu o que voc informou.
Python muito mais que um cachorro te amando incondicionalmente, entendendo
poucas palavras, olhando para para voc como um olhar doce (> > >) e esperando que
voc diga alguma coisa que ele entenda. Quando Python diz SytaxError: invalid syntax,
24 Captulo 1. Por que voc deve aprender a programar?

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 sintaxe: estes so os primeiros erros que cometer e os mais fceis de


corrigir. Um erro de sintaxe significa que voc violou as regras de gramtica do
Python. Python faz o possvel para apontar para a linha e o caracter que ele percebeu
que est confuso. A nica coisa complicada em erros de sintaxe que s vezes os
erros que precisam ser corrigidos esto antes do local que o Python identificou.
Assim, a linha e o caracter que o Python indicar em um erro de sintaxe apenas
um ponto inicial de investigao.

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.

Erros de semntica: um erro de semntica ocorre quando sua descrio de passos


est sintaticamente correta e na ordem correta, mas h simplesmente um erro no
programa. O programa est perfeitamente correto mas no faz o que deveria fazer.
Um exemplo simples se voc estiver dando coordenadas sobre um restaurante a
uma pessoa e diz, ... quando voc chegar no cruzamento com o posto de gasolina,
voc vira esquerda, anda uma milha e o restaurante uma construo vermelha
sua esquerda.. Seu amigo est muito atrasado e te telefona dizendo que esto
em uma fazenda e andando em volta de um celeiro e nenhum sinal de restaurante.
Ento voc diz: Voc virou esquerda ou direita no posto de gasolina?, e ele
diz Eu segui suas instrues perfeitamente, eu as tenho anotadas, e elas dizem vire
direita e ande uma milha at o posto de gasolina.. Ento voc diz, Me desculpe,
pois minhas instrues estava sintaticamente corretas, mas infelizmente continham
um pequeno e indetectvel erro de semntica..

Mais uma vez, nos trs tipos de erros, Python est apenas tentando fazer exata-
mene o que voc solicitou.

1.11 A jornada de aprendizado


Assim que voc avana em direo ao final deste livro, no se assuste se os conceitos
no se fixam perfeitamente na primeira vez. Quando voc estava aprendendo a falar,
1.12. Glossrio 25

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?

dos e expresses no prompt.


interpretar: executar um programa em linguagem de alto nvel traduzindo-o linha
por linha em tempo real.
linguagem de baixo nvel: uma linguagem de programao projetada para ser
fcil para um computador executar; tambm chamda de cdigo de mquina ou lingua-
gem assembly.
memria principal: armazena programas e dados. A memria principal perde as
informaes quando a energia desligada.
parse: examinar um programa e analisar sua estrutura sinttica.
portabilidade: um propriedade de um programa que pode executar em mais de
um tipo de computador.
comando print: um instruo que faz com que o interpretador Python mostre
um valor na tela.
resoluo de problema: o processo de formular um problema, encontrar uma
soluo e expressar a soluo.
programa: um conjunto de instrues que especifica um clculo.
prompt: quando um programa mostra uma mensagem e pausa para o usurio
digitar alguma entrada para o programa.
memria secundria: armazena programas e dados, mantendo as informaes
mesmo que a energia seja desligada. Geralmente mais lenta que a memria principal.
Exemplos de memria secundria incluem discos rgidos e memrias flash em pen drives.
semntica: o significado de um progranma.
cdigo fonte: um programa em liguagem de alto nvel.

1.13 Exerccios
Exerccio 1.1 Qual a funo da memria secundria em um computador?

a) Executar todos os clculos e lgica de um programa

b) Recuperar pginas na Internet

c) Armazenar informaes por um perodo longo, mesmo que ocorra queda de energia.

d) Obter entrada do usurio

Exerccio 1.2 O que um programa?


1.13. Exerccios 27

Exerccio 1.3 Qual a diferena entre um compilador e um interpretador?


Exerccio 1.4 Qual dos seguintes itens possui cdigo de mquina?

a) O interpretador Python

b) O teclado

c) Um arquivo fonte Python

d) um documento de processador de texto

Exerccio 1.5 O que est errado no seguinte cdigo:

> > > primt Hello world!


File <stdin>, line 1
primt Hello world!
^
SyntaxError: invalid syntax
> > >

Exerccio 1.6 Onde em um computador uma varivel como x armazenada


depois da seguinte linha em Python ser executada?

x = 123

a) Unidade central de processamento

b) Memria principal

c) Memria secundria

d) Dispositivos de entrada

e) Dispositivos de sada

Exerccio 1.7 O que o seguinte programa vai imprimir:

x = 43
x = x + 1
print x

a) 43

b) 44

c) x + 1
28 Captulo 1. Por que voc deve aprender a programar?

d) Erro porque = + 1 impossvel matematicamente

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

2 Variveis, expresses e sentenas

2.1 Valores e tipos

Um valor um dos elementos bsicos no qual um programa trabalha, como uma


letra ou um nmero. Os valores vistos at agora foram 1, 2 e Ol, Mundo!
Estes valores so de tipos diferentes: 1 e 2 so inteiros e Ol, Mundo uma
string, chamada assim por conter uma sequncia de letras. Voc (e o interpretador)
podem identificar strings porque elas esto entre aspas simples.
O comando print tambm funciona para inteiros. Ns usamos o comando python
para iniciar o interpretador.

python
> > > print 4
4

Se voc no tiver certeza de que tipo o valor, o interpretador pode te informar.

> > > type (Ol, Mundo!)


<type str>
> > > type (17)
<type int>

No de se surpreender que strings pertenam ao tipo str e inteiros pertenam


ao tipo int. J menos bvio que o nmero com casas decimais pertenam ao tipo
chamado float, porque estes nmeros so representados em um formato chamado ponto
flutuante.

> > > type (3.2)


<type float>

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

> > > type (17)


<type str>
> > > type (3.2)
<type str>

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.

> > > print 1,000,000


1 0 0

Bem, isso no o que se esperava! Python interpreta 1,000,000 como um comando


separador de inteiros, colocando espaos entre eles.
Este o primeiro exemplo que temos visto de erro de semntica: o cdigo executa
sem produzir uma mensagem de erro, mas no faz aquilo que certo.

2.2 Variveis

Uma das caractersticas mais poderosas de uma linguagem de programao a


capacidade de manipular variveis. Uma varivel um nome dado para se referir a um
valor.
Um comando de atribuio cria novas variveis e lhes atribui valores:

> > > mensagem = E agora totalmente diferente


> > > n = 17
> > > pi = 3.141592653589931

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.

> > > print n


17
> > > print pi
3.14159265359

O tipo de uma varivel o tipo do valor a que ela se refere:


2.3. Nome de variveis e palavras-chave 31

> > > type (message)


<type str>
> > > type (n)
<type int>
> > > type (pi)
<type float>

2.3 Nome de variveis e palavras-chave


Programadores geralmente escolhem nomes para suas variveis que so significa-
tivos, eles colocam o nome de acordo com o uso da varivel.
Nomes de variveis podem ser longos, podem conter nmeros e letras, mas precisam
comear com uma letra. possvel comear com letras maisculas, mas uma boa ideia
comear com letras minsculas (voc vai ver o porqu mais tarde).
O caracter ( ) pode aparecer no nome e frequentemente usado em nomes com
vrias palavras como meu_nome ou teste_de_variavel.
Se voc der um nome invlido a uma varivel, voc tem um erro de sintaxe.

> > > 78trombones = Grande parada


SyntaxError: invalid sintax
> > > more@ = 1000000
SyntaxError: invalid sintax
> > > class = Advanced Theoretical Zymurgy
SintaxError: invalid sintax

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:

and del from not while


as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try

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

produz a seguinte sada

1
2

A declarao de atribuio no produz sada.

2.5 Operadores e operandos


Operadores so smbolos especiais que representam operaes como soma e mul-
tiplicao. Os valores a que os operadores so aplicados denominam-se operandos.
Os operadores +, -, *, / e ** so de adio, subtrao, multiplicao, diviso e
exponenciao, respectivamente, como mostrado nos exemplos a seguir.

20+32 hour-1 hour*60+minuto minuto/60 5**2 (5+9)*(15-7)

O operador de diviso pode no fazer o que esperado.

> > > minuto = 59


> > > minuto/60
0

O valor de minuto 59, e o convencional que quando se divide 59 por 60 o


resultado seja 0,98333, no 0. O motivo por esta discrepncia que Python calcula o
2.6. Expresses 33

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.

> > > minuto/60.0


0.9833333333333

2.6 Expresses

Uma expresso uma combinao de valores, variveis e operadores. Um valor


por si mesmo j considerado uma expresso, e por isso uma varivel, ento os exemplos
seguintes so todos expresses invlidas (assumindo que varivel x foi atribudo um
valor).

17
x
x+17

Se voc digitar uma expresso no modo interativo, o interpretador avalia e exibe


o resultado:

> > > 1 + 1


2

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

2.7 Ordem das operaes


Quando mais de um operador aparece em uma expresso, a ordem de avaliao
depende da regra de precedncia. Para operadores matemticos, Python segue a ma-
temtica convencional. A sigla PEMDAS um bom modo de se lembrar das regras:

Parnteses tm a maior precedncia e podem ser usados para forar a expresso


a ser avaliada do jeito que voc quer. Como as expresses entre parnteses so
avaliadas em primeiro lugar, 2 *(3-1) 4, e (1 + 1)**(5-2) 8. Voc tambm
pode us-los para deixar a expresso mais fcil de ser compreendida, como em
(minuto * 100)/60, mesmo que no mude o resultado.

Exponenciao a prxima em precedncia, ento 2**1+1 3, no 4, e 3*1**3 3,


no 27.

Multiplicao e Diviso possuem a mesma precedncia, que maior que a Adio


e Subtrao, que tambm possuem a mesma precedncia. Ento 2*3-1 5, no 4,
e 6+4/2 8, no 5.

Operadores com a mesma precedncia so avaliados da esquerda para direita.


Ento na expresso 5-3-1 1, no 3, porque 5-3 ocorre primeiro e o 1 subtrado
do 2.

Em caso de dvida, sempre utilize parnteses nas expresses para ter certeza de
que as operaes sero realizadas na ordem que voc deseja.

2.8 Operador de mdulo


O operador de mdulo funciona em nmeros inteiros e produz o resto da diviso
do primeiro operando dividido pelo segundo. Em Python, o operador de mdulo repre-
sentado pelo smbolo de porcentagem (%). A sntaxe a mesma dos outros operadores:

> > > quociente = 7 / 3


> > > print quociente
2
> > > resto = 7 % 3
> > > print resto
1

Ento 7 dividido por 3 2 com 1 de resto.


2.9. Operaes com strings 35

O operador de mdulo torna-se surpreendentemente til. Por exemplo, voc pode


verificar se x divisvel por y se x % y zero.
Voc tambm pode extrair o digto mais a direita de um inteiro ou todos os dgitos
de um nmero inteiro. Por exemplo, x % 10 retorna o digto mais a direita de x (na base
10). Similarmente x % 100 retorna os dois ltimos dgitos.

2.9 Operaes com strings


O operador + funciona com strings, mas no uma adio no sentido matemtico.
Ele realiza uma concatenao, o que significa que ele une o final de uma string com o
incio da outra. Por exemplo:

> > > primeiro = 10


> > > segundo = 15
> > > print primeiro+segundo
25
> > > primeiro = 100
> > > segundo = 150
> > > print primeiro + segundo
100150

A sada do programa 100150.

2.10 Perguntando ao usurio a entrada


Algumas vezes ns gostaramos de obter o valor da varivel por meio do que o
usurio digitar em seu teclado. O Python prov uma funo de construo chamada
raw_input que obtm o valor do teclado3 . Quando esta funo chamada, o programa
para e espera o usurio digitar algo. Quando o usurio pressiona Return ou o Enter, o
programa continuar e o raw_input retornar o que o usurio digitou como uma string.

> > > input = raw_input()


Qualquer coisa
> > > print input
Qualquer coisa

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.

> > > nome = raw_input(Qual seu nome?n)


Qual seu nome?
Chuck
> > > print nome
Chuck

A sequncia \n no final da sentena representa uma nova linha, que um caracter


especial que causa uma quebra de linha. por isso que a entrada do usurio aparece em
uma nova linha.
Se voc espera que o usurio digite um inteiro, voc deve converter o valor retor-
nado para int utilizando a funo int():

> > > prompt = Qual a velocidade de uma ona?n


> > > velocidade = raw_input(prompt)
Qual a velocidade de uma ona?
17
> > > int(velocidade)
17
> > > int(velocidade) + 5
22

Mas se o usurio digita algo diferente do que voc espera, como uma string por
exemplo, voc receber um erro:

> > > velocidade = raw_input(prompt)


Qual a velocidade de uma ona?
Uma ona do pantanal ou da floresta amaznica?
> > > int(velocidade)
ValueError: invalid literal for int()

Veremos como solucionar este tipo de erro adiante.

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 #:

# Compute a porcentagem do tempo decorrido de uma hora


porcentagem = (minuto*100)/60

Neste caso, apenas o comentrio aparece na linha. Voc pode colocar comentrios
ao final de uma linha de comando:

porcentagem = (minuto*100)/60 # porcentagem de uma hora

Tudo que aparece a partir do smbolo # at o final da linha ignorado, no tendo


efeito em seu programa. Comentrios so muito teis quando informam caractersticas
no bvias de seu cdigo. razovel assumir que o leitor pode descobrir o que o cdigo
faz; muito mais til explicar o porque.
Esse comentrio redundante e intil para o cdigo:

v = 5 # v recebe 5

Esse comentrio contm informaes teis que no esto no cdigo:

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.

2.12 Escolhendo variveis com nomes mnemnicos

Seguindo as regras simples de nomeao de variveis e evitando palavras reserva-


das, voc possuir uma grande quantidade de escolhas para nomear suas variveis. No
incio essa escolha pode ser confusa tanto quando voc l o programa como quando voc
escreve seus prprios programas. Por exemplo, os prximos trs programas so idnticos,
em relao sua funo, mas muito diferentes quando os l e tenta entend-los.
38 Captulo 2. Variveis, expresses e sentenas

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 interpretador do Python v todos os trs programas exatamente iguais, mas os


olhos humanos vem e os entendem de forma diferente. Pessoas facilmente entendero o
significado do segundo programa porque o programador escolheu nomes de variveis que
representam o que ser armazenado nelas.
Ns chamamos esses nomes bem pensados de nomes mnemnicos. A palavra
mnemnico4 siginifica ajuda memria. Ns escolhemos variveis com nomes mnem-
nicos para nos ajudar a lembrar o porque criamos estas variveis em primeiro lugar.
Apesar de ser uma tima ideia usar variveis com nomes mnemnicos, variveis
com nomes mnemnicos podem se tornar uma pedra no sapato de programadores novatos
no sentido de desenvolverem suas habilidades para criar e entender cdigos. Isso se deve
ao fato dos programadores mais novos ainda no memorizarem as palavras reservadas
pelo sistema (so apenas 31) e, por vezes, variveis que possuem nomes muito descritivos
parecem fazer parte da linguagem e no apenas nomes de variveis bem escolhidos.
Observe o exemplo de cdigo em Python que faz um lao de repetio sobre al-
guns dados. Vamos estudar estruturas de repetio mais adiante, mas por enquanto tente
entender o que isso significa:

for palavra in palavras:


print palavra

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

for fatia in pizza:


print fatia

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.

for palavra in palavras:


print palavra

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:

> > > nome ruim = 5


SyntaxError: invalid syntax

Para erros de sintaxe, a prpria mensagem de erro no ajuda muito. As mensa-


gens mais comuns so SyntaxError: invalid syntax e SyntaxError: invalid token.
Nenhuma das mensagens muito informativa.
Os erros em tempo de execuo que voc ir encontrar mais frequentemente so:
use before def; que se refere ao fato de tentar utilizar uma varivel antes de atribuir um
valor a ela. Isso pode ocorrer se voc digitar o nome da varivel de maneira errada:
40 Captulo 2. Variveis, expresses e sentenas

> > > principal = 327.68


> > > interesse = principau * taxa
NameError: name principau is not defined

Nomes de variveis so sensveis ao caso ("case sensitive"), ou seja, LaTeX nao o


mesmo que latex para o Python.
Nesse ponto, a causa mais provvel de um erro semntico a ordem das operaes.
1
Por exemplo, para calcular 2 voc deve escrever

> > > 1.0/2.0 *

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

operador mdulo: um operador, denotado pelo sinal de porcentagem (%), que


atua sobre inteiros e produz o resto quando um nmero dividido por outro.
operando: um dos valores sobre o qual o operandor aplicado.
operador: um smbolo especial que representa um clculo simples como adio,
multiplicao ou concatenao de strings.
regras de precedncia: o conjunto de regras que controla a ordem em que as
expresses envolvendo mltiplos operadores e operandos so avaliadas.
sentena: um trecho de cdigo que representa um comando ou ao. Deste forma,
as sentenas que vimos at o momento so sentenas de atribuio e impresso.
string: um tipo que representa sequncias de caracteres.
tipo: uma categoria de valores. Os tipos vistos so inteiros (tipo int), nmeros
com ponto-flutuante (tipo float) e strings (tipo str).
valor: uma das unidades bsicas de dados, como um nmero ou string, que um
programa manipula.
varivel: um nome que faz referncia a um valor.

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.

Digite seu nome: Douglas


Ol Douglas

Exerccio 2.3 Escreva um programa no qual o usurio digite o nmero de horas


trabalhadas e o valor pago por hora e calcule o salrio bruto.

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

Use o interpretador de Python para verificar suas respostas.


Exerccio 2.5 Escreva um programa que toma como entrada uma temperatura
em Celsius, converta-a em Fahrenheit e imprima a temperatura convertida.
43

3 Execuo Condicional

3.1 Expresses Booleanas

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:

> > > 5 == 5


True
> > > 5 == 6
False

True e False so valores especiais que pertencem ao tipo bool; eles no so strings:

> > > type(True)


<type bool>
> > > type(False)
<type bool>

O operador == um dos operadores de comparao; os outros so:


x != y # x no igual y
x > y # x maior do que y
x < y # x menor do que y
x >= y # x maior ou igual a y
x <= y # menor ou igual a y
x is y # x o mesmo que y
x is not y # x no o mesmo que y
Embora esses operadores sejam provavelmente familiares para voc, os smbolos de
Python so diferentes dos smbolos matemticos. Um erro comum usar apenas um sinal
de igual (=) ao invs de um duplo sinal de igual (==). Lembre-se que = um operador de
atribuio e == um operador de comparao. No existe tal engano com os operadores
=< ou =>.
44 Captulo 3. Execuo Condicional

3.2 Operadores Lgicos


Existem trs operadores lgicos: and,or e not. A semntica (significado) desses
operadores similar ao significado em Ingls. Por exemplo:

x > 0 and x < 10

verdadeiro apenas se x for maior que 0 e menor que 10.


n%2 == 0 or n%3 == 0 verdadeiro se pelo menos uma das condies verda-
deira, isto , se o nmero n for divisvel por 2 ou 3.
Finalmente, o operador not nega uma expresso booleana, ento not(x > y)
verdadeira se x > y falso, isto , se x menor ou igual a y.
Estritamente falando, os operandos dos operadores lgicos deveriam ser expres-
ses lgicas, mas o Python no muito estrito. Qualquer nmero diferente de zero
interpretado como verdadeiro.

> > > 17 and True


True

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

3.3 Execuo condicional


Com o objetivo de escrever programas teis, ns quase sempre precisamos ava-
liar condies e mudar o comportamento do programa de acordo com tais avaliaes.
Sentenas condicionais nos do essa capacidade. A forma mais simples a sentena
if:

if x > 0 :
print x positivo

A expresso booleana aps a sentena if chamada de condio. Ns termina-


mos a sentena if com o caractere dois pontos (:) e a(s) linha(s) aps a(s) sentena(s)
condicional(is) if (so) identada(s).
Se a condio lgica verdadeira, ento a sentena identada executada. Se a
condio lgica falsa, ento a sentena identada ignorada.
Sentenas if tem a mesma estrutura que as definies de funo ou de estruturas
for. A sentena consiste de uma linha de cabealho que termina com o caractere dois
3.4. Execuo alternativa 45

Figura 5: Execuo de uma sentena condicional

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!

Se voc entrar com uma sentena condicional no interpretador Python, a tela de


comando ir mudar de trs sinais de > para trs pontos para indicar que voc est no
meio de um bloco de sentenas, como mostrado abaixo:

> > > x = 3


> > > if x < 10:
... print Small
...
Small
> > >

3.4 Execuo alternativa

Uma segunda forma da sentena if a execuo alternativa, na qual h duas


possibilidades e uma condio determina qual ser executada. A sintaxe se assemelha a:
46 Captulo 3. Execuo Condicional

if x % 2 == 0 :
print x is even
else:
print x is odd

Se o resto da diviso de x por 2 0, ento sabemos que x par, ento o pro-


grama exibe uma mensagem para esse fato. Se a condio falsa, o segundo conjunto de
instrues executado.

Figura 6: Execuo de uma sentena condicional alternativa

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.

3.5 Condicionais em Cadeia


Algumas vezes existem mais do que duas possibilidades e, por isso, precisamos de
mais do que dois ramos no fluxo de execuo. Uma maneira de expressar computacional-
mente isso a condio em cadeia:

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

Figura 7: Execuo de uma condio em cadeia

if choice == a:
print Bad guess
elif choice == b:
print Good guess
elif choice == c:
print Close, but not correct

Cada condio verificada em ordem. Se a primeira falsa, a prxima verificada,


e assim por diante. Se uma delas for verdadeira, o ramo correspondente executado, e a
sentena termina. Se houver mais de uma condio verdadeira, apenas o primeiro ramo
executado.

3.6 Condicionais Agrupadas


Uma condicional tambm pode estar contida em outra. Ns poderamos escrever
o seguinte exemplo de tricotomia:

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

ser sentenas condicionais.

Figura 8: Execuo de uma sentena condicional agrupada

Embora a indentao das sentenas faa a estrutura ficar aparente, condicionais


agrupadas podem comear a dificultar a leitura. Em geral, uma boa ideia evit-las
quando puder.
Operadores lgicos, frequentemente, oferecem caminhos para simplificar as condi-
cionais agrupadas. Por exemplo, pode-se reescrever o seguinte cdigo usando uma nica
condicional:

if 0 < x:
if x < 10:
print x is a positive single-digit number.

A sentena de impresso executada, apenas se as duas condies forem verda-


deiras, assim teramos o mesmo efeito com o operador and:

if 0 < x and x < 10:


print x is a positive single-digit number.

3.7 Entendendo excees usando try e except


Nos captulos anteriores vimos um segmento de cdigo, no qual tnhamos utilizado
as funes raw_input e int para ler e analisar um nmero inteiro digitado pelo usurio.
Ns tambm vimos quo traioeiro isso poderia ser:
3.7. Entendendo excees usando try e except 49

> > > speed = raw_input(prompt)


What...is the airspeed velocity of an unladen swallow?
What do you mean, an African or a European swallow?
> > > int(speed)
ValueError: invalid literal for int()
> > >

Quando ns estamos executando essas sentenas no interpretador de Python, re-


cebemos uma nova tela de comando do interpretador, e passamos adiante para nossa
prxima sentena.
Entretanto, se esse cdigo for colocado em um script de Python e esse erro ocorrer,
seu script para imediatamente seu curso com um traceback e no executa a prxima
sentena.
Aqui est um exemplo de programa que converte a temperatura de Fahrenheit
para Celsius:

inp = raw_input(Enter Fahrenheit Temperature:)


fahr = float(inp)
cel = (fahr - 32.0) * 5.0 / 9.0
print cel

Se executarmos esse cdigo e colocarmos uma entrada invlida, ele simplesmente


falha com uma mensagem de erro pouco amigvel:

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:

inp = raw_input(Enter Fahrenheit Temperature:)


try:
fahr = float(inp)
cel = (fahr - 32.0) * 5.0 / 90.
print cel
except:
print Please enter a number

Python comea executando a sequncia de sentenas no bloco do try. Se tudo


estiver correto, o bloco except ignorado e a execuo continua. Se uma exceo (erro)
ocorrer no bloco do try, a execuo segue para as sentenas do bloco except.

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.

3.8 Avaliaes de caminhos curtos de expresses lgicas


Quando Python processa uma expresso lgica tal como x >= 2 e (x/y)>2, a
expresso avaliada da esquerda para a direita. Devido definio de and, se x menor que
2, a expresso x >= 2 False e ento a expresso inteira False mesmo que (x/y) > 2
seja avaliada como True.
Quando Python detecta que no h nada a ganhar por avaliar o resto das expresso
lgica, ele para de avaliar e no computa o valor do resto da expresso. Quando a avaliao
de uma expresso lgica para porque todo o valor j conhecido, ocorre o fato chamado
de encurtar o caminho da avaliao, ou short-circuiting.
Enquanto isso pode parecer um bom mtodo, o comportamento do caminho curto
leva tcnica chamada de padro guardio. Considere a seguinte sequncia de cdigo
3.8. Avaliaes de caminhos curtos de expresses lgicas 51

no interpretador de Python:

> > > x = 6


> > > y = 2
> > > x >= 2 and (x/y) > 2
True
> > > x = 1
> > > y = 0
> > > x >= 2 and (x/y) > 2
False
> > > x = 6
> > > y = 0
> > > x >= 2 and (x/y) > 2
Traceback (most recent call last):
File <stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>

O terceiro clculo falhou porque o Python estava avaliando (x/y) e y era 0, o


que causou um erro em tempo de execuo. Mas o segundo exemplo no falhou porque
a primeira parte da expresso x >= 2 foi avaliada como False ento o (x/y) nunca foi
executado, devido regra do caminho curto.
Ns podemos construir a expresso lgica para, estrategicamente, colocar uma
avaliao de guarda, logo antes da avaliao que possa causar um erro, como segue:

> > > x = 1


> > > y = 0
> > > x >= 2 and y != 0 and (x/y) > 2
False
> > > x = 6
> > > y = 0
> > > x >= 2 and y != 0 and (x/y) > 2
False
> > > x >= 2 and (x/y) > 2 and y != 0
Traceback (most recent call last):
File <stdin>, line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
> > >

Na primeira expresso lgica, x >= 2 False ento a avaliao para no and. Na


segunda expresso x >= 2 True mas y != 0 False, ento a operao (x/y) no
executada.
52 Captulo 3. Execuo Condicional

Na terceira expresso, o y!=0 est depois do clculo de (x/y), ento a expresso


falha com um erro.
Na segunda expresso, dizemos que y!=0 atua como um guarda para assegurar
que executemos (x/y) somente se y no for zero.

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:

O tipo de erro ocorrido; e

Onde o erro ocorreu.

Erros de sintaxe so normalmente fceis de se encontrar. Erros de espaos em


branco podem ser difceis porque espaos e tabs so invisveis e estamos acostumados a
ignor-los.

> > > x = 5


> > > y = 6
File <stdin>", line 1
y = 6

SyntaxError: invalid syntax

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

Mas quando voc o executa, voc consegue uma mensagem de erro1 :

Traceback (most recent call last):


File "snr.py", line 5, in ?
decibels = 10 * math.log10(ratio)
OverflowError: math range error

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.

expresso booleana: Uma expresso cujo valor True ou Falso.

ramo: Uma das alternativas de sequncias de sentenas em uma sentena condi-


cional.

condicional em cadeia: Uma sentena condicional com uma srie de ramos al-
ternativos.

operador de comparao: Um dos operadores que compara seus operandos:


==, !=, >, <, >=, e <=.

sentena condicional: Uma sentena que controla o fluxo de execuo depen-


1
Em Python 3.0, voc no recebe mais uma mensagem de erro, o operador de diviso realiza uma
diviso em float mesmo com operandos inteiros.
54 Captulo 3. Execuo Condicional

dendo de uma condio.

condio: A expresso booleana em uma sentena condicional que determina qual


ramo ser executado.

sentena composta: Uma sentena que contm um cabealho e um corpo. O


cabealho termina com dois pontos (:). O corpo identado relativamente ao cabealho.

padro guardio: Expresso lgica com comparaes adicionais a fim de garantir


a corretude sobre o comportamento dos caminhos curtos.

operador lgico: Um dos operadores que combina expresses booleanas: and, or


e not.

condicionais agrupadas: Uma sentena condicional que aparece em um dos ra-


mos de outra sentena condicional.

traceback: Lista de funes que esto executando, impressa quando uma exceo
ocorre.

caminho curto: Quando o Python est em um percurso de avaliao da expres-


so lgica e para de avaliar porque o Python sabe o resultado final para a expresso sem
precisar avaliar o resto da expresso.

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

Entre com as horas: 45


Entre com o valor da hora: 10
Pagamento: 475.0

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.

Entre com as horas: fourty


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

Digite uma pontuao: 0.95


A

Digite uma pontuao: perfect


Pontuao Ruim

Digite uma pontuao: 10.0


Pontuao Ruim

Digite uma pontuao: 0.75


C

Digite uma pontuao: 0.5


F

Execute o programa repetidamente como mostrado acima para testar as sadas


para diferentes entradas.
57

4 Funes

4.1 Chamada de funes


No contexto de programao, uma funo uma sequncia de comandos que realiza
um clculo. Quando voc define uma funo, preciso especificar o nome e a sequncia de
comandos. Depois, voc poder chamar a funo pelo nome. Ns j vimos um exemplo
uma chamada de funo:

> > > > type(32)


<type int>

O nome da funo type. A expresso em parnteses chamada de argumento


da funo. O argumento um valor ou varivel que estamos passando para a entrada da
funo. O resultado, para a funo type, o tipo do argumento.
comum dizer que a funo recebe o argumento e retorna um resultado. Esse
resultado chamado valor de retorno.

4.2 Funes Embutidas


Python fornece diversas funes embutidas das quais podemos usar sem antes
defin-las. Os criadores do Python escreveram um conjunto de funes para resolver pro-
blemas comuns e as incluiram no Python, para que possamos usar.
As funes max e min so funes que nos devolvem o maior e o menor valor de
um lista, respectivamente.

> > > > max(Hello world)


w
> > > > min(Hello world)

> > > >

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

nmero de caracteres presentes na string.

> > > > len(Hello world)


11
> > > >

prudente considerar o nome das funes embutidas do Phyton como palavras


reservadas. Assim, o uso de uma varivel de nome MAX, por exemplo, deve ser evitado.

4.3 Funo de converso de tipo


Python contm funes para converter valores de um tipo para outro. A funo
int recebe um valor e o converte para um nmero inteiro, se possvel, caso contrrio
retorna uma mensagem de erro.

> > > > int (32)


32
> > > > int (Hello)
ValueError: invalid literal for int(): Hello

int pode converter valores com ponto flutuante para inteiros, mas isso no arre-
donda o valor; s remove a parte fracionria do valor.

> > > > int (3.99999)


3
> > > > int (-2.3)
-2

float converte inteiros e strings para nmeros com ponto flutuante:

> > > > float (32)


32.0
> > > > float(3.14159)
3.14159

Finalmente, str converte seu argumento para uma string:

> > > > str(32)


32
> > > > str(3.14159)
3.14159
4.4. Nmeros aleatrios 59

4.4 Nmeros aleatrios

Dadas as mesmas entradas, a maioria dos programas de computador geram a


mesma sada toda vez que executados, ento eles so ditos determinsticos. O Deter-
minismo de um programa geralmente uma caracterstica boa, uma vez que esperamos
que um mesmo clculo retorne sempre um mesmo resultado. Em algumas aplicaes, en-
tretanto, queremos que o computador seja imprevisvel. Jogos um exemplo bvio, mas
ainda existem outros.
Fazer um programa verdadeiramente no determinstico no uma coisa fcil, mas
existem maneiras de faz-los parecer com no determinsticos. Uma dessas maneiras usar
algoritmos que gerem nmeros pseudoaleatrios. Nmeros pseudoaleatrios no so
realmente aleatrios, porque eles so gerados por um clculo determinstico, mas pela
avaliao superficial de nmeros pseudoaleatrios impossvel distingu-los de nmeros
aleatrios.
O mdulo random fornece funes que geram nmeros pseudoaleatrios (os quais
sero chamados simplesmente de aleatrios daqui em diante).
A funo random retorna valores reais aleatrios entre 0.0 e 1.0 (incluindo o 0.0
mas no o 1.0). Cada vez que random chamada, voc recebe um nmero distinto. Para
ver uma amostra, execute esse lao:

import random

for i in range (10):


x = random.random()
print x

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

> > > random.randint(5, 10)


5
> > > random.randint(5, 10)
9

Para escolher aleatoriamente um elemento de uma sequncia, voc pode utilizar a


funo choice:

> > > t = [1, 2, 3]


> > > random.choice(t)
2
> > > random.choice(t)
3

O mdulo random s fornece funes para gerar valores aleatrios de uma distribuio
contnua incluindo Gaussiana e exponencial.

4.5 Funes matemticas

Python possui um mdulo matemtico que fornece muitas funes matemticas


familiares. Antes de podermos usar tal mdulo, preciso import-lo:

> > > import math

Esta sentena cria um objeto mdulo nomeado math. Se voc imprimir o objeto
mdulo, voc obter alguma informao sobre ele:

> > > print math


<modue math from /usr/lib/python2.5/lib-dynload/mah.so>

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

> > > razao = potencia_sinal / potencia_ruido


> > > decibeis = 10*math.log10(razao)

> > > radianos = 0.7


> > > altura = math.sin(radianos)

O primeiro exemplo calcula o logaritmo na base 10 da razo entre sinal e rudo.


O mdulo matemtico (math) contm tambm uma funo chamada log que calcula o
logaritmo na base e.
O segundo exemplo determina o valor do seno dado em radianos. O nome da
varivel (radianos) uma dica para inform-lo que a funo sin e outras funes tri-
gonomticas (cos, tan, etc.) recebem o argumento em radianos. Para converter de graus
para radianos, divide-se por 360 e multiplica-se por 2:

> > > graus = 45


> > > radianos = graus / 360.0 * 2 * math.pi
> > > math.sin(radianos)
0.707106781187

A expresso math.pi retorna o valor da varivel pi do mdulo matemtico. O valor


dessa varivel uma aproximao do valor de , com acurcia de cerca de 15 dgitos.
Se voc conhece trigonometria, ento voc poder verificar o resultado anterior
comparando-o com a raiz quadrada de 2 dividida por 2.

> > > math.sqrt(2) / 2.0


0.707106781187

4.6 Adicionando novas funes


At agora, apenas funes que vieram junto com o Python foram utilizadas, mas
possvel tambm adicionar novas funes. A definio de uma funo especifica o
nome desta nova funo e a srie de passos que ela executar quando for chamada. Uma
vez definida a funo, ns podemos us-la em qualquer parte do programa.
Aqui est um exemplo:

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

de variveis: letras, nmeros e alguns sinais de pontuao so permitidos, mas o primeiro


caractere no pode ser um nmero. Voc no pode usar uma palavra-chave como nome
da sua funo, e voc deve evitar ter variaveis e funes com o mesmo nome.
Os parnteses vazios aps o nome da funo indicam que ela no recebe argumento.
Mais adiante construiremos funes que recebero argumentos em suas entradas.
A primeira linha da definio de uma funo chamada de cabealho; e o resto
chamado de corpo. O cabealho tem que terminar com dois pontos e o corpo tem que ser
identado. Por conveno, a identao possui sempre quatro espaos. O corpo pode conter
qualquer nmero de declaraes.
Frases em declaraes de impresso so envolvidas com aspas duplas. Aspas simples
e aspas duplas exercem o mesmo papel; a maioria das pessoas usam aspas simples, exceto
em casos onde um apstrofo aparece na frase a ser impressa.
Se voc escrever a definio de uma funo no modo interativo, ser impresso
reticncias (. . . ) para voc saber que a definio ainda no est completa:

> > > > def print_lyrics():


... print Im a lumberjack, and Im okay.
... print I sleep all night and I work all day.
...

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.

> > > print print_lyrics


<function print_lyrics at 0xb7e99e9c>
> > > print type(print_lyrics)
<type function>

O valor de print_lyrics um objeto funo, que tem tipo function.


A sintaxe para chamar a nova funo a mesma para chamar funes embutidas:

> > > > print_lyrics()


Im a lumberjack, and Im okay.
I sleep all night and I work all day.

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()

e ento chamamos a repeat_lyrics:

> > > > repeat_lyrics()


Im a lumberjack, and Im okay.
I sleep all night and i work all day.
Im a lumberjack, and Im okay.
I sleep all night and i work all day.

4.7 Definies e Modo de Utilizao

Reunindo os fragmentos de cdigo da seo anterior, o programa por completo :

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()

Este programa contm duas definies de funes: print_lyrics e repeat_lyrics.


Definies de funes so executadas como quaisquer outros comandos, mas a inteno
criar objetos de funo. Os comandos dentro da funo no so executados at que a
funo seja chamada, e a definio da funo no gera nenhuma sada.
Como de se imaginar, preciso criar uma funo antes de execut-la. Em outras
palavras, a definio da funo tem que ser realizada antes que uma chamada a mesma
seja feita.
Exerccio 4.2 Mova a ltima linha do programa anterior para o topo, de modo
que a chamada s funes sejam realizadas antes das definies. Execute o programa e
veja que mensagem de erro retornada.
Exerccio 4.3 Mova a chamada de funo de volta para baixo e mova a definio de
print_lyrics aps a definio de repeat_lyrics. O que acontece quando voc executa
este programa?
64 Captulo 4. Funes

4.8 Fluxo de execuo


A fim de assegurar que uma funo seja definida antes do seu primeiro uso, voc
tem que saber a ordem em que os comandos so executados, o que chamado de fluxo
de execuo.
A execuo sempre comea com a primeira instruo do programa. As instrues
so executadas uma de cada vez, ordenadas de cima para baixo.
As definies de funo no alteram o fluxo de execuo do programa, mas lembre-
se que comandos dentro da funo no so executados at que a funo seja chamada.
Uma chamada de funo como um desvio no fluxo de execuo. Em vez de ir para
a prxima instruo, o fluxo segue para o corpo da funo, executa todas as declaraes
da funo, e depois volta para continuar de onde parou.
Isso soa bastante simples, at voc lembrar que uma funo pode chamar outra.
Enquanto executa os comandos dentro de uma funo, o programa pode ter que executar
os comandos de uma outra funo. E ao executar essa nova funo, o programa pode ter
de executar ainda outra funo!
Felizmente, Python bom em manter o controle de onde est, assim, cada vez
que uma funo concluda, o programa retoma de onde parou na funo que a chamou.
Quando se chega ao fim do programa, ele termina.
Entretanto, quando voc l um programa, nem sempre quer faz-lo de cima para
baixo. s vezes, faz mais sentido uma leitura seguindo o fluxo de execuo.

4.9 Parmetros e Argumentos


Algumas das funes embutidas que temos visto exigem argumentos. Por exemplo,
quando voc chama math.sin, preciso passar um nmero como argumento. Algumas
funes recebem mais de um argumento: math.pow necessita de dois, a base e o expoente.
Dentro da funo, os argumentos so atribudos a variveis chamadas parmetros.
Eis um exemplo de uma funo definida pelo usurio que recebe um argumento:

def print_twice(bruce):
print bruce
print bruce

Esta funo atribui o argumento a um parmetro chamado bruce. Quando a funo


chamada, impresso o valor do parmetro (seja ele qual for) duas vezes.
Esta funo funciona com qualquer valor que possa ser impresso.
4.10. Funes Produtivas e Funes Void 65

> > > print_twice(Spam)


Spam
Spam
> > > print_twice(17)
17
17
> > > print_twice(math.pi)
3.14159265359
3.14159265359

As mesmas regras de composio que se aplicam s funes nativas tambm se apli-


cam s funes definidas pelo usurio, ento ns podemos usar qualquer tipo de expresso
como um argumento para print_twice:

> > > print_twice(Spam *4)


Spam Spam Spam Spam
Spam Spam Spam Spam
> > > print_twice(math.cos(math.pi))
-1.0
-1.0

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:

> > > michael = Eric, the half a bee.


> > > print_twice(michael)
Eric, the half a bee.
Eric, the half a bee.

4.10 Funes Produtivas e Funes Void


Algumas das funes que estamos usando, tais como as funes matemticas, pro-
duzem resultados; por falta de um nome melhor, a chamamos de funes produtivas.
Outras funes, como print_twice, executam uma ao, mas no retornam um valor.
Elas so chamadas de funes void (vazias).
Quando uma funo produtiva chamada, quase sempre qse deseja fazer algo com
o resultado por ela produzido; por exemplo, atribuir tal resultado a uma varivel ou us-lo
como parte de uma expresso:

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)


2.2360679774997898

Mas em um script, se voc chamar uma funo no void e no armazenar o resul-


tado desta em uma varivel, o valor de retorno ser desprezado!

math.sqrt(5)

Este script calcula a raiz quadrada de 5, mas se voc no armazena o resultado


em uma varivel ou exibe o resultado, no h muita utilidade.
As funes void podem exibir algo na tela ou terem algum outro efeito, mas no
tm um valor de retorno. Se voc tentar atribuir o resultado a uma varivel, obter um
valor especial chamado None.

> > > result = print_twice(Bing)


Bing
Bing
> > > print result
None

O valor None no o mesmo que a string de None. um valor especial que possui
seu prprio tipo:

> > > print type(None)


<type NoneType>

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.

def addtwo(a, b):


added = a + b
return added

x = addtwo(3, 5)
print x

Quando esse script executado, a instruo print ir imprimir 8 porque a


funo addtwo foi chamada com os nmeros 3 e 5 como argumentos. Dentro da funo os
parmetros a e b receberam os valores 3 e 5, respectivamente. A funo calcula a soma
4.11. Por que utilizar funes? 67

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.

4.11 Por que utilizar funes?


Pode no ser evidente por que vale a pena dividir um programa em funes. En-
tretanto, h vrias razes:

Criar uma nova funo lhe d a oportunidade de nomear um grupo de instrues,


o que torna o programa mais fcil de ler, entender e depurar.

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.

Dividir um programa longo em funes permite que voc resolva as partes de um


problema e depois, junte todas estas solues.

Funes bem projetadas so frequentemente utilizadas em muitos programas. Uma


vez que voc escreve e depura uma funo, voc pode reutiliz-la.

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

No esquea de salvar os programas antes de execut-los. Alguns ambientes de


desenvolvimento fazem isso automaticamente, mas outros no. Dessa forma, o programa
que voc est vendo no editor de textos pode no ser o mesmo que est sendo executado.
Corrigir erros pode demorar se continuar executando o programa errado por di-
versas vezes.
Tenha certeza de que o cdigo que voc est vendo o mesmo que est sendo exe-
cutado. Se voc no tiver certeza disso, coloque um print Hello no incio do programa
e execute-o novamente. Se voc no ver Hello no incio da execuo, ento o programa
que est sendo executado no o correto!

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.

Corpo: Sequncia de passos dentro da definio de uma 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.

Fluxo de execuo: Ordem em que uma sequncia de passos executada.

Funo produtiva: Funo que retorna um valor.

Funo: Uma sequncia de passos nomeada. As funes podem ou no ter argumen-


tos e podem ou no produzir resultados.

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.

Cabealho: Primeira linha de uma definio de funo.

Declarao import: Declarao de leitura de um arquivo de mdulo e criao de um


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

Pseudo aleatrio: Refere-se a uma sequncia de nmeros que aparentemente alea-


tria, mas gerada de maneira determinstica.

Retorno de valor: Resultado de uma funo. Se a chamada funo ocorre em uma


expresso, ento o valor a ser retornado o valor da expresso.

Funo void: Uma funo que no retorna valor.

4.14 Exerccios

Exerccio 4.4 Qual o propsito da palavra-chave def em Python?


a) uma gria que significa "o seguinte cdigo muito legal"
b) Indica o comeo de uma funo
c) Indica que a sequncia de cdigo identada seguinte deve ser armazenada para posterior
utilizao.
d) b e c so ambas verdadeiras
e) n.d.a

Exerccio 4.5 O que o programa a seguir imprime ?


70 Captulo 4. Funes

def fred():
print Zap
def jane():
print ABC

jane()
fred()
jane()

a)Zap ABC jane fred jane


b)Zap ABC Zap
c)ABC Zap jane
d)ABC Zap ABC
e)Zap Zap Zap

Exerccio 4.6 Reescreva o programa de computao de pagamento com um tempo e


meio das horas extras e crie uma funo chamada computepagamento que recebe dois
parmetros (o nmero de horas e o valor pago por hora).

Entre com as horas: 45


Entre com o valor da hora: 10
Pagamento: 475.0

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:

Entre com a pontuao: 0.95


A

Entre com a pontuao: perfeito


Pontuao ruim

Entre com a pontuao: 10.0


Pontuao ruim

Entre com a pontuao: 0.75


C

Entre com a pontuao: 0.5


F

Execute o programa vrias vezes para testar diferentes valores de entrada.


73

5 Iterao

5.1 Atualizando variveis

Um padro comum em instrues de atribuio uma declarao de atribuio


que atualiza uma varivel - onde o novo valor da varivel depende do valor anterior.

x = x + 1

A instruo anterior significa "obter o valor atual de x, adicionar um, e depois


atualizar x com o novo valor".
Se voc tentar atualizar uma varivel que no existe, voc recebe um erro, porque
Python avalia o lado direito antes de atribuir um valor para x:

> > > x = x + 1


NameError: name x is not defined

Antes que voc possa atualizar uma varivel, voc tem que inicializ-la, geralmente
com uma simples atribuio:

> > > x = 0


> > > x = x + 1

Atualizar uma varivel, adicionando 1, chamado de um incremento; subtraindo


1 chamado um decremento.

5.2 A instruo while

Computadores so muitas vezes utilizados para automatizar tarefas repetitivas.


Repetir tarefas idnticas ou similares sem cometer erros algo que os computadores
fazem bem e as pessoas fazem mal. Por iterao ser to comum, Python fornece vrios
recursos de linguagem para torn-lo mais fcil.
Uma forma de iterao em Python a sentena while. Aqui vai um programa
simples que faz a contagem regressiva de cinco at zero e, em seguida, diz: Fim!.
74 Captulo 5. Iterao

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:

1. Avaliar a condio, produzindo True ou False.

2. Se a condio falsa, saia do comando while e continue a execuo da prxima


instruo.

3. Se a condio verdadeira, execute o corpo e, em seguida, volte para o passo 1.

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.

5.3 Loops infinitos


Uma fonte inesgotvel de diverso para os programadores a observao de que
as instrues no shampoo, Lave, enxge, repita um loop infinito, porque no h
nenhuma varivel de iterao para dizer-lhe quantas vezes executar o loop.
No caso do exemplo de loop while dado anteriormente, podemos provar que o loop
termina porque sabemos que o valor de n finito, e podemos ver que o valor de n menor a
cada iterao do loop, ento, eventualmente, temos de chegar a 0. Outras vezes um loop
obviamente infinito porque no tem nenhuma varivel de iterao.
5.4. Loops infinitos e o comando break 75

5.4 Loops infinitos e o comando break

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

> Hello There


Hello There
> finished
finished
> done
Done!

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

5.5 Finalizando iteraes com continue


s vezes, voc est em uma iterao de um loop e quer terminar a iterao atual
e saltar imediatamente para a prxima iterao. Nesse caso, voc pode usar a funo
continue para passar para a prxima iterao sem terminar o corpo do loop para iterao
atual.
Aqui est um exemplo de um loop que copia a sua entrada at que o usurio digite
done, e trato as linhas que comeam com o carcter # como linhas que no devem ser
impressas (como comentrios em Python).

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.

> hello there


hello there
> # dont print this
> print this!
print this! > done
Done!

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

while para iniciar a prxima iterao, ignorando, assim, a sentena print.

5.6 Laos usando for


s vezes queremos fazer um loop sobre um conjunto de elementos, como uma
lista de palavras, as linhas em um arquivo ou uma lista de nmeros. Quando temos uma
lista de elementos para o loop, podemos construir um loop definido usando a instruo
for. Chamamos a instruo while de um loop indefinido porque ele simplesmente repete
o loop at que alguma condio se torne False enquanto que o lao for executado sobre
um conjunto conhecido de itens. Assim, so executadas tantas iteraes quantos forem os
itens no conjunto.
A sintaxe de um loop for semelhante de um loop while em que existe uma
instruo for e um corpo de loop:

friends = [Joseph, Glenn, Sally]


for friend in friends:
print Happy New Year:, friend
print Done!

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:

Happy New Year: Joseph


Happy New Year: Glenn
Happy New Year: Sally
Done!

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.

for friend in friends:


print Happy New Year, friend

Em particular, friend a varivel de iterao do loop, a varivel friend muda


para cada iterao do loop e controla quando o lao for termina. A varivel de iterao
passa sucessivamente pelas trs strings armazenadas na varivel friends.
1
Ns examinaremos listas em mais detalhes no prximo captulo
78 Captulo 5. Iterao

5.7 Padres de Loop


Muitas vezes usamos um loop for ou while para percorrer uma lista de itens ou
o contedo de um arquivo e estamos procura de algo como o maior ou menor valor nos
dados que estamos percorrendo.
Estes laos so geralmente construdos por:

Inicializao de uma ou mais variveis antes do incio do loop;

Realizao de alguma computao dentro do corpo do loop, possivelmente alterando


as variveis no corpo do loop;

Avaliao das variveis resultantes quando o loop termina.

Usaremos uma lista de nmeros para demonstrar os conceitos e construo destes


padres de loop.

5.7.1 Loops de contagem e soma


Por exemplo, para contar o nmero de itens em uma lista, escreveramos o seguinte
loop for:

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

Neste loop utilizamos a varivel de iterao. Ao invs de simplesmente adicionar


1 varivel count como no loop anterior, adicionamos o nmero atual (3, 41, 12, etc)
varivel total durante cada iterao do loop. Se voc pensar sobre a varivel total, ela
contm a soma total dos valores at o momento. Ento, antes do loop iniciar, total
zero, porque ainda no visitamos quaisquer valores. Durante o loop, total o total
contnuo, e no final do loop, total a soma total de todos os valores na lista.
medida que o loop executa, total acumula a soma dos elementos; uma varivel
usada desta forma , s vezes, chamada de acumulador.
Nem o loop de contagem nem o loop somador so particularmente teis na prtica
porque h funes embutidas len() e sum(), que calculam o nmero de itens em uma
lista e a soma de todos os itens na lista, respectivamente.

5.7.2 Loops de mximos e mnimos


Para encontrar o maior valor em uma lista ou sequncia, construmos o seguinte
loop:

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

Quando o programa executado, a sada a seguinte:

Before : None
Loop: 3 3
Loop: 41 41
Loop: 12 41
Loop: 9 41
Loop: 74 74
Loop: 15 74
Largest: 74

A varivel largest mostra perfeitamente o conceito de maior valor visto at


agora. Antes do loop, atribumos a largest a constante None. None um valor especial
80 Captulo 5. Iterao

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

Novamente, smallest o menor at agora, antes, durante e aps a execuo


desse loop. Quando o lao termina, smallest contm o valor mnimo na lista.
Novamente, como na contagem e soma, as funes embutidas max() e min() faz
esses loops desnecessrios.
O que se segue uma verso simples da funo embutida de Python min():

def min(values):
smallest = None
for value in values:
if smallest is None or value < smallest:
smallest = value
return smallest

Na verso da funo do cdigo do menor, removemos todas as sentenas print,


de modo que equivalente funo min que j est incorporada ao Python.
5.8. Depurao 81

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.

decremento: atualizao que diminui o valor de uma varivel.

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

no h uma condio de trmino.

iterao: execuo repetida de um conjunto de sentenas usando ou uma chamada de


funo recursiva ou um loop.

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

6.1 Uma string uma sequncia


Uma string uma sequncia de caracteres. Voc pode acess-los um de cada vez
usando o colchete:

> > > fruta = banana


> > > letra = fruta[1]

A segunda declarao extrai o caractere na posio de ndice 1 da varivel fruta


e o atribui para a varivel letra.
A expresso entre colchetes chamada de ndice. O ndice indica qual caractere
na sequncia voc deseja. Porm, o resultado pode ser diferente do que voc espera:

> > > print letra


a

Para a maioria das pessoas, a primeira letra de banana o b, no o a. Porm,


em Python, o ndice um deslocamento a partir do incio da string, e a primeira letra
tem o ndice zero.

> > > letra = fruta[0]


> > > print letra
b

Ento b a letra de posio zero de banana, a a letra de posio 1, e n a


letra de posio 2.

Voc pode usar qualquer expresso, incluindo variveis e operadores, como um


ndice. Porm, o valor do ndice precisa ser um inteiro. Caso contrrio voc se deparar
com esta situao:

> > > letra = fruta[1.5]


TypeError: string indices must be integers
84 Captulo 6. Strings

6.2 Obtendo o comprimento de uma string usando len


len a uma funo pr-definida que retorna o nmero de caracteres em uma string:

> > > fruta = banana


> > > len(fruta)
6

Para acessar a ltima letra de uma string, voc deve estar pensando que pode
tentar algo como:

> > > comprimento = len(fruta)


> > > ultima = fruta[comprimento]
IndexError: string index out of range

A razo do erro IndexError porque no existe letra em banana com o ndice


6. Como comeamos a contar do zero, as seis letras esto enumeradas de 0 a 5. Para
conseguir o ltimo caractere voc precisa subtrair 1 de comprimento:

> > > ultima = fruta[comprimento-1]


> > > print ultima
a

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.

6.3 Percorrendo uma string com um loop


Muitos processos envolvem analisar um caractere da string por vez. Comeando
de uma posio pr-definida selecionado um caractere e nele realizado algum ao e esse
processo continua at o final definido. Este padro chamado de percurso. Uma forma
de escrever um percurso sobre uma string usando uma estrutura de repetio while:

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:

for caracter in fruta:


print caracter

Toda vez que o loop executado, o prximo caractere da string atribudo


varivel caracter. A estrutura de repetio continua at no haver mais caracteres em
fruta.

6.4 Fragmentando Strings

Um segmento de uma string chamado de fragmento. Selecionar um fragmento


como selecionar um caractere:

> > > s = Monty Python


> > > print s[0:5]
Monty
> > > print s[6:13]
Python

O operador [n:m] retorna a parte da string do n-simo caractere at o m-simo


caractere, incluindo o primeiro mas excluindo o ltimo.
Se o primeiro ndice (antes dos dois pontos) for omitido, o fragmento comea no
incio da string. Se omitir o segundo, o fragmento vai at o final da string:

> > > fruta = banana


> > > fruta[:3]
ban
> > > fruta[3:]
ana

Se o primeiro ndice igual ou maior que o segundo, o resultado uma string


vazia, representada por duas aspas:
86 Captulo 6. Strings

> > > fruta = banana


> > > fruta[3:3]

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?

6.5 Strings no podem ser mudadas

O uso do operador [ ] do lado esquerdo de uma atribuio, com o intuito de mudar


um caracter de uma string no permitido. Por exemplo:

> > > cumprimento = Ol, mundo!


> > > cumprimento[0] = J
TypeError: object does not support item assignment

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:

> > > cumprimento = Ol, mundo!


> > > novo_cumprimento = J + cumprimento[1:]
> > > print novo_cumprimento
Jla, mundo!

Esse exemplo concatena uma nova primeira letra em um fragmento de cumprimento


e atribui a nova string a uma nova varivel. A string original no sofre nenhuma alterao.

6.6 Estruturas de repetio e contadores

O programa a seguir conta quantas vezes a letra a aparece na string:


6.7. O operador in 87

palavra = banana
contador = 0
for letra in palavra:
if letra == a:
contador = contador + 1
print contador

Esse programa apresenta outro padro usado na computao chamado de con-


tador. A varivel contador inicializada em 0, e incrementada toda vez que um a
encontrado na string palavra. Quando a estrutura de repetio acabar, contador ir
conter o resultado - o nmero total de letras a existentes na varivel palavra.
Exerccio 6.2 Crie uma funo chamada count, que recebe uma palavra p e um
caracter c como entrada. Como sada, mostre o nmero de ocorrncias do caracter c na
palavra p.

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:

> > > a in banana


True
> > > semente in banana
False

6.8 Comparao entre strings


O operador de comparao visto anteriormente, funciona com strings. Para ver se
duas strings so iguais:

if palavra == banana
print So bananas.

Outros operadores de comparao so teis para colocar as palavras em ordem


alfabtica:

if palavra < banana:


print Sua palavra, + palavra + , vem antes de banana.
elif palavra > banana:
print Sua palavra, + palavra + , vem depois de banana.
else:
print So bananas.
88 Captulo 6. Strings

Python no trabalha com letras maisculas e minsculas do mesmo modo que


pessoas. Todas as letras maisculas vem antes das minsculas:

Sua palavra, Abacaxi, vem antes de banana.

Um modo de trabalhar com esse problema convertendo suas strings para um


formato padro, por exemplo, todas em minsculas, antes de realizar a comparao.

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.

> > > stuff = Ol mundo


> > > type(stuff)
<type str>
> > > dir(stuff)
{capitalize, center, count, decode, encode,
endswith, expandtabs, find, format, index,
isalnum, isalpha, isdigit, islower, isspace,
istitle, isupper, join, ljust, lower, lstrip,
partition, replace, rfind, rindex, rjust,
rpartition, rsplit, rstrip, split, splitlines,
startswith, strip, swapcase, title, translate,
upper, zfill}
> > > help(str.capitalize)
Help on method_descriptor:

capitalize(...)
S.capitalize() -> string

Return a copy of the string S with only its first character


capitalized.
> > >

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

> > > palavra = banana


> > > nova_palavra = palavra.upper()
> > > print nova_palavra
BANANA

Essa forma de notao especifica o nome do mtodo, upper, e o nome da string


sobre a qual se aplicar o mtodo, palavra. Os parnteses em branco indicam que esse
mtodo no recebe nenhum argumento.
Quando se realiza uma chamada ao mtodo dizemos que este est sendo invocado;
nesse caso, estamos invocando upper em palavra.
Por exemplo, h um mtodo chamado find que procura a posio de uma string
dentro de outra:

> > > palavra = banana


> > > indice = palavra.find(a)
> > > print index
1

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:

> > > palavra.find(na)


2

Tambm pode receber como segundo argumento um ndice, que indica de onde a
busca deve comear:

> > > palavra.find(na,3)


4

Uma tarefa comum a de remover espaos em branco (barras de espao, tabs, ou


novas linhas) do incio e do fim de uma string. Para isso, usamos o mtodo strip:
90 Captulo 6. Strings

> > > linha = Aqui vamos ns


> > > linha.strip()
Aqui vamos ns

Alguns mtodos como startswith retornam um valor booleano.

> > > linha = Tenha um bom dia


> > > linha.startswith(Tenha)
True
> > > linha.startswith(t)
False

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:

> > > linha = Tenha um bom dia


> > > linha.startswith(t)
False
> > > linha.lower()
tenha um bom dia
> > > linha.lower().startswith(t)
True

No ltimo exemplo, ns invocamos o mtodo lower e depois usamos startswith


para checar se a string em minsculo comea com a letra p. Se formos cuidadosos com
a ordem, podemos chamar mltiplos mtodos em uma nica expresso.
Exerccio 6.4 Existe um mtodo chamado count que similar funo do ltimo
exerccio. Leia a explicao desse mtodo em docs.python.org/library/string.html
e escreva uma invocao que conte quantas vezes a letra a aparece em banana.

6.10 Analisando uma string


Constantemente, queremos encontrar uma sub-string dentro de uma outra string.
Por exemplo, se nos for apresentada uma sequncia de linhas formatadas desse modo:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
E quisermos tirar apenas a segunda parte do endereo, (uct.ac.za), das linhas.
Podemos usar o mtodo find e fragment-la.
Primeiro, iremos encontrar a posio do caractere @ na string. Ento, encontrare-
mos o primeiro espao em branco depois dele. Logo em seguida, fragmentaremos a string
6.11. Operador de formatao 91

para extrair apenas a parte que queremos.

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

6.11 Operador de formatao


O operador de formatao % permite contruir strings, substituindo partes das
strings por dados armazenados em variveis. Quando aplicado a inteiros, % o operador de
mdulo. Porm, quando o primeiro operando uma string, % o operador de formatao.
O primeiro operando o de formato de string, e pode conter uma ou mais sequn-
cias de formatao que especificam o formato do segundo operando. O resultado uma
string.
Por exemplo, se o operador de formatao %d, isso significa que o segundo
operando precisa ser formatado como um inteiro (d de decimal):

> > > camelos = 42


> > > %d % camelos
42

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

> > > camelos = 42


> > > Eu tenho %d camelos % camelos
Eu tenho 42 camelos.

Se houver mais de uma sequncia de formatao em uma string, o segundo argu-


mento precisa ser um registro. Toda sequncia de formatao corresponde a um elemento
no registro, seguindo uma ordem.
Os exemplos a seguir usam %d para o formato de inteiros, %g para o formato de
nmeros com ponto flutuante, e %s para formatar uma string:

> > > Em %d anos eu terei %g %s. % (3,1.0,camelos)


Em 3 anos eu terei 1.0 camelos.

O nmero de elementos em um registro precisa corresponder ao nmero de sequn-


cias de formataes em uma string. E tambm, os tipos de elementos devem corresponder
com as sequncias de formataes:

> > > %d %d %d % (1, 2)


TypeError: not enough arguments for format string
> > > %d % dlares
TypeError: illegal argument type for built-in operation

No primeiro exemplo, no existem elementos o suficiente, e no segundo, o tipo est


errado.
O operador de formatao bem poderoso, mas tambm pode ser difcil de ser
usado. Voc pode aprender mais sobre eles no link2 .

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:

if len(linha) > 0 and linha[0] == #:

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

operador de formatao: operador %, que recebe uma cadeia de formatao e um


registro e ento gera uma string que inclui os elementos que o registro est especificando
formatados como indicados na cadeia de formatao.

sequncia de formatao: sequncia de caracteres em uma cadeia de formatao, como


%d, que especifica o formato em que o valor deve ser apresentado.

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.

invocao: sentena que chama um mtodo.

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.

item: um dos valores em uma sequncia.

mtodo: funo associada a um objeto, chamada usando o operador ponto(.).

objeto: algo a que uma varivel pode se referir. Por enquanto, os termos objeto e valor
podem ser utilizados sem distino.

busca: percurso que termina quando se encontra o que est procurando.

sequncia: grupo ordenado, isso , grupo de valores onde cada um identificado atravs
de um ndice inteiro.

fragmento: parte de uma string especificada atravs de um intervalo de ndices.

percurso: ao de percorrer os itens em uma sequncia, realizando uma ao similar


com cada um deles.

6.14 Exerccios
Exercicio 6.5 Dado o cdigo a seguir que armazena uma string:
6.14. Exerccios 95

str = X-DSPAM-Confidence: 0.8475

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.

Figura 9: Esquema de um computador genrico.

Nesse captulo, ns vamos comear a trabalhar com a Memria Secundria (ou


arquivos). Memria secundria no apagada quando a energia desligada. Ou no caso
de um Pen Drive USB, os dados podem ser escritos pelo nossos programas, removido do
sistema e transportados para outro sistema.
Iremos primeiramente focar na leitura e escrita de arquivos de texto como os que
criamos em um editor de texto. Depois iremos ver como trabalhar com arquivos de banco
de dados que so arquivos binrios, projetados especificamente para ler e escrever atravs
98 Captulo 7. Arquivos

do software do banco de dados.

7.2 Abrindo arquivos


Quando desejamos ler ou escrever um arquivo, primeiro devemos abrir o arquivo.
Abrindo o arquivo ocorre a comunicao com o seu sistema operacional, pois ele que sabe
onde os dados de cada arquivo so armazenados. Quando se abre um arquivo, pede-se ao
sistema operacional para procurar o arquivo pelo nome e ter certeza que o arquivo existe.
Nesse exemplo, abrimos o arquivo mbox.txt que deveria estar armazenado na mesma
pasta em que voc est quando inicia o Python. Voc pode realizar o download deste
arquivo atrves de www.py4inf.com/code/mbox.txt

> > > fhand = open(mbox.txt)


> > > print fhand
<open file mbox.txt, mode r at 0x1005088b0>

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.

Se o arquivo no existir, a abertura ir falhar com um traceback e voc no ter


o handle para acessar o contedo do arquivo:

> > > fhand = open(stuff.txt)


Traceback (most recent call last):
File <stdin>, line 1, in <module>
I0Error: [Errno 2] No such file or directory: stuff.txt

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

7.3 Arquivos de texto e linhas

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:

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008


Return-Path: <postmaster@collab.sakaiproject.org>
Date: Sat, 5 Jan 2008 09:12:18 -0500
To: source@collab.sakaiproject.org
From: stephen.marquard@uct.ac.za
Subject: [sakai] svn commit: r39772 - content/branches/
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev39772
...

O arquivo completo de interaes de e-mail est disponvel atravs do link1 e a


verso resumida do arquivo est disponvel atravs do link2 . Esses arquivos esto em
formato padro para um arquivo que contm vrias mensagens de e-mail. As linhas que
comeam com From separa as mensagens e as linhas que comeam com From: so
parte das mensagens. Para mais informaoes, veja em en.wikipedia.org/wiki/Mbox.
Para quebrar o arquivo em linhas, existe um caracter especial que representa o fim
da linha, chamado de caracter de nova linha.
Em Python, representamos o caracter de nova linha como n. Apesar do caracter
de nova linha ser representado por dois caracteres, na verdade apenas um caracter.
Quando olhamos para a varivel digitando stuff no interpretador, isso nos mostra o
n na string, mas quando usamos a funo print para mostrar a string, vemos a string
quebrada em duas linhas pelo caracter de nova linha.

1
www.py4inf.com/code/mbox.txt
2
www.py4inf.com/code/mbox-short.txt
100 Captulo 7. Arquivos

> > > stuff = HellonWorld!


> > > stuff
HellonWorld!
> > > print stuff
Hello
World!
> > > stuff = XnY
> > > print stuff
X
Y
> > > len(stuff)
3

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.

7.4 Lendo arquivos


J que o file handle no contm os dados do arquivo, fcil construir uma
estrutura de repetio for para ler e contar cada uma das linhas em um arquivo:

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

for faz realmente com que os dados do arquivo sejam lidos.


Quando o arquivo lido usando a repetio for dessa maneira, Python cuida de
dividir os dados do arquivo em linhas separadas utilizando o caractere de nova linha.
Python l cada linha atravs do n e inclui a nova linha como caractere na varivel line
para cada iterao do for.
Por que o for l os dados uma linha por vez, pode-se eficientemente ler e contar as
linhas de arquivos muito grandes sem correr o risco de ficar sem memria principal para
armazenar os dados. O programa acima pode contar as linhas de arquivos com qualquer
tamanho usando pouca memria, desde que cada linha seja lida, contada, e em seguida
descartada.
Se voc sabe que o arquivo relativamente pequeno, comparado com o tamanho
da memria principal de sua mquina, voc pode ler o arquivo inteiro em uma string
usando o mtodo read para o file handle.

> > > fhand = open(mbox-short.txt)


> > > inp = fhand.read()
> > > print len(inp)
94626
> > > print inp[:20]
Frin stephen.marquar

Nesse exemplo, todos os 94626 caracteres do arquivo mbox-short.txt so lidos


diretamente na varivel inp. Neste exemplo foi usado um corte de string para imprimir
apenas os vinte primeiros caracteres da string dos dados armazenado em inp.
Quando o arquivo lido dessa maneira, todos os caracteres, incluindo todas as
linhas e todos os caracteres de nova linha tornam-se uma grande string armazenada na
varivel inp. Lembre-se que esta forma de utilizao da funo open s deve ser usado se
os dados do arquivo couberem confortavelmente na memria principal do computador.
Se o arquivo for muito grande para caber na memria principal, voc deve escrever
seu programa para ler o arquivo em partes usando a estrutura de repetio for ou while.

7.5 Pesquisando em um arquivo


Quando voce est procurando por dados em um arquivo, muito comum ler o
arquivo ignorando a maioria das linhas, e processar apenas as linhas que se encaixam
em um critrio particular. Ns podemos combinar tal comportamento com mtodos que
atuam sobre string, para construirmos um simples mecanismo de busca.
Por exemplo, se desejamos ler um arquivo e apenas imprimir as linhas que comeam
102 Captulo 7. Arquivos

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

Quando o programa executado, esta sada apresentada:

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

Quando este programa executado, a seguinte sada apresentada:

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

Conforme o processamento de seu arquivo se torna mais complicado, voc pode


querer estruturar seus laos de buscas usando continue. A ideia bsica de uma estrutura
de busca que voce est procurando por linhas interessantes e, efetivamente, pulando
linhas desinteresantes. E ento, quando encontramos uma linha interessante, fazemos
algo com esta linha.
Podemos estrutrar a estrutura de repetio para seguir o padro de pular linhas
desinteressantes como segue:

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

A sada do programa a mesma. Em ingls, as linhas desinteressantes so aquelas


que no comeam com From:, as quais pulamos(ou descartamos) usando continue.
Para as linhas interessantes (linhas que comeam com From:) ns as processamos.
Podemos usar o mtodo de string find para simular uma busca de um editor de
texto, que encontra a string procurada em qualquer lugar de uma linha. Uma vez que
find procura pela ocorrncia de uma string dentro de outra string e retorna a posio da
string ou o nmero -1, representando que a string no foi encontrada, podemos escrever
a seguinte estrutura de repetio para mostrar qual linha contm a string @uct.ac.za.

fhand = open(mbox-short.txt)
for line in fhand:
line = line.rstrip()
if line.find(@uct.ac.za) == -1 :
continue
print line

O qual produz esta sada:


104 Captulo 7. Arquivos

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008


X-Authentication-Warning: set sender to stephen.marquard@uct.ac.za using -f
From: stephen.marquard@uct.ac.za
Author: stephen.marquard@uct.ac.za
From david.horwitz@uct.ac.za Fri Jan 4 07:02:32 2008
X-Authentication-Warning: set sender to david.horwitz@uct.ac.za using -f
From: david.horwitz@uct.ac.za
Author: david.horwitz@uct.ac.za

7.6 Permitindo ao usurio escolher o nome do arquivo

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:

fname = raw_input(Enter the file name: )


fhand = open(fname)
count = 0
for line in fhand:
if line.startswith(Subject:) :
count = count + 1
print There were, count, subject lines in, fname

Lemos o nome do arquivo desejado pelo usurio e guardamos na varivel chamada


fname, ento abrimos este arquivo. Agora podemos usar este programa repetidamente em
diferentes arquivos.

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

Antes de espiar a prxima seo, d uma olhada no programa acima e se pergunte,


O que poderia dar errado? ou O que nosso amigvel usurio poderia fazer que que
acarretaria em uma sada no to brilhante do nosso pequeno programa, fazendo-nos
parecer no to legal aos olhos do dele?
7.7. Usando try, except e open 105

7.7 Usando try, except e open

Eu te disse para no espiar. Esta sua ltima chance.


E se nosso usurio digitar algo que no um nome de arquivo?

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:

fname = raw_input(Enter the file name: )


try:
fhand = open(fname)
except:
print File cannot be opened:, fname
exit()

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

Proteger a chamada open um bom exemplo de uso correto de try e except em


um programa Python. Ns usamos o termo Pythonic quando estamos fazendo algo no
Jeito Python. Ns podemos dizer que o exemplo acima um jeito Pythonic de abrir um
arquivo.
Quando voc se tornar mais hbil em Python, voc pode conversar com outro
programador Python para decidir qual das solues equivalentes para um problema
mais Pythonica. O objetivo de ser mais Pythonico captura a noo que programar parte
engenharia e parte arte. No estamos sempre interessados em apenas fazer um trabalho,
tambm queremos que nossa soluo seja elegante e seja apreciada como tal.

7.8 Escrevendo Arquivos


Para escrever um arquivo, voc deve abrir com o modo w como um segundo
parmetro:

> > > fout = open(output.txt, w)


> > > print fout
<open file output.txt, mode w at 0xb7eb2410>

Se o arquivo j existir, abr-lo no modo de escrita apaga todos os dados antigos,


ento tenha cuidado! Se o arquivo no existe, um novo criado.
O mtodo write manipula objetos e os coloca como dados em um arquivo.

> > > line1 = This heres the wattle,n


> > > fout.write(line1)

Novamente, o objeto do arquivo (fout) nos d o controle sobre o arquivo. Ento, se


voc chamar a funo write novamente, so adicionados novos dados ao final do arquivo.
7.9. Depurao 107

Devemos nos certificar de gerir as extremidades das linhas enquanto escrevemos


no arquivo, inserindo explicitamente o caractere de nova linha quando desejamos finalizar
uma linha. A sentena print acrescenta automaticamente o caractere de nova linha,
porm o mtodo write no o faz.

> > > line2 = the emblem of our land.n


> > > fout.write(line2)

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.

> > > fout.close()

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:

> > > s = 1 2t 3n 4


> > > print s
1 2 3
4

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 :

> > > print repr(s)


1 2t 3n 4

Isto pode ser til para depurao.


Um outro problema que voc pode se deparar a variao de caractere para
indicao de fim de linha (nova linha) nos diferentes sistemas. Alguns sistemas usam o
108 Captulo 7. Arquivos

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.

Garantia de Qualidade: pessoa ou grupo focado em assegurar a qualidade global de um


produto de software. Est frequentemente envolvido em testar um produto e identificar
problemas antes que o produto seja entregue ao usurio.

Arquivo texto: sequncia de caracteres armazenada em local permanente como um


disco rgido.

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

Voc pode fazer o download do arquivo mbox-short.txt no link4 , conforme ro-


dap.
Exerccio 7.2 Escreva um programa para perguntar por um nome de arquivo, e
ento, ler o arquivo e procurar por linhas da forma:

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.

Enter the file name: mbox.txt


Average spam confidence: 0.894128046745

Enter the file name: mbox-short.txt


Average spam confidence: 0.750718518519

Teste seu programa sobre os arquivos mbox.txt e mbox-short.txt.


Exerccio 7.3 s vezes quando programadores se chateiam ou querem ter um
mnimo de diverso, eles adicionam um Ovo de Pscoa inofensivo aos seus programas
(en.wikipedia.org/wiki/Easter_egg_(media)). Modifique o programa que pergunta
ao usurio um nome de arquivo e ento imprime uma mensagem engraada quando o
usurio digita o nome de arquivo na na boo boo. O programa deve se comportar nor-
malmente para todos os outros arquivos que existem ou que no existem. Aqui est um
exemplo da execuo do programa:

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!

Ns no estamos encorajando voc a colocar Ovos de Pscoa em seus programas -


este apenas um exerccio.
4
www.py4inf.com/code/mbox-short.txt
111

8 Listas

8.1 Uma lista uma sequncia


Assim como uma string, uma lista uma sequncia de valores. Em uma string,
os valores so caracteres; em uma lista, eles podem ser de qualquer tipo. Os valores em
uma lista so chamados de elementos ou itens.
H muitas maneiras de se criar uma lista; a maneira mais simples colocar os
elementos entre colchetes.

[10, 20, 30, 40]


[sapo crocante, bexiga de carneiro, vmito de cotovia]

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:

[spam, 2.0, 5, [10,20]]

Uma lista anexada a outra lista uma lista aninhada.


Uma lista que no contm elementos chamada de lista vazia; voc pode criar
uma lista vazia colocando colchetes sem quaisquer elementos, [].
Como de se esperar, voc pode atribuir os valores de uma lista a variveis:

> > > queijos = [Cheddar, Edam, Gouda]


> > > numeros = [17, 123]
> > > vazio = []
> > > print queijos, numeros, vazio
[Cheddar, Edam, Gouda] [17, 123] []

8.2 Listas so mutveis


A sintaxe para acessar os elementos de uma lista a mesma para acessar os ca-
racteres de uma string - com colchetes. O valor dentro dos colchetes especifica o ndice.
Lembrando que os ndices iniciam a partir do 0:

> > > print queijos[0]


Cheddar
112 Captulo 8. Listas

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.

> > > numeros = [17, 123]


> > > numeros[1] = 5
> > > print numeros
[17, 5]

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:

Qualquer inteiro pode ser usado como ndice.

Se voc tenta ler ou escrever um elemento que no existe, voc obtm um erro do
tipo IndexError.

Se um ndice possui um valor negativo, o acesso ao elemento da lista feito a partir


do final da lista.

Pode-se usar o operador in em listas tambm.

> > > queijos = [Cheddar, Edam, Gouda]


> > > Edam in queijos
True
> > > Brie in queijos
False

8.3 Leitura de uma lista


A maneira mais comum de ler os elementos de uma lista com uma estrutura de
repetio for. A sintaxe a mesma da usada em strings:

for queijo in queijos:


print queijo

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

Essa estrutura de repetio l a lista e atualiza cada elemento. len retorna o


nmero de elementos na lista. range retorna uma lista de ndices de 0 n-1, onde n o
valor retornado por len. Durante a estrutura for, i possui o valor do ndice do prximo
elemento. O comando de atribuio usa o i para ler o valor antigo do elemento e atribuir
um novo valor.
A estrutura for de uma lista vazia nunca executada:

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:

[spam, 1, [Brie, Roquefort, Pol le Veq], [1, 2, 3]]

8.4 Operaes em listas


O operador + concatena listas:

> > > a = [1, 2, 3]


> > > b = [4, 5, 6]
> > > c = a + b
> > > print c
[1, 2, 3, 4, 5, 6].

Similarmente, o operador * repete uma lista um dado nmero de vezes:

> > > [0] * 4


[0, 0, 0, 0]
> > > [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

O primeiro exemplo repete a lista [0] quatro vezes. O segundo exemplo repete a
lista [1, 2, 3] trs vezes.

8.5 Fragmentando listas


O operador slice tambm funciona em listas:
114 Captulo 8. Listas

> > > t = [a, b, c, d, e, f]


> > > t[1:3]
[b, c]
> > > t[:4]
[a, b, c, d]
> > > t[3:]
[d, e, f]

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.

> > > t[:]


[a, b, c, d, e, f]

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.

> > > t = [a, b, c, d, e, f]


> > > t[1:3] = [x, y]
> > > print t
[a, x, y, d, e, f]

8.6 Mtodos em listas

Python fornece mtodos para operar em listas. Por exemplo, append adiciona um
novo elemento ao final de uma lista:

> > > t = [a, b, c]


> > > t.append(d)
> > > print t
[a, b, c, d]

extend recebe uma lista como um argumento e adiciona todos os elementos desta
lista ao final da outra lista:
8.7. Deletando elementos 115

> > > t1 = [a, b, c]


> > > t2 = [d, e]
> > > t1.extend(t2)
> > > print t1
[a, b, c, d, e]

Neste caso, t2 no alterado.


sort ordena os elementos da lista do menor para o maior:

> > > t = [d, c, e, b, a]


> > > t.sort()
> > > print t
[a, b, c, d, e]

A maioria dos mtodos em listas so do tipo void; eles modificam a lista e no


retornam nenhum valor (None). Se voc acidentalmente digitar t = t.sort(), voc ficar
desapontado com o resultado.

8.7 Deletando elementos

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:

> > > t = [a, b, c]


> > > x = t.pop(1)
> > > print t
[a, c]
> > > print x
b

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:

> > > t = [a, b, c]


> > > del t[1]
> > > print t
[a, c]

Se voc sabe o elemento que quer remover (mas no sabe o ndice), voc pode usar
o remove:
116 Captulo 8. Listas

> > > t = [a, b, c]


> > > t.remove(b)
> > > print t
[a, c]

O valor retornado por remove None.


Para remover mais de um elemento, voc pode usar del justamente com o operador
slice:

> > > t = [a, b, c, d, e, f]


> > > del t[1:5]
> > > print t
[a, f]

Como sempre, a fatia seleciona todos os elementos at o elemento anterior ao


segundo ndice.

8.8 Listas e funes

Existem algumas funes internas que podem ser usadas em listas. Tais funes
evitam a utilizao de estruturas de repetio:

> > > nums = [3, 41, 12, 9, 74, 15]


> > > print len(nums)
6
> > > print max(nums)
74
> > > print min(nums)
3
> > > print sum(nums)
154
> > > print sum(nums)/len(nums)
25

A funo sum() apenas funciona quando os elementos da lista so nmeros. As


outras funes (max(), len(), etc.) funcionam com listas de strings e outros tipos que
podem ser comparados.
possvel reescrever o programa anterior que calcula a mdia de uma lista de
nmeros digitados pelo usurio.
Primeiro, o programa para calcular uma mdia sem uma lista:
8.9. Listas e Strings 117

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

media = total / cont


print Mdia:, media

Neste programa, ns temos a varivel cont para contar a quantidade de nmeros


que o usurio digita e a varivel total que soma os nmeros digitados.
Ns podemos simplesmente armazenar os nmeros que o usurio digitou e utilizar
funes internas para calcular o total e cont no final.

numvet = list()
while ( True ) :
inp = raw_input(Digite um nmero: )
if inp == pronto : break
valor = float(inp)
numvet.append(valor)

media = sum(numvet) / len(numvet)


print Mdia:, media

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.

8.9 Listas e Strings

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:

> > > s = spam


> > > t = list(s)
> > > print t
[s, p, a, m]
118 Captulo 8. Listas

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:

> > > s = ansiado para os fiordes


> > > t = s.split()
> > > print t
[ansiado, para, os, fiordes]
> > > print t[2]
os

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:

> > > s = spam-spam-spam


> > > delimitador = -
> > > s.split(delimitador)
[spam, spam, spam]

join o inverso de split. Concatena os elementos de uma lista de strings. Como


join um mtodo de string, ento voc deve cham-lo para o delimitador e passar a lista
como parmetro:

> > > t = [ansioso, para, a, viagem]


> > > delimitador =
> > > delimitador.join(t)
ansioso para a viagem

Nesse caso, o delimitador um espao ento join coloca um espao entre as


palavras. Para concatenar strings sem espaos, voc pode usar uma string vazia, ,
como delimitador.

8.10 Analisando linhas


Usualmente, quando estamos lendo um arquivo, queremos fazer algo a mais com
as linhas que apenas imprimir a linha inteira. Frequentemente, queremos achar as li-
8.11. Objetos e Valores 119

nhas interessantes e analisar a linha para encontrar a parte interessante da linha. E se


quisssemos imprimir o dia da semana das linhas que comeam com a palavra From?

From stephen.marquart@uct.ac.za Sab Jan 5 09:14:16 2008

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]

Note que a forma contrada da sentena if foi utilizada. Assim, colocamos o


continue na mesma linha que o if. Essa forma contrada da funo if funciona da
mesma maneira como se o continue estivesse na linha seguinte e identado.
O programa produz as seguintes sadas:

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.

8.11 Objetos e Valores


Se executarmos as instrues de atribuio:

> > > a = banana


> > > b = banana

Sabemos que ambos, a e b, referem-se a uma string, mas no sabemos se referem-se


mesma string. H duas possibilidades:
No primeiro caso, a e b referem-se a dois objetos diferentes que possuem o mesmo
valor. No segundo caso, eles se referem ao mesmo objeto.
120 Captulo 8. Listas

Para verificar se duas variveis referem-se ao mesmo objeto, pode-se usar o opera-
dor is.

> > > a = banana


> > > b = banana
> > > a is b
True

Nesse exemplo, Python criou apenas um objeto string e ambos, a e b, se referem


a ele.
Mas quando se cria duas listas, h dois objetos:

> > > a = [1, 2, 3]


> > > b = [1, 2, 3]
> > > a is b
False

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:

> > > a = [1, 2, 3]


> > > b = a
> > > b is a
True

A associao de uma varivel com um objeto se denomina uma referncia. Nesse


exemplo, h duas referncias ao mesmo objeto.
8.13. Listas como Argumentos 121

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:

> > > b[0] = 17


> > > print a
[17, 2, 3]

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

Quase nunca faz diferena se a e b se referem a mesma string ou no.

8.13 Listas como Argumentos

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]

Aqui est uma chamada funo delete_head:

> > > letras = [a, b, c]


> > > delete_head(letras)
> > > print letras
[b, c]

O parmetro t e a varivel letras so pseudnimos para o mesmo objeto.


importante distinguir operaes que modificam listas e operaes que criam
novas listas. Por exemplo, o mtodo append modifica uma lista, mas o operador + cria
uma nova lista:
122 Captulo 8. Listas

> > > t1 = [1, 2]


> > > t2 = t1.append(3)
> > > print t1
[1, 2, 3]
> > > print t2
None

> > > t3 = t1 + [3]


> > > print t3
[1, 2, 3]
> > > t2 is t3
False

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:]

Essa funo deixa a lista original sem modificaes.

> > > letras = [a, b, c]


> > > resto = tail(letras)
> > > print resto
[b, c]

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:

1. No esquea de que a maioria dos mtodos de listas modifica o elemento e retorna


None. Isso o oposto do mtodo de string, que retorna uma nova string e no altera
a original.

Se voc est acostumado a escrever cdigos de string assim:

palavra = palavra.strip()

tentador escrever cdigo de lista assim:

t = t.sort() # !WRONG!

Como sort retorna None, a prxima operao com t provavelmente fracassar.

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.

2. Escolha um idioma e se atenha a ele.

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.

Para adicionar um elemento, pode-se usar o mtodo append ou o operador +. Mas


no se esquea de que esses esto certos:

t.append(x)
t = t + [x]

E esses esto errados:

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.

3. Faa cpias para evitar pseudnimos.

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!

4. Listas, split e arquivos

Quando lemos e analisamos arquivos, h tantas oportunidades para encontrarmos


entradas que possam arruinar nosso programa que uma boa ideia revisitar o padro
guardio quando se trata de escrever programas que leem um arquivo e procuram
por uma agulha no palheiro.

Vamos revisitar o programa que busca o dia da semana nas linhas From do nosso
arquivo:

From stephen.marquard@uct.ac.za Sab Jan 5 09:14:16 2008

J que estamos separando essa linha em palavras, podemos dispensar o uso de


startswith e apenas olhar a primeira palavra de cada linha para determinar se
estamos interessados na linha. Podemos usar continue para pular linhas que no
tm From como a primeira palavra:

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.

for line in fhand:


palavras = line.split()
print Debug:, palavras
if palavras[0] != From : continue
print palavras[2]

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.

Debug: [X-DSPAM-Confidence:, 0.8475]


Debug: [X-DSPAM-Probability:, 0.0000]
Debug: []
Traceback (most recent call last):
File search9.py, line 6, in <module>
if palavras[0] != From : continue
IndexError: list index out of range

Cada linha de impresso do comando print Debug:, palavras, est imprimindo


a lista de palavras que recebemos quando dividimos (split) a linha em palavras.
Quando o programa falha, a lista de palavras est vazia ([]). Se abrirmos o arquivo
em um editor de texto e olharmos, nesse ponto ele assim:
126 Captulo 8. Listas

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]

Primeiro deixamos a instruo print Debug:, palavras comentada ao invs de


remov-la, caso a modificao falhe e ela seja necessria novamente. Ento, adicio-
namos um guardio que checa se h zero palavras e, se esse o caso, usa continue
para pular para a prxima linha do arquivo.
Podemos pensar nos dois continue como nos ajudando a refinar os conjuntos de
linhas que so interessantes para ns e quais queremos processar um pouco mais.
Uma linha sem palavras desinteressante, ento pulamos para a prxima linha.
O mesmo acontece com uma linha que no comea com From.
O programa modificado executado com sucesso, ento talvez esteja correto. Nosso
guardio certifica-se de que palavras[0] nunca falhe, mas talvez no seja o suficiente.
Quando estamos programando, devemos sempre nos perguntar, O que pode dar
errado?.
Exerccio 8.2 Descubra qual linha do programa anterior ainda no est guardada
propriamente. Tente construir um caso de teste que faa o programa falhar e o
modifique para que a linha esteja guardada apropriadamente e teste para ter certeza
de que ele seja capaz de avaliar seu novo caso de teste.
8.15. Glossrio 127

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.

equivalente: duas variveis que armazenam o mesmo valor.

idntico: ser o mesmo objeto (implica equivalncia).

ndice: valor inteiro que indica um elemento em uma lista.

lista: sequncia de valores.

lista aninhada: lista que contm como elemento outra lista.

objeto: elemento ao qual uma varivel pode se referir. Possui um tipo e um valor.

percurso em lista: acesso sequencial aos elementos de uma lista.

pseudnimo: circunstncia na qual duas ou mais variveis se referem ao mesmo ob-


jeto.

referncia: associao entre uma varivel e seu 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

Quando o programa estiver completo, organize e imprima as seguintes palavras


em ordem alfabtica.

Informe o arquivo: romeo.txt


{Levantar, Mas, Ele, Julieta, Quem, j, e, quebra, leste,
invejoso, justo, dor, ser, matar, luz, Lua, plida, doente,
macio, sol, o, atravs, que, janela, com, l}

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.

From stephen.marquard@uct.ac.za Sab Jan 5 09:14:16 2008

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:

Insira o nome de um arquivo: mbox-short.txt


stephen.marquard@uct.ac.za
louis@media.berkeley.edu
zqian@umich.edu

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

Um dicionrio como uma lista, porm mais generalizado. Em uma lista, as


posies (ndices) tm que ser nmeros inteiros; em um dicionrio os ndices podem ser
(quase) de qualquer tipo.
Voc pode pensar em um dicionrio como um mapeamento entre um conjunto de
ndices (que so chamados de chaves) e um conjunto de valores. Cada chave mapeada
para um valor. A associao de uma chave e um valor chamado de par chave-valor ou
s vezes um item.
Como um exemplo, vamos implementar um dicionrio que mapeia palavras do
Ingls para o Espanhol, assim as chaves e os valores so todos do tipo string.
A funo dict cria um novo dicionrio sem itens, ou seja, cria um dicionrio vazio.
Como dict o nome de uma funo da linguagem, voc deve evitar us-la como nome
de varivel.

> > > eng2sp = dict()


> > > print eng2sp
{}

As chaves, {}, representam um dicionrio vazio. Para adicionar itens a ele, voc
pode usar colchetes:

> > > eng2sp[one] = uno

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:

> > > print eng2sp


{one: uno}

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

Agora, se voc imprimir eng2sp, voc pode se surpreender:


132 Captulo 9. Dicionrios

> > > print eng2sp


{ one: uno, three: tres, two: dos }

A ordem dos pares chave-valor no a mesma dada no momento da criao do


dicionrio. Na verdade, se voc digitar o mesmo exemplo no seu computador, voc ter
um resultado diferente. Em geral, a ordem dos itens num dicionrio imprevisvel.
Mas isso no um problema porque os elementos de um dicionrio nunca so
indexados com ndices inteiros. Ao invs disso, voc usa as chaves (keys) para ver os
valores correspondentes.

> > > print eng2sp[two]


dos

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:

> > > print eng2sp[four]


KeyError: four

A funo len tambm opera em dicionrios, retornando o nmero de pares chave-


valor:

> > > len(eng2sp)


3

O operador in para dicionrios indica se um determinado valor aparece como uma


chave no dicionrio e no como um valor.

> > > one in eng2sp


True
> > > uno in eng2sp
False

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:

> > > vals = eng2sp.values()


> > > uno in vals
True
9.1. Dicionrio como um conjunto de contadores 133

O operador in implementa diferentes algoritmos para listas e dicionrios. Para


listas, utilizado um algoritmo de busca linear. Quando a lista cresce, o tempo de busca
cresce proporcional ao tamanho da lista. Para dicionrios, Pyhton usa um algoritmo
chamado hash table que tem uma notvel propriedade; o operador in demora a mesma
quantidade de tempo independente do nmero de itens existentes no dicionrio. No
explicarei por que funes hash so to mgicas, mas voc pode ler mais sobre isso em
wikipedia.org/wiki/Hash_table.
Exerccio 9.1 Escreva um programa que leia palavras em words.txt e as arma-
zene como chaves em um dicionrio. No importa o que os valores so. Ento voc pode
usar o operador in como um meio rpido de verificar se uma string est no dicionrio.

9.1 Dicionrio como um conjunto de contadores


Suponha que voc tenha recebido uma string e quer contar quantas vezes cada
letra aparece nesta string. H vrias maneiras de se fazer isso:

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

Ns estamos efetivamente calculando um histograma, que um termo estatstico


para um conjunto de contadores (ou frequncias).
A estrutura for examina a string. A cada execuo do for, se o caractere c no
est no dicionrio, criamos um novo item com chave c e um valor inicial 1 (desde que
vimos essa letra uma vez). Se c j est no dicionrio ns incrementamos d[c].
A seguir a sada do programa:

{ a : 1, b : 1, o : 2, n : 1, s : 2, r : 2, u : 2, t:1 }

O histograma indica que as letras a e b aparecem uma vez; o aparece duas, e


assim por diante.
Dicionrios tm um mtodo chamado get que recebe uma chave e um valor padro.
Se a chave aparece no dicionrio, get retorna o valor correspondente; caso contrrio ela
retorna o valor padro. Por exemplo:

> > > counts = chuck : 1, annie : 42, jan : 100


> > > print count.get(jan , 0)
100
> > > print counts.get(tim , 0)
0

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

O uso do mtodo get para simplificar essa estrutura de repetio de contagem


acaba sendo uma prtica muito comum em Python e, por isso, vamos us-lo muitas vezes
9.2. Dicionrios e arquivos 135

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.

9.2 Dicionrios e arquivos

Um dos usos comuns de um dicionrio para contar a ocorrncia das palavras em


um arquivo com algo escrito. Vamos comear com um arquivo muito simples de palavras
obtidas de um texto de Romeu e Julieta1 .
Para o primeiro conjunto de exemplos, usaremos uma verso encurtada e simplifi-
cada do texto sem pontuao. Depois vamos trabalhar com o texto da cena com pontuao
includa.

But soft what light through yonder window breaks


It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

Escreveremos um programa em Python para ler as linhas do arquivo, quebrar cada


linha em uma lista de palavras e, em seguida, percorrer cada uma das palavras na linha,
e contar cada palavra usando um dicionrio.
Voc ver que temos duas estruturas for. A estrutura de repetio externa est
lendo as linhas do arquivo e a interna est repetindo, em cada uma das palavras, de
uma linha em particular. Esse um exemplo de um padro chamado de estrutura de
repetio aninhada porque uma das estruturas a estrutura de fora e a outra a
estrutura de dentro.
Devido estrutura de repetio interna executar todas as iteraes cada vez que
a estrutura de repetio externa faz uma nica iterao, pensamos que a estrutura de
repetio interna itera mais rapidamente e a externa mais devagar.
A combinao das duas estruturas aninhadas garante que vamos contar todas as
palavras em todas as linhas do arquivo de entrada.

1
Agradecimentos a http://shakespeare.mit.edu/Tragedy/romeoandjuliet/romeo_juliet.2.2.html
136 Captulo 9. Dicionrios

fname = raw_input ( Digite o nome do arquivo: )


try:
fhand = open(fname)
except:
print Arquivo no pode ser aberto: , fname
exit()
counts = dict()
for line in fhand:
words = line.split()
for word in words:
if word not in counts:
counts[word] = 1
else:
counts[word] +=1

print counts

Quando executamos o programa, vemos ao final, a impresso de todos os conta-


dores sem ordenao (o arquivo romeo.txt pode ser encontrado no link2 ).

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 }

um pouco inconveniente buscar no dicionrio a palavra mais comum e o seu


contador, ento precisamos adicionar um pouco mais ao cdigo Python para que tenhamos
uma sada mais til.

9.3 Estruturas de repetio e dicionrios


Se voc usa um dicionrio como a sequncia em uma estrutura de repetio for,
ele examina as chaves do dicionrio. A estrutura de repetio a seguir imprime cada chave
e seu valor correspondente.

counts = { chuck : 1, annie : 42, jan : 100 }


for key in counts:
print key, counts[key]

2
www.py4inf.com/code/romeo.txt
9.3. Estruturas de repetio e dicionrios 137

A sada mostrada a seguir:

jan 100
chuck 1
annie 42

Novamente, as chaves no esto em uma ordem pr-definida.


Podemos usar este padro para implementar estruturas de repetio sobre dicion-
rios que atuam como contadores. Por exemplo, se voc quer encontrar todas as entradas
em um dicionrio com um valor acima de 10, podamos escrever o seguinte cdigo:

counts = { chuck : 1, annie : 42, jan : 100 }


for key in counts:
if counts[key] > 10 :
print key, counts[key]

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

Apenas as entradas com um valor acima de 10 so mostradas.


Se voc quer imprimir as chaves em ordem alfabtica, primeiro voc cria uma
lista de chaves em um dicionrio usando o mtodo keys disponvel em objetos do tipo
dicionrio, e, em seguida, ordena essa lista e percorra a lista ordenada, visualizando a
impresso dos pares chave/valor na ordem de classificao, como segue:

counts = { chuck : 1, annie : 42, jan : 100 }


lst = counts.keys()
print lst
lst.sort()
for key in lst:
print key, counts[key]

A sada ficaria como:


138 Captulo 9. Dicionrios

[ jan , chuck , annie ]


annie 42
chuck 1
jan 100

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.

9.4 Anlise avanada de texto


No exemplo anterior, removemos os sinais de pontuao do arquivo romeo.txt. O
texto original tem vrias pontuaes como mostrado abaixo:

But, soft! what light through yonder window breaks?


It is the east, and Juliet is the sun.
Arise, fair sun, and kill the envious moon,
Who is already sick and pale with grief,

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:

string.translate(s, table[, deletechars])

Remova todos os caracteres de s que esto em deletechars (caso existam), e ento


traduza os caracteres usando table, que deve ser uma string de 256 caracteres retornando
a traduo para cada caractere vlido, indexado pelo original. Se table for None, ento
somente o passo de remoo do caractere executado.
No vamos especificar table, mas vamos usar o parmetro deletechars para
remover todas as pontuaes. Segue o comando que faz com que o Python nos mostre a
lista de caracteres que so considerados como caracteres de pontuao:
9.4. Anlise avanada de texto 139

> > > import string


> > > string.ponctuation
! "# % & \()*+,-./:;<=>?@[\\]^_{|}

Segue o novo cdigo para realizar a contagem de palavras do texto romeo.txt,


agora pontuado.

import string # Novo cdigo

fname = raw_input(Digite o nome do arquivo: )


try:
fhand = open(fname)
except:
print Arquivo no pode ser aberto: , fname
exit()

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

Usamos translate para remover todas as pontuaes e lower para transformar


todos os caracteres da linha em minsculos. De resto, o cdigo no foi alterado. Note
que para Python 2.5 e anteriores, translate no aceita None como o primeiro parmetro
ento use esse cdigo para a chamada do translate:

print a.translate(string.maketrans( , ), string.punctuation

Parte do aprendizado do Art of Python ou Thinking Pythonically est con-


cretizando que Python muitas vezes tem capacidades internas para muitos problemas de
anlise de dados comum. Com o tempo, voc ter visto exemplos de cdigos o suficiente
e ter lido a documentao o bastante para saber onde procurar se algem j escreveu
algo que torna seu trabalho mais fcil.
A seguir est uma verso abreviada da sada:
140 Captulo 9. Dicionrios

Digite o nome do arquivo: romeo-full.txt


{swearst: 1, all: 6, afeard: 1, leave: 2, these: 2,
kinsmen: 2, what: 11, thinkst: 1, love: 24, cloak: 1,
a: 24, orchard: 2, light: 5, lovers: 2, romeo: 40,
maiden: 1, whiteupturned: 1, juliet: 32, gentleman: 1,
it: 22, leans: 1, canst: 1, having: 1, ...}

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:

Reduza a entrada: Se possvel, reduza o tamanho do conjunto de dados. Por exem-


plo, se o programa l um arquivo de texto, comece apenas com as 10 primeiras linhas, ou
com o menor exemplo que voc pode achar. Voc pode ou editar os arquivos, ou (melhor)
modificar o programa para ler apenas as primeiras n linhas.
Se houver um erro, voc pode reduzir n para o menor valor em que o erro acontece
e, ento, incrementar gradualmente o valor de n, at que voc encontre e corrija os erros.

Confira os resumos e os tipos: Ao invs de imprimir e conferir o conjunto de da-


dos inteiro, considere resumos de impresso dos dados: por exemplo, o nmero de itens
em um dicionrio ou o total de uma lista de nmeros.
Um caso comum de erro em tempo de execuo um valor que no do tipo certo.
Para depurar esse tipo de erro, suficiente s imprimir o tipo de um valor.

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

Imprima adequadamente a sada: Formatar bem a sada da depurao pode tor-


nar mais fcil a tarefa de encontrar o erro.

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.

hash table: o algoritmo usado para implementar dicionrios em Python.

funes hash: funo usada por uma hash table para computar a localizao de uma
chave.

histograma: conjunto de contadores.

implementao: modo de realizar um clculo.

item: outro nome para um par chave-valor.

chave: objeto que aparece em um dicionrio como a primeira parte de um par chave-valor.

par chave-valor: representao do mapeamento de uma chave para um valor.

estruturas de repetio aninhadas: uma ou mais estruturas de repetio dentro


de outra estrutura de repetio. A estrutura de repetio interna executada at a con-
cluso cada vez que a estrutura de repetio externa executada.

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.3 Escreva um programa que leia um log de e-mails e construa um


histograma usando um dicionrio para contar quantas mensagens vem de cada endereo
de e-mail. Imprima o dicionrio.

Digite o nome do arquivo: mbox-short.txt


{gopal.ramasammycook@gmail.com: 1, louis@media.berkeley.edu: 3,
cwen@iupui.edu: 5, antranig@caret.cam.ac.uk: 1,
rjlowe@iupui.edu: 2, gsilver@umich.edu: 3,
david.horwitz@uct.ac.za: 4, wagnermr@iupui.edu: 1,
zqian@umich.edu: 4, stephen.marquard@uct.ac.za: 2,
ray@media.berkeley.edu: 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.

Digite o nome do arquivo: mbox-short.txt


cwen@iupui.edu 5

Digite o nome do arquivo: mbox.txt


zqian@umich.edu 195

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

10.1 Tuplas so imutveis


Uma tupla1 uma sequncia de valores muito parecida com uma lista. Os valores
armazenados em uma tupla podem ser de qualquer tipo, e so indexados por nmeros
inteiros. A diferena importante que tuplas so imutveis. Tuplas tambm so compa-
rveis e podem ser buscadas por hash de forma que podemos classificar listas de tuplas
e usarmos as tuplas como chaves em dicionrios Python.
Sintaticamente, uma tupla uma lista de valores separados por vrgula:

> > > t = a, b, c, d, e

Entretanto, isso no necessrio, comum valores de tuplas entre parnteses para


nos ajudar a identific-las rapidamente dentro do cdigo Python.

> > > t = (a, b, c, d, e)

Para criar uma tupla de um nico elemento, deve-se acrescentar uma vrgula no
final:

> > > t1 = (a,)


> > > type(t1)
<type tuple>

Sem a vrgula, o Python interpreta o (a) como string

> > > t2 = (a)


> > > type(t2)
<type str>

Outro jeito de criar uma tupla usando a funo tuple. Sem nenhum argumento,
ele cria uma tupla vazia:

> > > t = tuple()


> > > print t
()

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

Se o argumento for uma sequncia (string, lista ou tupla), o resultado da chamada


para tuple uma tupla com os elementos da sequncia:

> > > t = tuple(margarida)


> > > print t
(m, a, r, g, a, r, i, d, a,)

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:

> > > t = (a, b, c, d, e)


> > > print t[0]
a

E o operador de slice(:) seleciona um intervalo de elementos:

> > > print t[1:3]


(b,c)

Mas se voc tentar modificar um dos elementos da tupla, voc ter um erro:

> > > t[0] = A


TypeError: object doesnt support item assignment

Voc no pode modificar os elementos de uma tupla, mas voc pode substituir
uma tupla por outra:

> > > t = (A,) + t[1:]


> > > print t
(A,b,c,d,e)

10.2 Comparando tuplas

O operador de comparao trabalha com tuplas e outras sequncias; Python co-


mea pela comparao do primeiro elemento de cada sequncia. Se eles forem iguais, a
compara co segue para o prximo elemento, e assim por diante, at que encontre um pri-
meiro elemento que difere. Elementos de subsequncia no so considerados (nem mesmo
se forem muito grandes).
10.2. Comparando tuplas 145

> > > (0, 1, 2) < (0, 3, 4)


True
> > > (0, 1, 2000000) < (0, 3, 4)
True

A funo sort funciona do mesmo jeito. Ordena primeiramente pelo primeiro


elemento, mas em caso de empate, ela ordena pelo segundo elemento, e assim por diante.
Essa caracterstica leva a um padro chamado de DSU

Decorate: adiciona uma ou mais chaves de ordenao em posies anteriores aos ele-
mentos da lista.

Sort: ordene a lista de tuplas usando a funo sort do Python, e

Undecorate: extraia os elementos ordenados da sequncia.


Por exemplo, suponha que h uma lista de palavras e voc quer orden-las por
tamanho, da maior para a menor:

txt = but soft what light in yonder window breaks


words = txt.split()
t = list()
for word in words:
t.append((len(word), word))

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

[yonder, window, breaks, light, what, soft, but, in]

claro que as linhas perdem um pouco do seu impacto potico quando transfor-
mados em uma lista Python em ordem decrescente de tamanho.

10.3 Atribuio de tuplas

Uma das caractersticas sintticas da linguagem Python a possibilidade de ter


uma tupla no lado esquerdo de um comando de atribuio. Isso permiti atribuir mais de
uma varivel por vez quando o lado esquerdo uma sequncia.
Nesse exemplo temos dois elementos lista (que so sequncias), isso permite atri-
buir o primeiro e o segundo elementos da sequncia para as variveis x e y em uma nica
sentena.

> > > m = [have, fun]


> > > x, y = m
> > > x
have
> > > y
fun
> > >

Isso no mgica. Python traduz grosseiramente para a seguinte sintaxe:2

> > > m = [have, fun]


> > > x = m[0]
> > > y = m[1]
> > > x
have
> > > y
fun
> > >

Quando usamos uma tupla no lado esquerdo da sentena de atribuio, omitimos


os parnteses, mas a seguinte um sintaxe igualmente vlida:

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

> > > m = [have,fun]


> > > (x, y) = m
> > > x
have
> > > y
fun
> > >

Uma aplicao particularmente inteligente de atribuio de tuplas permitir que


troquemos o valor de duas variveis em uma nica sentena:

> > > a, b = b, a

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:

> > > a, b = 1, 2, 3


ValueError: too many values to unpack

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:

> > > addr = monty@python.org


> > > uname, domain = addr.split(@)

O valor de retorno do split uma lista com dois elementos; o primeiro elemento
atribuido para uname, o segundo para domain:

> > > print uname


monty
> > > print domain
python.org

10.4 Dicionrios e tuplas


Dicionrios possui um mtodo chamado items que retorna uma lista de tuplas,
onde cada tupla um par chave-valor3 .
3
Este comportamento levemente diferente em Python 3.0
148 Captulo 10. Tuplas

> > > d = {a:10,b:1,c:22}


> > > t = d.items()
> > > print t

[(a, 10), (c, 22), (b, 1)]

Como voc j deve esperar de um dicionrio, os itens no esto em uma ordem


particular.
No entanto, uma vez que a lista de tuplas uma lista, e tuplas so comparveis,
podemos agora ordenar a lista de tuplas. Converter um dicionrio para uma lista de tuplas
uma forma de apresentar o contedo de um dicionrio ordenado pela chave.

> > > d = {a:10, b:1, c:22}


> > > t = d.items()
> > > t
[(a, 10), (c, 22), (b, 1)]
> > > t.sort()
> > > t
[(a, 10), (b, 1), (c, 22)]

A nova lista ordenada em ordem alfabtica crescente pelo valor da chave.

10.5 Atribuio mltipla com dicionrios


Combinando items, atribuio de tuplas e for, possvel construir um padro de
cdigo bom para percorrer as chaves e valores de um dicionrio em uma nica estrutura
de repetio:

for key, val in d.items():


print val, key

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.

> > > d = {a:10, b:1, c:22}


> > > l = list()
> > > for key, val in d.items() :
... l.append( (val, key) )
...
> > > l
[(10, a), (22, c), (1, b)]
> > > l.sort(reverse=True)
> > > l
[(22, c), (10, a), (1, b)]
> > >

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.

10.6 As palavras mais comuns

Voltando ao nosso exemplo de execuo do texto de Romeu e Julieta Act 2, Cena 2,


podemos aumentar o nosso programa para usar esta tcnica para imprimir as dez palavras
mais comuns no texto da seguinte forma:
150 Captulo 10. Tuplas

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

# Sort the dictionary by value


lst = list()
for key, val in counts.items():
lst.append( (val, key) )

lst.sort(reverse=True)

for key, val in lst[:10] :


print key, val

A primeira parte do programa que l o arquivo e constroi o dicionrio que mapeia


cada palavra para a contagem de palavras no documento no alterado. Mas, em vez de
simplesmente imprimir counts e terminar o programa, construmos uma lista de tuplas
(val, key) e, em seguida, ordenamos a lista em ordem decrescente.
Uma vez que o valor vem em primeiro lugar na lista, ele vai ser usado para as
comparaes e, se houver mais do que uma tupla com o mesmo valor, o segundo elemento
(a chave) ser avaliado, assim nas tuplas de mesmo valor, estas sero ordenadas pela
chave.
No final, escrevemos uma estrutura de repetio for que faz uma iterao de
atribuio mltipla e imprime as dez palavras mais comuns por iterar atravs de uma
fatia da lista (lst[: 10]).
Ento, agora a sada finalmente se parece com o que queremos para a nossa anlise
de freqncia de palavras.
10.7. Usando tuplas como chaves em dicionrios 151

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.

10.7 Usando tuplas como chaves em dicionrios


Como tuplas so armazenadas em forme de hash e listas no, se quisermos criar
uma chave composta para usar em um dicionrio, devemos usar uma tupla como a chave.
Uma chave composta seria apropriada, se quisssemos criar uma lista telefnica
que mapeia, a partir do ltimo e do primeiro nome, para nmeros de telefone. Assumindo
que definimos as variveis last, first e number, poderamos escrever uma declarao de
atribuio de dicionrio da seguinte forma:

directory[last,first] = number

A expresso entre colchetes uma tupla. Ns poderamos usar atribuio de tupla


em uma estrutura de repetio for para percorrer este dicionrio.

for last, first in directory:


print first, last, directory[last,first]

Esta estrutura de repetio percorre as chaves em directory, que so tuplas. Ele


atribui os elementos de cada tupla para last e first, e imprime o nome correspondente
do nmero de telefone.

10.8 Sequncias: strings, listas and tuplas


Tenho focado em listas de tuplas, mas quase todos os exemplos neste captulo
tambm trabalham com listas de listas, tuplas de tuplas, e tuplas de listas. Para evi-
tar enumerar as combinaes possveis, s vezes mais fcil falar sobre sequncias de
152 Captulo 10. Tuplas

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:

1. Em alguns contextos, como em uma instruo return, sintaticamente mais simples


criar uma tupla do que uma lista. Em outros contextos, voc pode preferir uma lista.

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

Como as tuplas so imutveis, elas no fornecem mtodos como sort e reverse,


que modificam listas existentes. No entanto, Python fornece as funes embutidas sorted
e reversed, que recebe qualquer sequncia como parmetro e retornam uma nova lista
com os mesmos elementos em uma ordem diferente.

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

realmente quer dizer.

running: Experimente fazer mudanas e executar diferentes verses. Frequentemente


se voc mostra a coisa certa no lugar certo no programa, o problema torna-se bvio, mas
s vezes voc tem de gastar mais tempo para construir casos de validao.

ruminating: Gaste um tempo pensando! Que tipo de erro : sintaxe, em tempo de


execuo, semntica? Que informao voc obtm das mensagens de erro, ou da sada do
programa? Que tipo de erro podia causar o problema que voc est vendo? O que voc
mudou por ltimo, antes do problema aparecer?

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

Em seguida, voc pode colar as peas de volta, um pouco de cada vez.


Encontrar um erro grave requer leitura, execuo, reflexo, e s vezes recuar. Se
voc ficar preso a uma dessas atividades, tente as outras.

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.

estrutura de dados: coleo de valores relacionados, frequentemente organizados em


listas, dicionrios, tuplas, etc.

DSU: abreviao de decorate-sort-undecorate. Um padro que envolve construir uma


lista de tuplas, orden-las e extrair parte do resultado.

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.

scatter: operao de tratar uma sequncia como uma lista de argumentos.

forma (de uma estrutura de dados): resumo do tipo, tamanho e composio de


uma estrutura de dados.

singleton: lista (ou outra sequncia) com um nico elemento.

tupla: sequncia imutvel de elementos.

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

(commits) atravs da criao de uma lista de tuplas (contador, e-mail) do dicionrio e


ento ordena a lista em ordem decrescente e imprima a pessoa que tem mais submisses.

Exemplo de linha:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

Digite o nome do arquivo: mbox-short.txt


cwen@iupui.edu 5

Digite o nome do arquivo: mbox.txt


zqian@umich.edu 195

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

Exerccio 10.3 Escreva um programa que leia um arquivo e imprima as letras


em ordem decrescente de frequncia. Seu programa deve converter todas as entrada para
minsculo e somente contar as letras de a-z. Seu programa no deve contar espaos, dgitos,
pontuao ou qualquer outros que no sejam as letras de a-z. Encontre exemplos de textos
de diferentes linguagens e veja como a frequncia das letras variam entre as linguagens.
Compare seu resultado com as tabelas em wikipedia.org/wiki/Letter_frequencies.

Das könnte Ihnen auch gefallen