-
Notifications
You must be signed in to change notification settings - Fork 274
/
PenseEmPython.xml
5550 lines (5550 loc) · 529 KB
/
PenseEmPython.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<article lang="">
<para>Sumário</para>
<para>Prefácio 13</para>
<para>Capítulo 1 ■ A jornada do programa 25</para>
<para>O que é um programa? 25</para>
<para>Execução do Python 26</para>
<para>O primeiro programa 27</para>
<para>Operadores aritméticos 28</para>
<para>Valores e tipos 29</para>
<para>Linguagens formais e naturais 30</para>
<para>Depuração 32</para>
<para>Glossário 33</para>
<para>Exercícios 35</para>
<para>Capítulo 2 ■ Variáveis, expressões e instruções 37</para>
<para>Instruções de atribuição 37</para>
<para>Nomes de variáveis 38</para>
<para>Expressões e instruções 39</para>
<para>Modo script 39</para>
<para>Ordem das operações 41</para>
<para>Operações com strings 41</para>
<para>Comentários 42</para>
<para>Depuração 43</para>
<para>Glossário 44</para>
<para>Exercícios 46</para>
<para>Capítulo 3 ■ Funções 47</para>
<para>Chamada de função 47</para>
<para>Funções matemáticas 48</para>
<para>Composição 49</para>
<para>Como acrescentar novas funções 50</para>
<para>Uso e definições 51</para>
<para>Fluxo de execução 52</para>
<para>Parâmetros e argumentos 53</para>
<para>As variáveis e os parâmetros são locais 54</para>
<para>Diagrama da pilha 55</para>
<para>Funções com resultado e funções nulas 56</para>
<para>Por que funções? 57</para>
<para>Depuração 57</para>
<para>Glossário 58</para>
<para>Exercícios 60</para>
<para>Capítulo 4 ■ Estudo de caso: projeto de interface 63</para>
<para>Módulo turtle 63</para>
<para>Repetição simples 65</para>
<para>Exercícios 66</para>
<para>Encapsulamento 67</para>
<para>Generalização 67</para>
<para>Projeto da interface 68</para>
<para>Refatoração 70</para>
<para>Um plano de desenvolvimento 71</para>
<para>docstring 71</para>
<para>Depuração 72</para>
<para>Glossário 73</para>
<para>Exercícios 74</para>
<para>Capítulo 5 ■ Condicionais e recursividade 76</para>
<para>Divisão pelo piso e módulo 76</para>
<para>Expressões booleanas 77</para>
<para>Operadores lógicos 78</para>
<para>Execução condicional 78</para>
<para>Execução alternativa 79</para>
<para>Condicionais encadeadas 79</para>
<para>Condicionais aninhadas 80</para>
<para>Recursividade 81</para>
<para>Diagramas da pilha para funções recursivas 83</para>
<para>Recursividade infinita 83</para>
<para>Entrada de teclado 84</para>
<para>Depuração 85</para>
<para>Glossário 87</para>
<para>Exercícios 88</para>
<para>Capítulo 6 ■ Funções com resultado 92</para>
<para>Valores de retorno 92</para>
<para>Desenvolvimento incremental 94</para>
<para>Composição 96</para>
<para>Funções booleanas 97</para>
<para>Mais recursividade 98</para>
<para>Salto de fé 100</para>
<para>Mais um exemplo 101</para>
<para>Verificação de tipos 101</para>
<para>Depuração 103</para>
<para>Glossário 104</para>
<para>Exercícios 105</para>
<para>Capítulo 7 ■ Iteração 107</para>
<para>Reatribuição 107</para>
<para>Atualização de variáveis 108</para>
<para>Instrução while 109</para>
<para>break 110</para>
<para>Raízes quadradas 111</para>
<para>Algoritmos 113</para>
<para>Depuração 114</para>
<para>Glossário 115</para>
<para>Exercícios 115</para>
<para>Capítulo 8 ■ Strings 118</para>
<para>Uma string é uma sequência 118</para>
<para>len 119</para>
<para>Travessia com loop for 120</para>
<para>Fatiamento de strings 121</para>
<para>Strings são imutáveis 122</para>
<para>Buscando 123</para>
<para>Loop e contagem 123</para>
<para>Métodos de strings 124</para>
<para>Operador in 125</para>
<para>Comparação de strings 126</para>
<para>Depuração 126</para>
<para>Glossário 128</para>
<para>Exercícios 130</para>
<para>Capítulo 9 ■ Estudo de caso: jogos de palavras 133</para>
<para>Leitura de listas de palavras 133</para>
<para>Exercícios 134</para>
<para>Busca 136</para>
<para>Loop com índices 137</para>
<para>Depuração 139</para>
<para>Glossário 140</para>
<para>Exercícios 140</para>
<para>Capítulo 10 ■ Listas 142</para>
<para>Uma lista é uma sequência 142</para>
<para>Listas são mutáveis 143</para>
<para>Atravessando uma lista 144</para>
<para>Operações com listas 145</para>
<para>Fatias de listas 145</para>
<para>Métodos de listas 146</para>
<para>Mapeamento, filtragem e redução 147</para>
<para>Como excluir elementos 148</para>
<para>Listas e strings 149</para>
<para>Objetos e valores 150</para>
<para>Alias 151</para>
<para>Argumentos de listas 152</para>
<para>Depuração 154</para>
<para>Glossário 156</para>
<para>Exercícios 157</para>
<para>Capítulo 11 ■ Dicionários 161</para>
<para>Um dicionário é um mapeamento 161</para>
<para>Um dicionário como uma coleção de contadores 163</para>
<para>Loop e dicionários 165</para>
<para>Busca reversa 165</para>
<para>Dicionários e listas 167</para>
<para>Memos 169</para>
<para>Variáveis globais 170</para>
<para>Depuração 172</para>
<para>Glossário 173</para>
<para>Exercícios 175</para>
<para>Capítulo 12 ■ Tuplas 178</para>
<para>Tuplas são imutáveis 178</para>
<para>Atribuição de tuplas 180</para>
<para>Tuplas como valores de retorno 181</para>
<para>Tuplas com argumentos de comprimento variável 181</para>
<para>Listas e tuplas 182</para>
<para>Dicionários e tuplas 184</para>
<para>Sequências de sequências 186</para>
<para>Depuração 187</para>
<para>Glossário 188</para>
<para>Exercícios 189</para>
<para>Capítulo 13 ■ Estudo de caso: seleção de estrutura de dados 192</para>
<para>Análise de frequência de palavras 192</para>
<para>Números aleatórios 193</para>
<para>Histograma de palavras 195</para>
<para>Palavras mais comuns 196</para>
<para>Parâmetros opcionais 197</para>
<para>Subtração de dicionário 198</para>
<para>Palavras aleatórias 199</para>
<para>Análise de Markov 200</para>
<para>Estruturas de dados 202</para>
<para>Depuração 203</para>
<para>Glossário 205</para>
<para>Exercícios 206</para>
<para>Capítulo 14 ■ Arquivos 207</para>
<para>Persistência 207</para>
<para>Leitura e escrita 208</para>
<para>Operador de formatação 208</para>
<para>Nomes de arquivo e caminhos 210</para>
<para>Captura de exceções 211</para>
<para>Bancos de dados 212</para>
<para>Usando o Pickle 213</para>
<para>Pipes 214</para>
<para>Módulos de escrita 216</para>
<para>Depuração 217</para>
<para>Glossário 218</para>
<para>Exercícios 219</para>
<para>Capítulo 15 ■ Classes e objetos 221</para>
<para>Tipos definidos pelos programadores 221</para>
<para>Atributos 222</para>
<para>Retângulos 224</para>
<para>Instâncias como valores de retorno 225</para>
<para>Objetos são mutáveis 225</para>
<para>Cópia 226</para>
<para>Depuração 228</para>
<para>Glossário 229</para>
<para>Exercícios 230</para>
<para>Capítulo 16 ■ Classes e funções 231</para>
<para>Time 231</para>
<para>Funções puras 232</para>
<para>Modificadores 233</para>
<para>Prototipação versus planejamento 234</para>
<para>Depuração 236</para>
<para>Glossário 237</para>
<para>Exercícios 238</para>
<para>Capítulo 17 ■ Classes e métodos 240</para>
<para>Recursos orientados a objeto 240</para>
<para>Exibição de objetos 241</para>
<para>Outro exemplo 243</para>
<para>Um exemplo mais complicado 244</para>
<para>Método init 244</para>
<para>Método __str__ 245</para>
<para>Sobrecarga de operadores 246</para>
<para>Despacho por tipo 247</para>
<para>Polimorfismo 248</para>
<para>Interface e implementação 249</para>
<para>Depuração 250</para>
<para>Glossário 251</para>
<para>Exercícios 252</para>
<para>Capítulo 18 ■ Herança 253</para>
<para>Objetos Card 253</para>
<para>Atributos de classe 255</para>
<para>Comparação de cartas 256</para>
<para>Baralhos 257</para>
<para>Exibição do baralho 258</para>
<para>Adição, remoção, embaralhamento e classificação 258</para>
<para>Herança 259</para>
<para>Diagramas de classe 261</para>
<para>Encapsulamento de dados 262</para>
<para>Depuração 264</para>
<para>Glossário 265</para>
<para>Exercícios 267</para>
<para>Capítulo 19 ■ Extra 270</para>
<para>Expressões condicionais 270</para>
<para>Abrangência de listas 271</para>
<para>Expressões geradoras 273</para>
<para>any e all 274</para>
<para>Conjuntos 274</para>
<para>Contadores 276</para>
<para>defaultdict 277</para>
<para>Tuplas nomeadas 279</para>
<para>Reunindo argumentos de palavra-chave 280</para>
<para>Glossário 282</para>
<para>Exercícios 282</para>
<para>Capítulo 20 ■ Depuração 284</para>
<para>Erros de sintaxe 284</para>
<para>Continuo fazendo alterações e não faz nenhuma diferença 286</para>
<para>Erros de tempo de execução 286</para>
<para>Meu programa não faz nada 286</para>
<para>Meu programa fica suspenso 287</para>
<para>Quando executo o programa recebo uma exceção 288</para>
<para>Acrescentei tantas instruções print que fui inundado pelos resultados 290</para>
<para>Erros semânticos 291</para>
<para>Meu programa não funciona 291</para>
<para>Tenho uma baita expressão cabeluda e ela não faz o que espero 292</para>
<para>Tenho uma função que não retorna o que espero 293</para>
<para>Estou perdido e preciso de ajuda 293</para>
<para>Sério, preciso mesmo de ajuda 293</para>
<para>Capítulo 21 ■ Análise de algoritmos 295</para>
<para>Ordem de crescimento 296</para>
<para>Análise de operações básicas do Python 299</para>
<para>Análise de algoritmos de busca 301</para>
<para>Hashtables 302</para>
<para>Glossário 306</para>
<para>Sobre o autor 308</para>
<para>Prefácio</para>
<para>A estranha história deste livro</para>
<para>Em janeiro de 1999 eu me preparava para dar aula a uma turma de programação introdutória em Java. Já tinha dado esse curso três vezes e estava ficando frustrado. O índice de aprovação era muito baixo e mesmo entre os alunos aprovados, o nível geral das notas era baixo demais.</para>
<para>Um dos problemas que eu via eram os livros. Eram muito grandes, com detalhes desnecessários sobre o Java, e não havia orientação de alto nível sobre como programar. E todos eles sofriam do efeito alçapão: no início era fácil, os alunos iam aprendendo aos poucos, e lá pelo Capítulo 5, perdiam o chão. Era muito material novo, muito rápido, e eles acabavam engatinhando no resto do semestre.</para>
<para>Duas semanas antes do primeiro dia de aula, eu decidi escrever meu próprio livro. Meus objetivos eram:</para>
<para>• que o livro fosse curto. Era melhor os alunos lerem 10 páginas que não lerem 50.</para>
<para>• abordar o vocabulário com cuidado. Tentei minimizar o jargão e definir cada termo no momento do primeiro uso.</para>
<para>• construir o aprendizado passo a passo. Para evitar alçapões, dividi os tópicos mais difíceis e em uma série de etapas menores.</para>
<para>• que o conteúdo fosse concentrado em programar mesmo, não na linguagem de programação. Selecionei um subconjunto mínimo útil do Java e omiti o resto.</para>
<para>Eu precisava de um título, então, por capricho, decidi chamá-lo de Pense como um cientista da computação.</para>
<para>A minha primeira versão era apenas um esboço, mas funcionou. Os alunos liam e entendiam o suficiente para podermos usar o tempo de aula para os tópicos difíceis, interessantes e (o mais importante) para permitir que os alunos praticassem.</para>
<para>Lancei o livro sob uma Licença de Documentação Livre GNU, que permite aos usuários copiar, modificar e distribuir o livro.</para>
<para>E o que aconteceu em seguida foi legal. Jeff Elkner, um professor de ensino médio na Virgínia adotou meu livro e o traduziu para Python. Ele me enviou uma cópia de sua tradução e tive a experiência excepcional de aprender Python lendo o meu próprio livro. Com a editora Green Tea, publiquei a primeira versão em Python em 2001.</para>
<para>Em 2003 comecei a trabalhar no Olin College e a ensinar Python pela primeira vez na vida. O contraste com o Java era notável. Os estudantes tinham menos dificuldades, aprendiam mais, trabalhavam em projetos mais interessantes e geralmente se divertiam muito mais.</para>
<para>Desde então continuei a desenvolver o livro, corrigindo erros, melhorando alguns exemplos e acrescentando material, especialmente exercícios.</para>
<para>O resultado está aqui, agora com o título menos grandioso de Pense em Python. Fiz algumas alterações:</para>
<para>• Acrescentei uma seção sobre depuração (debugging) no fim de cada capítulo. Essas seções apresentam técnicas gerais para encontrar e evitar bugs (erros de programação) e avisos sobre armadilhas do Python.</para>
<para>• Acrescentei exercícios, incluindo testes curtos de compreensão e alguns projetos substanciais. A maior parte dos exercícios tem um link para a minha solução.</para>
<para>• Acrescentei uma série de estudos de caso – exemplos mais longos com exercícios, soluções e discussões.</para>
<para>• Expandi a discussão sobre planos de desenvolvimento de programas e padrões de design básicos.</para>
<para>• Acrescentei apêndices sobre depuração e análise de algoritmos.</para>
<para>Esta edição de Pense em Python tem as seguintes novidades:</para>
<para>• O livro e todo o código de apoio foram atualizados para o Python 3.</para>
<para>• Acrescentei algumas seções e mais detalhes sobre a web, para ajudar os principiantes a executar o Python em um navegador, e não ter que lidar com a instalação do programa até que seja necessário.</para>
<para>• Para “Módulo turtle” na página 63 troquei meu próprio pacote gráfico turtle, chamado Swampy, para um módulo Python mais padronizado, turtle, que é mais fácil de instalar e mais eficiente.</para>
<para>• Acrescentei um novo capítulo chamado “Extra”, que introduz alguns recursos adicionais do Python, não estritamente necessários, mas às vezes práticos.</para>
<para>Espero que goste de trabalhar com este livro, e que ele o ajude a aprender a programar e pensar, pelo menos um pouquinho, como um cientista da computação.</para>
<para>– Allen B. DowneyOlin College</para>
<para>Convenções usadas neste livro</para>
<para>As seguintes convenções tipográficas são usadas neste livro:</para>
<para>Itálico</para>
<para>Indica novos termos, URLs, endereços de email, nomes de arquivo e extensões de arquivo.</para>
<para>Negrito</para>
<para>Indica termos definidos no glossário no final de capítulo.</para>
<para>Monoespaçado</para>
<para>Usada para código de programa, bem como dentro de parágrafos para referir-se a elementos do programa, como nomes de variáveis ou de funções, bancos de dados, tipos de dados, variáveis de ambiente, instruções e palavras-chave.</para>
<para>Monoespaçado negrito</para>
<para>Exibe comandos ou outros textos que devem ser digitados literalmente pelo usuário.</para>
<para>Monoespaçado itálico</para>
<para>Exibe textos que devem ser substituídos por valores fornecidos pelos usuários ou por valores determinados pelo contexto.</para>
<para>Exemplos de uso de código (de acordo com a política da O'Reilly)</para>
<para>Há material suplementar (exemplos de código, exercícios etc.) disponível para baixar em http://www.greenteapress.com/thinkpython2/code.</para>
<para>Este livro serve para ajudar você a fazer o que precisa. Em geral, se o livro oferece exemplos de código, você pode usá-los nos seus programas e documentação. Não é preciso entrar em contato conosco para pedir permissão, a menos que esteja reproduzindo uma porção significativa do código. Por exemplo, escrever um programa que use vários pedaços de código deste livro não exige permissão. Vender ou distribuir um CD-ROM de exemplos dos livros da O’Reilly exige permissão. Responder a uma pergunta citando este livro e reproduzindo exemplos de código não exige permissão. Incorporar uma quantidade significativa de exemplos de código deste livro na documentação do seu produto exige permissão.</para>
<para>Agradecemos, mas não exigimos, crédito. O crédito normalmente inclui o título, o autor, a editora e o ISBN. Por exemplo: “Pense em Python, 2ª edição, por Allen B. Downey (O’Reilly). Copyright 2016 Allen Downey, 978-1-4919-3936-9.”</para>
<para>Se acreditar que o seu uso dos exemplos de código não se ajusta à permissão dada anteriormente, fique à vontade para entrar em contato conosco pelo email [email protected].</para>
<para>Como entrar em contato conosco</para>
<para>Envie comentários e dúvidas sobre este livro à editora, escrevendo para: [email protected].</para>
<para>Temos uma página web para este livro na qual incluímos erratas, exemplos e quaisquer outras informações adicionais.</para>
<para>• Página da edição em português</para>
<para> http://www.novatec.com.br/catalogo/7522508-pense-em-python</para>
<para>• Página da edição original em inglês</para>
<para> http://bit.ly/think-python_2E</para>
<para>Para obter mais informações sobre os livros da Novatec, acesse nosso site em http://www.novatec.com.br.</para>
<para>Agradecimentos</para>
<para>Muito obrigado a Jeff Elkner, que traduziu meu livro de Java para o Python, o que deu início a este projeto e me apresentou ao que acabou sendo a minha linguagem favorita.</para>
<para>Agradeço também a Chris Meyers, que contribuiu em várias seções do Pense como um cientista da computação.</para>
<para>Obrigado à Fundação do Software Livre pelo desenvolvimento da Licença de Documentação Livre GNU, que me ajudou a tornar possível a colaboração com Jeff e Chris, e ao Creative Commons pela licença que estou usando agora.</para>
<para>Obrigado aos editores do Lulu, que trabalharam no Pense como um cientista da computação.</para>
<para>Obrigado aos editores da O’Reilly Media, que trabalharam no Pense em Python.</para>
<para>Obrigado a todos os estudantes que trabalharam com versões anteriores deste livro e a todos os contribuidores (listados a seguir) que enviaram correções e sugestões.</para>
<para>Lista de contribuidores</para>
<para>Mais de cem leitores perspicazes e atentos enviaram sugestões e correções nos últimos anos. Suas contribuições e entusiasmo por este projeto foram inestimáveis.</para>
<para>Se tiver alguma sugestão ou correção, por favor, envie um email a [email protected]. Se eu fizer alguma alteração baseada no seu comentário, acrescentarei seu nome à lista de contribuidores (a menos que você peça para eu omitir a informação).</para>
<para>Se você incluir pelo menos uma parte da frase onde o erro aparece, é mais fácil para eu procurá-lo. Também pode ser o número da página e seção, mas aí é um pouquinho mais difícil de encontrar o erro a ser corrigido. Obrigado!</para>
<para>• Lloyd Hugh Allen enviou uma correção da Seção 8.4.</para>
<para>• Yvon Boulianne enviou a correção de um erro semântico no Capítulo 5.</para>
<para>• Fred Bremmer enviou uma correção da Seção 2.1.</para>
<para>• Jonah Cohen escreveu os scripts em Perl para converter a fonte de LaTeX deste livro para o belo HTML.</para>
<para>• Michael Conlon enviou uma correção gramatical do Capítulo 2 e uma melhoria no estilo do Capítulo 1, além de iniciar a discussão sobre os aspectos técnicos de interpretadores.</para>
<para>• Benoit Girard enviou uma correção a um erro humorístico na Seção 5.6.</para>
<para>• Courtney Gleason e Katherine Smith escreveram horsebet.py, que foi usado como um estudo de caso em uma versão anterior do livro. O programa agora pode ser encontrado no site.</para>
<para>• Lee Harr enviou mais correções do que temos espaço para relacionar aqui, e na verdade ele deve ser apontado como um dos editores principais do texto.</para>
<para>• James Kaylin é um estudante que usa o texto. Ele enviou várias correções.</para>
<para>• David Kershaw corrigiu a função catTwice defeituosa na Seção 3.10.</para>
<para>• Eddie Lam entregou diversas correções aos Capítulos 1, 2, e 3. Ele também corrigiu o Makefile para criar um índice na primeira vez que rodar e nos ajudou a estabelecer um esquema de versionamento.</para>
<para>• Man-Yong Lee enviou uma correção do código de exemplo na Seção 2.4.</para>
<para>• David Mayo indicou que a palavra “inconscientemente” no Capítulo 1 devia ser alterada para “subconscientemente”.</para>
<para>• Chris McAloon enviou várias correções para as Seções 3.9 e 3.10.</para>
<para>• Matthew J. Moelter tem contribuído já há um bom tempo e entregou diversas correções e sugestões para o livro.</para>
<para>• Simon Dicon Montford informou que havia uma definição de função ausente e vários erros de ortografia no Capítulo 3. Ele também encontrou erros na função increment no Capítulo 13.</para>
<para>• John Ouzts corrigiu a definição de “valor de retorno” no Capítulo 3.</para>
<para>• Kevin Parks enviou comentários e sugestões valiosos para melhorar a distribuição do livro.</para>
<para>• David Pool encontrou um erro de ortografia no glossário do Capítulo 1, e também enviou palavras gentis de encorajamento.</para>
<para>• Michael Schmitt enviou uma correção ao capítulo sobre arquivos e exceções.</para>
<para>• Robin Shaw indicou um erro na Seção 13.1, onde a função printTime foi usada em um exemplo sem ser definida.</para>
<para>• Paul Sleigh encontrou um erro no Capítulo 7 e um bug no script em Perl de Jonah Cohen, que gera o HTML do LaTeX.</para>
<para>• Craig T. Snydal está testando o texto em um curso na Drew University. Ele contribuiu com várias sugestões valiosas e correções.</para>
<para>• Ian Thomas e seus alunos estão usando o texto em um curso de programação. Eles são os primeiros a testar os capítulos da segunda metade do livro e fizeram muitas correções e sugestões.</para>
<para>• Keith Verheyden enviou uma correção no Capítulo 3.</para>
<para>• Peter Winstanley nos avisou sobre um erro antigo no latim do Capítulo 3.</para>
<para>• Chris Wrobel fez correções ao código no capítulo sobre arquivos E/S e exceções.</para>
<para>• Moshe Zadka fez contribuições inestimáveis para este projeto. Além de escrever o primeiro rascunho do capítulo sobre Dicionários, ele forneceu orientação contínua nas primeiras etapas do livro.</para>
<para>• Christoph Zwerschke enviou várias correções e sugestões pedagógicas, e explicou a diferença entre gleich e selbe.</para>
<para>• James Mayer enviou-nos um monte de erros tipográficos e ortográficos, inclusive dois da lista de contribuidores.</para>
<para>• Hayden McAfee percebeu uma inconsistência potencialmente confusa entre dois exemplos.</para>
<para>• Angel Arnal faz parte de uma equipe internacional de tradutores que trabalhou na versão do texto para o espanhol. Ele também encontrou vários erros na versão em inglês.</para>
<para>• Tauhidul Hoque e Lex Berezhny criaram as ilustrações do Capítulo 1 e melhoraram muitas das outras ilustrações.</para>
<para>• O Dr. Michele Alzetta pegou um erro no Capítulo 8 e enviou alguns comentários pedagógicos interessantes e sugestões sobre Fibonacci e o jogo do Mico.</para>
<para>• Andy Mitchell pegou um erro de ortografia no Capítulo 1 e um exemplo ruim no Capítulo 2.</para>
<para>• Kalin Harvey sugeriu um esclarecimento no Capítulo 7 e achou alguns erros de ortografia.</para>
<para>• Christopher P. Smith encontrou vários erros de ortografia e ajudou-nos a atualizar o livro para o Python 2.2.</para>
<para>• David Hutchins encontrou um erro de ortografia no prefácio.</para>
<para>• Gregor Lingl é professor de Python em uma escola de Ensino Médio em Viena, na Áustria. Ele está trabalhando em uma tradução do livro para o alemão e encontrou alguns erros feios no Capítulo 5.</para>
<para>• Julie Peters achou um erro de ortografia no prefácio.</para>
<para>• Florin Oprina enviou uma melhoria para o makeTime, uma correção no printTime e um belo erro de ortografia.</para>
<para>• D. J. Webre sugeriu um esclarecimento no Capítulo 3.</para>
<para>• Ken encontrou um punhado de erros nos Capítulos 8, 9 e 11.</para>
<para>• Ivo Wever achou um erro de ortografia no Capítulo 5 e sugeriu um esclarecimento no Capítulo 3.</para>
<para>• Curtis Yanko sugeriu um esclarecimento no Capítulo 2.</para>
<para>• Ben Logan enviou vários erros de ortografia e problemas com a tradução do livro para HTML.</para>
<para>• Jason Armstrong percebeu que faltava uma palavra no Capítulo 2.</para>
<para>• Louis Cordier notou um ponto no Capítulo 16 onde o código não correspondia com o texto.</para>
<para>• Brian Caim sugeriu vários esclarecimentos nos Capítulos 2 e 3.</para>
<para>• Rob Black entregou um monte de correções, inclusive algumas alterações para Python 2.2.</para>
<para>• Jean-Philippe Rey, da École Centrale Paris, enviou uma série de patches, inclusive algumas atualizações do Python 2.2 e outras melhorias bem pensadas.</para>
<para>• Jason Mader, da George Washington University, fez uma série de sugestões e correções úteis.</para>
<para>• Jan Gundtofte-Bruun nos lembrou de que “un erro” é um erro.</para>
<para>• Abel David e Alexis Dinno nos lembraram de que o plural de “matriz” é “matrizes”, não “matrixes”. Este erro esteve no livro por anos, mas dois leitores com as mesmas iniciais informaram a respeito dele no mesmo dia. Bizarro.</para>
<para>• Charles Thayer nos estimulou a sumir com os pontos e vírgulas que tínhamos posto no final de algumas instruções e a otimizar nosso uso de “argumento” e “parâmetro”.</para>
<para>• Roger Sperberg indicou uma parte distorcida de lógica no Capítulo 3.</para>
<para>• Sam Bull indicou um parágrafo confuso no Capítulo 2.</para>
<para>• Andrew Cheung indicou duas ocorrências de “uso antes da definição”.</para>
<para>• C. Corey Capel notou uma palavra ausente e um erro de ortografia no Capítulo 4.</para>
<para>• Alessandra ajudou a eliminar algumas coisas confusas do Turtle.</para>
<para>• Wim Champagne encontrou uma confusão de palavras em um exemplo de dicionário.</para>
<para>• Douglas Wright indicou um problema com a divisão pelo piso em arc.</para>
<para>• Jared Spindor encontrou uma confusão no fim de uma frase.</para>
<para>• Lin Peiheng enviou várias sugestões muito úteis.</para>
<para>• Ray Hagtvedt enviou dois erros e um quase erro.</para>
<para>• Torsten Hübsch indicou uma inconsistência no Swampy.</para>
<para>• Inga Petuhhov corrigiu um exemplo no Capítulo 14.</para>
<para>• Arne Babenhauserheide enviou várias correções úteis.</para>
<para>• Mark E. Casida é é bom em encontrar palavras repetidas.</para>
<para>• Scott Tyler preencheu um que faltava. E em seguida enviou um monte de correções.</para>
<para>• Gordon Shephard enviou várias correções, todas em emails separados.</para>
<para>• Andrew Turner notou um erro no Capítulo 8.</para>
<para>• Adam Hobart corrigiu um problema com a divisão pelo piso em arc.</para>
<para>• Daryl Hammond e Sarah Zimmerman indicaram que eu trouxe o math.pi para a mesa cedo demais. E Zim achou um erro de ortografia.</para>
<para>• George Sass encontrou um bug em uma seção de depuração.</para>
<para>• Brian Bingham sugeriu o Exercício 11.5.</para>
<para>• Leah Engelbert-Fenton indicou que usei tuple como um nome de variável, contrariando meu próprio conselho. E, em seguida, encontrou uma porção de erros de ortografia e um “uso antes da definição”.</para>
<para>• Joe Funke achou um erro de ortografia.</para>
<para>• Chao-chao Chen encontrou uma inconsistência no exemplo de Fibonacci.</para>
<para>• Jeff Paine sabe a diferença entre espaço e spam.</para>
<para>• Lubos Pintes enviou um erro de ortografia.</para>
<para>• Gregg Lind e Abigail Heithoff sugeriram o Exercício 14.3.</para>
<para>• Max Hailperin entregou uma série de correções e sugestões. Max é um dos autores das extraordinárias Abstrações Concretas (Tecnologia de curso, 1998), que você pode querer ler quando terminar este livro.</para>
<para>• Chotipat Pornavalai encontrou um erro em uma mensagem de erro.</para>
<para>• Stanislaw Antol enviou uma lista com várias sugestões úteis.</para>
<para>• Eric Pashman enviou uma série de correções para os Capítulos 4-11.</para>
<para>• Miguel Azevedo encontrou alguns erros de ortografia.</para>
<para>• Jianhua Liu enviou uma longa lista de correções.</para>
<para>• Nick King encontrou uma palavra que faltava.</para>
<para>• Martin Zuther enviou uma longa lista de sugestões.</para>
<para>• Adam Zimmerman encontrou uma inconsistência em uma ocorrência de “ocorrência” e vários outros erros.</para>
<para>• Ratnakar Tiwari sugeriu uma nota de rodapé explicando triângulos degenerados.</para>
<para>• Anurag Goel sugeriu outra solução para is_abecedarian e enviou algumas correções adicionais. E ele sabe soletrar Jane Austen.</para>
<para>• Kelli Kratzer notou um dos erros de ortografia.</para>
<para>• Mark Griffiths indicou um exemplo confuso no Capítulo 3.</para>
<para>• Roydan Ongie encontrou um erro no meu método de Newton.</para>
<para>• Patryk Wolowiec me ajudou com um problema na versão do HTML.</para>
<para>• Mark Chonofsky me falou de uma nova palavra-chave no Python 3.</para>
<para>• Russell Coleman ajudou com a minha geometria.</para>
<para>• Wei Huang notou vários erros tipográficos.</para>
<para>• Karen Barber achou o erro de ortografia mais antigo no livro.</para>
<para>• Nam Nguyen encontrou um erro de ortografia e indicou que usei o Decorator, mas não mencionei o nome.</para>
<para>• Stéphane Morin enviou várias correções e sugestões.</para>
<para>• Paul Stoop corrigiu um erro de ortografia em uses_only.</para>
<para>• Eric Bronner indicou uma confusão na discussão da ordem de operações.</para>
<para>• Alexandros Gezerlis definiu um novo padrão para o número e a qualidade das sugestões que enviou. Estamos profundamente gratos!</para>
<para>• Gray Thomas sabe diferenciar a direita da esquerda.</para>
<para>• Giovanni Escobar Sosa enviou uma longa lista de correções e sugestões.</para>
<para>• Alix Etienne corrigiu uma das URLs.</para>
<para>• Kuang He encontrou um erro de ortografia.</para>
<para>• Daniel Neilson corrigiu um erro sobre a ordem de operações.</para>
<para>• Will McGinnis indicou que polyline foi definida de forma diferente em dois lugares.</para>
<para>• Swarup Sahoo notou que faltava um ponto e vírgula.</para>
<para>• Frank Hecker indicou que um exercício estava mal especificado e encontrou alguns links quebrados.</para>
<para>• Animesh B me ajudou a esclarecer um exemplo confuso.</para>
<para>• Martin Caspersen encontrou dois erros de arredondamento.</para>
<para>• Gregor Ulm enviou várias correções e sugestões.</para>
<para>• Dimitrios Tsirigkas sugeriu que eu esclarecesse um exercício.</para>
<para>• Carlos Tafur enviou uma página de correções e sugestões.</para>
<para>• Martin Nordsletten encontrou um bug na solução de um exercício.</para>
<para>• Lars O.D. Christensen encontrou uma referência quebrada.</para>
<para>• Vitor Simeone encontrou um erro de ortografia.</para>
<para>• Sven Hoexter indicou que uma entrada de uma variável nomeada se sobrepõe a uma função integrada.</para>
<para>• Viet Le encontrou um erro de ortografia.</para>
<para>• Stephen Gregory indicou o problema com cmp no Python 3.</para>
<para>• Matthew Shultz me avisou sobre um link quebrado.</para>
<para>• Lokesh Kumar Makani me avisou sobre alguns links quebrados e algumas alterações em mensagens de erro.</para>
<para>• Ishwar Bhat corrigiu minha declaração do último teorema de Fermat.</para>
<para>• Brian McGhie sugeriu um esclarecimento.</para>
<para>• Andrea Zanella traduziu o livro para o italiano e enviou uma série de correções ao longo do caminho.</para>
<para>• Muito, muito obrigada a Melissa Lewis e Luciano Ramalho pelos comentários e sugestões excelentes na segunda edição.</para>
<para>• Obrigado a Harry Percival do PythonAnywhere por ajudar as pessoas a começar a usar o Python em um navegador.</para>
<para>• Xavier Van Aubel fez várias correções úteis na segunda edição.</para>
<para>capítulo 1</para>
<para>A jornada do programa</para>
<para>O objetivo deste livro é ensinar a pensar como um cientista da computação. Esta forma de pensar combina algumas das melhores características da matemática, da engenharia e das ciências naturais. Assim como os matemáticos, os cientistas da computação usam linguagens formais para denotar ideias (especificamente operações de computação). Como engenheiros, eles projetam coisas, reunindo componentes em sistemas e avaliando as opções de melhor retorno entre as alternativas à disposição. Como cientistas, observam o comportamento de sistemas complexos, formam hipóteses e testam previsões.</para>
<para>A habilidade específica mais importante de um cientista da computação é a resolução de problemas. Resolução de problemas significa a capacidade de formular problemas, pensar criativamente em soluções e expressar uma solução de forma clara e precisa. Assim, o processo de aprender a programar é uma oportunidade excelente para exercitar a habilidade de resolver problemas. É por isso que este capítulo se chama “A jornada do programa”.</para>
<para>Em um nível você aprenderá a programar, uma habilidade útil por si mesma. Em outro nível usará a programação como um meio para um fim. Conforme avançarmos, este fim ficará mais claro.</para>
<para>O que é um programa?</para>
<para>Um programa é uma sequência de instruções que especifica como executar uma operação de computação. A operação de computação pode ser algo matemático, como solucionar um sistema de equações ou encontrar as raízes de um polinômio, mas também pode ser uma operação de computação simbólica, como a busca e a substituição de textos em um documento; ou algo gráfico, como o processamento de uma imagem ou a reprodução de um vídeo.</para>
<para>Os detalhes parecem diferentes em linguagens diferentes, mas algumas instruções básicas aparecem em quase todas as linguagens:</para>
<para>entrada:</para>
<para>Receber dados do teclado, de um arquivo, da rede ou de algum outro dispositivo.</para>
<para>saída:</para>
<para>Exibir dados na tela, salvá-los em um arquivo, enviá-los pela rede etc.</para>
<para>matemática:</para>
<para>Executar operações matemáticas básicas como adição e multiplicação.</para>
<para>execução condicional:</para>
<para>Verificar a existência de certas condições e executar o código adequado.</para>
<para>repetição:</para>
<para>Executar várias vezes alguma ação, normalmente com algumas variações.</para>
<para>Acredite ou não, isto é basicamente tudo o que é preciso saber. Cada programa que você já usou, complicado ou não, é composto de instruções muito parecidas com essas. Podemos então chegar à conclusão de que programar é o processo de quebrar uma tarefa grande e complexa em subtarefas cada vez menores, até que estas sejam simples o suficiente para serem executadas por uma dessas instruções básicas.</para>
<para>Execução do Python</para>
<para>Um dos desafios de começar a usar Python é ter que instalar no seu computador o próprio programa e outros relacionados. Se tiver familiaridade com o seu sistema operacional, e especialmente se não tiver problemas com a interface de linha de comando, você não terá dificuldade para instalar o Python. Mas para principiantes pode ser trabalhoso aprender sobre administração de sistemas e programação ao mesmo tempo.</para>
<para>Para evitar esse problema, recomendo que comece a executar o Python em um navegador. Depois, quando você já conhecer o Python um pouco mais, darei sugestões para instalá-lo em seu computador.</para>
<para>Há uma série de sites que ajudam a usar e executar o Python. Se já tem um favorito, vá em frente e use-o. Senão, recomendo o PythonAnywhere. Apresento instruções detalhadas sobre os primeiros passos no link http://tinyurl.com/thinkpython2e.</para>
<para>Há duas versões do Python, o Python 2 e o Python 3. Como elas são muito semelhantes, se você aprender uma versão, é fácil trocar para a outra. Como é iniciante, você encontrará poucas diferenças. Este livro foi escrito para o Python 3, mas também incluí algumas notas sobre o Python 2.</para>
<para>O interpretador do Python é um programa que lê e executa o código Python. Dependendo do seu ambiente, é possível iniciar o interpretador clicando em um ícone, ou digitando python em uma linha de comando. Quando ele iniciar, você deverá ver uma saída como esta:</para>
<para>Python 3.4.0 (default, Jun 19 2015, 14:20:21)</para>
<para>[GCC 4.8.2] on linux</para>
<para>Type "help", "copyright", "credits" or "license" for more information.</para>
<para>>>></para>
<para>As três primeiras linhas contêm informações sobre o interpretador e o sistema operacional em que está sendo executado, portanto podem ser diferentes para você. Mas é preciso conferir se o número da versão, que é 3.4.0 neste exemplo, começa com 3, o que indica que você está executando o Python 3. Se começar com 2, você está executando (adivinhe!) o Python 2.</para>
<para>A última linha é um prompt indicando que o interpretador está pronto para você digitar o código. Se digitar uma linha de código e pressionar Enter, o interpretador exibe o resultado:</para>
<para>>>> 1 + 1</para>
<para>2</para>
<para>Agora você está pronto para começar. Daqui em diante, vou supor que você sabe como inicializar o interpretador do Python e executar o código.</para>
<para>O primeiro programa</para>
<para>Tradicionalmente, o primeiro programa que se escreve em uma nova linguagem chama-se “Hello, World!”, porque tudo o que faz é exibir as palavras “Hello, World!” na tela. No Python, ele se parece com isto:</para>
<para>>>> print('Hello, World!')</para>
<para>Este é um exemplo de uma instrução print (instrução de impressão), embora na realidade ela não imprima nada em papel. Ela exibe um resultado na tela. Nesse caso, o resultado são as palavras:</para>
<para>Hello, World!</para>
<para>As aspas apenas marcam o começo e o fim do texto a ser exibido; elas não aparecem no resultado.</para>
<para>Os parênteses indicam que o print é uma função. Veremos funções no Capítulo 3.</para>
<para>No Python 2, a instrução print é ligeiramente diferente; ela não é uma função, portanto não usa parênteses.</para>
<para>>>> print 'Hello, World!'</para>
<para>Esta distinção fará mais sentido em breve, mas isso é o suficiente para começar.</para>
<para>Operadores aritméticos</para>
<para>Depois do “Hello, World”, o próximo passo é a aritmética. O Python tem operadores, que são símbolos especiais representando operações de computação, como adição e multiplicação.</para>
<para>Os operadores +, - e * executam a adição, a subtração e a multiplicação, como nos seguintes exemplos:</para>
<para>>>> 40 + 2</para>
<para>42</para>
<para>>>> 43 - 1</para>
<para>42</para>
<para>>>> 6 * 7</para>
<para>42</para>
<para>O operador / executa a divisão:</para>
<para>>>> 84 / 2</para>
<para>42.0</para>
<para>Pode ser que você fique intrigado pelo resultado ser 42.0 em vez de 42. Vou explicar isso na próxima seção.</para>
<para>Finalmente, o operador ** executa a exponenciação; isto é, eleva um número a uma potência:</para>
<para>>>> 6**2 + 6</para>
<para>42</para>
<para>Em algumas outras linguagens, o ^ é usado para a exponenciação, mas no Python é um operador bitwise, chamado XOR. Se não tiver familiaridade com operadores bitwise, o resultado o surpreenderá:</para>
<para>>>> 6 ^ 2</para>
<para>4</para>
<para>Não abordarei operadores bitwise neste livro, mas você pode ler sobre eles em http://wiki.python.org/moin/BitwiseOperators.</para>
<para>Valores e tipos</para>
<para>Um valor é uma das coisas básicas com as quais um programa trabalha, como uma letra ou um número. Alguns valores que vimos até agora foram 2, 42.0 e 'Hello, World!'.</para>
<para>Esses valores pertencem a tipos diferentes: 2 é um número inteiro, 42.0 é um número de ponto flutuante e 'Hello, World!' é uma string, assim chamada porque as letras que contém estão em uma sequência em cadeia.</para>
<para>Se não tiver certeza sobre qual é o tipo de certo valor, o interpretador pode dizer isso a você:</para>
<para>>>> type(2)</para>
<para><class 'int'></para>
<para>>>> type(42.0)</para>
<para><class 'float'></para>
<para>>>> type('Hello, World!')</para>
<para><class 'str'></para>
<para>Nesses resultados, a palavra “class” [classe] é usada no sentido de categoria; um tipo é uma categoria de valores.</para>
<para>Como se poderia esperar, números inteiros pertencem ao tipo int, strings pertencem ao tipo str e os números de ponto flutuante pertencem ao tipo float.</para>
<para>E valores como '2' e '42.0'? Parecem números, mas estão entre aspas como se fossem strings:</para>
<para>>>> type('2')</para>
<para><class 'str'></para>
<para>>>> type('42.0')</para>
<para><class 'str'></para>
<para>Então são strings.</para>
<para>Ao digitar um número inteiro grande, alguns podem usar a notação americana, com vírgulas entre grupos de dígitos, como em 1,000,000. Este não é um número inteiro legítimo no Python e resultará em:</para>
<para>>>> 1,000,000</para>
<para>(1, 0, 0)</para>
<para>O que não é de modo algum o que esperávamos! O Python interpreta 1,000,000 como uma sequência de números inteiros separados por vírgulas. Aprenderemos mais sobre este tipo de sequência mais adiante.</para>
<para>Linguagens formais e naturais</para>
<para>As linguagens naturais são os idiomas que as pessoas falam, como inglês, espanhol e francês. Elas não foram criadas pelas pessoas (embora as pessoas tentem impor certa ordem a elas); desenvolveram-se naturalmente.</para>
<para>As linguagens formais são linguagens criadas pelas pessoas para aplicações específicas. Por exemplo, a notação que os matemáticos usam é uma linguagem formal especialmente boa para denotar relações entre números e símbolos. Os químicos usam uma linguagem formal para representar a estrutura química de moléculas. E o mais importante:</para>
<para>As linguagens de programação são idiomas formais criados para expressar operações de computação.</para>
<para>As linguagens formais geralmente têm regras de sintaxe estritas que governam a estrutura de declarações. Por exemplo, na matemática a declaração 3 + 3 = 6 tem uma sintaxe correta, mas não 3 + = 3$6. Na química, H2O é uma fórmula sintaticamente correta, mas 2Zz não é.</para>
<para>As regras de sintaxe vêm em duas categorias relativas a símbolos e estrutura. Os símbolos são os elementos básicos da linguagem, como palavras, números e elementos químicos. Um dos problemas com 3 + = 3$6 é que o $ não é um símbolo legítimo na matemática (pelo menos até onde eu sei). De forma similar, 2Zz não é legítimo porque não há nenhum elemento com a abreviatura Zz.</para>
<para>O segundo tipo de regra de sintaxe refere-se ao modo no qual os símbolos são combinados. A equação 3 + = 3 não é legítima porque, embora + e = sejam símbolos legítimos, não se pode ter um na sequência do outro. De forma similar, em uma fórmula química o subscrito vem depois do nome de elemento, não antes.</para>
<para>Esta é um@ frase bem estruturada em portuguê$, mas com s*mbolos inválidos. Esta frase todos os símbolos válidos tem, mas estrutura válida sem.</para>
<para>Ao ler uma frase em português ou uma declaração em uma linguagem formal, é preciso compreender a estrutura (embora em uma linguagem natural você faça isto de forma subconsciente). Este processo é chamado de análise.</para>
<para>Embora as linguagens formais e naturais tenham muitas características em comum – símbolos, estrutura e sintaxe – há algumas diferenças:</para>
<para>ambiguidade:</para>
<para>As linguagens naturais são cheias de ambiguidade e as pessoas lidam com isso usando pistas contextuais e outras informações. As linguagens formais são criadas para ser quase ou completamente inequívocas, ou seja, qualquer afirmação tem exatamente um significado, independentemente do contexto.</para>
<para>redundância:</para>
<para>Para compensar a ambiguidade e reduzir equívocos, as linguagens naturais usam muita redundância. Por causa disso, muitas vezes são verborrágicas. As linguagens formais são menos redundantes e mais concisas.</para>
<para>literalidade:</para>
<para>As linguagens naturais são cheias de expressões e metáforas. Se eu digo “Caiu a ficha”, provavelmente não há ficha nenhuma na história, nem nada que tenha caído (esta é uma expressão para dizer que alguém entendeu algo depois de certo período de confusão). As linguagens formais têm significados exatamente iguais ao que expressam.</para>
<para>Como todos nós crescemos falando linguagens naturais, às vezes é difícil se ajustar a linguagens formais. A diferença entre a linguagem natural e a formal é semelhante à diferença entre poesia e prosa, mas vai além:</para>
<para>Poesia:</para>
<para>As palavras são usadas tanto pelos sons como pelos significados, e o poema inteiro cria um efeito ou resposta emocional. A ambiguidade não é apenas comum, mas muitas vezes proposital.</para>
<para>Prosa:</para>
<para>O significado literal das palavras é o mais importante e a estrutura contribui para este significado. A prosa é mais acessível à análise que a poesia, mas muitas vezes ainda é ambígua.</para>
<para>Programas:</para>
<para>A significado de um programa de computador é inequívoco e literal e pode ser entendido inteiramente pela análise dos símbolos e da estrutura.</para>
<para>As linguagens formais são mais densas que as naturais, então exigem mais tempo para a leitura. Além disso, a estrutura é importante, então nem sempre é melhor ler de cima para baixo e da esquerda para a direita. Em vez disso, aprenda a analisar o programa primeiro, identificando os símbolos e interpretando a estrutura. E os detalhes fazem diferença. Pequenos erros em ortografia e pontuação, que podem não importar tanto nas linguagens naturais, podem fazer uma grande diferença em uma língua formal.</para>
<para>Depuração</para>
<para>Os programadores erram. Por um capricho do destino, erros de programação são chamados de bugs (insetos) e o processo de rastreá-los chama-se depuração (debugging).</para>
<para>Programar, e especialmente fazer a depuração, às vezes traz emoções fortes. Se tiver dificuldade com certo bug, você pode ficar zangado, desesperado ou constrangido.</para>
<para>Há evidências de que as pessoas respondem naturalmente a computadores como se fossem pessoas. Quando funcionam bem, pensamos neles como parceiros da equipe, e quando são teimosos ou grosseiros, respondemos a eles do mesmo jeito que fazemos com pessoas grosseiras e teimosas (Reeves e Nass, The Media Equation: How People Treat Computers, Television, and New Media Like Real People and Places; A equação da mídia: como as pessoas tratam os computadores, a televisão e as novas mídias como se fossem pessoas e lugares reais).</para>
<para>Prepare-se para essas reações, pois isso pode ajudar a lidar com elas. Uma abordagem é pensar no computador como um funcionário com certas vantagens, como velocidade e precisão, e certas desvantagens, como a falta de empatia e a incapacidade de compreender um contexto mais amplo.</para>
<para>Seu trabalho é ser um bom gerente: encontrar formas de aproveitar as vantagens e atenuar as desvantagens. E também encontrar formas de usar suas emoções para lidar com o problema sem deixar suas reações interferirem na sua capacidade de trabalho.</para>
<para>Aprender a depurar erros pode ser frustrante, mas é uma habilidade valiosa, útil para muitas atividades além da programação. No fim de cada capítulo há uma seção como esta, com as minhas sugestões para fazer a depuração. Espero que sejam úteis!</para>
<para>Glossário</para>
<para>resolução de problemas:</para>
<para>O processo de formular um problema, encontrar uma solução e expressá-la.</para>
<para>linguagem de alto nível:</para>
<para>Uma linguagem de programação como Python, que foi criada com o intuito de ser fácil para os humanos escreverem e lerem.</para>
<para>linguagem de baixo nível:</para>
<para>Uma linguagem de programação criada para o computador executar com facilidade; também chamada de “linguagem de máquina” ou “linguagem assembly”.</para>
<para>portabilidade:</para>
<para>A propriedade de um programa de poder ser executado em mais de um tipo de computador.</para>
<para>interpretador:</para>
<para>Um programa que lê outro programa e o executa.</para>
<para>prompt:</para>
<para>Caracteres expostos pelo interpretador para indicar que está pronto para receber entradas do usuário.</para>
<para>programa:</para>
<para>Conjunto de instruções que especificam uma operação de computação.</para>
<para>instrução print:</para>
<para>Uma instrução que faz o interpretador do Python exibir um valor na tela.</para>
<para>operador:</para>
<para>Um símbolo especial que representa uma operação de computação simples como adição, multiplicação ou concatenação de strings.</para>
<para>valor:</para>
<para>Uma das unidades básicas de dados, como um número ou string, que um programa manipula.</para>
<para>tipo:</para>
<para>Uma categoria de valores. Os tipos que vimos por enquanto são números inteiros (tipo int), números de ponto flutuante (tipo float) e strings (tipo str).</para>
<para>inteiro:</para>
<para>Um tipo que representa números inteiros.</para>
<para>ponto flutuante:</para>
<para>Um tipo que representa números com partes fracionárias.</para>
<para>string:</para>
<para>Um tipo que representa sequências de caracteres.</para>
<para>linguagem natural:</para>
<para>Qualquer linguagem que as pessoas falam e que se desenvolveu naturalmente.</para>
<para>linguagem formal:</para>
<para>Qualquer linguagem que as pessoas criaram com objetivos específicos, como representar ideias matemáticas ou programas de computador; todas as linguagens de programação são linguagens formais.</para>
<para>símbolo:</para>
<para>Um dos elementos básicos da estrutura sintática de um programa, análogo a uma palavra em linguagem natural.</para>
<para>sintaxe:</para>
<para>As regras que governam a estrutura de um programa.</para>
<para>análise:</para>
<para>Examinar um programa e sua estrutura sintática.</para>
<para>bug:</para>
<para>Um erro em um programa.</para>
<para>depuração:</para>
<para>O processo de encontrar e corrigir (depurar) bugs.</para>
<para>Exercícios</para>
<para>Exercício 1.1</para>
<para>É uma boa ideia ler este livro em frente a um computador para testar os exemplos durante a leitura.</para>
<para>Sempre que estiver testando um novo recurso, você deve tentar fazer erros. Por exemplo, no programa “Hello, World!”, o que acontece se omitir uma das aspas? E se omitir ambas? E se você soletrar a instrução print de forma errada?</para>
<para>Este tipo de experimento ajuda a lembrar o que foi lido; também ajuda quando você estiver programando, porque assim conhecerá o significado das mensagens de erro. É melhor fazer erros agora e de propósito que depois e acidentalmente.</para>
<para>1. Em uma instrução print, o que acontece se você omitir um dos parênteses ou ambos?</para>
<para>2. Se estiver tentando imprimir uma string, o que acontece se omitir uma das aspas ou ambas?</para>
<para>3. Você pode usar um sinal de menos para fazer um número negativo como -2. O que acontece se puser um sinal de mais antes de um número? E se escrever assim: 2++2?</para>
<para>4. Na notação matemática, zeros à esquerda são aceitáveis, como em 02. O que acontece se você tentar usar isso no Python?</para>
<para>5. O que acontece se você tiver dois valores sem nenhum operador entre eles?</para>
<para>Exercício 1.2</para>
<para>Inicialize o interpretador do Python e use-o como uma calculadora.</para>
<para>1. Quantos segundos há em 42 minutos e 42 segundos?</para>
<para>2. Quantas milhas há em 10 quilômetros? Dica: uma milha equivale a 1,61 quilômetro.</para>
<para>3. Se você correr 10 quilômetros em 42 minutos e 42 segundos, qual é o seu passo médio (tempo por milha em minutos e segundos)? Qual é a sua velocidade média em milhas por hora?</para>
<para>capítulo 2</para>
<para>Variáveis, expressões e instruções</para>
<para>Um dos recursos mais eficientes de uma linguagem de programação é a capacidade de manipular variáveis. Uma variável é um nome que se refere a um valor.</para>
<para>Instruções de atribuição</para>
<para>Uma instrução de atribuição cria uma nova variável e dá um valor a ela:</para>
<para>>>> message = 'And now for something completely different'</para>
<para>>>> n = 17</para>
<para>>>> pi = 3.141592653589793</para>
<para>Esse exemplo faz três atribuições. A primeira atribui uma string a uma nova variável chamada message; a segunda dá o número inteiro 17 a n; a terceira atribui o valor (aproximado) de π a pi.</para>
<para>Uma forma comum de representar variáveis por escrito é colocar o nome com uma flecha apontando para o seu valor. Este tipo de número é chamado de diagrama de estado porque mostra o estado no qual cada uma das variáveis está (pense nele como o estado de espírito da variável). A Figura 2.1 mostra o resultado do exemplo anterior.</para>
<para/>
<para>Figura 2.1 – Diagrama de estado.</para>
<para>Nomes de variáveis</para>
<para>Os programadores geralmente escolhem nomes significativos para as suas variáveis – eles documentam o uso da variável.</para>
<para>Nomes de variáveis podem ser tão longos quanto você queira. Podem conter tanto letras como números, mas não podem começar com um número. É legal usar letras maiúsculas, mas a convenção é usar apenas letras minúsculas para nomes de variáveis.</para>
<para>O caractere de sublinhar (_) pode aparecer em um nome. Muitas vezes é usado em nomes com várias palavras, como your_name ou airspeed_of_unladen_swallow.</para>
<para>Se você der um nome ilegal a uma variável, recebe um erro de sintaxe:</para>
<para>>>> 76trombones = 'big parade'</para>
<para>SyntaxError: invalid syntax</para>
<para>>>> more@ = 1000000</para>
<para>SyntaxError: invalid syntax</para>
<para>>>> class = 'Advanced Theoretical Zymurgy'</para>
<para>SyntaxError: invalid syntax</para>
<para>76trombones é ilegal porque começa com um número. more@ é ilegal porque contém um caractere ilegal, o @. Mas o que há de errado com class?</para>
<para>A questão é que class é uma das palavras-chave do Python. O interpretador usa palavras-chave para reconhecer a estrutura do programa e elas não podem ser usadas como nomes de variável.</para>
<para>O Python 3 tem estas palavras-chave:</para>
<para>False class finally is return</para>
<para>None continue for lambda try</para>
<para>True def from nonlocal while</para>
<para>and del global not with</para>
<para>as elif if or yield</para>
<para>assert else import pass</para>
<para>break except in raise</para>
<para>Você não precisa memorizar essa lista. Na maior parte dos ambientes de desenvolvimento, as palavras-chave são exibidas em uma cor diferente; se você tentar usar uma como nome de variável, vai perceber.</para>
<para>Expressões e instruções</para>
<para>Uma expressão é uma combinação de valores, variáveis e operadores. Um valor por si mesmo é considerado uma expressão, assim como uma variável, portanto as expressões seguintes são todas legais:</para>
<para>>>> 42</para>
<para>42</para>
<para>>>> n</para>
<para>17</para>
<para>>>> n + 25</para>
<para>42</para>
<para>Quando você digita uma expressão no prompt, o interpretador a avalia, ou seja, ele encontra o valor da expressão. Neste exemplo, o n tem o valor 17 e n + 25 tem o valor 42.</para>
<para>Uma instrução é uma unidade de código que tem um efeito, como criar uma variável ou exibir um valor.</para>
<para>>>> n = 17</para>
<para>>>> print(n)</para>
<para>A primeira linha é uma instrução de atribuição que dá um valor a n. A segunda linha é uma instrução de exibição que exibe o valor de n.</para>
<para>Quando você digita uma instrução, o interpretador a executa, o que significa que ele faz o que a instrução diz. Em geral, instruções não têm valores.</para>
<para>Modo script</para>
<para>Até agora executamos o Python no modo interativo, no qual você interage diretamente com o interpretador. O modo interativo é uma boa forma de começar, mas se estiver trabalhando com mais do que algumas linhas do código, o processo pode ficar desorganizado.</para>
<para>A alternativa é salvar o código em um arquivo chamado script e então executar o interpretador no modo script para executá-lo. Por convenção, os scripts no Python têm nomes que terminam com .py.</para>
<para>Se souber como criar e executar um script no seu computador, você está pronto. Senão, recomendo usar o PythonAnywhere novamente. Inseri instruções sobre como executar programas no modo script em http://tinyurl.com/thinkpython2e.</para>
<para>Como o Python oferece os dois modos, você pode testar pedaços do código no modo interativo antes de colocá-los em um script. Mas há diferenças entre o modo interativo e o modo script que podem confundir as pessoas.</para>
<para>Por exemplo, se estiver usando o Python como uma calculadora, você poderia digitar:</para>
<para>>>> miles = 26.2</para>
<para>>>> miles * 1.61</para>
<para>42.182</para>
<para>A primeira linha atribui um valor a miles, mas não tem efeito visível. A segunda linha é uma expressão, então o interpretador a avalia e exibe o resultado. No fim, chega-se ao resultado de que uma maratona tem aproximadamente 42 quilômetros.</para>
<para>Mas se você digitar o mesmo código em um script e executá-lo, não recebe nenhuma saída. Uma expressão, por conta própria, não tem efeito visível no modo script. O Python, na verdade, avalia a expressão, mas não exibe o valor a menos que você especifique:</para>
<para>miles = 26.2</para>
<para>print(miles * 1.61)</para>
<para>Este comportamento pode confundir um pouco no início.</para>
<para>Um script normalmente contém uma sequência de instruções. Se houver mais de uma instrução, os resultados aparecem um após o outro, conforme as instruções sejam executadas.</para>
<para>Por exemplo, o script</para>
<para>print(1)</para>
<para>x = 2</para>
<para>print(x)</para>
<para>produz a saída</para>
<para>1</para>
<para>2</para>
<para>A instrução de atribuição não produz nenhuma saída.</para>
<para>Para verificar sua compreensão, digite as seguintes instruções no interpretador do Python e veja o que fazem:</para>
<para>5</para>
<para>x = 5</para>
<para>x + 1</para>
<para>Agora ponha as mesmas instruções em um script e o execute. Qual é a saída? Altere o script transformando cada expressão em uma instrução de exibição e então o execute novamente.</para>
<para>Ordem das operações</para>
<para>Quando uma expressão contém mais de um operador, a ordem da avaliação depende da ordem das operações. Para operadores matemáticos, o Python segue a convenção matemática. O acrônimo PEMDAS pode ser útil para lembrar das regras:</para>
<para>• Os Parênteses têm a precedência mais alta e podem ser usados para forçar a avaliação de uma expressão na ordem que você quiser. Como as expressões em parênteses são avaliadas primeiro, 2 * (3-1) é 4, e (1+1)**(5-2) é 8. Também é possível usar parênteses para facilitar a leitura de uma expressão, como no caso de (minute * 100) / 60, mesmo se o resultado não for alterado.</para>
<para>• A Exponenciação tem a próxima precedência mais alta, então 1 + 2**3 é 9, não 27, e 2 * 3**2 é 18, não 36.</para>
<para>• A Multiplicação e a Divisão têm precedência mais alta que a Adição e a Subtração. Assim, 2*3-1 é 5, não 4, e 6+4/2 é 8, não 5.</para>
<para>• Os operadores com a mesma precedência são avaliados da esquerda para a direita (exceto na exponenciação). Assim, na expressão degrees/ 2 * pi, a divisão acontece primeiro e o resultado é multiplicado por pi. Para dividir por 2π, você pode usar parênteses ou escrever degrees / 2 / pi.</para>
<para>Eu não fico sempre tentando lembrar da precedência de operadores. Se a expressão não estiver clara à primeira vista, uso parênteses para fazer isso.</para>
<para>Operações com strings</para>
<para>Em geral, não é possível executar operações matemáticas com strings, mesmo se elas parecerem números, então coisas assim são ilegais:</para>
<para>'2'-'1' 'eggs'/'easy' 'third'*'a charm'</para>
<para>Mas há duas exceções, + e *.</para>
<para>O operador + executa uma concatenação de strings, ou seja, une as strings pelas extremidades. Por exemplo:</para>
<para>>>> first = 'throat'</para>
<para>>>> second = 'warbler'</para>
<para>>>> first + second</para>
<para>throatwarbler</para>
<para>O operador * também funciona em strings; ele executa a repetição. Por exemplo, 'Spam'*3 é 'SpamSpamSpam'. Se um dos valores for uma string, o outro tem de ser um número inteiro.</para>
<para>Este uso de + e * faz sentido por analogia com a adição e a multiplicação. Tal como 4*3 é equivalente a 4+4+4, esperamos que 'Spam'*3 seja o mesmo que 'Spam'+'Spam'+'Spam', e assim é. Por outro lado, há uma diferença significativa entre a concatenação de strings e a repetição em relação à adição e à multiplicação de números inteiros. Você consegue pensar em uma propriedade que a adição tem, mas a concatenação de strings não tem?</para>
<para>Comentários</para>
<para>Conforme os programas ficam maiores e mais complicados, eles são mais difíceis de ler. As linguagens formais são densas e muitas vezes é difícil ver um pedaço de código e compreender o que ele faz ou por que faz isso.</para>
<para>Por essa razão, é uma boa ideia acrescentar notas aos seus programas para explicar em linguagem natural o que o programa está fazendo. Essas notas são chamadas de comentários, e começam com o símbolo #:</para>
<para># computa a percentagem da hora que passou</para>
<para>percentage = (minute * 100) / 60</para>
<para>Nesse caso, o comentário aparece sozinho em uma linha. Você também pode pôr comentários no fim das linhas:</para>
<para>percentage = (minute * 100) / 60 # percentagem de uma hora</para>
<para>Tudo do # ao fim da linha é ignorado – não tem efeito na execução do programa.</para>
<para>Os comentários tornam-se mais úteis quando documentam algo no código que não está óbvio. Podemos supor que o leitor compreenda o que o código faz; assim, é mais útil explicar porque faz o que faz.</para>
<para>Este comentário é redundante em relação ao código, além de inútil:</para>
<para>v = 5 # atribui 5 a v</para>
<para>Este comentário contém informações úteis que não estão no código:</para>
<para>v = 5 # velocidade em metros/segundo.</para>
<para>Bons nomes de variáveis podem reduzir a necessidade de comentários, mas nomes longos podem tornar expressões complexas difíceis de ler, então é preciso analisar o que vale mais a pena.</para>
<para>Depuração</para>
<para>Há três tipos de erros que podem ocorrer em um programa: erros de sintaxe, erros de tempo de execução e erros semânticos. É útil distinguir entre eles para rastreá-los mais rapidamente.</para>
<para>Erro de sintaxe:</para>
<para>A “sintaxe” refere-se à estrutura de um programa e suas respectivas regras. Por exemplo, os parênteses devem vir em pares correspondentes, então (1 + 2) é legal, mas 8) é um erro de sintaxe.</para>
<para>Se houver um erro de sintaxe em algum lugar no seu programa, o Python exibe uma mensagem de erro e para, e não será possível executar o programa. Nas primeiras poucas semanas da sua carreira em programação, você pode passar muito tempo rastreando erros de sintaxe. Ao adquirir experiência, você fará menos erros e os encontrará mais rápido.</para>
<para>Erro de tempo de execução:</para>
<para>O segundo tipo de erro é o erro de tempo de execução, assim chamado porque o erro não aparece até que o programa seja executado. Esses erros também se chamam de exceções porque normalmente indicam que algo excepcional (e ruim) aconteceu.</para>
<para>Os erros de tempo de execução são raros nos programas simples que veremos nos primeiros capítulos, então pode demorar um pouco até você encontrar algum.</para>
<para>Erro semântico:</para>
<para>O terceiro tipo do erro é “semântico”, ou seja, relacionado ao significado. Se houver um erro semântico no seu programa, ele será executado sem gerar mensagens de erro, mas não vai fazer a coisa certa. Vai fazer algo diferente. Especificamente, vai fazer o que você disser para fazer.</para>
<para>Identificar erros semânticos pode ser complicado, porque é preciso trabalhar de trás para a frente, vendo a saída do programa e tentando compreender o que ele está fazendo.</para>
<para>Glossário</para>
<para>variável:</para>
<para>Um nome que se refere a um valor.</para>
<para>atribuição:</para>
<para>Uma instrução que atribui um valor a uma variável.</para>
<para>diagrama de estado:</para>
<para>Uma representação gráfica de um grupo de variáveis e os valores a que se referem.</para>
<para>palavra-chave:</para>
<para>Uma palavra reservada, usada para analisar um programa; não é possível usar palavras-chave como if, def e while como nomes de variáveis.</para>
<para>operando:</para>
<para>Um dos valores que um operador produz.</para>
<para>expressão:</para>
<para>Uma combinação de variáveis, operadores e valores que representa um resultado único.</para>
<para>avaliar:</para>
<para>Simplificar uma expressão executando as operações para produzir um valor único.</para>
<para>instrução:</para>
<para>Uma seção do código que representa um comando ou ação. Por enquanto, as instruções que vimos são instruções de atribuições e de exibição.</para>
<para>executar:</para>
<para>Executar uma instrução para fazer o que ela diz.</para>
<para>modo interativo:</para>
<para>Um modo de usar o interpretador do Python, digitando o código no prompt.</para>
<para>modo script:</para>
<para>Um modo de usar o interpretador do Python para ler código em um script e executá-lo.</para>
<para>script:</para>
<para>Um programa armazenado em um arquivo.</para>
<para>ordem das operações:</para>
<para>As regras que governam a ordem na qual as expressões que envolvem vários operadores e operandos são avaliadas.</para>
<para>concatenar:</para>
<para>Juntar dois operandos pelas extremidades.</para>
<para>comentários:</para>
<para>Informações em um programa destinadas a outros programadores (ou qualquer pessoa que leia o texto fonte) que não têm efeito sobre a execução do programa.</para>
<para>erro de sintaxe:</para>
<para>Um erro em um programa que torna sua análise impossível (e por isso impossível de interpretar).</para>
<para>exceção:</para>
<para>Um erro que se descobre quando o programa é executado.</para>
<para>semântica:</para>
<para>O significado de um programa.</para>
<para>erro semântico:</para>
<para>Um erro que faz com que um programa faça algo diferente do que o programador pretendia.</para>
<para>Exercícios</para>
<para>Exercício 2.1</para>
<para>Repetindo o meu conselho do capítulo anterior, sempre que você aprender um recurso novo, você deve testá-lo no modo interativo e fazer erros de propósito para ver o que acontece.</para>
<para>• Vimos que n = 42 é legal. E 42 = n?</para>
<para>• Ou x = y = 1?</para>
<para>• Em algumas linguagens, cada instrução termina em um ponto e vírgula ;. O que acontece se você puser um ponto e vírgula no fim de uma instrução no Python?</para>
<para>• E se puser um ponto no fim de uma instrução?</para>
<para>• Em notação matemática é possível multiplicar x e y desta forma: xy. O que acontece se você tentar fazer o mesmo no Python?</para>
<para>Exercício 2.2</para>
<para>Pratique o uso do interpretador do Python como uma calculadora:</para>
<para>1. O volume de uma esfera com raio r é . Qual é o volume de uma esfera com raio 5?</para>
<para>2. Suponha que o preço de capa de um livro seja R$ 24,95, mas as livrarias recebem um desconto de 40%. O transporte custa R$ 3,00 para o primeiro exemplar e 75 centavos para cada exemplar adicional. Qual é o custo total de atacado para 60 cópias?</para>
<para>3. Se eu sair da minha casa às 6:52 e correr 1 quilômetro a um certo passo (8min15s por quilômetro), então 3 quilômetros a um passo mais rápido (7min12s por quilômetro) e 1 quilômetro no mesmo passo usado em primeiro lugar, que horas chego em casa para o café da manhã?</para>
<para>capítulo 3</para>
<para>Funções</para>
<para>No contexto da programação, uma função é uma sequência nomeada de instruções que executa uma operação de computação. Ao definir uma função, você especifica o nome e a sequência de instruções. Depois, pode “chamar” a função pelo nome.</para>
<para>Chamada de função</para>
<para>Já vimos um exemplo de chamada de função:</para>
<para>>>> type(42)</para>
<para><class 'int'></para>
<para>O nome da função é type. A expressão entre parênteses é chamada de argumento da função. Para esta função, o resultado é o tipo do argumento.</para>
<para>É comum dizer que uma função “recebe” um argumento e “retorna” um resultado. O resultado também é chamado de valor de retorno.</para>
<para>O Python oferece funções que convertem valores de um tipo em outro. A função int recebe qualquer valor e o converte em um número inteiro, se for possível, ou declara que há um erro:</para>
<para>>>> int('32')</para>
<para>32</para>
<para>>>> int('Hello')</para>
<para>ValueError: invalid literal for int(): Hello</para>
<para>int pode converter valores de ponto flutuante em números inteiros, mas não faz arredondamentos; ela apenas corta a parte da fração:</para>
<para>>>> int(3.99999)</para>
<para>3</para>
<para>>>> int(-2.3)</para>
<para>-2</para>
<para>float converte números inteiros e strings em números de ponto flutuante:</para>
<para>>>> float(32)</para>
<para>32.0</para>
<para>>>> float('3.14159')</para>
<para>3.14159</para>
<para>Finalmente, str converte o argumento em uma string:</para>
<para>>>> str(32)</para>
<para>'32'</para>
<para>>>> str(3.14159)</para>
<para>'3.14159'</para>
<para>Funções matemáticas</para>
<para>O Python tem um módulo matemático que oferece a maioria das funções matemáticas comuns. Um módulo é um arquivo que contém uma coleção de funções relacionadas.</para>
<para>Antes que possamos usar as funções em um módulo, precisamos importá-lo com uma instrução de importação:</para>
<para>>>> import math</para>
<para>Esta instrução cria um objeto de módulo chamado math (matemática). Ao se exibir o objeto de módulo, são apresentadas informações sobre ele:</para>
<para>>>> math</para>
<para><module 'math' (built-in)></para>
<para>O objeto de módulo contém as funções e variáveis definidas no módulo. Para acessar uma das funções, é preciso especificar o nome do módulo e o nome da função, separados por um ponto. Este formato é chamado de notação de ponto.</para>
<para>>>> ratio = signal_power / noise_power</para>
<para>>>> decibels = 10 * math.log10(ratio)</para>
<para>>>> radians = 0.7</para>
<para>>>> height = math.sin(radians)</para>
<para>O primeiro exemplo usa math.log10 para calcular a proporção de sinal e de ruído em decibéis (assumindo que signal_power e noise_power tenham sido definidos). O módulo matemático também oferece a função log, que calcula logaritmos de base e.</para>
<para>O segundo exemplo encontra o seno de radians. O nome da variável indica que sin e outras funções trigonométricas (cos, tan etc.) recebem argumentos em radianos. Para converter graus em radianos, divida por 180 e multiplique por π:</para>
<para>>>> degrees = 45</para>
<para>>>> radians = degrees / 180.0 * math.pi</para>
<para>>>> math.sin(radians)</para>
<para>0.707106781187</para>
<para>A expressão math.pi recebe a variável pi do módulo matemático. Seu valor é uma aproximação de ponto flutuante de π, com precisão aproximada de 15 dígitos.</para>
<para>Se souber trigonometria, você pode verificar o resultado anterior comparando-o com a raiz quadrada de 2 dividida por 2:</para>
<para>>>> math.sqrt(2) / 2.0</para>
<para>0.707106781187</para>
<para>Composição</para>
<para>Por enquanto, falamos sobre os elementos de um programa – variáveis, expressões e instruções – de forma isolada, mas não sobre como combiná-los.</para>
<para>Uma das características mais úteis das linguagens de programação é a sua capacidade de usar pequenos blocos de montar para compor programas. Por exemplo, o argumento de uma função pode ser qualquer tipo de expressão, inclusive operadores aritméticos:</para>
<para>x = math.sin(degrees / 360.0 * 2 * math.pi)</para>
<para>E até chamadas de função:</para>
<para>x = math.exp(math.log(x+1))</para>
<para>É possível colocar um valor, uma expressão arbitrária, em quase qualquer lugar. Com uma exceção: o lado esquerdo de uma instrução de atribuição tem que ser um nome de variável. Qualquer outra expressão no lado esquerdo é um erro de sintaxe (veremos exceções a esta regra depois).</para>
<para>>>> minutes = hours * 60 # correto</para>
<para>>>> hours * 60 = minutes # errado!</para>
<para>SyntaxError: can't assign to operator</para>
<para>Como acrescentar novas funções</para>
<para>Por enquanto, só usamos funções que vêm com o Python, mas também é possível acrescentar novas funções. Uma definição de função especifica o nome de uma nova função e a sequência de instruções que são executadas quando a função é chamada.</para>
<para>Aqui está um exemplo:</para>
<para>def print_lyrics():</para>
<para> print("I'm a lumberjack, and I'm okay.")</para>
<para> print("I sleep all night and I work all day.")</para>
<para>def é uma palavra-chave que indica uma definição de função. O nome da função é print_lyrics. As regras para nomes de função são as mesmas que as das variáveis: letras, números e sublinhado são legais, mas o primeiro caractere não pode ser um número. Não podemos usar uma palavra-chave como nome de uma função e devemos evitar ter uma variável e uma função com o mesmo nome.</para>
<para>Os parênteses vazios depois do nome indicam que esta função não usa argumentos.</para>
<para>A primeira linha da definição de função chama-se cabeçalho; o resto é chamado de corpo. O cabeçalho precisa terminar em dois pontos e o corpo precisa ser endentado. Por convenção, a endentação sempre é de quatro espaços. O corpo pode conter qualquer número de instruções.</para>
<para>As strings nas instruções de exibição são limitadas por aspas duplas. As aspas simples e as aspas duplas fazem a mesma coisa; a maior parte das pessoas usa aspas simples apenas nos casos em que aspas simples (que também são apóstrofes) aparecem na string.</para>
<para>Todas as aspas (simples e duplas) devem ser “aspas retas”, normalmente encontradas ao lado do Enter no teclado. “Aspas curvas”, como as desta oração, não são legais no Python.</para>
<para>Se digitar uma definição de função no modo interativo, o interpretador exibe pontos (...) para mostrar que a definição não está completa:</para>
<para>>>> def print_lyrics():</para>
<para>... print("I'm a lumberjack, and I'm okay.")</para>
<para>... print("I sleep all night and I work all day.")</para>
<para>...</para>
<para>Para terminar a função, é preciso inserir uma linha vazia.</para>
<para>A definição de uma função cria um objeto de função, que tem o tipo function:</para>
<para>>>> print(print_lyrics)</para>
<para><function print_lyrics at 0xb7e99e9c></para>
<para>>>> type(print_lyrics)</para>
<para><class 'function'></para>
<para>A sintaxe para chamar a nova função é a mesma que a das funções integradas:</para>
<para>>>> print_lyrics()</para>
<para>I'm a lumberjack, and I'm okay.</para>
<para>I sleep all night and I work all day.</para>
<para>Uma vez que a função tenha sido definida, é possível usá-la dentro de outra função. Por exemplo, para repetir o refrão anterior, podemos escrever uma função chamada repeat_lyrics:</para>
<para>def repeat_lyrics():</para>
<para> print_lyrics()</para>
<para> print_lyrics()</para>
<para>E daí chamar repeat_lyrics:</para>
<para>>>> repeat_lyrics()</para>
<para>I'm a lumberjack, and I'm okay.</para>
<para>I sleep all night and I work all day.</para>
<para>I'm a lumberjack, and I'm okay.</para>
<para>I sleep all night and I work all day.</para>
<para>Mas a canção não é bem assim.</para>
<para>Uso e definições</para>
<para>Juntando fragmentos de código da seção anterior, o programa inteiro fica assim:</para>
<para>def print_lyrics():</para>
<para> print("I'm a lumberjack, and I'm okay.")</para>
<para> print("I sleep all night and I work all day.")</para>
<para>def repeat_lyrics():</para>
<para> print_lyrics()</para>
<para> print_lyrics()</para>
<para>repeat_lyrics()</para>
<para>Este programa contém duas definições de função: print_lyrics e repeat_lyrics. As definições de função são executadas como outras instruções, mas o efeito é criar objetos de função. As instruções dentro da função não são executadas até que a função seja chamada, e a definição de função não gera nenhuma saída.</para>
<para>Como poderíamos esperar, é preciso criar uma função antes de executá-la. Em outras palavras, a definição de função tem que ser executada antes que a função seja chamada.</para>
<para>Como exercício, mova a última linha deste programa para o topo, para que a chamada de função apareça antes das definições. Execute o programa e veja qual é a mensagem de erro que aparece.</para>
<para>Agora mova a chamada de função de volta para baixo e mova a definição de print_lyrics para depois da definição de repeat_lyrics. O que acontece quando este programa é executado?</para>
<para>Fluxo de execução</para>
<para>Para garantir que uma função seja definida antes do seu primeiro uso, é preciso saber a ordem na qual as instruções serão executadas. Isso é chamado de fluxo de execução.</para>
<para>A execução sempre começa na primeira instrução do programa. As instruções são executadas uma após a outra, de cima para baixo.</para>
<para>As definições de função não alteram o fluxo da execução do programa, mas lembre-se de que as instruções dentro da função não são executadas até a função ser chamada.</para>
<para>Uma chamada de função é como um desvio no fluxo de execução. Em vez de ir à próxima instrução, o fluxo salta para o corpo da função, executa as instruções lá, e então volta para continuar de onde parou.</para>
<para>Parece bastante simples, até você lembrar que uma função pode chamar outra. Enquanto estiver no meio de uma função, o programa pode ter que executar as instruções em outra função. Então, enquanto estiver executando a nova função, o programa pode ter que executar mais uma função!</para>
<para>Felizmente, o Python é bom em não perder o fio da meada, então cada vez que uma função é concluída, o programa continua de onde parou na função que o chamou. Quando chega no fim do programa, ele é encerrado.</para>
<para>Resumindo, nem sempre se deve ler um programa de cima para baixo. Às vezes faz mais sentido seguir o fluxo de execução.</para>
<para>Parâmetros e argumentos</para>
<para>Algumas funções que vimos exigem argumentos. Por exemplo, ao chamar math.sin, você usa um número como argumento. Algumas funções exigem mais de um argumento: o math.pow exige dois, a base e o expoente.</para>
<para>Dentro da função, os argumentos são atribuídos a variáveis chamadas parâmetros. Aqui está a definição de uma função que precisa de um argumento:</para>
<para>def print_twice(bruce):</para>
<para> print(bruce)</para>
<para> print(bruce)</para>
<para>Esta função atribui o argumento a um parâmetro chamado bruce. Quando a função é chamada, ela exibe o valor do parâmetro (seja qual for) duas vezes.</para>
<para>Esta função funciona com qualquer valor que possa ser exibido:</para>
<para>>>> print_twice('Spam')</para>
<para>Spam</para>
<para>Spam</para>
<para>>>> print_twice(42)</para>
<para>42</para>
<para>42</para>
<para>>>> print_twice(math.pi)</para>
<para>3.14159265359</para>
<para>3.14159265359</para>
<para>As mesmas regras de composição usadas para funções integradas também são aplicadas a funções definidas pelos programadores, então podemos usar qualquer tipo de expressão como argumento para print_twice:</para>
<para>>>> print_twice('Spam '*4)</para>
<para>Spam Spam Spam Spam</para>
<para>Spam Spam Spam Spam</para>
<para>>>> print_twice(math.cos(math.pi))</para>
<para>-1.0</para>
<para>-1.0</para>
<para>O argumento é avaliado antes de a função ser chamada. Então, nos exemplos, as expressões 'Spam '*4 e math.cos (math.pi) só são avaliadas uma vez.</para>
<para>Você também pode usar uma variável como argumento:</para>
<para>>>> michael = 'Eric, the half a bee.'</para>
<para>>>> print_twice(michael)</para>
<para>Eric, the half a bee.</para>
<para>Eric, the half a bee.</para>
<para>O nome da variável que passamos como argumento (michael) não tem nada a ver com o nome do parâmetro (bruce). Não importa que o valor tenha sido chamado de volta (em quem chama); aqui em print_twice, chamamos todo mundo de bruce.</para>
<para>As variáveis e os parâmetros são locais</para>
<para>Quando você cria uma variável dentro de uma função, ela é local, ou seja, ela só existe dentro da função. Por exemplo:</para>
<para>def cat_twice(part1, part2):</para>
<para> cat = part1 + part2</para>
<para> print_twice(cat)</para>
<para>Esta função recebe dois argumentos, concatena-os e exibe o resultado duas vezes. Aqui está um exemplo que a usa:</para>
<para>>>> line1 = 'Bing tiddle '</para>
<para>>>> line2 = 'tiddle bang.'</para>
<para>>>> cat_twice(line1, line2)</para>
<para>Bing tiddle tiddle bang.</para>
<para>Bing tiddle tiddle bang.</para>
<para>Quando cat_twice é encerrada, a variável cat é destruída. Se tentarmos exibi-la, recebemos uma exceção:</para>
<para>>>> print(cat)</para>
<para>NameError: name 'cat' is not defined</para>
<para>Os parâmetros também são locais. Por exemplo, além de print_twice, não existe o bruce.</para>
<para>Diagrama da pilha</para>
<para>Para monitorar quais variáveis podem ser usadas e onde, é uma boa ideia desenhar um diagrama da pilha. Assim como diagramas de estado, os diagramas da pilha mostram o valor de cada variável, mas também mostram a função à qual cada variável pertence.</para>
<para>Cada função é representada por um frame (quadro). Um frame é uma caixa com o nome de uma função junto a ele e os parâmetros e as variáveis da função dentro dele. O diagrama da pilha para o exemplo anterior é exibido na Figura 3.1.</para>
<para/>
<para>Figura 3.1 – Diagrama da pilha.</para>
<para>Os frames são organizados em uma pilha que indica qual função que foi chamada por outra, e assim por diante. Neste exemplo, print_twice foi chamada por cat_twice e cat_twice foi chamada por __main__, que é um nome especial para o frame na posição mais proeminente. Quando você cria uma variável fora de qualquer função, ela pertence a __main__.</para>
<para>Cada parâmetro refere-se ao mesmo valor como seu argumento correspondente. Desta forma, part1 tem o mesmo valor que line1, part2 tem o mesmo valor que line2 e bruce tem o mesmo valor que cat.</para>
<para>Se ocorrer um erro durante uma chamada de função, o Python exibe o nome da função, o nome da função que a chamou e o nome da função que chamou esta função por sua vez, voltando até __ main __.</para>
<para>Por exemplo, se você tentar acessar cat de dentro de print_twice, receberá uma mensagem de NameError:</para>
<para>Traceback (innermost last):</para>
<para> File "test.py", line 13, in __main__</para>
<para> cat_twice(line1, line2)</para>
<para> File "test.py", line 5, in cat_twice</para>
<para> print_twice(cat)</para>
<para> File "test.py", line 9, in print_twice</para>
<para> print(cat)</para>
<para>NameError: name 'cat' is not defined</para>
<para>Esta lista de funções é chamada de traceback. Ela mostra o arquivo do programa em que o erro ocorreu e em que linha, e quais funções estavam sendo executadas no momento. Ele também mostra a linha de código que causou o erro.</para>
<para>A ordem das funções no traceback é a mesma que a ordem dos frames no diagrama da pilha. A função que está sendo executada no momento está no final.</para>
<para>Funções com resultado e funções nulas</para>
<para>Algumas funções que usamos, como as funções matemáticas, devolvem resultados; por falta de um nome melhor, vou chamá-las de funções com resultados. Outras funções, como print_twice, executam uma ação, mas não devolvem um valor. Elas são chamadas de funções nulas.</para>
<para>Quando você chama uma função com resultado, quase sempre quer fazer algo com o resultado; por exemplo, você pode atribui-lo a uma variável ou usá-la como parte de uma expressão:</para>
<para>x = math.cos(radians)</para>
<para>golden = (math.sqrt(5) + 1) / 2</para>
<para>Quando você chama uma função no modo interativo, o Python exibe o resultado:</para>
<para>>>> math.sqrt(5)</para>
<para>2.2360679774997898</para>
<para>Mas em um script, se você chamar uma função com resultado e mais nada, o valor de retorno é perdido para sempre!</para>
<para>math.sqrt(5)</para>
<para>Este script calcula a raiz quadrada de 5, mas como não armazena ou exibe o resultado, não é muito útil.</para>
<para>As funções nulas podem exibir algo na tela ou ter algum outro efeito, mas não têm um valor de retorno. Se você atribuir o resultado a uma variável, recebe um valor especial chamado None:</para>
<para>>>> result = print_twice('Bing')</para>
<para>Bing</para>
<para>Bing</para>
<para>>>> print(result)</para>
<para>None</para>
<para>O valor None não é o mesmo que a string 'None'. É um valor especial que tem seu próprio tipo:</para>