Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Campo Grande - MS
Maio de 2015
Campo Grande - MS
Maio de 2015
Lista de ilustraes
Figura
Figura
Figura
Figura
1
2
3
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 9
. 11
. 11
. 13
Figura
Figura
Figura
Figura
5
6
7
8
Execuo
Execuo
Execuo
Execuo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
de
de
de
de
uma
uma
uma
uma
sentena condicional . . . . . .
sentena condicional alternativa
condio em cadeia . . . . . . .
sentena condicional agrupada .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
45
46
47
48
Sumrio
1 Por que voc deve aprender a programar? . . . . . . . . . . . . . . . . . . .
1.1
Criatividade e Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2
1.3
Entendendo Programao . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4
Palavras e sentenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5
1.6
1.7
Escrevendo um programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.8
O que um programa? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.9
Os blocos de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
. . . . . . . . . . . . . . . . . . 11
Valores e tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2
Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3
2.4
Sentenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5
Operadores e operandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.6
Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7
2.8
Operador de mdulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.9
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
3.8
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
4.4
Nmeros aleatrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.5
Funes matemticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.6
4.7
4.8
Fluxo de execuo
4.9
Parmetros e Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Atualizando variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.2
A instruo while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3
Loops infinitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.4
5.5
5.6
5.7
Padres de Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.7.1
5.7.2
5.8
Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.9
Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.1
6.2
6.3
6.4
Fragmentando Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
6.5
6.6
6.7
O operador in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.8
6.9
Mtodos de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Persistncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.2
Abrindo arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3
7.4
7.5
7.6
7.7
7.8
7.9
Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
8.1
8.2
8.3
8.4
8.5
Fragmentando listas
8.6
8.7
8.8
8.9
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.12
8.13
8.14
8.15
8.16
Pseudnimo . . . . . . .
Listas como Argumentos
Depurao . . . . . . . .
Glossrio . . . . . . . . .
Exerccios . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
120
121
123
127
127
9 Dicionrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1 Dicionrio como um conjunto de contadores . . . . . . . . . . . . .
9.2 Dicionrios e arquivos . . . . . . . . . . . . . . . . . . . . . . . . .
9.3 Estruturas de repetio e dicionrios . . . . . . . . . . . . . . . . .
9.4 Anlise avanada de texto . . . . . . . . . . . . . . . . . . . . . . .
9.5 Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.6 Glossrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.7 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
131
133
135
136
138
140
141
141
10 Tuplas . . . . . . . . . . . . . . . . . . . . . .
10.1 Tuplas so imutveis . . . . . . . . . . . .
10.2 Comparando tuplas . . . . . . . . . . . . .
10.3 Atribuio de tuplas . . . . . . . . . . . .
10.4 Dicionrios e tuplas . . . . . . . . . . . . .
10.5 Atribuio mltipla com dicionrios . . . .
10.6 As palavras mais comuns . . . . . . . . . .
10.7 Usando tuplas como chaves em dicionrios
10.8 Sequncias: strings, listas and tuplas . . .
10.9 Depurao . . . . . . . . . . . . . . . . . .
10.10Glossrio . . . . . . . . . . . . . . . . . . .
10.11Exerccios . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
143
143
144
146
147
148
149
151
151
152
154
154
. . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
10
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 computador), deixando mais tempo para que voc execute coisas que seja especialmente adequadas
a voc. Voc traz criatividade, intuio e inveno a esta parceria.
11
12
13
14
http://xkcd.com/231
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!
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
Isto no est indo to bem. A menos que voc pense em algo rapidamente, os habitantes 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!
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 inclivelmente 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.
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 provavelmente 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.
18
> x = 6
> print x
> y = x * 7
> print y
>
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
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 completamente 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 interessante ter um interpretador ou compilador que permite escrevermos cdigo em linguagens 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 trabalhar 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 computador (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
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.
cat hello.py
Hello world!
python hello.py
world!
21
resolver o problema.
Suponha que voc est fazendo pesquisas em Computao Social nos posts do Facebook 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 procurando 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
23
O programa de contagem de palavras acima utiliza todos estes pades, exceto um.
24
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 exatamene o que voc solicitou.
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 programao, 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 construindo 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
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
a) 43
b) 44
c) x + 1
28
29
python
> > > print 4
4
O que dizer de valores como 17 e 3.2? Eles se parecem nmeros, mas esto
entre aspas como strings. Logo, eles so strings.
30
type (17)
str>
type (3.2)
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
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
2.3.
2.3
31
type (message)
str>
type (n)
int>
type (pi)
float>
Programadores geralmente escolhem nomes para suas variveis que so significativos, 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.
Python possui 31 palavra-chaves
and
as
assert
break
class
continue
def
1
del
elif
else
except
exec
finally
for
from
global
if
import
in
is
lambda
not
while
or
with
pass
yield
print
raise
return
try
32
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 executar. 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
hour-1
hour*60+minuto
minuto/60
5**2
(5+9)*(15-7)
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
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
Em Python 3.0, o resultado desta diviso um float. Em Python 3.0 o novo operador // executa a
diviso inteira
34
35
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
36
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
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()
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
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
Bons nomes para variveis podem reduzir a necessidade de comentrios, mas nomes
longos podem transformar expresses complexas difceis de se ler.
38
a = 35.0
b = 12.50
c = a*b
print c
horas = 35.0
rate = 12.50
pay = hours * rate
printf pay
x1q3z9ahd = 35.0
x1q3z9afd = 12.50
x1q3p9afd = x1q3z9ahd * x1q3z9afd
print x1q3p9afd
O que est acontecendo aqui? Qual dessas palavras (for, palavras, in, etc.) so
palavras reservadas e quais so apenas nomes de variveis? O Python entende fundamentalmente 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
2.13. Depurao
39
mais fcil para iniciantes avaliar esse cdigo e saber quais partes so palavras
reservadas definidas pelo Python e quais so simples nomes de variveis escolhidos pelo
programador. muito claro que o Python no possui entendimento sobre pizza nem sobre
fatias, nem mesmo sobre o fato de que uma pizza consiste em uma ou mais fatias.
Mas se nosso programa est realmente lendo e pesquisando palavras na memria,
pizza e fatia so nomes de variveis no mnemnicas. Escolher o nome das variveis
diverge do verdadeiro propsito do programa.
Aps um curto perodo de tempo voc saber as palavras reservadas mais comuns
e comear a v-las destacadas no programa.
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 palavras 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 mensagens 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
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 fracionrias.
piso da diviso: a operao que divide dois nmeros, desconsiderando a parte
fracionria.
inteiro: um tipo de dado que representa nmeros inteiros.
palavra-chave: uma palavra reservada que usada pelo compilador para analisar
um programa; voc no pode usar palavras-chaves como if, def, e while como nomes
de variveis.
mnemnico: um auxiliar de memria. Frequentemente damos nomes mnemnicos
para as variveis para nos ajudar a lembrar o que armazenado na varivel.
2.15. Exerccios
41
2.15 Exerccios
Exerccio 2.2 Escreva um programa que use raw_input para perguntar a ele qual
seu nome e d as boas vindas ao usurio.
Digite seu nome: Douglas
Ol Douglas
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
Para cada expresso a seguir, escreva o valor da expresso e o tipo (do valor da
expresso).
1.
2.
3.
4.
largura/2
largura/2.0
altura/3
1 + 2 *5
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
> > >
<type
type(True)
bool>
type(False)
bool>
!= y
> y
< y
>= y
<= y
is y
is not y
#
#
#
#
#
#
#
x no igual y
x maior do que y
x menor do que y
x maior ou igual a y
menor ou igual a y
x o mesmo que y
x no o mesmo que y
44
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).
A expresso booleana aps a sentena if chamada de condio. Ns terminamos 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
45
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!
46
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 programa exibe uma mensagem para esse fato. Se a condio falsa, o segundo conjunto de
instrues executado.
Dado que uma condio sempre verdadeira ou falsa, exatamente uma das alternativas ser executada. As alternativas so chamadas branches, porque elas so ramos
do fluxo da execuo.
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.
47
if choice == a:
print Bad guess
elif choice == b:
print Good guess
elif choice == c:
print Close, but not correct
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
A sentena de impresso executada, apenas se as duas condies forem verdadeiras, assim teramos o mesmo efeito com o operador and:
if 0 < x and x < 10:
print x is a positive single-digit number.
49
Quando ns estamos executando essas sentenas no interpretador de Python, recebemos 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
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
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
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.
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
>
52
3.9 Depurao
O traceback do Python exibido quando ocorre um erro contendo uma grande
quantidade de informaes. E isso pode ser um fator de complicao. Entretanto, as
partes fundamentais so:
Nesse exemplo, o problema que a segunda linha foi indentada com um espao.
Mas a mensagem de erro aponta para o y, erroneamente. Em geral, mensagens de erro
indicam onde o problema foi descoberto, mas o erro em questo ocorreu, de fato, antes
desse cdigo, algumas vezes na linha anterior. O mesmo verdade para erros em tempo
de execuo. Suponha que voc esteja tentando computar um sinal/rudo em decibis. A
frmula = 1010 ( / ). Em Python voc deve escrever:
import math
signal_power = 9
noise_power = 10
ratio = signal_power / noise_power
decibels = 10 * math.log10(ratio)
print decibels
3.10. Glossrio
53
A mensagem de erro indica a linha 5, mas no h nada de errado nessa linha. Para
achar o erro real, pode ser til imprimir o valor de ratio, que no caso 0. O problema
est na linha 4, porque dividindo-se dois inteiros, o resultado ser tambm um inteiro. A
soluo para representar um valor da potncia e do barulho, ambos em ponto flutuante.
Em geral, mensagens de erro dizem para voc onde o problema foi descoberto, mas
esse, geralmente, no o lugar onde o mesmo ocorreu.
3.10 Glossrio
corpo: sequncia de sentenas dentro de uma sentena composta.
condicional em cadeia: Uma sentena condicional com uma srie de ramos alternativos.
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
condicionais agrupadas: Uma sentena condicional que aparece em um dos ramos 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 expresso 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
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
>= 0.9
>= 0.8
>= 0.7
>= 0.6
< 0.6
Grade
A
B
C
D
F
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>
A funo max nos diz qual o maior caractere em uma string (o que retorna a
letra w para o exemplo anterior) e a funo min mostra qual o menor caractere, que
o espao, considerando a frase Hello world.
Outra funo embutida muito comum a funo len, a qual nos diz quantos
smbolos existem no argumento. Se o argumento para len uma string, ele retorna o
58
Captulo 4. Funes
int pode converter valores com ponto flutuante para inteiros, mas isso no arredonda o valor; s remove a parte fracionria do valor.
> > > > int (3.99999)
3
> > > > int (-2.3)
-2
59
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 funo 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
O mdulo random s fornece funes para gerar valores aleatrios de uma distribuio
contnua incluindo Gaussiana e exponencial.
Esta sentena cria um objeto mdulo nomeado math. Se voc imprimir o objeto
mdulo, voc obter alguma informao sobre ele:
> > > 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.
61
def a palavra-chave que indica que uma funo ser definida. O nome dessa
funo print_lyrics. As regras para os nomes das funes so as mesmas dos nomes
62
Captulo 4. Funes
Para terminar a funo, voc tem que deixar uma linha em branco (isso no
necessrio no cdigo).
Definir uma funo cria uma varivel com o mesmo nome.
> > > print print_lyrics
<function print_lyrics at 0xb7e99e9c>
> > > print type(print_lyrics)
<type function>
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:
63
def repeat_lyrics():
print_lyrics()
print_lyrics()
64
Captulo 4. Funes
65
As mesmas regras de composio que se aplicam s funes nativas tambm se aplicam 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:
> > >
> > >
Eric,
Eric,
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 resultado desta em uma varivel, o valor de retorno ser desprezado!
math.sqrt(5)
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
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.
Durante todo o resto do livro, muitas vezes, vamos utilizar a definio de funo
para explicar um conceito. Parte da habilidade de criar e utilizar funes exige que voc
entenda corretamente uma ideia como, por exemplo: encontrar o menor valor em uma
lista de valores. Mais tarde vamos mostrar o cdigo que encontra o menor valor em uma
lista de valores e apresentaremos a voc como uma funo chamada min que leva uma
lista de valores como seu argumento e retorna o menor valor na lista.
4.12 Debugging
Se voc est usando um editor de textos para escrever seus cdigos, voc poder ter
alguns problemas com a quantidade de espaos e tabulaes. A melhor maneira de evitar
esses problemas usar somente espaos e no usar tabulaes. A maioria dos editores de
textos que contm suporte para Phyton substituem o tab por quatro espaos, mas existem
editores que no fazem isso.
Tabs e espaos geralmente so invisveis, o que torna mais difcil corrigir os erros.
Procure um editor de textos que administre a identao para voc.
68
Captulo 4. Funes
4.13 Glossrio
Algoritmo: Um processo geral para resolver um tipo de problema.
Argumento: Um valor dado funo quando ela chamada. Esse valor atribudo
ao parmetro correspondente da funo.
Corpo: Sequncia de passos dentro da definio de uma funo.
Composio: Usar uma expresso como parte de uma expresso maior, ou uma sentena como parte de uma sentena maior.
Determinstico: Relativo a um programa que faz a mesma coisa toda vez que executado, 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 argumentos 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 acessar 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 aleatria, 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()
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
Score
> 0.9
> 0.8
> 0.7
> 0.6
<= 0.6
Grade
A
B
C
D
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
71
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
Antes que voc possa atualizar uma varivel, voc tem que inicializ-la, geralmente
com uma simples atribuio:
> > > x = 0
> > > x = x + 1
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:
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.
75
Se voc cometer o erro e executar este cdigo, voc vai aprender rapidamente como
parar um processo Python que no para em seu sistema ou descobrir onde o boto de
desligar em seu computador. Este programa executar para sempre ou at que a bateria
se esgote porque a expresso lgica no topo do loop sempre verdadeira, em virtude do
fato de que a expresso o valor constante True.
Enquanto este um loop infinito disfuncional, ainda podemos usar este padro
para construir laos teis, enquanto ns adicionarmos cuidadosamente cdigo ao corpo
do loop para explicitamente sair do loop usando break, quando chegarmos condio de
sada.
Por exemplo, suponha que voc queira receber uma entrada do usurio at que ele
digite done.
Voc poderia escrever:
while True:
line = raw_input (> )
if line == done:
break
print line
print Done!
A condio do loop True, o que sempre verdade, de modo que o loop executado
repetidamente at que seja executado o comando break.
A cada iterao mostrado o smbolo > solicitando a entrada do usurio. Se
o usurio digitar done, a instruo break faz com que o loop seja interrompido. Caso
contrrio, o programa repete o que quer que o usurio digite e volta ao topo do loop.
Aqui est uma execuo simples:
76
Captulo 5. Iterao
Esta forma de escrever while comum, pois voc pode verificar a condio em
qualquer lugar do loop (e no apenas no incio do loop) e voc pode expressar a condio
de parada afirmativamente (parar quando isso acontece) ao invs de negativamente
(continuar at que isso acontea.).
Aqui est um exemplo de execuo deste novo programa com continue acrescentado.
> 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
77
Em Python, a varivel friends uma lista1 de trs strings e o loop for percorre
a lista e executa o corpo uma vez para cada uma das trs strings da lista resultando na
sada:
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
78
Captulo 5. Iterao
Atribumos o valor zero varivel count antes do incio do loop, ento ns escrevemos 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:
79
total = 0
for intervar in [3, 41, 12, 9, 74, 15]:
total = total + intervar
print Total: , total
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, imediatamente 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
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 resultado.
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 posteriormente.
incremento: atualizao que aumenta o valor de uma varivel (em geral, em um).
loop infinito: loop em que a condio de trmino nunca satisfeita ou para o qual
82
Captulo 5. Iterao
5.10 Exerccios
Exerccio 5.1 Escreva um programa que leia nmeros repetidamente at que o
usurio informe done. Uma vez que done informado, imprima a soma, quantidade
e mdia dos nmeros. Se o usurio digita alguma coisa diferente de um nmero, detecte
o erro usando try e except e imprima uma mensagem de erro e pule para o prximo
nmero.
Digite um numero: 4
Digite um numero: 5
Digite um numero: bad data
Invalid input
Digite um numero: 7
Digite um numero: done
16 3 5.33333333333
Exerccio 5.2 Escreva um programa que pede por uma lista de nmeros e imprima
o maior e o menor dos nmeros. Sua entrada deve respeitar as condies impostas no
Exerccio 5.1.
83
6 Strings
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]
84
Captulo 6. Strings
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
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.
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
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
86
Captulo 6. Strings
Uma string vazia no contm caracteres e tem comprimento 0. Excluindo este fator, ela como qualquer outra string.
Exerccio 6.2 Sabendo que fruta uma string, o que fruta[:] significa?
O object nesse caso a string e o item o caractere que voc tentou atribuir.
Por agora, um object um valor, porm iremos redefin-lo mais frente. Um item um
dos valores em uma sequncia.
A razo desse erro que as strings so imutveis, isso significa que voc no pode
realizar mudanas em uma string j existente. O melhor a se fazer criar uma nova string
com as alteraes que eram desejadas na original:
> > > cumprimento = Ol, mundo!
> > > novo_cumprimento = J + cumprimento[1:]
> > > print novo_cumprimento
Jla, mundo!
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 contador. 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
88
Captulo 6. Strings
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
Nesse exemplo, invocamos find em palavra e passamos a letra que estamos procurando 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
90
Captulo 6. Strings
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
91
Usamos uma verso do mtodo find de modo que ele apenas comeou a procurar
o que desejvamos a partir de uma posio especfica. Quando o fragmentamos, extramos
os caracteres de uma posio depois do @ at o caracter antes do espao em branco.
A explicao do mtodo find encontra-se no link1 .
O resultado foi a string 42, que no pode ser confundida com o inteiro de valor
42.
A sequncia de formatao pode aparecer em qualquer lugar da string, assim voc
pode inserir um valor em uma sentena:
1
docs.python.org/library/string.html
92
Captulo 6. Strings
Se houver mais de uma sequncia de formatao em uma string, o segundo argumento 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 sequncias 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
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:
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, representada por duas aspas.
94
Captulo 6. Strings
6.14 Exerccios
Exercicio 6.5 Dado o cdigo a seguir que armazena uma string:
6.14. Exerccios
95
Use o mtodo find e fragmente a string para extrair a poro da string depois dos
dois pontos e ento use a funo float para converter a string extrada em um nmero
com ponto flutuante.
Exercicio 6.6 Leia o documento sobre os mtodos de string no endereo3 . Voc
pode querer experimentar algum deles para ter certeza de que funcionam. strip e replace
so bastante teis.
A documentao disponvel no site usa uma sintaxe que pode confund-lo. Por
exemplo, em find(sub[,start[, end]]), os colchetes indicam argumentos opcionais.
Ento sub requerido, porm start opcional, e se voc incluir o start, ento o end
opcional.
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.
98
Captulo 7. Arquivos
Se a funo open teve sucesso e o arquivo for aberto, o sistema operacional retornar para ns o file handle. O file handle no so os dados atuais contidos no arquivo,
e sim um handle que podemos usar para ler os dados. Voc est dando um handle se
o arquivo solicitado existe e se voc tem permisses para ler o arquivo.
Depois, iremos usar o try e except para lidar da melhor forma com a situao em
que tentamos abrir um arquivo que no existe.
99
Um arquivo de texto pode ser pensado como uma sequncia de linhas, assim como
uma string em Python pode ser pensada como uma sequncia de caracteres. Por exemplo,
este um simples arquivo de texto que registra a atividade de e-mail de uma equipe de
desenvolvimento de um projeto de cdigo aberto:
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
...
1
2
www.py4inf.com/code/mbox.txt
www.py4inf.com/code/mbox-short.txt
100
Captulo 7. Arquivos
Voc tambm pode ver que o comprimento da string XnY so trs caracteres
porque o caracter de nova linha um caracter simples.
Assim, quando olhamos para as linhas em um arquivo, precisamos imaginar que l
tem um caracter especial invisvel ao fim de cada linha que marca o fim da linha, chamado
de nova linha.
Portanto, o caracter de nova linha separa os caracteres no arquivo em linhas.
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
101
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
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
stephen.marquard@uct.ac.za
louis@media.berkeley.edu
zqian@umich.edu
rjlowe@iupui.edu
zqian@umich.edu
rjlowe@iupui.edu
cwen@iupui.edu
103
104
Captulo 7. Arquivos
105
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
7.9. Depurao
107
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
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
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
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]]
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
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:
113
for i in range(len(numeros)):
numeros[i] = numeros[i] * 2
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]]
> a = [1, 2, 3]
> b = [4, 5, 6]
> c = a + b
> print c
2, 3, 4, 5, 6].
> [0]
0, 0,
> [1,
2, 3,
* 4
0]
2, 3] * 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.
114
Captulo 8. Listas
t = [a, b, c, d, e, f]
t[1:3]
c]
t[:4]
b, c, d]
t[3:]
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 operaes 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.
> > >
> > >
> > >
[a,
t = [a, b, c, d, e, f]
t[1:3] = [x, y]
print t
x, y, d, e, f]
t = [a, b, c]
t.append(d)
print t
b, c, d]
extend recebe uma lista como um argumento e adiciona todos os elementos desta
lista ao final da outra lista:
115
t1 = [a, b, c]
t2 = [d, e]
t1.extend(t2)
print t1
b, c, d, e]
t = [d, c, e, b, a]
t.sort()
print t
b, c, d, e]
t = [a, b, c]
x = t.pop(1)
print t
c]
print x
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:
> > >
> > >
> > >
[a,
t = [a, b, c]
del t[1]
print t
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
c]
t = [a, b, c, d, e, f]
del t[1:5]
print t
f]
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
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.
s = spam
t = list(s)
print t
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]
119
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]
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.
120
Captulo 8. Listas
Para verificar se duas variveis referem-se ao mesmo objeto, pode-se usar o operador is.
> > > a = banana
> > > b = banana
> > > a is b
True
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
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
letras = [a, b, c]
delete_head(letras)
print letras
c]
122
Captulo 8. Listas
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:]
letras = [a, b, c]
resto = tail(letras)
print resto
c]
Exerccio 8.1 Escreva uma funo chamada chop que receba uma lista e a modifique, 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:
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:
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 alguma 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
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]
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 objeto.
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
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
Insira
Insira
Insira
Insira
Insira
Insira
Maior:
Menor:
um nmero:
um nmero:
um nmero:
um nmero:
um nmero:
um nmero:
9.0
2.0
129
6
2
9
3
5
pronto
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 imprimirmos 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 =
132
Captulo 9. Dicionrios
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
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
133
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 adicionaria 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 implementaes 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
Podemos usar get para escrever nossa estrutura de histograma mais concisa. Porque 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
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.
Agradecimentos a http://shakespeare.mit.edu/Tragedy/romeoandjuliet/romeo_juliet.2.2.html
136
Captulo 9. Dicionrios
Quando executamos o programa, vemos ao final, a impresso de todos os contadores 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 }
www.py4inf.com/code/romeo.txt
137
A estrutura for itera atravs das chaves do dicionrio, ento devemos usar o operador indce para recuperar o valor correspondente para cada chave. A sada mostrada
a seguir:
jan 100
annie 42
138
Captulo 9. Dicionrios
Primeiro voc v a lista das chaves sem ordenao que obtivemos pelo mtodo
keys. Em seguida vemos os pares chave/valor em ordem impressos dentro da estrutura
for.
Como a funo split do Python procura por espaos e trata palavras como smbolos 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])
139
# Novo cdigo
# Novo cdigo
print counts
Parte do aprendizado do Art of Python ou Thinking Pythonically est concretizando 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
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 exemplo, 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 dados 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 nmeros, 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 tornar 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 concluso cada vez que a estrutura de repetio externa executada.
valor: objeto que aparece em um dicionrio como a segunda parte de um par chavevalor. Isso mais especfico que nosso uso anterior da palavra valor.
9.7 Exerccios
Exerccio 9.2 Escreva um programa que categorize cada mensagem de e-mail
pelo dia da semana que a submisso foi feita. Para fazer isso, procure por linhas que
comeam com From, e ento procure pela terceira palavra e assim continue executando
142
Captulo 9. Dicionrios
o contador para cada um dos dias da semana. No fim do programa imprima o contedo
de seu dicionrio (a ordem no importa).
Linha exemplo:
From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Execuo do exemplo:
python dow.py
Digite o nome do arquivo: mbox-short.txt
{ Fri : 20, Thu : 6, Sat : 1 }
Exerccio 9.4 Adicione linhas ao cdigo anterior a fim de descobrir quem tem
mais mensagens no arquivo.
Aps todos os dados serem lidos e o dicionrio ser criado, olhe no dicionrio usando
uma estrutura de repetio mxima (olhe a Seo 5.7.2), para descobrir quem tem mais
mensagens e imprima quantas mensagens a pessoa tem.
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 comparveis 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
Para criar uma tupla de um nico elemento, deve-se acrescentar uma vrgula no
final:
> > > t1 = (a,)
> > > type(t1)
<type tuple>
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 variados: nica, dupla, tripla, qudrupla, quntupla, sxtupla, setupla, etc.
144
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 colchetes indexa um elemento:
> > > t = (a, b, c, d, e)
> > > print t[0]
a
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)
145
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
claro que as linhas perdem um pouco do seu impacto potico quando transformados em uma lista Python em ordem decrescente de tamanho.
Python no traduz a sintaxe literalmente. Por exemplo, se voc tentar isto com um dicionrio, voc
ter um resultado inesperado.
147
Ambos os lados desta sentena so tuplas, mas o lado esquerdo uma tupla de
variveis; o lado direito uma tupla de expresses. Cada valor no lado direito atribudo a
sua respectiva varivel no lado esquerdo. Todas as expresses no lado direito so avaliadas
antes que as atribuies sejam realizadas.
O nmero de variveis no lado esquerdo e direito tem de ser o mesmo:
> > > 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
148
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 avanados para o prximo par chave/valor no dicionrio (ainda na ordem hash).
A sada do loop :
10 a
22 c
1 b
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 dicionrio 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 elemento de cada tupla, podemos classificar a lista de tuplas e obter contedos do dicionrio
ordenados por valor.
150
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
61
42
40
34
34
32
32
30
29
24
151
i
and
romeo
to
the
thou
juliet
that
my
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.
152
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 mutveis. 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
154
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
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