SnakeWranglingforKids,LearningtoProgramwithPython · tocassem (ent˜ao, n˜ao!!)mas as coisas...

162

Transcript of SnakeWranglingforKids,LearningtoProgramwithPython · tocassem (ent˜ao, n˜ao!!)mas as coisas...

Snake Wrangling for Kids, Learning to Program with Python

by Jason R. Briggs

Version 0.7.7

Copyright c©2007.

Published by... ah, no one actually.

Cover art and illustrations by Nuthapitol C.

Website:http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids

Thanks To:Guido van Rossum (for benevelont dictatorship of the Python language), the mem-bers of the Edu-Sig mailing list (for helpful advice and commentary), author David Brin(the original instigator of this book), Michel Weinachter (for providing better qualityversions of the illustrations), and various people for providing feedback and errata,including: Paulo J. S. Silva, Tom Pohl, Janet Lathan, Martin Schimmels, and MikeCariaso (among others). Anyone left off this list, who shouldn’t have been, is enti-rely due to premature senility on the part of the author.

License:

This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 3.0 New Zealand License. To view a copy of this license, visithttp://creativecommons.org/licenses/by-nc-sa/3.0/nz/ or send a letter to CreativeCommons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Below is a summary of the license.

You are free:

• to Share — to copy, distribute and transmit the work

• to Remix — to adapt the work

Under the following conditions:

Attribution. You must attribute the work in the manner specified by the authoror licensor (but not in any way that suggests that they endorse you or youruse of the work).

Noncommercial. You may not use this work for commercial purposes.

Share Alike. If you alter, transform, or build upon this work, you may distributethe resulting work only under the same or similar license to this one.

For any reuse or distribution, you must make clear to others the license terms ofthis work.

Any of the above conditions can be waived if you get permission from the copyrightholder.

Nothing in this license impairs or restricts the author’s moral rights.

Sumario

Preface v

1 Nem todas cobras te morderao 1

1.1 Um pouco sobre linguagens . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 A Ordem das Nao-venenosasSerpentes Constritoras. . . . . . . . . . . . 3

1.3 Seu primeiro programa em Python . . . . . . . . . . . . . . . . . . . 4

1.4 Seu segundo programa em Python. . .o mesmo? . . . . . . . . . . . . . 6

2 8 multiplicado por 3.57 e. . . 9

2.1 Uso de parenteses e “Prioridade de Operacoes” . . . . . . . . . . . . . 11

2.2 Nao ha nada possa mudar tanto como uma variavel . . . . . . . . . . 13

2.3 Usando uma variavel . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.4 Um pedaco de ‘string’? . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.5 Truques com Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.6 Nao e igual a uma lista de compras . . . . . . . . . . . . . . . . . . . 19

2.7 Tuplas e Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.8 Coisas para tentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3 Tartarugas e outras criaturas lentas 25

3.1 Coisas para tentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4 Como fazer uma pergunta 33

4.1 Faca isso. . . SENAO!!! . . . . . . . . . . . . . . . . . . . . . . . . . . 35

i

4.2 Faca isso. . . ou isso. . . ou isso. . . ou SENAO!!! . . . . . . . . . . . . . 35

4.3 Combinando condicoes . . . . . . . . . . . . . . . . . . . . . . . . . . 36

4.4 Vacuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4.5 Qual e a diferenca. . .? . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5 De novo e de novo 41

5.1 Quando um bloco nao e quadrado? . . . . . . . . . . . . . . . . . . . 44

5.2 Ja que estamos falando de lacos. . . . . . . . . . . . . . . . . . . . . . 50

5.3 Coisas para tentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

6 Assim como reciclar. . . 53

6.1 Pedacos e pecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

6.2 Modulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

6.3 Coisas para tentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

7 Um curto capıtulo sobre Arquivos 63

8 Mais e mais tartarugas 65

8.1 Colorindo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

8.2 Escuridao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

8.3 Preenchendo coisas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

8.4 Coisas para tentar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

9 Um pouco sobre graficos 81

9.1 Desenhar rapidamente . . . . . . . . . . . . . . . . . . . . . . . . . . 82

9.2 Desenhando algo simples . . . . . . . . . . . . . . . . . . . . . . . . . 85

9.3 Desenhando Caixas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

9.4 Desenhando Arcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

9.5 Desenhos Ovais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

9.6 Desenhando Poligonos . . . . . . . . . . . . . . . . . . . . . . . . . . 95

9.7 Desenhando Imagens . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

9.8 Animacao Basica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

ii

9.9 Reagindo a eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

10 Por onde seguir a partir daqui 105

A Palavras-chave em Python 107

B Built-in Functions 121

C A Few Python Modules 131

D Answers to “Things to try” 141

iii

iv

Introducao

Um recado aos Pais...

Prezado(a) Pai, Mae ou Responsavel,

Para que seu filho inicie as atividades de programacao, voce tera que instalaro Python em seu computador. Este livro foi recentemente atualizado para utilizaro Python 3, que e a ultima versao do Python. Caso voce possua uma versao antigado Python instalada, voce precisara utilizar uma versao antiga do livro.

Instalar o Python e uma tarefa muito simples, porem, dependendo do SistemaOperacional que voce estiver utilizando, talvez precise passar por alguns obstaculos.Se voce apenas comprou um novo computador, nao tem ideia do que fazer comele, e a ultima frase te deu ate calafrios, voce provavelmente precisara de alguempara realizar tal trabalho. Dependendo do seu computador, e da velocidade da suaconexao com a internet, essa tarefa pode levar de 10 minutos a algumas horas.

Primeiramente, va ate www.python.org e baixe a ultima versao do instalador doPython 3 para Windows. No momento em que estou escrevendo, e esse:

http://python.org/ftp/python/3.3.2/python-3.3.2.msi

Clique duas vezes sobre o ıcone do instalador para Windows (voce se lembra deonde o salvou, ne?), e entao, siga as instrucoes para instala-lo no seu diretoriopadrao (provavelmente c:\Python32 ou algo muito parecido).

Apos a instalacao. . .

. . . Voce pode precisar sentar ao lado de seu filho em alguns dos primeiros capıtulos,mas nos esperamos que apos alguns exemplos, eles tirem o teclado das suas maose facam eles mesmos. Eles devem pelo menos saber como utilizar algum tipo deeditor de texto (nao um editor como o Microsoft Word, mas um editor de textocomum, apenas para texto). Eles devem saber como abrir e fechar arquivos, criarnovos arquivos de texto e salvar o que estiverem fazendo. Fora isso, o livro tentaraensinar a partir do mais basico.

v

Obrigado pela sua atencao, meus cumprimentos,O LIVRO

vi

Capıtulo 1

Nem todas cobras te morderao

Ha possibilidade de que este livro tenha sido lhe dado em seu aniversario, ou possi-velmente no Natal. Tia Amelia lhe daria um par de meias duas vezes maior que oseu pe (e que mesmo se servisse, voce nao gostaria de usar). Mas ao inves disso, elaouviu alguem falando sobre a versao impressa deste livro e logo lembrou que vocetinha um daqueles compu-alguma-coisa, que inclusive tentou ensina-la a usar umavez, no ultimo Natal (ate que ela comecasse a tentar falar com o mouse), e pediu-lhepara que imprimisse mais uma copia. Seja grato por nao ter ganho aquele velho parde meias.

Espero que voce nao esteja tao decepcionado, por eu surgir de um papel depresentes reciclado, ao inves disso. Um nao-tao-falante (ok, um nada-falante) livro,com um tıtulo aparentemente ameacador na capa “Aprendendo. . .”. Mas espere ummomento para pensar em como eu me sinto. Se voce fosse o personagem daquelanovela sobre magos que estao na prateleira de livros do seu quarto, eu possivelmenteteria dentes. . . ou ate olhos. Eu poderia mover figuras dentro de mim, ou ser ca-paz de fazer sons fantasmagoricos enquanto voce folheia minhas paginas. Mas pelocontrario, eu sou impresso em folhas de papel A4 com algumas orelhas, ou quemsabe grampeados, dentro de uma pasta. Como eu saberia—Eu nao tenho olhos.

Eu daria qualquer coisa por alguns belos e afiados dentes. . .

Porem isso nao e tao ruim quanto parece. Mesmo que eu nao possa falar... oumorder os seus dedos enquanto nao esta olhando... Eu posso lhe dizer um pouqui-nho como os computadores funcionam. Nada da parte fısica, com fios, chips, cabos eoutros dispositivos que, mais do que provavel, lhe dariam choque antes mesmo que otocassem (entao, nao!!)—mas as coisas escondidas que rodam entre esses fios, chipsde computador, cabos e bits, que fazem o seu computador ter alguma utilidade.

1

2 CAPITULO 1. NEM TODAS COBRAS TE MORDERAO

E um pouco como os pensamen-tos rodando dentro da sua cabeca. Sevoce nao tivesse pensamentos, voce es-taria sentado no chao do seu quarto,olhando vagarosamente para a porta ebabando sobre a sua camiseta. Semos programas, os computadores ser-viriam apenas para apoiar portas—emesmo assim ainda nao seriam muitouteis, pois voce ainda tropecaria so-bre eles durante a noite. E conve-nhamos que, nao ha nada pior quetropecar no escuro e bater o dedinho dope.

Eu sou apenas um livro e eu sei disso.

Sua famılia pode ter um Playstation, Xbox ou Wii na sala—-eles nao teriam muitouso sem os programas (jogos) para faze-los funcionar. Seu aparelho de DVD, pos-sivelmente sua geladeira e seu carro, todos usam programas de computador que ostornam mais prestativos do que seriam. Seu aparelho de DVD tem programas queajudam-o a escolher o que quer assistir no DVD; sua geladeira pode ter um simplesprograma que o ajuda a economizar energia eletrica, e mesmo assim mantem a co-mida conservada; seu carro pode ter um computador, que possui um programa, quealerta o motorista sobre uma possıvel colisao.Se voce souber como escrever programas de computador, voce pode fazer todos ti-pos de coisas uteis. Quem sabe escrever seus proprios jogos. Criar web sites querealmente facam algo, nao apenas deixa-los com um visual colorido. Ser capaz deprogramar o ajudaria ate com o seu dever de casa.

Como dito, vamos para algo um pouco mais interessante.

1.1 Um pouco sobre linguagens

Assim como os humanos, certamente as baleias, possivelmente os golfinhos, e talvezalguns pais (embora isso seja discutıvel), computadores tem sua propria linguagem.Atualmente, como os humanos, eles tem ate mais de uma linguagem. Praticamenteha uma linguagem para cada letra do alfabeto. A, B, C, D e E nao sao apenasletras, mas tambem linguagens de programacao (que provam que adultos nao temimaginacao, e deveriam ter lido um dicionario, ou ao menos uma enciclopedia, antes

1.2. A ORDEM DAS NAO-VENENOSAS SERPENTES CONSTRITORAS. . . 3

de nomear algo).

Ha linguagens de programacao com nomes de pessoas, nomeadas usando sim-ples acronimos (a primeira letra de uma serie de palavras), e apenas algumas nome-adas apos um programa de TV. Ah, e se voce adicionar alguns sinais de adicao, ousustenidos (+, #) apos algumas das letras que mencionei—voce tera mais algumaslinguagens de programacao. Tornando as coisas piores, algumas linguagens de pro-gramacao sao praticamente a mesma coisa, diferenciando-se levemente.

O que eu te disse? Sem imaginacao!

Felizmente, muitas dessas linguagens caıram em desuso, ou sumiram completamente;mas a lista de diferentes formas que voce pode ‘falar’ com o computador continuapreocupantemente grande. Irei discutir apenas uma delas–caso contrario nem mesmoteriamos comecado.Seria mais produtivo sentar-se em seu quarto e babar sobre a sua camiseta. . .

1.2 A Ordem das Nao-venenosas

Serpentes Constritoras. . .

. . .ou Pythons (Pıtons em portugues), mais especificamente.

Alem de ser uma cobra, Python tambem e uma linguagem de programacao.Porem, nao foi nomeada com o nome de um reptil sem patas; mas e uma daslinguagens de programacao nomeadas apos um programa de TV. Monty Pythonfoi um popular programa humorıstico de TV britanico, durante a decada de 70 (econtinua popular ate hoje), que voce deve ter uma certa idade para achar engracado.Qualquer um abaixo dessa idade. . . digamos 12. . . ficara se perguntando do que setrata1.

Existe uma serie de coisas sobre Python (a linguagem de programacao, nao acobra, nem o programa de TV) que a fazem extremamente util quando voce estaaprendendo a programar. Para nos, no momento, o motivo mais importante e quevoce pode comecar a fazer as coisas muito mais rapidamente.

Esta e a parte em que voce espera que a sua Mae, Pai (ou quem estiverresponsavel pelo computador), tenha lido o comeco do livro, rotulado “Um recadoaos Pais”.

Existe um bom modo de saber se eles realmente leram:

1Exceto a danca-do-peixe-na-cara. Que e engracado independente da sua idade.

4 CAPITULO 1. NEM TODAS COBRAS TE MORDERAO

Figura 1.1: Python no menu do Windows.

Clique no botao ‘Iniciar’ no canto inferior esquerdo da tela, e va em ‘Todosprogramas’ (que tem um triangulo verde ao lado), e espera-se que na lista de pro-gramas voce veja ‘Python 3.2’ (ou algo parecido). Figura 1.1 mostra o que vocedeve visualizar. Clique em ‘Python (command line)’ como mostrado na Figura 1.1.

Se voce descobrir que eles nao leram o comeco do livro. . .

. . .porque esta faltando algo quando voce tenta seguir essas instrucoes—entao vire apagina ate o comeco do livro e coloque-o sobre o jornal que eles estao tentando ler,olhando-os com confianca. Dizendo, “por favor, por favor” de novo e de novo, ate quese torne chato o bastante, deve funcionar bem, caso voce esteja tendo problemas paratira-los do sofa. E claro, uma outra alternativa, e voce tentar seguir as instrucoesda ‘Introducao’, de como instalar o Python, voce mesmo.

1.3 Seu primeiro programa em Python

Com sorte, se voce chegou ate aqui, voce ja deve ter iniciado o Interpretador Python,que e uma das formas de executar comandos e programas em Python. Quando voceo inicia pela primeira vez (ou apos executar algum comando), voce vera o que

1.3. SEU PRIMEIRO PROGRAMA EM PYTHON 5

Figura 1.2: Interpretador Python no Windows.

chamamos de ‘prompt’. No Interpretador Python, o ‘prompt’ e indicado por tressinais de ‘maior que’ (>):

>>>

Se voce juntar alguns comandos Python necessarios, voce tera um programaque podera rodar nao apenas no interpretador. . . mas no momento, nos queremosdeixar as coisas simples, digitando nossos comandos diretamente no interpretador,no ‘prompt’ (>>>). Entao, por que nao comecamos digitando o seguinte:

print("Ola mundo")

Certifique-se de colocar as aspas (que sao essas: ” ”), e pressionar a tecla‘enter’ no final da linha. Esperando que voce veja algo parecido com isso:

>>> print("Ola mundo")

Ola mundo

O ‘prompt’ reaparece, informando-o que o Interpretador Python ja esta prontopara outros comandos.

Parabens! Voce acaba de criar seu primeiro programa em Python. print e a funcaoque escreve no interpretador, o que estiver entre os parenteses—em breve, nos outilizaremos novamente.

6 CAPITULO 1. NEM TODAS COBRAS TE MORDERAO

1.4 Seu segundo programa em Python. . .o mesmo?

Os programas em Python nao seriam tao uteis assim, caso voce tivesse que digitarcada comando, toda hora que quisesse fazer algo—ou se voce escrevesse um programapara alguem, e ele tivesse que digitar tudo de novo, antes de usa-lo.

O editor de texto que voce utiliza para fazer seus trabalhos de escola, deve terem torno de 10 a 100 milhoes de linhas de codigo. Dependendo do numero de linhasque voce imprimir por pagina (imprimindo ou nao em frente e verso), isso daria porvolta de 400,000 paginas. . . ou uma pilha de papel de mais de 40 metros. Imagineque, quando voce levasse esse programa da loja para a sua casa, voce teria que fazervarias viagens de ida e volta, para carregar tanto papel. . .

. . .e ainda teria que torcer para nao ocorresse nenhuma rajada de vento, en-quanto carregava os papeis. Felizmente, ha uma alternativa para tudo que foi ditoaqui—ou ninguem faria nada disso.

Abra o Bloco de notas (Clique em Iniciar, Todos Programas, e em Acessorios),e entao digite o comando print, exatamente como voce digitou anteriormente nointerpretador:

1.4. SEU SEGUNDO PROGRAMA EM PYTHON. . .O MESMO? 7

Figura 1.3: Icone do ola.py na Area de Trabalho.

print("Ola mundo")

Clique no menu Arquivo (no Bloco de notas) e salve-o na Area de Trabalhocom o nome ola.py. Clique duas vezes sobre o ıcone do ola.py na sua Area deTrabalho (veja a Figura 1.3) e entao aparecera, muito rapidamente, a janela do In-terpretador Python. Que desaparecera muito rapidamente tambem, antes mesmoque voce consiga ler o que esta escrito, mas a frase ‘Ola mundo’ deve aparecer natela por uma fracao de segundo—nos voltaremos nisso em breve e provaremos queisso realmente ocorreu.

Agora voce pode ver que as boas pessoas que criaram o Python, amavelmente,salvaram-o de ter que digitar a mesma coisa repetidas e repetidas vezes. Como fize-ram alguns la nos anos 80. E serio—eles fizeram. Va e pergunte ao seu pai, se eleja nao teve um ZX81 quando era crianca.

Se ja teve, voce pode apontar para ele e comecar a rir.

Acredite em mim. Voce nao vai entender isso, mas ele vai.2

Porem esteja preparado para correr.

2O Sinclair ZX81, lancado nos anos 80, foi um dos primeiros computadores pessoais acessıveis.Uma serie de jovens, garotos e garotas, ficaram enlouquecidos, digitando o codigo de alguns jogosque vinham nas populares revistas sobre o ZX81—descobrindo somente apos horas de digitacao,que aquelas maluquices jamais funcionaram como deveriam.

8 CAPITULO 1. NEM TODAS COBRAS TE MORDERAO

O fim do comeco

Bem-vindo ao maravilhoso mundo da Programacao. Nos comecamos com um simplesprograma de “Ola mundo”—todo mundo comeca assim quando estao aprendendo aprogramar. No proximo capıtulo, nos comecaremos a fazer coisas mais uteis com oInterpretador Python, e veremos como sao feitos os programas.

Capıtulo 2

8 multiplicado por 3.57 e. . .

Quanto e 8 multiplicado por 3.57? Voce teria que usar uma calculadora, certo?Bom, a nao ser que voce seja extremamente esperto e consiga fazer mutiplicacoes defracoes, de cabeca — mas isso nao vem ao caso. Voce pode fazer isso no terminal doPython. Inicie o terminal novamente (veja o Capıtulo 1 para mais informacoes, casovoce tenha pulado uma parte por algum motivo estranho), e assim que ele iniciar,digite 8∗3.57 e pressione a tecla Enter:

Python 3.0 (r30:67503, Dec 6 2008, 23:22:48)

Type "help", "copyright", "credits" or "license" for more information.

>>> 8 * 3.57

28.559999999999999

A tecla estrela (*), ou asterisco (shift 8, em alguns teclados), e usada paramultiplicacao, ao inves do sinal de vezes (X) que voce usa na escola (usar o asterisco enecessario, pois caso contrario, como o computador entenderia quando voce quisesseusar a letra x ou o sımbolo de multiplicacao X ?). Que tal uma equacao, que e umpouco mais interessante?

Suponhamos que voce faca algumas pequenas tarefas, ao menos uma vez porsemana e ganhe R$5 para isso. E que voce tambem entregue alguns jornais, pelomenos 5 vezes na semana e ganhe R$30 para isso — quanto voce ganharia em umano?

Se estivessemos escrevendo isso em um papel, escreveriamos algo assim:

(5 + 30) x 52

9

10 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

O Python e defeituoso!?!?

Se voce pegar uma calculadora e digitar 8 x 3.57, a respostaexibida sera:

28.56

Mas porque no Python e diferente? E um defeito?

Na verdade nao. O motivo e a forma com que os pontos flu-tuantes (fracoes de numeros com casas decimais) numeros saomanuseados pelo computador. E um problema complicado eum pouco confuso para iniciantes, entao o melhor coisa a sefazer e sempre que estiver trabalhando com fracoes (ex.: comnumeros com casas decimais), se lembrar que algumas vezeso resultado pode ser diferente do esperado. Isso e fato paramultiplicacao, divisao, adicao ou subtracao.

Que e R$5 + R$30 multiplicado por 52 semanas em um ano. Claro, voce eesperto e nos sabemos que 5 + 30 e 35, entao a equacao seria:

35 x 52

Que e bastante facil de se fazer com uma calculadora, ou ate mesmo no papel.Mas nos podemos fazer todos esses calculos no terminal tambem:

>>> (5 + 30) * 52

1820

>>> 35 * 52

1820

Mas e se voce gastasse R$10 toda semana? Quanto lhe sobraria no final doano? Nos poderiamos escrever essa equacao no papel de diversas maneiras, masvamos fazer isso no terminal:

>>> (5 + 30 - 10) * 52

1300

Isso seria R$5 mais R$30, menos R$10, multiplicado pelas 52 semanas no ano.E lhe sobraria R$1300 no final do ano. Certo, mas isso nao esta parecendo muito

2.1. USO DE PARENTESES E “PRIORIDADE DE OPERACOES” 11

util. Nos poderiamos fazer tudo isso com uma calculadora. Mas nos voltaremosmais tarde nesse assunto e demonstraremos como tornar isso muito mais util.

Voce pode multiplicar, somar (obviamente), subtrair e dividir, usando o termi-nal do Python, junto a diversas outras operacoes matematicas que nao nos aprofu-daremos no momento. Para agora, os sımbolos matematicos mais basicos (chamadosoperadores) em Python, sao:

+ Adicao- Subtracao* Multiplicacao/ Divisao

O motivo da barra (/) ser utilizada para divisao, e que seria muito difıcildesenhar a linha de divisao (alem disso, o teclado dos computadores nao contemplao sımbolo de divisao ÷) que voce esta acostumado a usar nas equacoes. Por exemplo,se voce tem 100 ovos e 20 caixas e gostaria de saber quantos ovos deveriam ir emcada caixa, voce dividiria 100 por 20, escrevendo a seguinte equacao:

100

20

Ou se voce usa o metodo de Divisao Longa, voce escreveria dessa forma:

5

20 )100100

0

Ou ainda, voce poderia escrever assim:

100÷ 20

Porem, em Python voce apenas digitaria “100 / 20”.

Que eu acho muito mais simples. Porem eu sou apenas um livro — do que eusei?

2.1 Uso de parenteses e “Prioridade de Operacoes”

Nos usamos parenteses em uma linguagem de programacao para controlar o que cha-mamos de “Prioridade de Operacoes”. Uma operacao e a utilizacao de um operador

12 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

(algum daqueles sımbolos da tabela acima). Existem outros operadores alem dossımbolos matematicos basicos, mas para estes operadores (adicao, subtracao, mul-tiplicacao e divisao), e o suficiente saber que a multiplicacao e a divisao tem maisprioridade que a adicao e a subtracao. Que significa que voce faz a multiplicacaoe a divisao em uma equacao, antes da adicao e da subtracao. Na equacao abaixo,onde todos os operadores sao de adicao (+), os numeros sao adicionados em ordem:

>>> print(5 + 30 + 20)

55

Da mesma forma, nesta equacao, existem somente operadores de adicao e subtracao,por isso o Python considera cada numero na ordem em que ele aparece.

>>> print(5 + 30 - 20)

15

Mas na equacao abaixo, existe um operador de multiplicacao, entao os numeros 30e 20 sao considerados primeiro. Esta equacao e outro jeito de se dizer, “multiplique30 por 20 e entao adicione 5 ao resultado” (multiplicacao primeiro, pois ela temmais prioridade que a adicao):

>>> print(5 + 30 * 20)

605

Entao o que acontece se nos usarmos parenteses? A seguinte equacao nos mostrarao resultado:

>>> print((5 + 30) * 20)

700

Por que o resultado e diferente? Porque os parenteses controlam a ordem dasoperacoes. Com os parenteses, o Python sabe que deve realizar as operacoes en-tre parenteses primeiro, e depois as que estiverem fora. Entao, essa equacao e outramaneira de dizer, “adicione 5 e 30, entao multiplique o resultado por 20”.

O uso dos parenteses pode se tornar complicado. Podem existir parentesesdentro de parenteses:

>>> print(((5 + 30) * 20) / 10)

70

Neste caso, o Python calculara o que estiver dentro dos parenteses primeiro, depoiso que estiver fora, e assim por diante. Entao essa equacao e outra maneira de sedizer, “adicione 5 e 30, entao multiplique o resultado por 20, finalmente divida oresultado por 10”. O resultado, sem parenteses, e novamente um pouco diferente:

2.2. NAO HA NADA POSSA MUDAR TANTO COMO UMA VARIAVEL 13

>>> 5 + 30 * 20 / 10

65

Neste caso, o 30 e multiplicado por 20 primeiro, entao o resultado e divididopor 10 e finalmente o 5 e adicionado ao resultado.

Lembre-se de que a multiplicacao e a divisao sao sempre realizadas antes daadicao e da subtracao, a nao ser que os parenteses estejam sendo utilizados paracontrolar a ordem das operacoes.

2.2 Nao ha nada possa mudar tanto como uma

variavel

Uma ‘variavel‘, em termos de programacao, e usada para descrever um lugar onde sepossa armazenar coisas. Essas ”coisas”podem ser numeros, textos, listas de numerose textos — e todos os outros tipos de itens, que seria impossıvel de descrever aqui.Para agora, vamos apenas imaginar as variaveis como uma caixa de correios.

Voce pode colocar coisas (como uma carta ou um pacote) na caixa de correios,assim como voce pode colocar coisas (numeros, textos, listas de numeros e textos,etc) em uma variavel. A ideia da caixa de correios, e um modo que muitas linguagensde programacao funcionam. Mas nao todas.

Em Python, as variaveis sao um pouco diferentes. Ao inves de uma caixa decorreios com coisas dentro, uma variavel lembra mais um selo que e colado do lado

14 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

de fora de uma caixa de correios. Nos podemos descolar esse selo e cola-lo em outracoisa, ou ate mesmo amarra-lo em mais de uma coisa (talvez usando uma corda).Nos criamos uma variavel dando a ela um nome, usando o sinal de igual (=) e entaodizendo ao Python o que nos queremos apontar para aquele nome.

>>> fred = 100

Nos apenas criamos uma variavel chamada ‘fred’ e dissemos para que ela apon-tasse para o numero 100. E quase o mesmo que dizer ao Python para se lembrardaquele numero porque nos vamos querer usa-lo posteriormente. Para descobrirpara onde uma variavel esta apontando, nos apenas digitamos ‘print’ no terminal,seguido do nome da variavel e entao pressionamos o Enter, por exemplo:

>>> fred = 100

>>> print(fred)

100

Nos tambem podemos dizer ao Python, que nos queremos que a variavel fredaponte para outra coisa:

>>> fred = 200

>>> print(fred)

200

Na primeira linha, nos dizemos que agora nos queremos que o fred aponte parao numero 200. Depois, na segunda linha, nos perguntamos para onde o fred estaapontando, apenas para provar que mudou. Nos podemos tambem apontar mais deum nome para a mesma coisa:

>>> fred = 200

>>> john = fred

>>> print(john)

200

No codigo acima, nos estavamos dizendo que nos queriamos que o nome (ouetiqueta) john apontasse para a mesma coisa que fred estava apontando. Claroque, ‘fred’ nao e um nome muito util para uma variavel. Ele nao nos diz nada arespeito da sua utilidade. Uma caixa de correios e facil — voce usa uma caixa decorreios para enviar cartas. Mas uma variavel pode ter diversas utilidades e podeapontar para um monte de coisas diferentes, entao nos precisamos de um nome maisinformativo.

2.3. USANDO UMA VARIAVEL 15

Suponha que voce tenha iniciado o terminal do Python, digitado ‘fred = 200’e entao tenha saıdo — passou 10 anos escalando o Monte Everest, atravessando oDeserto do Saara, pulando de uma ponte na Nova Zelandia e finalmente, passeoupor todo o rio Amazonas — quando voce voltou para o seu computador, como vocese lembraria o que o numero 200 significa (e para que ele seria usado)?

Eu acho que eu nao lembraria.

Eu so fiz isso ate agora e nao tenho ideia do que ‘fred = 200‘ significa (a nao ser umnome apontando para o numero 200 ). Entao apos 10 anos, voce nao teria nenhumachance de se lembrar.

Aha! Mas e se nos chamassemos nossa variavel de: numero de estudantes.

>>> numero_de_estudantes = 200

Nos podemos fazer isso, pois o nome das variaveis podem conter letras, numerose ( ) sublinhados — embora elas nao possam comecar com um numero. Se vocevoltar apos 10 anos, ‘numero de estudantes’ ainda vai fazer sentido. Voce podedigitar:

>>> print(numero_de_estudantes)

200

E voce vai imediatamente se lembrar que estamos falando de 200 estudantes. Nemsempre e importante usar nomes significativos para variavies. Voce pode usar qual-quer coisa, desde uma unica letra (como o ‘a’) ate grandes sentencas. E de vez emquando, se estiver fazendo algo rapido, um nome de variavel simples e curto tambemsera util. Depende muito do que voce vai querer pensar posteriormente, ao olharpara o nome dessa variavel.

este_nome_de_variavel_tambem_eh_valido_porem_nao_eh_muito_util

2.3 Usando uma variavel

Agora que nos sabemos como criar uma variavel, como nos a usamos? Lembra daequacao que nos vimos la atras? Aquela para saber quanto voce teria em dinheirono final do ano, caso ganhasse R$5 por semana fazendo alguns pequenos trabalhos,R$30 por semana entregando jornais e gastasse R$10 por semana. Ate agora, o quetemos e:

16 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

>>> print((5 + 30 - 10) * 52)

1300

Que tal se transformarmos os 3 primeiros numeros em variaveis? Tente digitar oseguinte:

>>> trabalhos = 5

>>> entregas_de_jornal = 30

>>> gastos = 10

Nos apenas criamos as variaveis ‘trabalhos’, ‘entregas de jornal’ e ‘gastos’. Nospodemos redigir a equacao para ver:

>>> print((trabalhos + entregas_de_jornal - gastos) * 52)

1300

Que dara exatamente o mesmo resultado. E se voce ganhasse mais R$2 porsemana, fazendo alguns trabalhos extras? Mude a variavel ‘trabalhos’ para 7, entaoaperte a tecla para cima (↑) ate que a equacao apareca novamente e aperte Enter:

>>> trabalhos = 7

>>> print((trabalhos + entregas_de_jornal - gastos) * 52)

1404

Assim e muito mais facil descobrir que voce ficou com R$1404 no final do ano.Voce pode tentar alterar outras variaveis e apertar a seta para cima para realizar aconta novamente e voce vera o efeito que tera.

Se voce gastar o dobro do dinheiro por semana:

>>> gastos = 20

>>> print((trabalhos + entregas_de_jornal - gastos) * 52)

884

Voce tera poupado apenas R$884 no final do ano. Isso ainda e bem pouco util.Nos ainda nao chegamos em algo realmente util. Mas para o momento, e o bastantepara entender que variavies sao usadas para armazenar coisas.

Pense em uma caixa de correios com uma etiqueta colada!

2.4. UM PEDACO DE ‘STRING’? 17

2.4 Um pedaco de ‘string’?

Se voce esta prestando atencao, nao apenas folheando as paginas olhando as partesboas, voce deve se lembrar que eu mencionei que variaveis podem ser usadas paratudo — nao somente numeros. Em programacao, na maior parte do tempo noschamamos um texto de ‘string’ (corda). Que pode parecer um pouco estranho; masse voce pensar que um texto e apenas um punhado de letras ‘amarradas’ umas asoutras, talvez faca um pouco mais sentido.

E novamente, caso nao faca.

Neste caso, tudo que voce deve saber e que uma string e apenas um punhadode letras, numeros e outros sımbolos juntos, formando algo mais significativo. Todasas letras, numeros e sımbolos neste livro poderiam formar uma string. O seu nomepode ser uma string. Assim como o endereco da sua casa. Nosso primeiro programaem Python, no capıtulo 1, usou uma string: ‘Ola mundo’.

Em Python, nos criamos uma string colocando aspas ao redor do texto. Entaonos podemos pegar a nossa variavel de pouca utilidade ‘fred’ e colocar uma stringdentro:

>>> fred = "esta e uma string"

E nos podemos ver o que esta dentro da variavel fred, digitando print(fred):

>>> print(fred)

esta e uma string

Nos tambem podemos usar aspas simples para criar uma string:

>>> fred = ’esta tambem e uma string’

>>> print(fred)

esta tambem e uma string

Porem, se voce tentar digitar mais de uma linha de texto na sua string, usandoaspas simples (’) ou duplas (”), voce recebera uma mensagem de erro. Por exemplo,digite a seguinte linha e aperte Enter. Voce vera uma mensagem de erro assustadora,parecida com a seguinte:

>>> fred = "estas s~ao duas

File "<stdin>", line 1

fred = "estas s~ao duas

^

SyntaxError: EOL while scanning string literal

18 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

Nos falaremos sobre errors mais tarde, mas por agora, se voce quiser mais deuma linha de texto, voce pode usar 3 aspas simples:

>>> fred = ’’’estas s~ao duas

... linhas de texto em uma unica string’’’

Imprima o conteudo para ver se funcionou:

>>> print(fred)

estas s~ao duas

linhas de texto em uma unica string

A proposito, voce vera esses 3 pontinhos (...) sempre que estiver digitandoalgo que continue na proxima linha (como as strings de varias linhas). Na verdade,voce ainda vera muitos destes conforme continuamos.

2.5 Truques com Strings

Aqui esta uma questao interessante: quanto e 10 * 5 (10 vezes 5)? A resposta e 50,claro.

Ok, essa nao e uma questao das mais interessantes.

Mas quanto e 10 * ’a’ (10 vezes a letra a)? Isso pode parecer uma questao semsentido, mas aqui esta a resposta diretamente do Mundo do Python:

>>> print(10 * ’a’)

aaaaaaaaaa

Isso funciona ainda com mais caracteres:

>>> print(20 * ’abcd’)

abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd

Outro truque com uma string e embutir valores. Voce pode fazer isso usandoo sinalizador %s, que sera substituido pelo valor que voce quer incluir na string. Emais facil de explicar com um exemplo:

>>> meutexto = ’Eu tenho %s anos de idade’

>>> print(meutexto % 12)

Eu tenho 12 anos de idade

Na primeira linha, a variavel ‘meutexto’ foi criada contendo uma string comalgumas palavras e o sinalizador (%s). O %s esta dizendo “substitua-me com

2.6. NAO E IGUAL A UMA LISTA DE COMPRAS 19

algo” para o terminal do Python. Entao na linha seguinte, quando nos chama-mos print(meutexto), nos usamos o sımbolo %, que diz ao Python para substituiro sinalizador pelo numero 12. Nos podemos reutilizar a string e passar diferentesvalores:

>>> meutexto = ’Ola %s, como vai voce hoje?’

>>> nome1 = ’Joe’

>>> nome2 = ’Jane’

>>> print(meutexto % name1)

Ola Joe, como vai voce hoje?

>>> print(meutexto % name2)

Ola Jane, como vai voce hoje?

No exemplo acima, 3 variaveis (meutexto, nome1 e nome2) foram criadas —o primeiro inclui a string com o sinalizador. Em seguida nos imprimimos a variavel‘meutexto’ e usamos novamente o operador % para passar as variaveis ‘nome1’ e‘nome2’. E voce pode usar mais de um sinalizador:

>>> meutexto = ’Ola %s e %s, como voces est~ao hoje?’

>>> print(meutexto % (nome1, nome2))

Ola Joe a Jane, como voces est~ao hoje?

Quando utilizar mais de um sinalizador, voce precisa envolver os valores entreparenteses — entao, (nome1, nome2) e a forma apropriada de se passar 2 variaveis.Uma serie de valores entre parenteses e chamado de tupla e e bem parecido comuma lista, que nos abordaremos depois.

2.6 Nao e igual a uma lista de compras

Ovos, leite, queijo, salsinha, margarina e fermento. Que nao e uma lista de comprascompleta, mas serve para o que precisamos. Se voce quiser armazenar isso em umavariavel, voce pode criar uma string:

>>> lista_de_compras = ’ovos, leite, queijo, salsinha, margarina, fermento’

>>> print(lista_de_compras)

ovos, leite, queijo, salsinha, margarina, fermento

Uma outra forma, seria criar uma ‘lista’, que e um tipo de objeto especial emPython:

20 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

>>> lista_de_compras = [’ovos’, ’leite’, ’queijo’, ’salsinha’, ’margarina’,

... ’fermento’ ]

>>> print(lista_de_compras)

[’ovos’, ’leite’, ’queijo’, ’salsinha’, ’margarina’, ’fermento’]

E um pouco mais de digitacao, porem mais util. Nos poderıamos imprimir oterceiro item da lista, usando a sua posicao (chamado de ındice), usando colchetes[]:

>>> print(lista_de_compras[2])

queijo

Listas iniciam no ındice 0 — entao o primeiro item da lista e 0, o segundo e1 e o terceiro e 2. Isso nao faz muito sentido para a maioria das pessoas, mas fazpara os programadores. Um pouco a frente, quando voce subir mais alguns degrausvoce vai comecar a contar a partir do zero, ao inves do um. Isso deve confundir umpouco o seu irmao ou irma.

Nos podemos exibir todos os itens, do 3o ao 5o da lista, usando o dois pontosdentro do colchetes:

>>> print(lista_de_compras[2:5])

[’queijo’, ’salsinha’, ’margarina’]

[2:5] e o mesmo que dizer que nos estamos interessados nos itens do ındice 2ao 5 (mas nao o incluindo). E por comecarmos a contar do 0, o 3o item da listae o numero 2 e o 5o item e o numero 4. Listas podem ser usadas para armazenarqualquer tipo de item. Elas podem armazenar numeros:

>>> minhalista = [1, 2, 5, 10, 20]

E strings:

>>> minhalista = [’a’, ’bbb’, ’ccccccc’, ’ddddddddd’]

E misturar numeros e strings:

>>> minhalista = [1, 2, ’a’, ’bbb’]

>>> print(minhalista)

[1, 2, ’a’, ’bbb’]

E ate listas de listas:

2.6. NAO E IGUAL A UMA LISTA DE COMPRAS 21

>>> lista1 = [’a’, ’b’, ’c’]

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

>>> minhalista = [lista1, lista2]

>>> print(minhalista)

[[’a’, ’b’, ’c’], [1, 2, 3]]

No exemplo acima, ama variavel chamada ‘lista’ e criada contendo 3 letras,‘lista2’ e criada contendo 3 numeros e ‘minhalista’ e criada contendo a ‘lista1’ e a‘lista2’. As coisas podem ficar um pouco confusas, rapidamente, se voce comecara criar listas de listas de listas. . . mas felizmente nao ha muita necessidade de sefazer coisas desse tipo em Python. Ainda assim, e util para voce saber que podearmazenar quaisquer tipos de itens em uma lista em Python.

E nao somente a sua lista de compras.

Substituindo itens

Nos podemos substituir um item em uma lista, apenas trocando o seu valor, damesma forma que e trocado o valor de uma variavel. Por exemplo, nos podemostrocar a salsinha por alface, trocando o valor do ındice 3:

>>> lista_de_compras[3] = ’alface’

>>> print(lista_de_compras)

[’ovos’, ’leite’, ’queijo’, ’alface’, ’margarina’, ’fermento’]

Adicionando itens...

Nos podemos adicionar itens a uma lista, usando o metodo ‘append’. Um metodoe uma acao ou comando que diz ao Python que nos queremos fazer algo. Nosfalaremos mais adiante sobre metodos, por agora, para adicionar um item a nossalista de compras, nos fazemos:

>>> lista_de_compras.append(’barra de chocolate’)

>>> print(lista_de_compras)

[’ovos’, ’leite’, ’queijo’, ’alface’, ’margarina’, ’fermento’, ’barra de chocolate’]

Que certamente torna a lista de compras muito melhor.

. . .e removendo itens

Nos podemos remover itens de uma lista, usando o comando ‘del’ (nome curto paradelete). Por exemplo, para remover o quinto item da lista (fermento):

22 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

>>> del lista_de_compras[5]

>>> print(lista_de_compras)

[’ovos’, ’leite’, ’queijo’, ’alface’, ’margarina’, ’barra de chocolate’]

Lembre-se que as posicoes iniciam em zero, entao lista de compras[5] se refereao sexto item.

Duas listas e melhor que apenas 1

Nos podemos unir listas, apenas somando-as como se fossem dois numeros:

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

>>> lista2 = [4, 5, 6]

>>> print(lista1 + lista2)

[1, 2, 3, 4, 5, 6]

Nos podemos tambem associar o resultado a uma outra variavel:

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

>>> lista2 = [4, 5, 6]

>>> lista3 = lista1 + lista2

>>> print(lista3)

[1, 2, 3, 4, 5, 6]

E voce pode multiplicar uma lista, da mesma forma que nos multiplicamos umastring:

>>> lista1 = [1, 2]

>>> print(lista1 * 5)

[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

No exemplo acima, multiplicando a lista1 por cinco, e outra forma de se dizer “repitaa lista1 cinco vezes”. Porem, a divisao (/) e a subtracao (-) nao fazem sentido,quando se trabalhando com listas, entao voce vera erros quando tentar os seguintesexemplos:

>>> lista1 / 20

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unsupported operand type(s) for /: ’list’ and ’int’

ou:

2.7. TUPLAS E LISTAS 23

>>> lista1 - 20

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unsupported operand type(s) for -: ’type’ and ’int’

Voce recebera uma mensagem de erro bastante desagradavel.

2.7 Tuplas e Listas

Uma tupla (mencionada anteriormente) se parece muito com uma lista, mas aoinves de usar colchetes, voce usa parenteses — ex. ‘(’ e ‘)’. Voce pode usar tuplasda mesma forma que usa uma lista:

>>> t = (1, 2, 3)

>>> print(t[1])

2

A principal diferenca e que, diferente das listas, as tuplas nao mudam aposserem criadas. Entao se voce tentar substituir um valor, assim como nos fizemoscom a lista anteriormente, voce vera uma mensagem de erro:

>>> t[0] = 4

Traceback (most recent call last):

File "<stdin>", line 1, in ?

TypeError: ’tuple’ object does not support item assignment

Isso nao significa que voce nao pode alterar o valor da variavel contendo atupla para um outro valor qualquer. Por exemplo, esse codigo funcionara:

>>> minhavariavel = (1, 2, 3)

>>> minhavariavel = [’uma’, ’lista’, ’de’, ’strings’]

Primeiro nos criamos a variavel minhavariavel apontando para uma tupla de 3numeros. Entao nos alteramos minhavariavel para apontar para uma lista de strings.Isso pode ser um pouco confuso inicialmente. Mas pense nisso como os armarios deuma escola. Cada armario possui uma etiqueta com um nome. Voce coloca algo noarmario, fecha a porta, tranca e tira a chave. Voce entao tira a etiqueta, vai ateoutro armario vazio e coloca algo dentro (so que agora voce deixa a chave). A tuplae como um armario trancado. Voce nao pode mudar o que esta dentro dele, masvoce pode retirar a etiqueta e colar em outro armario destrancado, que voce podecolocar e retirar coisas de dentro — como uma lista.

24 CAPITULO 2. 8 MULTIPLICADO POR 3.57 E. . .

2.8 Coisas para tentar

Neste capıtulo, nos vismos como calcular simples equacoes matematicas usando oterminal do Python. Nos tambem vimos como os parenteses podem alterar o resul-tado de uma equacao, controlando a ordem em que os operadores sao usados. Nosvimos como dizer ao Python para se lembrar de alguns valores para usarmos maistarde – usando variaveis — e tambem como o Python usa strings para armazenartexto e listas e tuplas para armazenar mais de um item.

Exercıcio 1

Faca uma lista com os seus brinquedos favoritos, com o nome brinquedos. Faca umalista com as suas comidas favoritas, com o nome comidas. Junte as duas listas enomeie o resultado de favoritos. Por fim, imprima a variavel favoritos.

Exercıcio 2

Se voce tem 3 caixas contendo 25 chocolates e 10 caixas contendo 32 doces, quantosdoces e chocolates voce tem no total? (Dica: voce pode fazer com apenas umaequacao, no terminal do Python)

Exercıcio 3

Crie variaveis para o seu primeiro e ultimo nome. Agora crie uma string e use ossinalizadores para incluir o seu nome.

Capıtulo 3

Tartarugas e outras criaturaslentas

Existem algumas similaridades entre as tartarugas do mundo real e a do Python.No mundo real, uma tartaruga e um reptil verde, que se move lentamente e carregasua casa nas suas costas. No mundo do Python, uma tartaruga e uma pequena setapreta que se move lentamente pela tela. Sem se referir a uma casa nas costas.

De fato, considerando que a tartaruga do Python deixa uma trilha e se movepela tela, isso a torna menos parecida com uma tartaruga do mundo real e maisparecida com uma cobra, ou uma lesma. Porem, eu suponho que um modulo cha-mado ‘slug’ (lesma) nao seria muito atraente, entao faz sentido continuar com astartarugas. Imagine uma tartaruga carregando um par de pinceis e desenhando natela conforme ela anda.

Em um passado profundo, escuro e distante, havia uma simples linguagemde programacao chamada Logo. Logo foi usada para controlar uma tartaruga-robo(chamada Irving). Ao longo do tempo, a tartaruga evoluiu de um robo que se moviapelo chao, para uma pequena seta movendo pela tela.

O que so serve para mostrar que nem sempre as coisas melhoram conforme atecnologia avanca — uma pequena tartaruga-robo seria muito mais divertido.

O modulo ‘turtle’ do Python (nos vamos chegar em modulos depois, mas poragora apenas imagine o modulo como algo que nos opdemos usar dentro de umprograma) e um pouco como a linguagem de programacao Logo, mas enquanto aLogo era (e) bem limitada, o Python possui muito mais recursos. O modulo ‘turtle’por si so, e um metodo muito util para aprender como os computadores desenhamfiguras no seu monitor.

Vamos comecar e ver como isso funciona. O primeiro passo, e dizer ao Python

25

26 CAPITULO 3. TARTARUGAS E OUTRAS CRIATURAS LENTAS

Figura 3.1: Uma seta representando a tartaruga.

que nos queremos usar o modulo ‘turtle’, importando-o:

>>> import turtle

Entao nos precisamos exibir uma tela para desenhar. Uma tela parecida coma que os artistas usam para pintar; neste caso e um espaco branco para desenhar:

>>> tartaruga = turtle.Pen()

Nesse codigo, nos chamamos uma funcao (Pen) do modulo ‘turtle’, que au-tomaticamente cria uma tela para nos desenharmos. Uma funcao e um pedaco decodigo reutilizavel (nos veremos funcoes mais tarde) que faz algo util — neste caso,um objeto que representa uma tartaruga e retornado pela funcao ‘Pen’ — nos ar-mazenamos esse objeto na variavel ‘tartaruga’. Quando voce digitar o codigo noterminal do Python, voce vera uma tela em branco, assim como na figura 3.1.

Sim, aquela pequena seta no meio da tela e a nossa tartaruga. E, nao, ela naose parece nenhum pouco com uma tartaruga.

Voce pode enviar instrucoes a tartaruga, usando algumas funcoes do objetoque nos criamos (chamando turtle.Pen) — uma vez que nos atribuimos o objeto avariavel tartaruga, nos usamos tartaruga para enviar instrucoes.

27

Figura 3.2: A tartaruga desenha uma linha.

Uma das instrucoes e a forward. Forward (ir para frente, em ingles) diz atartaruga para se mover para frente, seja qual for a direcao que ela esteja. Vamosdizer a tartaruga para se mover 50 pixels para frente (nos falaremos sobre pixels emum minuto).

>>> tartaruga.forward(50)

Voce vera algo como a figura 3.2.

Do ponto de vista da tartaruga, ela moveu 50 passos para frente. Do nossoponto de vista, ela moveu 50 pixels.

Entao, o que e um pixel?

Um pixel e um ponto na tela. Quando voce olha para o seu computador, tudoe feito de pequenos pontos (quadrados). Os programas que voce usa e os jogos quevoce joga no computador, ou com o seu PlayStation, ou Xbox, ou Wii; todos saoformados por um monte de pontos coloridos diferentes, exibidos na tela. Na verdade,se voce olhar para a tela do seu computador usando uma lente de aumento, vocevera esses pontos. Entao, se olharmos bem perto da linha desenhada pela tartaruga,nos veremos que a seta que representa a tartaruga, tambem e formata por um montede pontos quadrados, como podemos ver na figura 3.3.

Nos falaremos mais tarde sobre esses pontos, ou pixels, em outro capıtulo.

28 CAPITULO 3. TARTARUGAS E OUTRAS CRIATURAS LENTAS

Figura 3.3: Visao aproximada da linha e da seta.

Figura 3.4: As ‘divisoes’ em um relogio.

Depois, podemos dizer para a tartaruga virar para a esquerda ou direita:

>>> tartaruga.left(90)

Isso diz a tartaruga para virar para a esquerda, 90 graus. Voce pode nao teraprendido sobre graus na escola ainda, mas uma maneira facil de se pensar, e queeles sao como as divisoes em um relogio, assim como na figura 3.4.

A diferenca de um relogio e que, ao inves de 12 divisoes (ou 60, caso estejacontando em minutos ao inves de horas), existem 360 divisoes. Entao, se voce contaras 360 divisoes do relogio, voce tera 90 onde marca 3 horas, 180 onde marca 6 horase 270 onde marca 9 horas; e o 0, no comeco, onde marca 12 horas. A figura 3.5mostra as divisoes em graus.

Entao, o que realmente significa quando voce chama left(90)?

Se voce estender o seu braco para o lado, na direcao do seu ombro, isso e 90graus. Se voce estender o seu braco esquerdo, isso e 90 graus para a esquerda. Sevoce estender o seu braco direito, isso e 90 graus para a direita. Quando a tartarugado Python se vira a esquerda, ela posiciona o seu rosto para a esquerda e entao

29

Figura 3.5: Graus.

gira o seu corpo para a nova direcao (da mesma forma que voce faria para saberpara onde o seu braco esta apontando). Entao, tartaruga.left(90) faz com que a setaagora aponte para cima, como exibido na figura 3.6.

Vamos tentar os mesmos comandos novamente, algumas vezes:

>>> tartaruga.forward(50)

>>> tartaruga.left(90)

>>> tartaruga.forward(50)

>>> tartaruga.left(90)

>>> tartaruga.forward(50)

>>> tartaruga.left(90)

Nossa tartaruga desenhou um quadrado e ficou virada para a mesma direcaoque estava (veja a figura 3.7).

Nos podemos limpar o que esta na tela, usando o comando clear:

>>> tartaruga.clear()

Algumas das outras funcoes basicas que voce pode usar sao: reset, que tambemlimpa a tela, mas tambem coloca a tartaruga de volta na sua posicao inicial; backward,que move a tartaruga para tras; right, que vira a tartaruga para a direita; up quediz a tartaruga para parar de desenhar conforme ela anda (como se tirasse o pincelda tela); e finalmente o down que diz a tartaruga para voltar a desenhar. Voce podechamar essas funcoes da mesma forma que chamou as outras:

30 CAPITULO 3. TARTARUGAS E OUTRAS CRIATURAS LENTAS

Figura 3.6: A tartaruga, apos virar para a esquerda.

Figura 3.7: Desenhando um quadrado.

3.1. COISAS PARA TENTAR 31

>>> tartaruga.reset()

>>> tartaruga.backward(100)

>>> tartaruga.right(90)

>>> tartaruga.up()

>>> tartaruga.down()

Nos voltaremos ao modulo ‘turtle’ em breve.

3.1 Coisas para tentar

Neste capıtulo, nos vimos como usar o modulo ‘turtle’ para desenhar linhas simples,virando-a para esquerda e direita. Nos vimos que sao usados graus para virar atartaruga, um pouco parecido com as divisoes dos minutos em um relogio..

Exercıcio 1

Crie uma tela usando a funcao Pen do modulo ‘turtle’ e desenhe um retangulo.

Exercıcio 2

Crie outra tela usando a funcao Pen e desenhe um triangulo.

32 CAPITULO 3. TARTARUGAS E OUTRAS CRIATURAS LENTAS

Capıtulo 4

Como fazer uma pergunta

Em termos de programacao, uma pergunta normalmente significa que nos queremosfazer ou uma coisa, ou outra, dependendo da resposta. Isso e chamado de expressaoif . Por exemplo:

Quantos anos voce tem? Se voce tem mais de 20 anos, voce e muitovelho!

Isso pode ser escrito em Python usando a seguinte expressao ‘if’:

if idade > 20:

print(’voce e muito velho!’)

Uma expressao ‘if’ e composta de um ‘if’ seguido pelo que chamamos de‘condicao’, seguido por dois-pontos (:). As linhas linhas apos o ‘if’ devem ficar emum bloco — e se a resposta para a pergunta for ‘sim’ (ou ‘True’, como chamamosem programacao) os comandos no bloco serao executados.

A condicao e uma expressao de programacao que retorna ‘sim’ (True) ou ‘nao’(False). Existem alguns sımbolos (ou operadores) usados para criar condicoes, como:

== igual!= diferente> maior que< menor que>= maior que, ou igual<= menor que, ou igual

33

34 CAPITULO 4. COMO FAZER UMA PERGUNTA

Por exemplo, se voce tem 10 anos, entao a condicao sua idade == 10 retornariaTrue (sim), mas se voce nao tem 10 anos, retornaria False (nao). Lembre-se: naoconfunda os dois sımbolos de igual, usados na condicao (==), com os usados paraassociar valores (=) — se voce usar apenas um igual em uma condicao, voce receberauma mensagem de erro.

Assumindo que voce tenha a variavel idade com a sua idade, entao se vocetiver 12 anos, a condicao. . .

idade > 10

. . . retornara ‘True’ novamente. Se voce tiver 8 anos de idade, retornara ‘False’.Se voce tiver 10 anos de idade, retornara ‘False’ — pois a condicao verifica se e maiorque (>) 10, nao se e maior ou igual (>=) a 10.

Vamos tentar alguns exemplos:

>>> idade = 10

>>> if idade > 10:

... print(’chegou aqui’)

Se voce digitar o exemplo acima no terminal, o que deve acontecer?

Nada.

Pois o valor da variavel idade nao e maior que 10, o comando ‘print’ no bloco naosera executado. Que tal:

>>> idade = 10

>>> if idade >= 10:

... print(’chegou aqui’)

chegou aqui

Se voce tentar este exemplo, entao voce devera ver a mensagem exibida noterminal. O mesmo ocorrera com o proximo exemplo:

>>> idade = 10

>>> if idade == 10:

... print(’chegou aqui’)

chegou aqui

4.1. FACA ISSO. . . SENAO!!! 35

4.1 Faca isso. . . SENAO!!!

Nos tambem podemos estender a expressao ‘if’, para que faca algo caso a condicaonao seja verdade. Por exemplo, exibir a palavra ‘Ola’ no terminal, se a idade for12, senao exibir a mensagem ‘Tchau’. Para fazer isso, nos precisamos usar umaexpressao ‘se-entao-senao’ (o mesmo que dizer “se algo e verdadeiro, entao facaisso, senao faca aquilo”):

>>> idade = 12

>>> if idade == 12:

... print(’Ola’)

... else:

... print(’Tchau’)

Ola

Digite o exemplo acima e voce vera ‘Ola’ no terminal. Mude o valor da variavelidade para outro numero e ‘Tchau’ sera exibido:

>>> idade = 8

>>> if idade == 12:

... print(’Ola’)

... else:

... print(’Tchau’)

Tchau

4.2 Faca isso. . . ou isso. . . ou isso. . . ou SENAO!!!

Nos podemos estender a expressao ‘if’ ainda mais, usando o ‘elif’ (abreviacao de‘else-if’). Por exemplo, nos podemos verificar se a idade e 10, ou se e 11, ou se e 12e por aı em diante:

36 CAPITULO 4. COMO FAZER UMA PERGUNTA

1. >>> idade = 12

2. >>> if idade == 10:

3. ... print(’voce tem 10’)

4. ... elif idade == 11:

5. ... print(’voce tem 11’)

6. ... elif idade == 12:

7. ... print(’voce tem 12’)

8. ... elif idade == 13:

9. ... print(’voce tem 13’)

10. ... else:

11. ... print(’ahn?’)

12. ...

13. voce tem 12

No codigo acima, a linha 2 verifica se o valor da variavel idade e igual a 10.Se nao, entao ele pula para a linha 4, onde e verificado se o valor da variavel idadee igual a 11. Novamente, se nao, entao ele pula para a linha 6, para verificar se avariavel e igual a 12. Neste caso e, entao o Python prossegue no bloco na linha 7 eexecuta o comando ‘print’. (Felizmente voce deve ter notado que existem 5 gruposneste codigo — linhas 3, 5, 7, 9 e linha 11)

4.3 Combinando condicoes

Voce pode combinar condicoes usando a palavra-chave ‘and’ (‘e’, em ingles) e ‘or’(‘ou’, em ingles). Nos podemos reduzir o exemplo acima, um pouco, usando o ‘or’para juntar as condicoes:

1. >>> if idade == 10 or idade == 11 or idade == 12 or idade == 13:

2. ... print(’voce tem %s’ % idade)

3. ... else:

4. ... print(’ahn?’)

Se qualquer uma das condicoes na linha 1 forem verdade (ex.: se idade for 10ou idade for 11 ou idade for 12 ou idade for 13), entao o bloco de codigo na linha2 sera executado, senao o Python executara a linha 4. Nos podemos reduzir umpouco o exemplo, usando o ‘and’ e os sımbolos >= e <=.

1. >>> if idade >= 10 and idade <= 13:

2. ... print(’voce tem %s’ % idade)

3. ... else:

4. ... print(’ahn?’)

Felizmente voce deve ter notado que se ambas as condicoes na linha 1 foremverdade, entao o bloco de codigo na linha 2 sera executado (se a idade for maior ou

4.4. VACUO 37

igual a 10 e a idade for menor ou igual a 13). Entao se o valor da variavel idade for12, entao ‘voce tem 12’ sera impresso no terminal: pois 12 e maior que 10 e tambeme menor que 13.

4.4 Vacuo

Existe outro tipo de valor, que pode ser atribuıdo a uma variavel, que nao falamossobre nos capıtulos anteriores: Nada.

Da mesma forma que numeros, strings e listas podem ser atribuıdos a umavariavel, ‘nada’ tambem e um valor que pode ser atribuıdo. Em Python, um valorvazio e referenciado como None (em outras linguagens de programacao, muitas vezeschamado de ‘null’) e voce pode usar da mesma maneira que os outros valores:

>>> minhavar = None

>>> print(minhavar)

None

‘None’ e uma forma de apagar o conteudo de uma variavel, ou apenas de criaruma variavel definindo um valor padrao antes de ser usada.

Por exemplo, se o seu time de futebol estiver levantando fundos para um novouniforme e voce esta somando quanto ja foi levantado, voce pode querer esperar ateque todo time de o dinheiro antes de iniciar a contagem. Em termos de programacao,nos poderiamos ter uma variavel para cada membro do time e entao atribuir todasas variaveis para ‘None’:

>>> jogador1 = None

>>> jogador2 = None

>>> jogador3 = None

Nos podemos usar a expressao ‘if’, para verificar essas variaveis e determinarse todos os membros do time ja retornaram com o dinheiro que levantaram:

>>> if jogador1 is None or jogador2 is None or jogador3 is None:

... print(’Por favor, aguarde ate que todos jogadores tenham retornado’)

... else:

... print(’Voce conseguiu %s’ % (jogador1 + jogador2 + jogador3))

A expressao ‘if’ verifica se alguma das variaveis possui o valor None, e imprimea primeira mensagem, se sim. Se cada uma das variaveis possuir um valor, entao

38 CAPITULO 4. COMO FAZER UMA PERGUNTA

a segunda mensagem e impressa, com o valor total levantado. Se voce tentar estecodigo com todas as variaveis com ‘None’, voce vera a primeira mensagem (nao seesqueca de criar as variaveis primeiro, senao voce recebera uma mensagem de erro):

>>> if jogador1 is None or jogador2 is None or jogador3 is None:

... print(’Por favor, aguarde ate que todos jogadores tenham retornado’)

... else:

... print(’Voce conseguiu %s’ % (jogador1 + jogador2 + jogador3))

Por favor, aguarde ate que todos jogadores tenham retornado

Ate mesmo se nos definirmos uma ou duas variaveis, nos ainda receberemos amensagem:

>>> jogador1 = 100

>>> jogador3 = 300

>>> if jogador1 is None or jogador2 is None or jogador3 is None:

... print(’Por favor, aguarde ate que todos jogadores tenham retornado’)

... else:

... print(’Voce conseguiu %s’ % (jogador1 + jogador2 + jogador3))

Por favor, aguarde ate que todos jogadores tenham retornado

Finalmente, assim que todas variaveis estiverem definidas, voce vera a mensagemdo segundo bloco:

>>> jogador1 = 100

>>> jogador3 = 300

>>> jogador2 = 500

>>> if jogador1 is None or jogador2 is None or jogador3 is None:

... print(’Por favor, aguarde ate que todos jogadores tenham retornado’)

... else:

... print(’Voce conseguiu %s’ % (jogador1 + jogador2 + jogador3))

Voce conseguiu 900

4.5 Qual e a diferenca. . .?

Qual e a diferenca entre 10 e ’10’?

Nada alem das aspas, voce deve estar pensando. Bem, pelo que foi lido nosprimeiros capıtulos, voce sabe que o primeiro e um numero e o segundo e uma‘string’. Isso os diferencia mais do que voce deve estar pensando. Mais cedo, noscomparamos o valor da variavel (idade) a um numero em uma expressao ‘if’:

4.5. QUAL E A DIFERENCA. . .? 39

>>> if idade == 10:

... print(’voce tem 10’)

Se voce definir a variavel idade com 10, o comando ‘print’ sera chamado:

>>> idade = 10

>>> if idade == 10:

... print(’voce tem 10’)

...

voce tem 10

Porem, se ‘idade’ for definida como ’10’ (note as aspas), nao sera:

>>> idade = ’10’

>>> if idade == 10:

... print(’voce tem 10’)

...

Por que o codigo no bloco nao foi executado? Porque uma string e diferentede um numero, mesmo que eles se parecam:

>>> idade1 = 10

>>> idade2 = ’10’

>>> print(idade1)

10

>>> print(idade2)

10

Veja! Eles parecem exatamente iguais. Ainda, por um ser uma string e outroum numero, eles tem valores diferentes. Portanto idade == 10 (idade igual a 10)nunca sera verdade, se o valor da variavel e uma string.

Provavelmente, a melhor forma de pensar sobre isso e considerar 10 livros e10 tijolos. O numero de itens pode ser o mesmo, mas voce nao poderia dizer que10 livros sao 10 tijolos, poderia? Felizmente em Python, nos temos funcoes magicasque podem transformar strings em numeros e numeros em strings (mesmo que elasnao transformem tijolos em livros). Por exemplo, para converter uma string ’10’ emum numero, voce pode usar a funcao int:

>>> idade = ’10’

>>> idade_convertida = int(idade)

A variavel idade convertida agora contem o numero 10 e nao uma string. Paraconverter um numero para uma string, voce pode usar a funcao str:

40 CAPITULO 4. COMO FAZER UMA PERGUNTA

>>> idade = 10

>>> idade_convertida = str(idade)

A variavel idade convertida agora contem a string 10 e nao um numero. De voltaaquela expressao ‘if’ que nao imprime nada:

>>> age = ’10’

>>> if age == 10:

... print(’you are 10’)

...

Se nos convertermos a variavel antes de verificarmos, entao veremos a diferenca noresultado:

>>> idade = ’10’

>>> idade_convertida = int(idade)

>>> if idade_convertida == 10:

... print(’voce tem 10’)

...

voce tem 10

Capıtulo 5

De novo e de novo

Nao existe coisa pior do que ter que fazer a mesma coisa mais e mais vezes. Existe ummotivo para que seus pais pecam para voce contar ovelhas para tentar dormir e issonao tem nada a ver com um maravilhoso sono — induzindo poderes de mamıferosfofinhos. Isso tem a ver com o fato de que contar infinitamente, a mesma coisa, echato e a sua mente se desligara mais facil para dormir, se nao estiver focando emalgo interessante.

Alem disso, especialmente os programadores nao gostam de ser repetitivos.Isso os coloca para dormir de certa forma. Que e uma boa razao para que todasas linguagens de programacao tenham o que e chamado de laco-for. Por exemplo,para imprimir ‘ola’, 5 vezes em Python, voce poderia fazer o seguinte:

>>> print("Ola")

Ola

>>> print("Ola")

Ola

>>> print("Ola")

Ola

>>> print("Ola")

Ola

>>> print("Ola")

Ola

Que e. . . bastante entediante.

Ou voce poderia usar o ‘laco-for’ (observe: existe 4 espacos na segunda linha,antes do comando ‘print’ — Eu os substituı por @ para que nos o pudessemos ver):

41

42 CAPITULO 5. DE NOVO E DE NOVO

>>> for x in range(0, 5):

... @@@@print(’Ola’)

...

Ola

Ola

Ola

Ola

Ola

range e uma funcao e uma forma rapida e facil de criar uma lista contendouma sequencia de numeros entre um ‘inıcio’ e um ‘fim’. Por exemplo:

>>> print(list(range(10, 20)))

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Entao, no caso do ‘laco-for’, o codigo ‘for x in range(0, 5)’ esta dizendo aoPython para criar uma lista de numeros (0, 1, 2, 3, 4) e entao para cada numero,armazenar seu valor na variavel x. Nos podemos entao usar o x no nosso comando‘print’, se quisermos:

>>> for x in range(0, 5):

... print(’Ola %s’ % x)

Ola 0

Ola 1

Ola 2

Ola 3

Ola 4

Se nos livrarmos do ‘laco-for’ novamente, nos terıamos que fazer algo assim:

x = 0

print(’Ola %s’ % x)

x = 1

print(’Ola %s’ % x)

x = 2

print(’Ola %s’ % x)

x = 3

print(’Ola %s’ % x)

x = 4

print(’Ola %s’ % x)

Entao o laco nos fez economizar, escrevendo 8 linhas a menos de codigo. Issoe extremamente util, visto que um programador medio e mais preguicoso que umhipopotamo no calor, quando o assunto e digitar. Bons programadores odeiam fazer

43

coisas mais de uma vez, entao o ‘laco-for’ e um dos comandos mais uteis em umalinguagem de programacao.

AVISO!!!

Se voce esteve tentando os exemplos conforme foi lendo, vocepode ter recebido uma mensagem de erro quando digitou ocodigo para aquele ‘laco-for’. Se recebeu, foi algo assim:

IndentationError: expected an indented block

Se voce ver um erro parecido com esse, entao voce esqueceu decolocar os espacos na segunda linha. Os espacos em Python(ou tabs) sao extremamente importantes. Nos falaremos maissobre isso depois. . .

Nos nao precisamos continuar usando o range, nos tambem podemos usarlistas, como ja criamos. Assim como a lista de compras que criamos no ultimocapıtulo:

>>> lista_compras = [ ’ovos’, ’leite’, ’queijo’, ’salsinha’, ’margarina’,

... ’fermento’ ]

>>> for i in lista_compras:

... print(i)

ovos

leite

queijo

salsinha

margarina

fermento

O codigo acima e uma forma de dizer, “para cada item na lista, armazenena variavel ‘i’ e entao imprima o conteudo dessa variavel”. Novamente, se nos naousassemos o ‘laco-for’, nos terıamos que fazer algo assim:

44 CAPITULO 5. DE NOVO E DE NOVO

>>> lista_compras = [ ’ovos’, ’leite’, ’queijo’, ’salsinha’, ’margarina’,

... ’fermento’ ]

>>> print(lista_compras[0])

ovos

>>> print(lista_compras[1])

leite

>>> print(lista_compras[2])

queijo

>>> print(lista_compras[3])

salsinha

>>> print(lista_compras[4])

margarina

>>> print(lista_compras[5])

fermento

Entao, novamente, o laco nos salvos de digitar muita coisa.

5.1 Quando um bloco nao e quadrado?

Quando e um bloco de codigo.

O que e um ‘bloco de codigo’ entao?

Um bloco de codigo e uma serie de comandos de programacao que voce querjuntar. Por exemplo, no laco ‘for’ do exemplo acima, voce pode querer mais queapenas imprimir os itens. Talvez voce quisesse comprar cada item e entao imprimı-lo.Supondo que nos tivessemos uma funcao chamada ‘comprar’, voce poderia escrevero codigo assim:

>>> for i in lista_compras:

... comprar(i)

... print(i)

Nao ha necessidade de tentar digitar esse exemplo no terminal do Python —pois nos nao temos uma funcao ‘comprar’ e voce recebera uma mensagem de erro setentar — mas isso demonstra um simples bloco de codigo em Python, formado por2 comandos:

comprar(i)

print(i)

Em Python, os espacos em branco como o tab (quando voce pressiona a teclaTab) e o espaco (quando voce aperta a barra de espaco) emuito importante. Codigosque estao alinhados na mesma posicao, sao agrupados como blocos.

5.1. QUANDO UM BLOCO NAO E QUADRADO? 45

este seria o bloco 1

este seria o bloco 1

este seria o bloco 1

este seria o bloco 2

este seria o bloco 2

este seria o bloco 2

este ainda seria o bloco 1

este ainda seria o bloco 1

este seria o bloco 3

este seria o bloco 3

este seria o bloco 4

este seria o bloco 4

este seria o bloco 4

Mas voce deve ser consistente com seus espacos. Por exemplo:

>>> for i in lista_compras:

... comprar(i)

... print(i)

A segunda linha (function comprar(i)) inicia com 4 espacos. A terceira linha(print(i)) inicia com 6 espacos. Vamos olhar novamente o codigo, com os espacosvisıveis (usando @ no lugar):

>>> for i in lista_compras:

... @@@@comprar(i)

... @@@@@@print(i)

Isso causaria um erro. Assim que voce comecou usando 4 espacos, voce precisacontinuar usando 4 espacos. E se voce quiser colocar um bloco dentro de outrobloco, voce precisara de 8 espacos (2 x 4) no comeco de cada linha dentro dessebloco.

Entao o primeiro bloco tem 4 espacos (Eu vou destacar novamente, para vocever):

@@@@aqui esta o meu primeiro bloco

@@@@aqui esta o meu primeiro bloco

E entao o segundo bloco (que esta ‘dentro’ do primeiro) precisa de 8 espacos:

@@@@aqui esta o meu primeiro bloco

@@@@aqui esta o meu primeiro bloco

@@@@@@@@aqui esta o meu segundo bloco

@@@@@@@@aqui esta o meu segundo bloco

Porque nos iriamos querer um bloco ‘dentro’ de outro? Normalmente nosfazemos isso quando o segundo bloco depende do primeiro, de alguma forma. Como

46 CAPITULO 5. DE NOVO E DE NOVO

o nosso laco ‘for’. Se a linha com o laco e o primeiro bloco, os comandos quenos queremos executar varias vezes estara no segundo bloco — de certa forma elesdependem do primeiro bloco para funcionar.

No terminal do Python, assim que voce comecar a digitar o codigo em umbloco, o Python continuara naquele bloco ate que voce pressione ‘Enter’ em umalinha em branco (voce vera os 3 pontos no comeco da linha, mostrando que voceainda esta em um bloco).

Vamos tentar alguns exemplos reais. Abra o terminal e digite o seguinte(lembre-se de colocar 4 espacos no comeco das linhas com o comando ‘print’):

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i)

... print(i)

...

a

a

b

b

c

c

Apos o segundo ‘print’, pressione a tecla ‘Enter’ em uma linha em branco —que ira dizer ao terminal que voce quer finalizar o bloco. Isso entao imprimira cadaitem da lista, duas vezes.

O proximo exemplo causara uma mensagem de erro:

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i)

... print(i)

...

File \<stdin>", line 3

print(i)

^

IndentationError: unexpected indent

A segunda linha tem 6 espacos, nao 4, coisa que o Python nao gosta, pois elequer que os espacos se mantenham os mesmos.

5.1. QUANDO UM BLOCO NAO E QUADRADO? 47

LEMBRE-SE

Se voce inicia o seu bloco de codigo com 4 espacos, vocedeve continuar usando 4 espacos. Se voce inicia blocos com2 espacos, voce deve continuar usando 2 espacos. Continuecom os 4 espacos, porque e o que as pessoas mais usam.

Aqui esta um exemplo mais cimplicado, com 2 blocos de codigo:

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i)

... for j in minhalista:

... print(j)

...

Onde estao os blocos nesse codigo e o que ele faz?

Existem dois blocos — o primeiro e parte do primeiro laco ‘for’:

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i) #

... for j in minhalista: # estas linhas s~ao o PRIMEIRO bloco

... print(j) #

...

O segundo bloco tem somente o ‘print’ , no segundo laco ‘for’:

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i)

... for j in minhalista:

... print(j) # esta linha e o SEGUNDO bloco

...

Voce consegue descobrir o que esse pequeno pedaco de codigo ira fazer?

Ele ira imprimir as 3 letras em ‘minhalista’, mas quantas vezes? Se nos olhar-mos cada linha, nos descobriremos. Nos sabemos que o primeiro laco ira caminharpor cada um dos itens na lista e entao executar os comandos no bloco 1. Entao eleira imprimir uma letra, entao iniciar o proximo laco. Esse laco tambem caminharapor cada item na lista e executara o comando no bloco 2. Entao o que nos teremosquando esse codigo rodar, e o ‘a’ seguido por ‘a’, ‘b’, ‘c’, e entao ‘b’ seguido por ‘a’,‘b’, ‘c’ e por assim em diante. Digite o codigo voce mesmo no terminal do Pythonpara ver:

48 CAPITULO 5. DE NOVO E DE NOVO

>>> minhalista = [ ’a’, ’b’, ’c’ ]

>>> for i in minhalista:

... print(i)

... for j in minhalista:

... print(j)

...

a

a

b

c

b

a

b

c

c

a

b

c

Que tal algo mais util que apenas imprimir letras? Lembra daquele calculoque usamos no comeco deste livro, com intuito de saber quanto voce teria no finaldo ano, se voce ganhasse R$5 fazendo alguns trabalhos, R$30 por entregar algunsjornais, mas gastasse R$10, toda semana?

Algo assim:

>>> (5 + 30 - 10) * 52

(Isto e R$5 + R$30 - R$10 multiplicado por 52 semanas em um ano).

Seria util ver como as suas economias aumentaram durante o ano, ao inves decalcular quanto voce teria no final do ano. Nos podemos fazer isso atraves de outrolaco ‘for’. Mas antes de tudo, nos precisamos carregar esses numeros em variaveis:

>>> trabalhos = 5

>>> jornal = 30

>>> gastos = 10

Nos podemos realizar o calculo original usando as variaveis:

>>> (trabalhos + jornal - gastos) * 52

1300

Ou nos podemos ver a economia aumentar durante o ano, criando outravariavel chamada ‘economia’, e usar ela no laco:

5.1. QUANDO UM BLOCO NAO E QUADRADO? 49

1. >>> economia = 0

2. >>> for semana in range(1, 53):

3. ... economia = economia + trabalhos + jornal - gastos

4. ... print(’Semana %s = %s’ % (semana, economia))

5. ...

Na linha 1, a variavel ‘economia’ e iniciada com 0 (pois nos nao temos nenhumaeconomia ainda).A linha 2 inicia o laco, que vai rodar os comandos que estao no bloco (o bloco ecomposto das linhas 3 e 4). Cada vez que o laco roda, a variavel ‘semana’ e carregadacom o proximo numero dentro da serie de 1 a 52.A linha 3 e um pouco mais complicada. Basicamente, a cada semana, nos queremosadicionar o que economizamos ao total economizado. Pense na variavel ‘economia’como se fosse um banco. Juntamos o dinheiro que ganhamos fazendo alguns bicose a entrega de jornais, subtraimos o dinheiro que gastamos e colocamos o restanteno banco. Entao, na linguagem de computador, a linha 3 significa: “substitua oconteudo da variavel ‘economia’ pela minha economia atual, mais o que eu ganheiessa semana”. Basicamente, o sımbolo igual (=) e um pedaco de codigo ‘mandao’que diz algo como “calcule algo que esta a direita e salve para depois, com o nomeque esta a esquerda”.A linha 4 possui um comando ‘print’ um pouco mais complicado, que imprime onumero da semana e o total economizado (naquela semana) na tela. Verifique asecao Truques com Strings na pagina 18, se essa linha nao lhe fizer muito sentido.Entao, se voce rodar o programa, voce vera algo como abaixo:

Semana 1 = 25

Semana 2 = 50

Semana 3 = 75

Semana 4 = 100

Semana 5 = 125

Semana 6 = 150

Semana 7 = 175

Semana 8 = 200

Semana 9 = 225

Semana 10 = 250

Semana 11 = 275

Semana 12 = 300

Semana 13 = 325

Semana 14 = 350

Semana 15 = 375

. . .ate a semana 52.

50 CAPITULO 5. DE NOVO E DE NOVO

5.2 Ja que estamos falando de lacos. . .

O ‘for’ nao e o unico tipo de laco que voce pode fazer em Python. Existe tambem olaco ‘while’ (enquanto). Se o ‘for’ e um laco onde voce sabe exatamente quando iraparar, o laco ‘while’ e um laco onde voce nao sabe, necessariamente, quantas vezesira rodar. Imagine uma escada com 20 degraus. Voce sabe facilmente que podesubir 20 degraus. Isso e um laco ‘for’.

>>> for degrau in range(0,20):

... print(degrau)

Agora imagine uma escada que sobe uma montanha. Voce pode perder aenergia antes de chegar no topo. Ou o tempo pode piorar, forcando voce a parar aescalada. Esse e um laco ‘while’.

>>> degrau = 0

>>> while degrau < 10000:

... print(degrau)

... if cansado == True:

... break

... elif tempo_ruim == True:

... break

... else:

... degrau = degrau + 1

Nao se preocupe em executar o codigo de exemplo acima, pois nos ainda naocriamos as variaveis cansado e tempo ruim. Mas ele demonstra um laco ‘while’basico. Enquanto o valor da variavel degrau for menor que 10000 (degrau < 10000)o codigo no bloco sera executado. No bloco, nos imprimimos o valor da variaveldegrau e entao checamos se o valor de cansado ou tempo ruim e ‘True’. Se cansadofor ‘True’, entao o comando break para a execucao do laco (basicamente, nos pulamospara fora do laco, imediatamente para a primeira linha do proximo bloco). Setempo ruim for ‘True’, nos tambem paramos o laco. Se nao, entao 1 e somado aovalor em degrau, e a condicao do laco (degrau < 10000) e verificada novamente.

Entao os passos de um laco ‘while’, basicamente, sao:

⊲ verifique a condicao,

⊲ execute o codigo que esta no bloco,

⊲ repita

5.2. JA QUE ESTAMOS FALANDO DE LACOS. . . 51

Geralmente, o laco ‘while’ pode ser criado usando uma serie de condicoes:

>>> x = 45

>>> y = 80

>>> while x < 50 and y < 100:

... x = x + 1

... y = y + 1

... print(x, y)

Nesse laco, nos criamos uma variavel x com o valor 45 e uma variavel y com ovalor 80. Existem duas condicoes que sao verificadas pelo laco: quando x e menorque 50 e quando y e menor que 100. Enquanto ambas condicoes forem verdadeiras, obloco de codigo sera executado, adicionando 1 a ambas variaveis e entao imprimindo-as. O resultado desse codigo e:

46 81

47 82

48 83

49 84

50 85

Talvez voce possa descobrir porque esses numeros sao impressos?1

Outro uso comum do laco ‘while’, e criar um laco semi-eterno. Um laco quebasicamente roda para sempre, ou ate que algo aconteca no codigo que o faca parar.Por exemplo:

>>> while True:

... muitos codigos aqui

... muitos codigos aqui

... muitos codigos aqui

... if alguma_condicao == True:

... break

A condicao do laco ‘while’ e apenas ‘True’. Entao ele sempre ira executar ocodigo que esta no bloco (assim, o laco e eterno, ou infinito). O laco somente iraparar quando a variavel alguma condicao for verdadeira. Voce pode ver um exemplomelhor disso no Apendice C (a secao sobre o modulo random), mas voce poderia lero proximo capıtulo antes de pular para la.

1Nos iniciamos contando em 45 na variavel x e em 80 na variavel y, entao incrementamos(somamos 1) a cada variavel, toda vez que o codigo no laco e executado. As condicoes verificamque x deve ser menor que 50 e y deve ser menor que 100. Apos rodar 5 vezes (adicionando 1 a cadavariavel), o valor em x chega a 50. Agora a primeira condicao (x < 50) nao e mais verdadeira,entao o Python sabe que deve parar o laco.

52 CAPITULO 5. DE NOVO E DE NOVO

5.3 Coisas para tentar

Neste capıtulo, nos vimos como usar lacos para fazer tarefas repetitivas. Nos usamosblocos de codigo dentro de lacos para as tarefas a serem repetidas.

Exercıcio 1

O que voce acha que vai acontecer no codigo abaixo?

>>> for x in range(0, 20):

... print(’ola %s’ % x)

... if x < 9:

... break

Exercıcio 2

Quando voce guarda dinheiro no banco, voce ganha juros. ‘Juros’ e o dinheiro queo banco lhe paga por deixar ele usar o seu dinheiro — a cada ano voce recebe umapequena quantia de dinheiro, relativa ao tanto que voce guardou. Esse pagamento,normalmente e adicionado de volta a sua conta no banco, que por sua vez tambemrendera mais dinheiro. . . o que e um pouco confuso, entao pode ter que pedir a suamae ou ao seu pai para explicar. Juros sao calculados usando porcentagens. Sevoce nao sabe o que e porcentagem, nao se preocupe, e o suficiente saber que se obanco esta pagando a voce 1% (1 porcento) de juros, voce pode multiplicar o valormonetario pelo numero pelo numero 0.01 (se o seu montante for R$1000, entao vocefera: 1000 * 0.01). Se eles estao pagando 2% em juros, voce pode usar o numero0.02 e por assim em diante.

Se voce tem R$100 guardados no banco, e eles lhe pagam 3% de juros todo ano,quanto em dinheiro voce acha que teria ao longo de 10 anos? Voce pode escrever umprograma usando um laco ‘for’ para descobrir isso. (Dica: Lembre-se de adicionaros juros ao total).

Capıtulo 6

Assim como reciclar. . .

Pense no montante de lixo que e criado todos os dias. Garrafas de agua ou derefrigerante, pacotes de batata, embalagens de sanduıche, sacos de vegetais, carnesem bandejas de plastico, sacolas de compras de plastico, jornais, revistas e mais emais. . .

Agora apenas imagine o que poderia acontecer se todo esse lixo fosse empilhadono entrada da sua garagem.

53

54 CAPITULO 6. ASSIM COMO RECICLAR. . .

Claro que voce reciclaria tudo que fosse possıvel. Que e uma coisa boa, poisninguem gosta de andar por cima de uma montanha de lixo, a caminho da escola.Entao, aquelas garrafas de vidro na lixeira de reciclagem serao derretidas e transfor-madas em novas garrafas e frascos; papel e transformado em papel reciclado; plasticose transforma em outras coisas de plastico — entao o gramado da frente da sua casanao desaparece em meio a uma pilha de lixo. Nos comecamos a reutilizar algunsdos produtos que usamos, ao inves de tirar a mesma materia prima da natureza denovo e de novo.

Reciclar ou reutilizar, no mundo da programacao, e igualmente importante.Nao porque o seu programa ira desaparecer debaixo de uma pilha de lixo — mas sevoce nao reutilizar algumas coisas que voce faz, voce eventualmente desgastara osseus dedos, digitando excessivamente.

Existem diversas maneiras de reutilizar codigo em Python (e nas linguagensde programacao em geral), mas nos ja vimos uma das maneiras, no Capıtulo 3, coma funcao ‘range’. Funcoes sao uma maneira de reutilizar codigo — assim voce podeescrever o codigo apenas uma vez, entao usa-lo nos seus programas varias vezes.Vamos primeiro tentar um exemplo simples de funcao:

>>> def minhafuncao(nome):

... print(’Ola %s’ % nome)

...

A funcao acima tem o nome ‘minhafuncao’ e um parametro chamado ‘nome’.Um parametro e uma variavel que somente e acessıvel dentro do ‘corpo’ da funcao(que e o bloco de codigo logo apos a definicao def (caso esteja se perguntando, def euma abreviacao para ‘defina’). Voce pode executar a funcao, chamando-a pelo seunome e os parametros entre parenteses:

>>> minhafuncao(’Maria’)

Ola Maria

Nos podemos alterar a funcao para aceitar 2 parametros:

>>> def minhafuncao(nome, sobrenome):

... print(’Ola %s %s’ % (nome, sobrenome))

...

E entao chama-la da mesma maneira:

>>> minhafuncao(’Maria’, ’Almeida’)

Ola Maria Almeida

Ou nos poderıamos criar algumas variaveis e chamar a funcao com essas variaveis:

55

>>> nome = ’Jo~ao’

>>> sobrenome = ’Roberto’

>>> minhafuncao(nome, sobrenome)

Ola Jo~ao Roberto

Nos podemos retornar valores de uma funcao, usando a expressao return:

>>> def economias(trabalhos, entregas_jornal, gastos):

... return trabalhos + entregas_jornal - gastos

...

>>> print(economias(10, 10, 5))

15

Esta funcao recebe 3 parametros, adiciona os dois primeiros (trabalhos e en-tregas jornal) antes de subtrair o ultimo (gastos). O resultado e entao retornado —esse resultado pode ser usado como o valor de uma variavel (da mesma forma queatribuımos valores a outras variaveis):

>>> minhas_economias = economias(20, 10, 5)

>>> print(minhas_economias)

25

Porem, uma variavel que nos usamos dentro do corpo de uma funcao, nao seraacessıvel (usavel) apos o fim da funcao:

>>> def teste_variavel():

... a = 10

... b = 20

... return a * b

...

>>> print(teste_variavel())

200

>>> print(a)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ’a’ is not defined

No exemplo acima, nos criamos uma funcao teste variavel, que multiplica ovalor de duas variaveis (a e b) e retorna o resultado. Se nos chamarmos essa funcaousando o print, nos teremos o resultado: 200. Porem se nos tentarmos imprimir ovalor de a (ou b, por exemplo), nos receberemos uma mensagem a erro “‘a’ is notdefined” (‘a’ nao esta definido). Isso e algo que chamamos de ‘escopo’, no mundoda programacao.

56 CAPITULO 6. ASSIM COMO RECICLAR. . .

Imagine uma funcao como uma pequena ilha flutuante no oceano — e e muitolonge para nadar da ilha ate outro lugar qualquer. Ocasionalmente, um aviao asobrevoa e derruba pedacos de papel na ilha (sao aqueles parametros, chegandona funcao) que os habitants entao juntam e formam uma mensagem, colocam amensagem dentro de uma garrafa e entao lancam a garrafa ao mar (esse e o valorde retorno). O que os habitantes da ilha fazem, ou quantos deles foram necessariospara formar a mensagem, nao faz diferenca a pessoa que pegou a garrafa e esta lendoa mensagem. Essa e, provavelmente, a forma mais simples de explicar o escopo —mas existe um pequeno problema nessa ideia. Um dos habitantes tem um par debinoculos gigante e pode ver tudo alem do continente. Ele pode ver o que outraspessoas estao fazendo la e isso pode afetar a mensagem que ele esta criando:

>>> x = 100

>>> def teste2_variavel():

... a = 10

... b = 20

... return a * b * x

...

>>> print(teste2_variavel())

20000

Assim, mesmo que as variaveis a e b nao possam ser usadas de fora da funcao, avariavel x (que foi criada fora da funcao) pode ser usada dentro. Pense no habitanteda ilha com o binoculos, espero que isso o ajude a entender melhor essa ideia.

O laco ‘for’ que nos criamos anteriormente para exibir as economias ao longodo ano, pode ser facilmente adicionado a uma funcao:

6.1. PEDACOS E PECAS 57

>>> def economias_no_ano(trabalhos, jornal, gastos):

... economias = 0

... for semana in range(1, 53):

... economias = economias + trabalhos + jornal - gastos

... print(’Semana %s = %s’ % (semana, economias))

...

Tente digitar essa funcao no terminal, e chama-la com diferentes valores paratrabalhos, jornal, e gastos:

>>> economias_no_ano(10, 10, 5)

Semana 1 = 15

Semana 2 = 30

Semana 3 = 45

Semana 4 = 60

Semana 5 = 75

Semana 6 = 90

Semana 7 = 105

Semana 8 = 120

Semana 9 = 135

Semana 10 = 150

(e por aı vai...)

>>> economias_no_ano(25, 15, 10)

Semana 1 = 30

Semana 2 = 60

Semana 3 = 90

Semana 4 = 120

Semana 5 = 150

(e por aı vai...)

Isso e um pouco mais eficiente que redigitar o laco ‘for’ toda vez que vocequiser tentar um valor diferente. Funcoes podem ser agrupadas no que chamamosde modulos, que tornam o Python muito mais eficiente.

Falaremos mais sobre modulos em breve.

6.1 Pedacos e pecas

Quando o Python e instalado no seu computador, uma montanha de funcoes emodulos tambem sao instalados. Algumas funcoes sao disponibilizadas por padrao.range e dessas funcoes, que nos ja vimos. file e outra funcao que nao usamos ainda.

58 CAPITULO 6. ASSIM COMO RECICLAR. . .

Figura 6.1: Janela de Salvar Arquivo no Bloco de Notas.

Para ver como o file e usado, abra o Bloco de Notas, digite algumas palavrase entao salve o arquivo como ‘teste.txt’.

1. Clique no menu ‘Arquivo’, entao ‘Salvar’,

2. Clique duas vezes em ‘Meu Computador’ na janela de Arquivo,

3. Clique duas vezes em ‘Disco Local (C:)’,

4. No nome do arquivo (na parte debaixo) onde esta ‘*.txt’, coloque ‘teste.txt’

Abra o terminal do Python novamente e digite:

>>> f = open(’c:\\teste.txt’)

>>> print(f.read())

O conteudo do arquivo que voce acabou de criar sera exibido.

Entao, o que esse pequeno trecho de codigo faz? A primeira linha chamaa funcao file, passando o caminho do arquivo que voce criou, como parametro.A funcao retorna um tipo de valor especial (chamado objeto) que representa umarquivo. Nao e o arquivo em si; mas sim como se fosse um grande dedo apontandopara o arquivo, dizendo “AQUI ESTA ELE!!!” O objeto de arquivo e armazenadona variavel f.

A proxima linha, chama uma funcao especial (read) no objeto de arquivo, paraler o seu conteudo e imprimir o resultado no terminal. Por a variavel f conter umobjeto, isso significa que nos precisamos chamar a funcao ‘read’ usando o sımboloponto (.).

O apendice B (no final do livro) tem mais informacoes sobre asfuncoes embutidas no Python.

6.2. MODULOS 59

6.2 Modulos

Nos ja vimos muitas formas diferentes de reutilizar codigos. Uma delas e criaruma funcao propria, ou entao usar uma funcao pre-existente no Python (como orange, file, int e str). A outra e um tipo especial de funcao, em objetos — que noschamamos usando o sımbolo ponto — e a outra seria utilizando um modulo, que euma forma de agrupar muitas funcoes e objetos, de forma eficiente. Um exemplodisso e o modulo ‘time’:

>>> import time

O comando ‘import’ e usado para dizer ao Python que nos queremos usar ummodulo. No exemplo acima, nos estamos dizendo que nos queremos usar o modulo‘time’. Nos podemos entao, chamar as funcoes e objetos disponıveis nesse modulo,usando o sımbolo ponto, novamente:

>>> print(time.localtime())

(2006, 11, 10, 23, 49, 1, 4, 314, 1)

localtime e uma funcao dentro do modulo ‘time’, que retorna a data e horaatual, quebrada em partes individuais — ano, mes, dia, hora, minuto, segundo, diada semana, dia do ano e se e horario de verao ou nao (1 se for, 0 se nao). As partesindividuais sao armazenadas em uma tupla (veja Tuplas e Listas na pagina 23. Vocepode usar outra funcao do modulo ‘time’ para converter a data e hora retornadapelo localtime, em algo mais legıvel:

>>> t = time.localtime()

>>> print(time.asctime(t))

Sat Nov 18 22:37:15 2006

Nos podemos fazer tudo isso em apenas uma linha, se quisermos:

>>> print(time.asctime(time.localtime()))

Sat Nov 18 22:37:15 2006

Suponha que voce queira perguntar a alguem um valor. Voce pode fazer issousando o comando print e o modulo ‘sys’ — importando-o da mesma forma que fezcom o modulo time:

60 CAPITULO 6. ASSIM COMO RECICLAR. . .

import sys

Dentro do modulo ‘sys’, tem um objeto chamado ‘stdin’ (abreviacao de ‘stan-dard input’ ou ‘entrada padrao’). stdin tem um metodo (ou funcao) bastante util,chamado readline — que e usado para ler uma linha de texto que alguem digita (ateque ela pressione Enter). Voce pode testar o readline, usando os seguintes comandosno terminal do Python:

>>> print(sys.stdin.readline())

Se voce digitar algumas palavras e pressionar a tecla Enter, o que voce digitarsera impresso no console. Relembre, por um momento, o codigo que escrevemosanteriormente, usando a expressao ‘if’:

if idade >= 10 and idade <= 13:

print(’Voce tem %s’ % idade)

else:

print(’ahn?’)

Ao inves de criar uma variavel idade antecipadamente, nos podemos pedir aalguem para digitar o valor. Por que nao, primeiramente, colocar o codigo em umafuncao. . .

>>> def sua_idade(idade):

... if idade >= 10 and idade <= 13:

... print(’Voce tem %s’ % idade)

... else:

... print(’ahn?’)

...

Que pode ser chamada, passando um numero como parametro. Primeiro,vamos testar para ver se funciona corretamente:

>>> sua_idade(9)

ahn?

>>> sua_idade(10)

Voce tem 10

Agora que nos sabemos que nao ha problemas com a nossa funcao, podemosalterar ela para pedir a idade de uma pessoa:

6.3. COISAS PARA TENTAR 61

>>> def sua_idade():

... print(’Por favor, insira a sua idade’)

... idade = int(sys.stdin.readline())

... if idade >= 10 and idade <= 13:

... print(’Voce tem %s’ % idade)

... else:

... print(’ahn?’)

...

Devido ao fato de que o readline() retorna o que uma pessoa digitou comoum texto (em outras palavras, uma string), nos precisamos usar a funcao int paraconverter isso para um numero (assim entao, a expressao ‘if’ funcionara corretamente— veja Qual e a diferenca na pagina 38 para mais informacoes a respeito sobre isso).Para tentar isso, chame a funcao sua idade sem nenhum parametro e entao digite asua idade quando o texto ‘Por favor, insira a sua idade’ aparecer:

>>> sua_idade()

Por favor, insira a sua idade

10

Voce tem 10

>>> sua_idade()

Por favor, insira a sua idade

15

ahn?

A coisa mais importante em observar aqui, e que mesmo que voce esteja digitandoum numero (no caso, 10 ou 15), a funcao ‘readline’ sempre retornara uma string.

O sys e time sao apenas dois, de muitos modulos embutidosno Python. Para mais informacoes sobre alguns (nao todos)modulos do Python, veja o Apendice C.

6.3 Coisas para tentar

Neste capıtulo, nos vimos como fazer reciclagem em Python; atraves do uso defuncoes e modulos. Nos vimos um pouco sobre o escopo de uma variavel, comovariaveis de fora da funcao podem ser ‘vistas’ de dentro, enquanto variaveis ‘dedentro’ nao podem ser acessadas de fora, e aprendemos como criar nossas propriasfuncoes usando o def

62 CAPITULO 6. ASSIM COMO RECICLAR. . .

Exercıcio 1

No exercıcio 2 do Capıtulo 5, nos criamos um laco ‘for’ para descobrir quanto, deR$100, nos ganhamos com juros, em um perıodo de 10 anos. Esse laco ‘for’ pode serfacilmente colocado em uma funcao. Tente criar uma funcao que recebe um valorinicial e uma taxa de juros. Voce pode chamar a funcao usando o seguinte codigo:

calcular_juros(100, 0.03)

Exercıcio 2

Pegue a funcao que voce acabou de criar e faca ela calcular os juros em diferentesperıodos — como 5 anos ou 15 anos. Talvez voce possa chama-la usando o seguintecodigo:

calcular_juros(100, 0.03, 5)

Exercıcio 3

Talvez, ao inves de uma simples funcao onde nos passamos os valores como parametros,nos poderiamos criar um pequeno programa, que pergunta os valores (usando afuncao readline()). Nesse caso, nos poderıamos chama-la, usando o seguinte codigo,sem nenhum parametro:

calcular_juros()

Para criar esse pequeno programa, precisamos usar uma funcao que ainda nao vimos:float. A funcao float e parecida com a int, exceto que ela converte strings paraalgo que chamamos de numeros de ponto flutuante (que discutimos brevemente noCapıtulo 2). Numeros de ponto flutuante sao numeros com casa decimal (.), comopor exemplo 20.3 ou 2541.933.

Capıtulo 7

Um curto capıtulo sobre Arquivos

Voce provavelmente ja sabe o que e um arquivo.

Se os seus pais tem um escritorio em casa, existe uma grande chance de eles teremalgum tipo de armario de arquivo. Varios papeis importantes (principalmente coisaschatas de adultos) sao armazenadas nesses armarios, normalmente em pastas rotu-ladas com as letras do alfabeto ou meses do ano. Os arquivos em um computadorsao bastante semelhantes a essas pastas. Eles tem rotulos (o nome do arquivo) esao usados para armazenar informacoes importantes. As gavetas de um armario dearquivo, sao similares aos diretorios (ou pastas) em um computador.

Nos ja criamos um objeto de arquivo usando Python, no capıtulo anterior. Oexemplo se parecia com esse:

>>> f = open(’c:\\teste.txt’)

>>> print(f.read())

Um objeto de arquivo nao tem somente a funcao read. Afinal, armarios dearquivo nao seriam tao uteis se voce so pudesse abrir as gavetas e tirar os papeisde dentro, sem poder guarda-los de volta. Nos podemos criar um novo arquivo embranco, passando um outro parametro quando chamamos a funcao file:

>>> f = open(’novoarquivo.txt’, ’w’)

O ’w’ e uma forma de dizer ao Python que nos queremos apenas escrever noobjeto de arquivo e nao ler. Nos agora podemos guardar informacoes no arquivo,usando a funcao write.

63

64 CAPITULO 7. UM CURTO CAPITULO SOBRE ARQUIVOS

>>> f = open(’novoarquivo.txt’, ’w’)

>>> f.write(’este e um arquivo de teste’)

E entao, precisamos dizer ao Python que nos terminamos e nao queremos maisescrever no arquivo — nos usamos a funcao close para isso.

>>> f = open(’novoarquivo.txt’, ’w’)

>>> f.write(’este e um arquivo de teste’)

>>> f.close()

Se voce abrir o arquivo usando o seu editor de texto favorito, vera que elecontem o texto: “este e um arquivo de teste”. Ou melhor ainda, nos podemos usaro Python para ler:

>>> f = open(’novoarquivo.txt’)

>>> print(f.read())

este e um arquivo de teste

Capıtulo 8

Mais e mais tartarugas

Voltando ao modulo turtle, que comecamos a ver no Capıtulo 3. Lembre-se que paraconfigurar a tela para a tartaruga desenhar, nos precisamos importar o modulo ecriar um objeto ‘Pen’:

>>> import turtle

>>> t = turtle.Pen()

Agora nos podemos usar algumas funcoes basicas para mover a tartaruga pelatela e desenhar algumas formas simples, mas seria interessante usar algo que nosja abordamos anteriormente. Por exemplo, o codigo que nos usamos para criar oquadrado, foi:

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

Nos podemos reescrever esse codigo, usando um laco ‘for’:

>>> t.reset()

>>> for x in range(1, 5):

... t.forward(50)

... t.left(90)

...

Que de fato e muito menos para se digitar, mas para algo ainda mais interes-sante, tente o seguinte:

65

66 CAPITULO 8. MAIS E MAIS TARTARUGAS

Figura 8.1: A tartaruga desenhando uma estrela de 8 pontas.

>>> t.reset()

>>> for x in range(1, 9):

... t.forward(100)

... t.left(225)

...

Este codigo produz uma estrela de 8 pontas, como exibido na figura 8.1 (atartaruga vira 225 graus, cada vez que anda 100 pixels para frente).

Em um angulo diferente (175 graus), e um laco mais longo (37 vezes), nos podemosfazer uma estrela com ainda mais pontas (como visto na figura 8.2):

>>> t.reset()

>>> for x in range(1, 38):

... t.forward(100)

... t.left(175)

...

Ou, que tal o seguinte codigo, que produz uma estrela tipo espiral, na figura 8.3.

>>> for x in range(1, 20):

... t.forward(100)

... t.left(95)

...

67

Figura 8.2: Uma estrela com muito mais pontas.

Figura 8.3: Uma estrela tipo espiral.

68 CAPITULO 8. MAIS E MAIS TARTARUGAS

Figura 8.4: Uma estrela de 9 pontas.

Aqui esta algo um pouco mais complicado:

>>> t.reset()

>>> for x in range(1, 19):

... t.forward(100)

... if x % 2 == 0:

... t.left(175)

... else:

... t.left(225)

...

No codigo acima, nos verificamos se a variavel x contem um numero par. Parafazer isso, nos usamos um operador chamado modulo (%), na expressao: x % 2 ==0.

x % 2 e igual a zero, se o numero na variavel x puder ser dividido por dois,sem sobrar nada — se isso nao faz muito sentido, nao se preocupe, apenas lembre deusar ‘x % 2 == 0’ para verificar se o numero contido em uma variavel e um numeropar. O resultado desse codigo, e uma estrela de 9 pontas, como na figura 8.4.

Voce nao precisa apenas desenhar estrelas e simples formas geometricas. Usandouma combinacao de chamadas de funcao, a sua tartaruga pode desenhar muitas coi-sas diferentes. Por exemplo:

8.1. COLORINDO 69

t.color(1, 0, 0)

t.begin_fill()

t.forward(100)

t.left(90)

t.forward(20)

t.left(90)

t.forward(20)

t.right(90)

t.forward(20)

t.left(90)

t.forward(60)

t.left(90)

t.forward(20)

t.right(90)

t.forward(20)

t.left(90)

t.forward(20)

t.end_fill()

t.color(0, 0, 0)

t.up()

t.forward(10)

t.down()

t.begin_fill()

t.circle(10)

t.end_fill()

t.setheading(0)

t.up()

t.forward(90)

t.right(90)

t.forward(10)

t.setheading(0)

t.begin_fill()

t.down()

t.circle(10)

t.end_fill()

Que e uma forma beeeem longa de se desenhar o carrinho feio e com visual bemprimitivo, da figura 8.5. Mas demonstra varias outras funcoes da tartaruga: color,para alterar a cor da caneta usada pela tartaruga, fill, que preenche uma area datela; e circle, para desenhar um cırculo com um determinado tamanho.

8.1 Colorindo

A funcao color, aceita 3 parametros. O primeiro parametro e o valor para o vermelho,o segundo e o valor para o verde e o ultimo e o valor para o azul.

70 CAPITULO 8. MAIS E MAIS TARTARUGAS

Figura 8.5: A tartaruga e pessima em desenhar carros!

Por que vermelho, verde e azul?

Se voce ja brincou com diferentes cores de tinta, voce provavelmente ja sabeparte da resposta para essa questao. Quando voce mistura duas cores diferentes, voceconsegue outra cor1. Quando voce mistura azul e vermelho, voce consegue roxo. . .e quando voce mistura varias cores, normalmente voce consegue um marrom corde lama. Em um computador, voce pode misturar varias cores, da mesma forma— coloca vermelho e verde juntos para conseguir amarelo — exceto que com umcomputador, nos estamos combinando cores de luz, nao cores de tinta.

Mesmo que nao estejamos usando tinta, por um momento, pense em 3 po-tes grandes de tinta. Um vermelho, um verde e um azul. Os potes estao cheios,entao nos vamos dizer que um pote cheio tem o valor de 1 (ou 100%). Nos entaoderramamos todo o pote vermelho (100%) em um tanque, seguido de toda a tintaverde (novamente, 100%). Depois de misturar um pouco, nos teremos a cor amarela.Vamos desenhar um cırculo amarelo usando a tartaruga:

1Na realidade, as tres cores primarias sao o vermelho, o amarelo e o azul e nao verme-lho/verde/azul (RGB – Red/Green/Blue), no computador.

8.1. COLORINDO 71

>>> t.color(1, 1, 0)

>>> t.begin_fill()

>>> t.circle(50)

>>> t.end_fill()

Entao acima, nos chamamos a funcao ‘color’ com 100% de vermelho (red),100% de verde (green) e 0% de azul (blue) – em outras palavras, 1, 1 e 0. Parafacilitar o teste de outras cores, vamos transformar isso em uma funcao:

>>> def meucirculo(red, green, blue):

... t.color(red, green, blue)

... t.begin_fill()

... t.circle(50)

... t.end_fill()

...

Nos podemos desenhar um cırculo verde brilhante, usando toda a tinta verde (1 ou100%):

>>> mycircle(0, 1, 0)

E nos podemos desenhar um cırculo verde escuro, usando metade de toda a tintaverde (0.5 ou 50%):

>>> meucirculo(0, 0.5, 0)

Aqui e onde pensar sobre tinta nao faz muito sentido mais. No mundo real,se voce tiver um pote de tinta verde, nao importa o quanto voce use, voce sempretera o mesmo tom. Com cores em um computador, devido a estarmos brincandocom luzes, usando menos de uma cor geralmente resultara em uma tonalidade maisescura. E o mesmo que voce acender uma tocha durante a noite, voce tera uma luzamarelada — quando a chama e a luz comecarem a diminuir, a cor amarela comecaraa ficar mais e mais escura. Apenas para voce ver, tente desenhar um cırculo comum vermelho completo e um vermelho pela metade (1 e 0.5) e um azul completo eum azul pela metade.

>>> meucirculo(1, 0, 0)

>>> meucirculo(0.5, 0, 0)

>>> meucirculo(0, 0, 1)

>>> meucirculo(0, 0, 0.5)

Diferentes combinacoes de vermelho, verde e azul produzirao uma enorme variedadede cores. Voce tera a cor de ouro, usando 100% do vermelho, 85% do verde e nadado azul:

72 CAPITULO 8. MAIS E MAIS TARTARUGAS

>>> meucirculo(1, 0.85, 0)

Uma cor rosa claro pode ser feita combinando 100% do vermelho, 70% do verde e75% do azul:

>>> meucirculo(1, 0.70, 0.75)

E voce consegue a cor laranja, combinando 100% do vermelho, 65% do verde; e omarrom com 60% do vermelho, 30% do verde e 15% do azul:

>>> meucirculo(1, 0.65, 0)

>>> meucirculo(0.6, 0.3, 0.15)

Nao se esqueca, voce pode limpar a tela usando o t.clear().

8.2 Escuridao

Aqui vai uma pergunta para voce: O que acontece quando voce desliga todas ascores a noite? Fica tudo preto.

A mesma coisa acontece com as cores em um computador. Nenhuma luz e amesma coisa que nenhuma cor. Entao um cırculo com 0 de vermelho, 0 de verde e0 de azul:

>>> meucirculo(0, 0, 0)

Produz o cırculo preto da figura 8.6.

O recıproca e verdadeira; se voce usar 100% do vermelho, 100% do verde e100% do azul, voce tera branco. Use o seguinte codigo e o cırculo preto sumiranovamente:

>>> meucirculo(1, 1, 1)

8.3 Preenchendo coisas

Voce provavelmente ja descobriu que a funcao ‘fill’ e ligada passando o parametro‘1’, entao desligada passando o parametro ‘0’. Quando voce a desliga, a funcao na

8.3. PREENCHENDO COISAS 73

Figura 8.6: Um buraco negro!

realidade preenche a area que voce desenhou — assumindo que voce tenha dese-nhado pelo menos parte de uma forma. Entao nos podemos facilmente desenharum quadrado preenchido, usando o codigo que nos criamos previamente. Primeiro,vamos transforma-lo em uma funcao. Para desenhar um quadrado com a tartaruga,nos fazemos:

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

Entao, em uma funcao nos podemos querer passar o tamanho do quadrado porparametro. Isso torna a funcao um pouco mais flexıvel:

74 CAPITULO 8. MAIS E MAIS TARTARUGAS

>>> def meuquadrado(tamanho):

... t.forward(tamanho)

... t.left(90)

... t.forward(tamanho)

... t.left(90)

... t.forward(tamanho)

... t.left(90)

... t.forward(tamanho)

... t.left(90)

Nos podemos testar a nossa funcao, chamando:

>>> meuquadrado(50)

Ja e um comeco, mas nao e algo perfeito. Se voce olhar para o codigo acima,voce vera um padrao. Nos repetimos: forward(tamanho) e left(90) 4 vezes. Que eum disperdıcio de digitacao. Nos podemos usar um laco ‘for’ para fazer isso por nos(muito parecido com o que ja fizemos anteriormente):

>>> def meuquadrado(tamanho):

... for x in range(0, 4):

... t.forward(tamanho)

... t.left(90)

Isso e uma versao bem melhor que a anterior. Voce pode testar a funcao comdiferentes tamanhos:

>>> t.reset()

>>> meuquadrado(25)

>>> meuquadrado(50)

>>> meuquadrado(75)

>>> meuquadrado(100)

>>> meuquadrado(125)

E a tartaruga devera desenhar algo como a figura 8.7.

Agora, nos podemos tentar um quadrado preenchido. Primeiro de tudo, vamosapagar a tela novamente:

>>> t.reset()

Entao, ativando o preenchimento e chamando a funcao meuquadrado novamente:

8.3. PREENCHENDO COISAS 75

Figura 8.7: Varios quadrados.

>>> t.begin_fill()

>>> meuquadrado(50)

Voce continuara vendo um quadrado vazio, ate desativar o preenchimento:

>>> t.end_fill()

Que produz algo parecido com o quadrado da figura 8.8.

Que tal se mudarmos a funcao, para que pudessemos desenhar tanto umquadrado preenchido como um sem preenchimento? Nos precisamos de um outroparametro, e um codigo um pouquinho mais complicado para fazer isso:

>>> def meuquadrado(tamanho, preenchido):

... if preenchido == True:

... t.begin_fill()

... for x in range(0, 4):

... t.forward(tamanho)

... t.left(90)

... if preenchido == True:

... t.end_fill()

...

As primeiras duas linhas, verificam se o valor do parametro ‘preenchido’ e iguala ‘True’. Se for, entao ativa o preenchimento. Entao nos fazemos um laco 4 vezes,

76 CAPITULO 8. MAIS E MAIS TARTARUGAS

Figura 8.8: Um quadrado preto.

para desenhar os quatro lados do quadrado e entao, apos isso, verificamos novamentese o parametro ‘preenchido’ e igual a ‘True’, se sim, desativamos o preenchimento.Agora voce pode desenhar um quadrado preenchido, chamando:

>>> mysquare(50, True)

E um quadrado nao preenchido, chamando:

>>> meuquadrado(150, False)

Que faz com que a nossa tartaruga desenhe a imagem da figura 8.9. . . . . .que agoraque eu vi, parece um olho quadrado estranho.

Voce pode desenhar diversas formas e preenche-las com cores. Vamos tornar aestrela que nos criamos anteriormente, em uma funcao. O codigo original era maisou menos assim:

8.3. PREENCHENDO COISAS 77

Figura 8.9: Um olho quadrado.

>>> for x in range(1, 19):

... t.forward(100)

... if x % 2 == 0:

... t.left(175)

... else:

... t.left(225)

...

Nos podemos usar as mesmas expressoes ‘if’ da funcao ‘meuquadrado’ e passaros parametros ‘tamanho’ e ‘preenchido’:

1. >>> def minhaestrela(tamanho, preenchido):

2. ... if preenchido:

3. ... t.begin_fill()

4. ... for x in range(1, 19):

5. ... t.forward(tamanho)

6. ... if x % 2 == 0:

7. ... t.left(175)

8. ... else:

9. ... t.left(225)

10. ... if preenchido:

11. ... t.end_fill()

Nas linhas 2 e 3, nos ativamos o preenchimento, dependendo do valor doparametro preenchido (ativado, caso seja ‘True’ ou desativado, caso seja ‘False’).

78 CAPITULO 8. MAIS E MAIS TARTARUGAS

Figura 8.10: Uma estrela cor de ouro.

E nas linhas 10 e 11 nos desativamos, caso o preenchimento esteja ativado. A ou-tra diferenca nessa funcao, e que nos passamos o tamanho da estrela atraves doparametro ‘tamanho’ e usamos esse valor na linha 5.

Agora, vamos definir a cor para ouro (lembre-se que, para conseguirmos a corouro, precisamos de 100% de vermelho, 85% de verde e nada de azul) e entao chamara funcao:

>>> t.color(1, 0.85, 0)

>>> minhaestrela(120, True)

A tartaruga deve desenhar a estrela cor de ouro da figura 8.10. Nos podemos con-tornar a estrela trocando as cores novamente (dessa vez para preto) e redesenhandoa estrela com o preenchimento desativado:

>>> t.color(0,0,0)

>>> minhaestrela(120, False)

Portanto, a estrela agora parece com a da figura 8.11.

8.4. COISAS PARA TENTAR 79

Figura 8.11: Uma estrela contornada.

8.4 Coisas para tentar

Neste capıtulo, nos aprendemos sobre o modulo ‘turtle’, usando-o para desenharalgumas formas geometricas basicas. Nos usamos funcoes, para podermos reutilizaros nossos codigos e facilitar na hora de desenhar formas com diferentes cores.

Exercıcio 1

Nos desenhamos estrelas, quadrados e retangulos. Que tal um octogono? Umoctogono tem 8 lados. (Dica: tente virando 45 graus).

Exercıcio 2

Agora, converta o codigo que desenha um octogono em uma funcao, que o preencheracom uma cor.

80 CAPITULO 8. MAIS E MAIS TARTARUGAS

Capıtulo 9

Um pouco sobre graficos

O problema de usar a tartaruga para desenhar, e. . . que. . .. . . as tartarugas. . .. . .. . .sao. . .. . .. . .. . .muito. . .. . .. . .. . . lentas.

Mesmo quando uma tartaruga esta no seu maximo de velocidade, ela aindanao esta indo rapido. Para tartarugas, isso nao e um problema — eles tem tempoa perder —- mas quando estamos falando de graficos de computador, isso e umproblema. Se voce tem um Nintendo DS, um Gameboy Advance ou jogos no seucomputador, pense por um momento sobre os graficos (que voce ve na tela). Existemdiversas formas de exibicao de graficos que sao usadas em jogos: existem os jogos2d (ou de 2 dimensoes), onde as imagens sao planas e os personagens geralmente semovem para cima, para baixo, esquerda e direita — muitoc omum em videogamesde mao — e finalmente, os jogos 3d, onde as figuras desenhadas na tela tentandoimitar a realidade.

Todos estes tipos de graficos tem uma coisa em comum — eles precisam serdesenhados muito rapidamente. Voce ja tentou fazer a sua propria animacao? Ondevoce pega um bloco de folhas de papel e no canto, na parte debaixo da primeirapagina, e na proxima folha, voce desenha a figura um pouco mais para frente e porassim em diante. Quando voce terminar, voce folheia as paginas e se voce folhearrapido o suficiente, vai parecer que a figura esta realmente se movendo. E assim quebasicamente todas as animacoes sao feitas — se forem os desenhos que voce assistena tv ou os jogos que voce joga no videogame ou computador. Voce desenha algoe depois desenha a mesma coisa novamente, com pequenas mudancas, para dar ailusao de movimento. Que e o motivo pelo qual a tartaruga nao e tao boa fazendograficos. Para fazer uma imagem parecer que esta se movendo, voce precisa desenharcada ‘frame’ (quadro) da animacao muito rapidamente.

Graficos tridimensionais sao feitos de uma maneira bem diferente dos graficosbidimensionais, mas ainda assim, a ideia basica e a mesma. No momento em que

81

82 CAPITULO 9. UM POUCO SOBRE GRAFICOS

a sua tartaruga terminou de desenhar uma pequena porcao de uma figura, ja seriahora de virar a pagina e comecar a desenhar a proxima. . .

9.1 Desenhar rapidamente

Cada linguagem de programacao tem um metodo diferente de desenhar na tela.Alguns metodos sao mais rapidos, enquanto outros sao mais lentos, o que significaque os programadores que criam jogos tem que ser cuidadosos na hora de escolhera linguagem que vao usar para trabalhar.

9.1. DESENHAR RAPIDAMENTE 83

Assim como o Python tambem possui diversas formas diferentes de fazergraficos (incluindo a tartaruga, que nos ja usamos), mas os melhores metodos (doponto de vista dos graficos) normalmente sao modulos e bibliotecas que sao inclui-das no Python por padrao. Voce provavelmente tera que programar por alguns anospara poder instalar e usar algumas dessas bibliotecas complexas.

Felizmente, existe um modulo que vem com o Python, que podemos usar parafazer graficos simples (um pouco mais rapido que a tartaruga). Talvez rapida osuficiente para a chamarmos de Tartaruga Rapida para Desenhar.

O modulo se chama tkinter (um nome estrenho, que vem de ‘Tk interface’)e pode ser usada para criar aplicacoes completas (voce pode ate mesmo criar umEditor de Textos se quiser), assim como apenas desenhar. Nos podemos criar umaaplicacao simples com um botao, usando o seguinte codigo:

1. >>> from tkinter import Tk, Button

2. >>> tk = Tk()

3. >>> btn = Button(tk, text="clique aqui")

4. >>> btn.pack()

Na linha 1, nos importamos o que vamos usar do modulo Tk — o mais usadoe o Tk, que cria uma janela basica que podemos adicionar algumas coisas. Elaaparecera na tela assim que voce digitar a linha 2. Na linha 3, nos criamos um novo

84 CAPITULO 9. UM POUCO SOBRE GRAFICOS

botao (‘Button’) e o associamos a variavel btn. O botao e criado passando o objetotk como parametro, junto de um parametro nomeado com as palavras ‘clique aqui’.

Parametros Nomeados

Essa e a primeira vez que nos usamos os ‘parametros nomea-dos’. Eles funcionam da mesma forma que os parametros nor-mais, exceto que eles podem aparecer em qualquer ordem, entaonos devemos nomea-los.Por exemplo, suponha que nos tivessemos uma funcao ‘retan-gulo’ que recebe dois parametros: largura e altura. Normal-mente, nos deverıamos chamar essa funcao usando algo do tiporetangulo(200, 100), que significa que nos queremos um retan-gulo de 200 pixels de largura, por 100 de altura. Mas e seos parametros pudessem aparecer em qualquer ordem? Comosaberıamos qual e a largura e qual e a altura?Nesse caso, seria melhor dizer exatamente o que e o que. Porexemplo: retangulo(altura=100, largura=200). Na realidade,a ideia dos parametros nomeados e um pouco mais complicadado que isso e pode ser usada de diversas maneiras, para tornaras funcoes mais flexıveis — mas isso e assunto para um livromais aprofundado do que essa introducao a programacao.

A ultima linha (4) e uma instrucao que diz ao botao para se desenhar. Nesseponto, a janela criada na linha 2 ira encolher para o tamanho de um pequeno botao,contendo as palavras ‘clique aqui’. Algo parecido com isso:

O botao nao faz nada demais, mas voce pode ao menos clicar nele. Nos pode-mos fazer com que ele faca algo, modificando um pouco o exemplo anterior (assegureque a janela que criamos anteriormente esta fechada). Primeiro, nos criamos umafuncao que imprime um texto:

>>> def ola():

... print(’ola!’)

Entao, modificamos o nosso exemplo para usar a funcao:

9.2. DESENHANDO ALGO SIMPLES 85

>>> from tkinter import *

>>> tk = Tk()

>>> btn = Button(tk, text="clique aqui", command=ola)

>>> btn.pack()

O parametro nomeado ‘command’ diz que nos queremos acionar a funcao ola,quando o botao for clicado. Logo, se voce clicar no botao, voce vera a mensagem“ola!” no terminal — impressa cada vez que voce clicar no botao.

9.2 Desenhando algo simples

Botoes nao ajudam muito quando o que voce quer e desenhar algo na tela — entaonos precisamos usar um componente diferente: um Canvas (tela). Quando criamosum ‘canvas’, diferente do botao (que recebe os parametros ‘texto’ e ‘comando’), nosprecisamos passar a largura e a altura (em pixels), da tela. Tirando isso, o codigo esimilar ao do botao:

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=500, height=500)

>>> canvas.pack()

Similar ao exemplo do botao, uma janela aparecera quando voce digitar a linha2. E na linha 4, a janela aumentara seu tamanho. Nos podemos desenhar uma linhana tela, usando pixels como coordenadas. Coordenadas sao as posicoes dos pixelsem uma tela. Na tela (ou ‘canvas’) do Tk, as coordenadas dizem qual a largura (daesquerda para a direita) e a altura (do topo ate embaixo). A parte do ‘da esquerdapara a direita’ e chamada de eixo-x, enquanto o ‘do topo ate embaixo’ e chamadode eixo-y.

Como a tela tem 500 pixels de largura e 500 de altura, as coordenadas do cantoinferior direito da tela sao 500, 500. Entao, a linha na figura 9.1 pode ser desenhadainiciando das coordenadas 0, 0 e terminadas nas coordenadas 500, 500.:

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=500, height=500)

>>> canvas.pack()

>>> canvas.create_line(0, 0, 500, 500)

Agora, para fazer a mesma coisa com a tartaruga, precisariamos usar o seguintecodigo:

86 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.1: Eixo-x e eixo-y da tela.

>>> import turtle

>>> turtle.setup(width=500, height=500)

>>> t = turtle.Pen()

>>> t.up()

>>> t.goto(-250, 250)

>>> t.down()

>>> t.goto(500, -500)

Assim vemos que o codigo usando o tkinter ja e uma melhoria, menor e menoscomplicado. Existe um grande numero de metodos disponıveis no objeto Canvas,alguns que nao nos serao tao uteis, mas veremos alguns exemplos interessantes.

9.3 Desenhando Caixas

Com a tartaruga, nos desenhamos uma caixa movendo para frente, virando, parafrente, virando novamente e por assim em diante. Eventualmente voce pode desenharum retangulo ou um quadrado apenas mudando o quanto “para frente” voce quermover. Com o tkinter, desenhar um quadrado ou um retangulo e bem mais simples— voce apenas precisa saber as coordenadas dos cantos.

9.3. DESENHANDO CAIXAS 87

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_rectangle(10, 10, 50, 50)

1

No exemplo acima, nos criamos uma tela com 400 pixels de largura, 400 pixelsde altura e entao nos desenhamos um quadrado no canto superior esquerdo (10pixels da esquerda para a direita e 10 pixels do topo para baixo). Voce deve estarse perguntando: que numero e aquele que apareceu apos digitar o create rectangle?Isso e um numero de identificacao para a forma que nos desenhamos (seja uma linha,um quadrado ou um cırculo). Nos falaremos desse numero mais tarde.

Portanto, os parametros passados para o create rectangle sao: posicao do cantosuperior esquerdo, posicao do canto inferior esquerdo, posicao do canto superiordireito e posicao do canto inferior direito. Para nao termos que digitar tudo issotoda vez, vamos nos referir a essas posicoes como x1, y2 e x2, y2. Nos podemosdesenhar um retangulo apenas usando um numero maior no x2:

>>> canvas.create_rectangle(100, 100, 300, 50)

Ou usando um numero maior no y2:

>>> canvas.create_rectangle(100, 200, 150, 350)

O ultimo retangulo esta basicamente dizendo: va 100 pixels pela tela (a partirdo canto superior esquerdo), 200 pixels para baixo e entao desenhe uma caixa, saindodo pixel 150 ate o 350. Nesse momento, voce tera algo como a figura 9.2 na sua tela.

Vamos tentar preencher o canvas com retangulos de diferentes tamanhos. Nospodemos fazer isso usando o modulo random. Primeiro, importe o modulo ‘random’:

>>> import random

Entao em seguida, nos podemos criar uma funcao que usa um numero aleatoriopara as coordenadas do canto superior e inferior. A funcao que vamos usar chamarandrange:

88 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.2: caixas no tkinter.

>>> def retangulo_aleatorio(largura, altura):

... x1 = random.randrange(largura)

... y1 = random.randrange(altura)

... x2 = random.randrange(x1 + random.randrange(largura))

... y2 = random.randrange(y1 + random.randrange(altura))

... canvas.create_rectangle(x1, y1, x2, y2)

Nas primeiras duas linhas, nos definimos as variaveis com as coordenadas doscantos superior e inferior esquerdo do retangulo, usando o randrange, passando alargura e a altura. A funcao randrange, recebe um numero como argumento (veja oApendice C para mais detalhes do randrange) — entao randrange(10) retorna umnumero entre 0 e 9, randrange(100), retorna um numero entre 0 e 99 e por assim emdiante. As proximas duas linhas, definem variaveis com as coordenadas dos cantossuperior e inferior direito do retangulo (ou quadrado!) — nos usamos as coordenadasdo canto superior e inferior esquerdo (x1 e y1) para somar a um numero aleatorio nasvariaveis e finalmente chamamos a funcao create rectangle usando essas variaveis.Voce pode tentar usar a funcao retangulo aleatorio, passando a largura e a alturada tela (canvas) que voce criou:

9.3. DESENHANDO CAIXAS 89

Figura 9.3: Uma bagunca de retangulos.

>>> retangulo_aleatorio(400, 400)

Ou, para preencher a tela, que tal fazermos um laco para chamar essa funcao variasvezes:

>>> for x in range(0, 100):

... retangulo_aleatorio(400, 400)

Que faz um pouco de bagunca (figura 9.3, mas que e interessante.

Lembra-se no ultimo capıtulo, que nos definimos cores para a tartaruga dese-nhar, usando as porcentagens de 3 cores: vermelho, verde e azul? Com o tkinter vocepode fazer o mesmo, mas infelizmente, e um pouco mais complicado que o moduloturtle. Primeiramente, vamos alterar a funcao retangulo aleatorio para aceitar umacor de preenchimento como parametro:

90 CAPITULO 9. UM POUCO SOBRE GRAFICOS

>>> def retangulo_aleatorio(largura, altura, cor_preencher):

... x1 = random.randrange(largura)

... y1 = random.randrange(altura)

... x2 = random.randrange(x1 + random.randrange(largura))

... y2 = random.randrange(y1 + random.randrange(altura))

... canvas.create_rectangle(x1, y1, x2, y2, fill=preencher_cor)

A funcao create rectangle da tela, pode receber um parametro ‘fill’ que defineuma cor para preenchimento. Nos podemos passa-la pela funcao. Tente o seguinte:

>>> retangulo_aleatorio(400, 400, ’green’)

>>> retangulo_aleatorio(400, 400, ’red’)

>>> retangulo_aleatorio(400, 400, ’blue’)

>>> retangulo_aleatorio(400, 400, ’orange’)

>>> retangulo_aleatorio(400, 400, ’yellow’)

>>> retangulo_aleatorio(400, 400, ’pink’)

>>> retangulo_aleatorio(400, 400, ’purple’)

>>> retangulo_aleatorio(400, 400, ’violet’)

>>> retangulo_aleatorio(400, 400, ’magenta’)

>>> retangulo_aleatorio(400, 400, ’cyan’)

Alguns, talvez todas, as cores funcionarao pelo nome. Mas algumas delas iraoresultar uma mensagem de erro (depende se voce estiver no Windows, no Mac ou noLinux). Bem facil ate agora. E se nos quisermos uma cor ouro? No modulo turtle,nos criamos a cor ouro usando 100% do vermelho, 85% do verde e nada de azul. Notkinter, nos podemos fazer a cor ouro usando:

>>> retangulo_aleatorio(400, 400, ’#ffd800’)

Que, apesar de tudo, e uma forma bem estranha de criar uma cor. ‘ffd800’ eo que chamamos de hexadecimal, e e outra maneira de representar numeros. Expli-car como funcionam os numeros hexadecimais nos levaria a escrever mais algumaspaginas, entao para economiza-las, vamos usar a seguinte funcao para criar coresem hexadecimal:

>>> def corhex(vermelho, verde, azul):

... vermelho = 255 * (vermelho / 100.0)

... verde = 255 * (verde / 100.0)

... azul = 255 * (azul / 100.0)

... return ’#%02x%02x%02x’ % (vermelho, verde, azul)

Chamando ‘corhex’ com 100% de vermelho, 85% de verde e 0% de azul, resul-tara no codigo hexadecimal para a cor ouro, que nos queremos:

9.4. DESENHANDO ARCOS 91

Figura 9.4: Um retangulo rosa.

>>> print(corhex(100, 85, 0))

#ffd800

Voce pode criar um rosa choque, usando 98% de vermelho, 1% de verde e 77% deazul:

>>> print(corhex(98, 1, 77))

#f902c4

E voce pode usar isso, junto com a funcao retangulo aleatorio que nos criamos:

>>> retangulo_aleatorio(400, 400, hexcolor(98, 1, 77))

9.4 Desenhando Arcos

Um arco e uma parte de um cırculo, mas para desenhar um com o tkinter, voceprecisa desenhar um retangulo. Nao faz muito sentido, ate que voce tente desenharum retangulo e entao desenhar um arco dentro dele (veja na figura 9.5). O codigopara desenhar esse arco e mais ou menos assim:

92 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.5: Um arco dentro de um retangulo.

canvas.create_arc(10, 10, 200, 100, extent=180, style=ARC)

Isso posiciona o canto superior esquerdo do retangulo nas coordenadas 10,10 (10 para o lado e 10 pixels para baixo), e o canto inferior direito do retangulonas coordenadas 200, 100 (200 pixels para o lado e 100 para baixo). O proximoparametro (um parametro nomeado), ‘extent’ e usado para especificar os graus doangulo do arco. Se voce nao sabe nada sobre graus em um cırculo (ou arco), entaoapenas se lembre que, quando falamos em um cırculo, 180 graus formam a metadede um cırculo (ou arco), 359 graus formam um cırculo completo, 90 graus formam1/4 de um cırculo e 0 graus formam. . . bem, nada. Aqui esta um codigo que gera ummonte de arcos diferentes, entao voce pode perceber as diferencas basicas quandousamos graus diferentes (voce pode ver os exemplos na figura 9.6):

>>> canvas.create_arc(10, 10, 200, 80, extent=45, style=ARC)

>>> canvas.create_arc(10, 80, 200, 160, extent=90, style=ARC)

>>> canvas.create_arc(10, 160, 200, 240, extent=135, style=ARC)

>>> canvas.create_arc(10, 240, 200, 320, extent=180, style=ARC)

>>> canvas.create_arc(10, 320, 200, 400, extent=359, style=ARC)

9.5 Desenhos Ovais

Apesar de o ultimo comando acima reproduzir um desenho oval, voce tambem podeusar a funcao create oval. Da mesma maneira que desenhar arcos, uma forma ovale desenhada dentro dos limites de um retangulo. Por exemplo, o seguinte codigo:

9.5. DESENHOS OVAIS 93

Figura 9.6: Arcos em diferentes graus.

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400,height=400)

>>> canvas.pack()

>>> canvas.create_oval(1, 1, 300, 200)

Este exemplo desenha uma forma oval dentro do quadrado (imaginario) dese-nhado nas posicoes 1, 1 e 300, 200. Se nos desenharmos um retangulo vermelho comas mesmas coordenadas, veremos que a forma oval e desenhada dentro (figura 9.7):

>>> canvas.create_rectangle(1, 1, 300, 200, outline="#ff0000")

Para desenhar um cırculo, ao inves de uma forma oval, o retangulo imaginario deveser um quadrado (que produz o cırculo da figura 9.9):

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_oval(1, 1, 300, 300)

94 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.7: O contorno da forma oval.

Figura 9.8: O contorno da forma oval dentro de um retangulo.

9.6. DESENHANDO POLIGONOS 95

Figura 9.9: Um cırculo simples.

9.6 Desenhando Poligonos

Um polıgono e uma forma com 3 ou mais lados. Triangulos, quadrados, retangulos,pentagonos, hexagonos etc sao todos exemplos de polıgonos. Alem dessas formasmais comuns, voce tambem pode criar polıgonos irregulares. Por exemplo, paradesenhar um triangulo, voce precisa especificar 3 pares de coordenadas para cadaponto do triangulo (criando o triangulo da figura 9.10):

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_polygon(10, 10, 100, 10, 100, 50, fill="", outline="black")

Nos podemos adicionar um polıgono irregular, usando o seguinte codigo: Afigura 9.11 exibe o triangulo e o polıgono irregular.

>>> canvas.create_polygon(200, 10, 240, 30, 120, 100, 140, 120, fill="", outline="black")

96 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.10: Um triangulo simples.

Figura 9.11: Um triangulo simples e um polıgono e irregular.

9.7. DESENHANDO IMAGENS 97

9.7 Desenhando Imagens

Voce pode desenhar uma imagem na tela, usando o tkinter, primeiramente carre-gando a imagem e entao usando a funcao create image do objeto canvas. Isso pareceum pouco ilogico, mas funciona assim:

1. >>> from tkinter import *

2. >>> tk = Tk()

3. >>> canvas = Canvas(tk, width=400, height=400)

4. >>> canvas.pack()

5. >>> imagem = PhotoImage(file=’teste.gif’)

6. >>> canvas.create_image(0, 0, image=imagem, anchor=NW)

Nas linha 1 a 4, nos configuramos a tela da mesma forma que antes. Na linha5, a imagem e carregada na variavel imagem. E importante que a imagem que vocequer carregar esteja no mesmo diretorio que voce iniciou o terminal do Python. Vocepode ver que diretorio e esse, importando o modulo os e usando a funcao getcwd():

>>> import os

>>> print(os.getcwd())

Isso exibira algo como ‘c:Python30’.

Copie sua imagem para esse diretorio e entao carregue usando a funcao ‘Pho-toImage‘ (assim como na linha 5). Voce pode entao usar a funcao create image paraexibir a imagem (linha 6). Se voce fez tudo certo, voce vera algo como na figura 9.12.

O PhotoImage pode carregar arquivos com as extensoes .gif, .ppm e .pgm. Sevoce quiser carregar outros tipos de imagem (existem diversas formas diferentes dearquivos de imagem — por exemplo, as cameras digitais normalmente usam .jpg),entao voce precisara usar uma extensao que adiciona esse capacidade ao Python. A“Python Imaging Library” (PIL)1 habilita todos os tipos de imagem, assim comoexpandir, encolher e outras formas de manipular imagens. Porem, instalar e usa-laesta fora do escopo deste livro.

9.8 Animacao Basica

Ate agora, nos vimos como fazer desenhos estaticos — imagens que nao se movem.Que tal uma animacao? Animacoes nao sao o forte do Tk, mas voce pode fazer

1A biblioteca PIL pode ser encontrada em http://www.pythonware.com/products/pil/index.htm

98 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.12: Uma foto.

o basico. Por exemplo, nos podemos criar um triangulo preenchido e entao faze-lomover pela tela, usando o seguinte codigo:

1. >>> import time

2. >>> from tkinter import *

3. >>> tk = Tk()

4. >>> canvas = Canvas(tk, width=400, height=400)

5. >>> canvas.pack()

6. >>> canvas.create_polygon(10, 10, 10, 60, 50, 35)

7. 1

8. >>> for x in range(0, 60):

9. ... canvas.move(1, 5, 0)

10. ... tk.update()

11. ... time.sleep(0.05)

No momento que voce pressionar a tecla Enter, apos digitar a ultima linha,o triangulo comecara a se mover pela tela (voce pode ve-lo atravessando a tela, nafigura 9.13).

Como funciona?

Da linha 1 ate a 5, nos ja vimos — e apenas a configuracao basica para exibira tela — e na linha 6, nos criamos o triangulo (usando a funcao create polygon) e

9.8. ANIMACAO BASICA 99

Figura 9.13: O triangulo movendo-se pela tela.

na linha 6, voce vera o identificador (o numero 1) que e retornado pela funcao. Nalinha 8, nos fizemos um simples laco ‘for’, contando de 0 a 59.

O bloco das linhas (9 a 11) do codigo, e o que faz o triangulo mover. A funcaomove do objeto canvas, ira mover qualquer objeto desenhado, apenas adicionandoos valores das coordenadas x e y. Por exemplo, na linha 8, nos movemos o objeto1 (o identificador do triangulo), 5 pixels para o lado e 0 pixels para baixo. Se nosquisessemos move-lo de volta, nos usarıamos canvas.move1, -5, 0.

A funcao update do objeto Tk, atualiza a tela, caso contrario, o tkinter espe-raria ate o laco terminar para mover o triangulo, o que significa que voce nao o veriamovendo. Finalmente, a linha 11 pede ao Python para ”dormir”(sleep) por 1/20 deum segundo (0.05s), antes de continuar. Nos podemos alterar o codigo para que otriangulo mova pela tela, na diagonal, chamando move(1, 5, 5). Primeiro, feche atela (clicando no X da janela), entao tente esse codigo:

100 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Figura 9.14: O triangulo descendo pela tela.

>>> import time

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_polygon(10, 10, 10, 60, 50, 35)

1

>>> for x in range(0, 60):

... canvas.move(1, 5, 5)

... tk.update()

... time.sleep(0.05)

...

A figura 9.14 mostra o triangulo descendo pela tela. Mova o triangulo peladiagonal, de volta a sua posicao inicial, usando -5, -5:

>>> import time

>>> for x in range(0, 60):

... canvas.move(1, -5, -5)

... tk.update()

... time.sleep(0.05)

9.9. REAGINDO A EVENTOS. . . 101

9.9 Reagindo a eventos. . .

Nos tambem podemos fazer o triangulo reagir quando alguem aperta uma tecla,usando o que chamamos de ligacao de eventos. Eventos sao coisas que ocorremenquanto o programa esta rodando, por exemplo quando alguem move o mouse,aperta uma tecla ou fecha uma janela. Voce pode configurar o Tk para monitoraralguns desses eventos e fazer algo quando ocorrerem. Para comecar a tratar eventos,nos precisamos iniciar criando uma funcao. Supondo que queremos que o triangulomova ao apertarmos a tecla Enter, nos precisamos definir uma funcao para mover otriangulo:

>>> def movetriangulo(evento):

... canvas.move(1, 5, 0)

The function needs to have a single parameter (event), which is used by Tk tosend information to the function about what has happened. We then tell Tk thatthis function should be used for a particular event, using the bind all function on thecanvas. The full code looks like this: A funcao precisa receber um unico parametro(evento), que sera usado pelo Tk para enviar informacoes a funcao sobre o que estaacontecendo. Nos entao dizemos ao Tk, que essa funcao devera ser usada para umevento em particular, usando a funcao bind all, do canvas. O codigo completo ficaassim:

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_polygon(10, 10, 10, 60, 50, 35)

>>> def movetriangulo(evento):

... canvas.move(1, 5, 0)

...

>>> canvas.bind_all(’<KeyPress-Return>’, movetriangulo)

O primeiro parametro da funcao bind all, descreve o evento que nos queremosque o Tk fique de olho. Neste caso, e o evento ¡KeyPress-Return¿ (que e pressionara tecla enter). Nos dizemos ao Tk que a funcao movetriangulo devera ser chamadaquando ocorrer esse evento. Voce vera se rodar o codigo, clicar na tela do Tk como mouse e entao apertar a tecla Enter do seu teclado.

Que tal mudar a direcao do triangulo, dependendo da tecla que voce pressionar,como por exemplo as setas? Primeiro de tudo, nos precisamos mudar a funcao quemove o triangulo, para o seguinte:

102 CAPITULO 9. UM POUCO SOBRE GRAFICOS

>>> def movetriangulo(evento):

... if evento.keysym == ’Up’:

... canvas.move(1, 0, -3)

... elif evento.keysym == ’Down’:

... canvas.move(1, 0, 3)

... elif evento.keysym == ’Left’:

... canvas.move(1, -3, 0)

... else:

... canvas.move(1, 3, 0)

O objeto ‘evento’ que e passado para o movetriangulo, contem varias proprie-dades2. Uma dessas propriedades e a keysym, que e uma string que contem a teclaque foi pressionada. Se o keysym contem a string ‘Up’ (cima), nos chamamos can-vas.move com os parametros (1, 0, -3); se contem ‘Down’ (baixo), nos chamamos comos parametros (1, 0, 3) e por assim em diante. Lembre-se que o primeiro parametroe o numero identificador da forma desenhada na tela, o segundo parametro e o valorpara adicionar a coordenada ‘x’ (horizontal) e o ultimo parametro e o valor a seradicionado a coordenada ‘y’ (vertical). E entao nos dizemos ao Tk que a funcao mo-vetriangulo deve ser usada para controlar os eventos de quatro teclas (cima, baixo,esquerda e direita). Entao, o codigo ficara assim:

2Propriedades sao valores nomeados, que descrevem algo — por exemplo, uma propriedade doceu, e que ele e azul (na maioria das vezes), uma propriedade de um carro e que ele tem rodas.Em termos de programacao, uma propriedade tem um nome e um valor.

9.9. REAGINDO A EVENTOS. . . 103

>>> from tkinter import *

>>> tk = Tk()

>>> canvas = Canvas(tk, width=400, height=400)

>>> canvas.pack()

>>> canvas.create_polygon(10, 10, 10, 60, 50, 35)

1

>>> def movetriangulo(evento):

... if evento.keysym == ’Up’:

... canvas.move(1, 0, -3)

... elif evento.keysym == ’Down’:

... canvas.move(1, 0, 3)

... elif evento.keysym == ’Left’:

... canvas.move(1, -3, 0)

... else:

... canvas.move(1, 3, 0)

...

>>> canvas.bind_all(’<KeyPress-Up>’, movetriangulo)

>>> canvas.bind_all(’<KeyPress-Down>’, movetriangulo)

>>> canvas.bind_all(’<KeyPress-Left>’, movetriangulo)

>>> canvas.bind_all(’<KeyPress-Right>’, movetriangulo)

Com este exemplo, o triangulo agora movera na mesma direcao em que as setasforem pressionadas.

104 CAPITULO 9. UM POUCO SOBRE GRAFICOS

Capıtulo 10

Por onde seguir a partir daqui

Parabens! Voce chegou ate o final.

O que voce aprendeu com esse livro, sao os conceitos basicos que farao voceaprender outras linguagens de programacao mais facilmente. Enquanto o Pythone uma linguagem de programacao brilhante, uma unica linguagem nem sempre e amelhor ferramente para qualquer tarefa. Entao nao tenha medo de aprender outrasformas de programar, se isso lhe interessa.

Por exemplo, se voce se interessa por programacao de jogos, voce talvez possaolhar algo como o BlitzBasic (www.blitzbasic.com), que usa a linguagem de pro-gramacao Basic. Ou talvez o Flash (que e usado em muitos sites para animacao ejogos — por exemplo, o site da Nickelodeon, www.nick.com, usa muito Flash).

Se voc6e for interessado em programacao de jogos em Flash, possivelmente umbom comeco seria o livro ‘Beginning Flash Games Programming for Dummies’, umlivro escrito por Andy Harris, ou uma referencia mais avancada como o ‘The Flash8 Game Developing Handbook’ por Serge Melnikov. Procurando por ‘flash games’na www.amazon.com, voce encontrara diversos livros neste assunto.

Outros livros de programacao de jogos sao: ‘Beginner’s Guide to DarkBASICGame Programming’ por Jonathon S Harbour (tambem usando a linguagem deprogramacao Basic), e ‘Game Programming for Teens’ por Maneesh Sethi (usandoBlitzBasic). Saiba que o BlitzBasic, DarkBasic e Flash (pelo menos as ferramentasde desenvolvimento) sao todas pagas (diferente do Python), entao a sua mae ou paiterao que agir antes de voce poder comecar.

Se voce quer continuar com o Python para programar jogos, existe diversoslugares para olhar: www.pygame.org e o livro ‘Game Programming With Python’por Sean Riley.

Se voce nao esta interessado especificamente em programacao de jogos, mas

105

106 CAPITULO 10. POR ONDE SEGUIR A PARTIR DAQUI

quer aprender um pouco mais sobre Python (mais topicos avancados de programacao),entao de uma olhada no livro ‘Dive into Python’ por Mark Pilgrim (www.diveintopython.org).Tambem existe um bom tutorial gratuito para Python disponıvel em: http://docs.python.org/tut/tutExiste uma pilha de topicos que nos nao cobrimos nessa introducao basica, entao,pelo menos da perspectiva do Python, existe muita coisa para se aprender e brincar.

Boa sorte e desfrute dos seus aprendizados de programacao.

Apendice A

Palavras-chave em Python

Palavras-chave em Python (na verdade, na maioria das linguagens de programacao),sao palavras importantes, usadas pela propria linguagem. Se voce tentar usar algu-mas dessas palavras especiais como nomes de variaveis, ou usa-las de forma incorreta,voce vera um erro estranho (algumas vezes engracado, outras confuso), no termi-nal do Python. Abaixo esta cada uma das palavras-chave em Python e uma brevedescricao.

and

A palavra-chave and e usada para juntar duas expressoes em uma so declaracao(por exemplo, o ‘if’), para dizer que essas duas expressoes precisam ser verdadeiras.Por exemplo:

if idade > 10 and idade < 20

Isso significa que a idade deve ser maior que 10 e menor que 20.

as

A palavra-chave as e usada para dar um outro nome a um modulo importado. Porexemplo, se voce tem um modulo com o seguinte nome:

eu_sou_um_modulo_do_python_nao_muito_util

Seria muito chato ter que digitar o nome do modulo toda vez que voce quisesseusa-lo:

107

108 APENDICE A. PALAVRAS-CHAVE EM PYTHON

>>> import eu_sou_um_modulo_do_python_nao_muito_util

>>>

>>> eu_sou_um_modulo_do_python_nao_muito_util.faca_algo()

Fiz algo

>>> eu_sou_um_modulo_do_python_nao_muito_util.faca_outra_coisa()

Fiz outra coisa!

Ao inves disso, voce pode dar um nome assim que importa-lo e entao apenas usar onovo nome (como se fosse um apelido):

>>> import eu_sou_um_modulo_do_python_nao_muito_util as poucoutil

>>>

>>> poucoutil.faca_algo_something()

Fiz algo

>>> poucoutil.faca_outra_coisa()

Fiz outra coisa!

Apesar de que voce nao usara a palavra-chave ‘as’ muitas vezes.

assert

A palavra-chave assert e uma palavra-chave avancada, que e usada por programa-dores quando eles querem assegurar que um codigo seja verdadeiro (ou ‘True’). Euma outra forma de capturar erros e problemas em um codigo — e normalmenteusado em programas mais avancados.

break

A palavra-chave break e usada para parar algum codigo que esta executando. Vocedevera usar o ‘break’ dentro de um laco ‘for’:

>>> idade = 25

>>> for x in range(1, 100):

... print(’contando %s’ % x)

... if x == idade:

... print(’fim da contagem’)

... break

Se a variavel ‘idade’ for 10, isso e o que sera impresso:

109

contando 1

contando 2

contando 3

contando 4

contando 5

contando 6

contando 7

contando 8

contando 9

contando 10

fim da contagem

Confira o Capıtulo 5 para mais informacoes sobre os lacos ‘for’.

class

A palavra-chave class e usada para definir um tipo de objeto. Essa e uma ca-racterıstica presente em muitas linguagens de programacao e e muito util quandoestamos desenvolvendo programas mais complicados, mas esse e um assunto umpouco avancado para este livro.

del

‘del’ e uma funcao especial, usada para se livrar de algo. Por exemplo, se voce temuma lista em um diario, contendo os presentes que quer de aniversario, mas mudoude ideia, voce poderia risca-lo da lista, e adicionar um novo:

Se tivessemos a mesma lista em Python:

>>> eu_quero = [’carrinho de controle remoto’, ’bicicleta’, ’video-game’]

Nos poderıamos remover o video-game, usando o del e adicionando o novo ıtemusando a funcao ‘append’:

110 APENDICE A. PALAVRAS-CHAVE EM PYTHON

>>> del eu_quero[2]

>>> eu_quero.append(’robo-dinossauro’)

E entao, para ver a nova lista:

>>> print(eu_quero)

[’carrinho de controle remoto’, ’bicicleta’, ’robo-dinossauro’]

Veja o Capıtulo 2 para mais informacoes sobre listas.

elif

A palavra-chave elif e usada como uma parte da condicao ‘if’. Veja sobre o if maisabaixo...

else

A palavra-chave else tambem e usada como uma parte da condicao ‘if’. Veja sobreo if mais abaixo...

except

Outra palavra-chave para capturar problemas no codigo. Novamente, o uso desta epara programas mais complicados, muito avancado para este livro.

exec

O exec e uma funcao especial, usada para que uma string seja executada como sefosse um codigo Python. Por exemplo, voce quer criar uma variavel com uma stringde valor, como abaixo:

>>> minhavar = ’ola!’

E imprimir o seu conteudo:

>>> print(minhavar)

ola!

Mas voce tambem poderia colocar um codigo em Python dentro de uma string:

111

>>> minhavar = ’print("ola!")’

E entao voce poderia usar o ‘exec’ para tornar essa string em um mini programaPython e executa-lo:

>>> exec(minhavar)

ola!

Parece uma ideia um pouco estranha e talvez seja algo que nao fara sentidoate voce precisar usar. Como o assert, essa e uma das palavras-chave avancadas quee usada em programas mais sofisticados.

finally

Esta e outra palavra-chave avacada, usada para assegurar que, quando um erroocorrer, um codigo em especial sera executado (normalmente para limpar a ’bagunca’que um outro codigo deixou para tras).

for

A palavra-chave for e usada para criar um laco ‘for’ de alguma forma. Por exemplo:

for x in range(0, 5):

print(’x e %s’ % x)

O laco ‘for’ acima, executa um bloco de codigo (o comando ‘print’) 5 vezes, criandoa seguinte saıda:

x e 0

x e 1

x e 2

x e 3

x e 4

from

Enquanto importando um modulo, voce pode querer importar apenas uma parte quevoce precisa, usando a palavra-chave from. Por exemplo, o modulo ‘turtle’ tem umafuncao chamada Pen() que e usada para criar um objeto do tipo ‘Pen’ (basicamenteuma tela onde a tartaruga se movera) — voce pode importar o modulo inteiro eentao usar a funcao Pen, como abaixo:

112 APENDICE A. PALAVRAS-CHAVE EM PYTHON

>>> import turtle

>>> t = turtle.Pen()

Ou, voce pode importar apenas a funcao Pen e entao usa-la diretamente (semprecisar referenciar o modulo ‘turtle’ por completo):

>>> from turtle import Pen

>>> t = Pen()

E e claro que isso significa que voce nao podera usar outras partes do moduloque voce nao importou. Por exemplo, o modulo ‘time’ tem uma funcao chamada‘localtime‘ e outra ‘gmtime’. Se nos importarmos o ‘localtime’ e entao tentarmosusar a ‘gmtime’, teremos um erro:

>>> from time import localtime

>>> print(localtime())

(2007, 1, 30, 20, 53, 42, 1, 30, 0)

Isso funciona, mas isso:

>>> print(gmtime())

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ’gmtime’ is not defined

A mensagem “‘gmtime’ is not defined” indica que o Python nao sabe da funcaogmtime. . . ainda. Se houverem um monte de funcoes em um modulo que vocequer usar e voce nao quer referenciar o nome do modulo toda vez que usa-las (ex.time.localtime, ou time.outra coisa), voce pode importar tudo do modulo, de umaso vez, usando o asterısco (*):

>>> from time import *

>>> print(localtime())

(2007, 1, 30, 20, 57, 7, 1, 30, 0)

>>> print(gmtime())

(2007, 1, 30, 13, 57, 9, 1, 30, 0)

Neste caso, nos importamos tudo do modulo ‘time’ e podemos referenciar asfuncoes individualmente pelo nome.

113

global

No Capıtulo 6, nos falamos sobre escopo. Escopo e a ‘visibilidade’ de uma variavel.Se a variavel e definida fora de uma funcao, normalmente ela pode ser vista dentroda funcao. Se definida dentro de uma funcao, normalmente ela nao pode ser vistade fora dessa funcao.

A palavra-chave global e uma excecao a essa regra. Uma variavel que e definidacomo global, pode ser vista de qualquer lugar. A definicao da palavra ‘global’ e‘universal’, entao voce pode pensar no terminal do Python como sendo um universo.Por exemplo:

>>> def teste():

... global a

... a = 1

... b = 2

O que voce acha que acontece quando voce chamar print(a) e entao print(b)depois de executar a funcao teste? O primeiro ira funcionar, o segundo entao causaraum erro:

>>> teste()

>>> print(a)

1

>>> print(b)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ’b’ is not defined

A variavel a e global agora (visıvel por todo mundo), mas b ainda e umavariavel visıvel apenas dentro da funcao. Observe que voce deve chamar globalantes de salvar ou usar a sua variavel global.

if

Uma expressao tomando uma decisao sobre algo — que em algumas vezes e usadocom algumas palavras-chave adicionais como else (senao) e o elif (else if / senaose). Uma expressao ‘if’ e uma forma de dizer, “se algo for verdade, entao faca umaacao”. Por exemplo:

114 APENDICE A. PALAVRAS-CHAVE EM PYTHON

if preco_brinquedo > 1000:

print(’O preco desse brinquedo e inviavel’)

elif preco_brinquedo > 100:

print(’Esse brinquedo e muito caro’)

else:

print(’Eu compraria esse brinquedo’)

A expressao ‘if’ diz que se o preco do brinquedo for acima de R$1000, e inviavel;se o preco do brinquedo for acima de R$100, e muito caro.... caso contrario, diz(imprime) “Eu compraria esse brinquedo”. O Capıtulo 4 tem mais informacoessobre as expressoes ‘if’.

import

A palavra-chave import diz ao Python para carregar um modulo para ser usado.Por exemplo:

>>> import sys

Isso diz ao Python que nos queremos usar o modulo sys.

in

A palavra-chave in e usada em expressoes, para saber se um item esta em umacolecao de itens. Por exemplo, pode o numero 1 ser encontrado na lista (umacolecao) de numeros:

>>> if 1 in [1, 2, 3, 4]:

... print(’numero 1 esta na lista’)

number is in list

Ou se ‘alface’ pode ser encontrado na lista de compras:

>>> lista_compras = [’ovos’, ’leite’, ’queijo’]

>>> if ’alface’ in shopping_list:

... print(’alface esta na lista de compras’)

... else:

... print(’alface n~ao esta na lista de compras’)

...

alface n~ao esta na lista de compras

115

is

A palavra-chave is, e parecida com o operador de igualdade (==) que e usado paradizer se duas coisas sao iguais (por exemplo, 10 == 10 e verdadeiro, 10 ==11 e falso).Porem, existe uma diferenca fundamental entre is e ==. Se voce esta comparandoduas coisas, o == retornara verdadeiro (‘True’) onde o ‘is’ retornaria falso (‘False’).

Este e um daqueles conceitos extremamente avancados de programacao, quetendem a ser bem confusos, entao por enquanto vamos ficar apenas com o ==.

lambda

Outra palavra-chave avancada. De fato, ‘lambda’ e tao complicada, ate escreveruma explicacao sobre ela faria este livro pegar fogo.

Entao e melhor nao falarmos sobre isso.

not

Se algo e verdadeiro, entao a palavra-chave not faz isso ser falso. Por exemplo, senos criarmos uma variavel x e definirmos seu valor como ‘True’...

>>> x = True

...e entao imprimirmos o valor de x usando not, nos teremos:

>>> print(not x)

False

O que nao parece ser muito util, ate que voce comece usar o not em umacondicao ‘if’. Por exemplo, se voce tem 12 anos e a idade mais importante paravoce e 12, voce pode se referir as demais idades, apenas usando:

“1 nao e uma idade importante” “2 nao e uma idade importante” “3nao e uma idade importante” “4 nao e uma idade importante” ... ... “50nao e uma idade important”

E por assim em diante.

Nos termos de uma condicao ‘if’, nos poderıamos escrever isso assim. . .

116 APENDICE A. PALAVRAS-CHAVE EM PYTHON

if age == 1:

print("1 n~ao e uma idade importante")

elif age == 2:

print("2 n~ao e uma idade importante")

elif age == 3:

print("3 n~ao e uma idade importante")

elif age == 4:

print("4 n~ao e uma idade importante")

. . .infinitamente. Uma forma mais simples de escrever a mesma condicao, seria:

if idade < 10 or idade > 10:

print("%d n~ao e uma idade importante" % idade)

Mas uma das formas mais simples de escrever essa condicao ‘if’, e usando o not:

if not idade == 10:

print("%d n~ao e uma idade importante" % idade)

Que provavelmente voce ja deve ter percebido, e o mesmo que dizer: “se idade naofor 10”.

or

A palavra-chave or e usada para unir duas expressoes em uma unica condicao (assimcomo o ‘if’), para dizer que ao menos uma das expressoes deve ser verdadeira. Porexemplo:

>>> if amigo == ’Rachel’ or amigo == ’Rob’:

... print(’Os Robinsons’)

... elif amigo == ’Bill’ or amigo == ’Bob’:

... print(’Os Baxters’)

Neste caso, a variavel amigo contem ‘Rachel’ ou ’Rob’, entao imprime ‘OsRobinsons’. Se a variavel amigo contem ‘Bill’ ou ‘Bob’ entao imprime ‘Os Baxters’.

pass

Algumas vezes, voce esta escrevendo um programa e voce quer escrever apenas umpouco, para testar algumas coisas. O problema com isso e que voce nao pode teruma condicao ‘if’ sem nenhum bloco de codigo que devera rodar se a condicao forverdadeira. Voce tambem nao pode ter um laco ‘for’ sem um bloco de codigo paraser executado. Por exemplo:

117

>>> if idade > 10:

... print(’mais velho que 10’)

O codigo acima funcionara, mas se voce digitar:

>>> if idade > 10:

...

Voce vera uma mensagem de erro no terminal, mais ou menos assim:

File "<stdin>", line 2

^

IndentationError: expected an indented block

Este e a mensagem de erro que o Python mostra, quando voce deve ter umbloco de codigo apos uma instrucao.

A palavra-chave pass pode ser usada nesses casos, entao voce pode criar umainstrucao sem um bloco de codigo. Por exemplo, voce poderia querer escrever umlaco ‘for’ com uma condicao ‘if’ dentro. Mas voce ainda nao decidiu o que vai colocarna condicao ‘if’ ainda. Talvez voce coloque um ‘print’ ou um ‘break’ ou alguma outracoisa. Neste caso, voce pode usar o pass e o codigo continuara funcionando (mesmoque nao seja exatamente o que voce quer, ainda). O codigo:

>>> for x in range(1, 7):

... print(’x e %s’ % x)

... if x == 5:

... pass

imprimira o seguinte:

x e 1

x e 2

x e 3

x e 4

x e 5

x e 6

Depois, voce pode adicionar o bloco de codigo que voce quer na condicao ‘if’ (subs-tituindo o pass).

118 APENDICE A. PALAVRAS-CHAVE EM PYTHON

print

A palavra-chave print, escreve algo no terminal do Python; como uma string, umnumero ou uma variavel:

print(’ola’)

print(10)

print(x)

raise

Outra palavra-chave avancada. Neste caso, o raise e usado para causar uma excecao— que pode parecer algo estranho, mas em programas avancados, e um tanto quantoutil.

return

A palavra-chave return e usada para retornar um valor em uma funcao. Por exem-plo, voce pode querer criar uma funcao que retorna o total de dinheiro que voceeconomizou:

>>> def meudinheiro():

... return total_de_dinheiro

Quando voce chamar essa funcao, o valor retornado pode ser associado a uma outravariavel:

>>> total = meudinheiro()

ou impresso:

>>> print(meudinheiro())

try

A palavra-chave try, e o comeco do bloco de codigo que termina com as palavras-chave except e/ou finally. Todos juntos, esses blocos de codigo try/except/finally,sao usados para gerenciar erros em um programa — por exemplo, para assegurarqeu o seu programa exibe uma mensagem de erro util para o usuario, ao inves deuma mensagem de erro ”feia”, do Python.

119

while

Um pouco parecido com o laco ‘for’, o while e outra maneira de repetir um codigo.Onde um laco ‘for’ conta atraves de uma sequencia (de numeros), um laco ‘while’continua executando enquanto a expressao for ‘True’. Voce tem que ser mais cuida-doso com lacos ‘while’, pois se a expressao sempre for ‘True’, o laco nunca terminara(isso e chamado de laco infinito). Por exemplo:

>>> x = 1

>>> while x == 1:

... print(’ola’)

Se voce executar o codigo acima, ele nunca terminara. Bem, ate que voce fecheo terminal do Python, ou pressione CTRL+C para interromper. Porem, o seguintecodigo:

>>> x = 1

>>> while x < 10:

... print(’ola’)

... x = x + 1

Imprimira ‘ola’ 9 vezes (cada vez adicionando 1 a variavel x, ate que x naomais seja menor que 10). Esta forma e obviamente um pouco parecido com o laco‘for’, mas tem suas utilidades em algumas situacoes.

with

With e uma palavra-chave muito avancada.

yield

Yield e outra palavra-chave muito avancada.

120 APENDICE A. PALAVRAS-CHAVE EM PYTHON

Apendice B

Built-in Functions

Python has a number of built-in functions—functions that can be used withoutneeding to import them first. Some of the available built-in functions are listedbelow.

abs

The abs function returns the absolute value of a number. An absolute value is anumber that is not negative. So the absolute value of 10 is 10, and the absolutevalue of -20.5 is 20.5. For example:

>>> print(abs(10))

10

>>> print(abs(-20.5))

20.5

bool

The bool function returns either True or False based on the value passed as itsparameter. For numbers, 0 returns False, while any other number returns True:

121

122 APENDICE B. BUILT-IN FUNCTIONS

>>> print(bool(0))

False

>>> print(bool(1))

True

>>> print(bool(1123.23))

True

>>> print(bool(-500))

True

For other values, None returns False while anything else returns True:

>>> print(bool(None))

False

>>> print(bool(’a’))

True

cmp

The cmp function compares two values and returns a negative number if the firstvalue is less than the second; returns 0 if the first value is equal to the second; andreturns a positive number if the first value is greater than the second. For example,1 is less than 2:

>>> print(cmp(1,2))

-1

And 2 is equal to 2:

>>> print(cmp(2,2))

0

But 2 is greater than 1:

>>> print(cmp(2,1))

1

Compare doesn’t only work with numbers. You can use other values, such as strings:

>>> print(cmp(’a’,’b’))

-1

>>> print(cmp(’a’,’a’))

0

>>> print(cmp(’b’,’a’))

1

But do be careful with strings; the return value may not be exactly what youexpect. . .

123

>>> print(cmp(’a’,’A’))

1

>>> print(cmp(’A’,’a’))

-1

A lower-case ’a’ is actually greater than an upper-case ’A’. Of course. . .

>>> print(cmp(’aaa’,’aaaa’))

-1

>>> print(cmp(’aaaa’,’aaa’))

1

. . .3 letter a’s (aaa) are less than 4 letter a’s (aaaa).

dir

The dir function returns a list of information about a value. You can use dir onstrings, numbers, functions, modules, objects, classes—pretty much anything. Onsome values, the information might not be all that useful (in fact it might not makea huge amount of sense at all). For example, calling dir on the number 1 resultsin. . .

>>> dir(1)

[’__abs__’, ’__add__’, ’__and__’, ’__class__’, ’__cmp__’, ’__coerce__’, ’__delattr__’,

’__div__’, ’__divmod__’, ’__doc__’, ’__float__’, ’__floordiv__’, ’__getattribute__’,

’__getnewargs__’, ’__hash__’, ’__hex__’, ’__index__’, ’__init__’, ’__int__’, ’__invert__’,

’__long__’, ’__lshift__’, ’__mod__’, ’__mul__’, ’__neg__’, ’__new__’, ’__nonzero__’,

’__oct__’, ’__or__’, ’__pos__’, ’__pow__’, ’__radd__’, ’__rand__’, ’__rdiv__’,

’__rdivmod__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rfloordiv__’,

’__rlshift__’, ’__rmod__’, ’__rmul__’, ’__ror__’, ’__rpow__’, ’__rrshift__’, ’__rshift__’,

’__rsub__’, ’__rtruediv__’, ’__rxor__’, ’__setattr__’, ’__str__’, ’__sub__’, ’__truediv__’,

’__xor__’]

. . .quite a large number of special functions. Whereas calling dir on the string’a’ results in...

124 APENDICE B. BUILT-IN FUNCTIONS

>>> dir(’a’)

[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’, ’__ge__’,

’__getattribute__’, ’__getitem__’, ’__getnewargs__’, ’__getslice__’, ’__gt__’, ’__hash__’,

’__init__’, ’__le__’, ’__len__’, ’__lt__’, ’__mod__’, ’__mul__’, ’__ne__’, ’__new__’,

’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rmod__’, ’__rmul__’, ’__setattr__’,

’__str__’, ’capitalize’, ’center’, ’count’, ’decode’, ’encode’, ’endswith’, ’expandtabs’,

’find’, ’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’]

Which shows you there are functions such as capitalize (change the first letterin a string to a capital). . .

>>> print(’aaaaa’.capitalize())

Aaaaa

. . .isalnum (which returns True if a string is alphanumeric—contains only let-ters and numbers), isalpha (which returns True if a string contains only letters),and so on. Dir can be useful when you have a variable and quickly want to find outwhat you can do with it.

eval

The eval function takes a string as a parameter and runs it as though it were aPython expression. This is similar to the exec keyword, but works a little differently.With exec you can create mini Python programs in your string, but eval only allowssimple expressions, such as:

>>> eval(’10*5’)

50

file

A function to open a file and return a file object with functions that can accessinformation in the file (the contents of the file, its size and so on). You can findmore information about file and file objects in Chapter 7.

float

The float function converts a string or a number into a floating point number. Afloating point number is a number with a decimal place (also called a real number).

125

For example, the number 10 is an ‘integer’ (also called a whole number), but 10.0,10.1, 10.253, and so on, are all ‘floats’. You can convert a string to a float by calling:

>>> float(’12’)

12.0

You can use a decimal place in the string as well:

>>> float(’123.456789’)

123.456789

A number can be converted to a float by calling:

>>> float(200)

200.0

Of course, converting a floating point number just returns another floating pointnumber:

>>> float(100.123)

100.123

Calling float with no arguments, returns 0.0.

int

The int function converts a string or a number into a whole number (or integer).For example:

>>> int(123.456)

123

>>> int(’123’)

123

This function works a little differently from the float function. If you try toconvert a floating point number in a string, you will get an error message:

>>> int(’123.456’)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: invalid literal for int() with base 10: ’123.456’

However, if you call int with no argument, then 0 is returned.

126 APENDICE B. BUILT-IN FUNCTIONS

len

The len function returns the length of an object. In this case of a string, it returnsthe number of characters in the string:

>>> len(’this is a test string’)

21

For a list or a tuple, it returns the number of items:

>>> mylist = [ ’a’, ’b’, ’c’, ’d’ ]

>>> print(len(mylist))

4

>>> mytuple = (1,2,3,4,5,6)

>>> print(len(mytuple))

6

For a map, it also returns the number of items:

>>> mymap = { ’a’ : 100, ’b’ : 200, ’c’ : 300 }

>>> print(len(mymap))

3

You might find the len function useful with loops, if you want to count through theelements in a list. You could do this using the following code:

>>> mylist = [ ’a’, ’b’, ’c’, ’d’ ]

>>> for item in mylist:

... print(item)

Which would print out all the items in the list (a,b,c,d)—but what if you wantedto print the index position of each item in the list? In this case we could find thelength of the list, then count through the items as follows:

>>> mylist = [ ’a’, ’b’, ’c’, ’d’ ]

>>> length = len(mylist)

>>> for x in range(0, length):

... print(’the item at index %s is %s’ % (x, mylist[x]))

...

the item at index 0 is a

the item at index 1 is b

the item at index 2 is c

the item at index 3 is d

We store the length of the list in the variable ‘length’, and then use that variable inthe range function to create our loop.

127

max

The max function returns the largest item in a list, tuple or even a string. Forexample:

>>> mylist = [ 5, 4, 10, 30, 22 ]

>>> print(max(mylist))

30

A string with the items are separated by commas or spaces will also work:

>>> s = ’a,b,d,h,g’

>>> print(max(s))

h

And you don’t have to use lists, or tuples or strings. You can also call the maxfunction directly with a number of arguments:

>>> print(max(10, 300, 450, 50, 90))

450

min

The min function works in the same way as max, except it returns the smallestitem in the list/tuple/string:

>>> mylist = [ 5, 4, 10, 30, 22 ]

>>> print(min(mylist))

4

range

The range function is mainly used in for-loops, when you want to loop throughsome code a number of times. We first saw range in Chapter 5, so we’ve seen howto use it with two arguments, but it can also be used with three arguments. Here’sanother example of range with two arguments:

128 APENDICE B. BUILT-IN FUNCTIONS

>>> for x in range(0, 5):

... print(x)

...

0

1

2

3

4

What you might not have realised, is that the range function actually just returns aspecial object (called an iterator) which the for-loop then works through. You canconvert the iterator into a list (oddly enough, using the function list), so if you printthe return value when calling range, you’ll see the numbers it contains:

>>> print(list(range(0, 5)))

[0, 1, 2, 3, 4]

You get a list of numbers that can be assigned to variables and used elsewhere inyour program:

>>> my_list_of_numbers = list(range(0, 30))

>>> print(my_list_of_numbers)

[0, 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]

Range also takes a third argument, called a ‘step’ (the first two arguments are calledthe ‘start’ and the ‘stop’). If the step value is not passed into the function (in otherwords, when you call it with only the start and stop values), by default the number1 is used. But what happens when we pass the number 2 as the step? You can seethe result in the following example:

>>> my_list_of_numbers = list(range(0, 30, 2))

>>> print(my_list_of_numbers)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

Each number in the list increases by 2 from the previous number. We can use largersteps:

>>> mylist = list(range(0, 500, 50))

>>> print(mylist)

[0, 50, 100, 150, 200, 250, 300, 350, 400, 450]

This creates a list from 0 to 500 (but not including 500, of course), incrementingthe numbers by 50.

129

sum

The sum function adds up items in a list and returns the total number. For example:

>>> mylist = list(range(0, 500, 50))

>>> print(mylist)

[0, 50, 100, 150, 200, 250, 300, 350, 400, 450]

>>> print(sum(mylist))

2250

130 APENDICE B. BUILT-IN FUNCTIONS

Apendice C

A Few Python Modules

Python has a large number of modules available for doing all sorts of things. If youwant to read about them, you can look at the Python documentation at the fol-lowing address: docs.python.org/modindex.html, however, a few of the more usefulmodules are explained below. A warning if you do decide to look at the Pythondocumentation—the list of modules is very long, and some of them are quite com-plicated.

The ‘random’ module

If you’ve ever played the game where you ask someone to guess a number between1 and 100, you’ll know what to do with the random module. Random contains anumber of functions useful for coming up with. . . random numbers. It’s kind of likeasking the computer to pick a number. The random module contains a number offunctions, but the most useful are randint, choice and shuffle. The first function,random, picks a random number between a start and end number (in other words,between 1 and 100, or between 100 and 1000, or between 1000 and 5000, and so on).For example:

>>> import random

>>> print(random.randint(1, 100))

58

>>> print(random.randint(100, 1000))

861

>>> print(random.randint(1000, 5000))

3795

We could use this to create a simple (and annoying) guessing game, using awhile loop:

131

132 APENDICE C. A FEW PYTHON MODULES

import random

import sys

num = random.randint(1, 100)

while True:

print(’Guess a number between 1 and 100’)

chk = sys.stdin.readline()

i = int(chk)

if i == num:

print(’You guessed right’)

break

elif i < num:

print(’Try higher’)

elif i > num:

print(’Try lower’)

Use choice, if you have a list and want to pick a random item from that list.For example:

>>> import random

>>> list1 = [ ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’ ]

>>> print(random.choice(list1))

c

>>> list2 = [ ’ice cream’, ’pancakes’, ’trifle’, ’pavlova’, ’sponge’ ]

>>> print(random.choice(list2))

trifle

And finally, use shuffle if you want to mix up a list (like shuffling cards):

>>> import random

>>> list1 = [ ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’ ]

>>> list2 = [ ’ice cream’, ’pancakes’, ’trifle’, ’pavlova’, ’sponge’ ]

>>> random.shuffle(list1)

>>> print(list1)

[’h’, ’e’, ’a’, ’b’, ’c’, ’g’, ’f’, ’d’]

>>> random.shuffle(list2)

>>> print(list2)

[’pancakes’, ’ice cream’, ’sponge’, ’trifle’, ’pavlova’]

The ‘sys’ module

The sys module contains useful ‘system’ functions. This is just an odd way of sayingthat they are very important within Python. Some of the most useful functions andvalues available in sys are: exit, stdin, stdout, and version.

The exit function is another way of stopping the Python console. For exampleif you type:

133

>>> import sys

>>> sys.exit()

The Python console will stop. Depending upon whether you’re using Windows,Mac or Linux, a number of different things might happen—but the end result is thatthe Python console stops running.

Stdin has been used elsewhere in this book (see Chapter 6), to prompt someoneusing a program to enter some values. For example:

>>> import sys

>>> myvar = sys.stdin.readline()

this is a test value

>>> print(myvar)

this is a test value

Stdout is the opposite—used to write messages to the console. In some ways,it’s the same as print, but works more like a file, so sometimes it’s more useful touse stdout than print:

>>> import sys

>>> l = sys.stdout.write(’this is a test’)

this is a test>>>

Notice where the prompt (>>>) reappears? It’s not an error, that it’s at theend of the message. That’s because, unlike print, when you call write, it doesn’tautomatically move to the next line. To do the same with write we can do thefollowing:

>>> import sys

>>> l = sys.stdout.write(’this is a test\n’)

this is a test

>>>

(Note that stdout.write returns the number of characters written–try print(l) to seethe result).

\n is the escape character for a newline (what you get when you hit the enter key).An escape character is a special character that you use in strings when you can’ttype it directly. For example, if you want to create a string with a newline in themiddle, but try to use the enter key, you’ll get an error:

134 APENDICE C. A FEW PYTHON MODULES

>>> s = ’test test

File "<stdin>", line 1

s = ’test test

^

SyntaxError: EOL while scanning single-quoted string

Instead you can use the newline escape character:

>>> s = ’test test\ntest’

Finally, version is just a way of displaying the version of Python you are running:

>>> import sys

>>> print(sys.version)

2.5.1c1 (release25-maint, Apr 12 2007, 21:00:25)

[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)]

The ‘time’ module

Python’s time module contains functions for displaying. . . well, the time, obviously.However, if you try to call the most obvious function (time), the result won’t quitebe what you were expecting:

>>> import time

>>> print(time.time())

1179918604.34

The number returned by time() is actually the number of seconds since the 1stof January, 1970 (at 00:00:00am to be exact). You might not think this is enormouslyuseful, however it does, occasionally, have its purpose. For example, if you create aprogram and want to know how fast bits of it run, you can record the time at thebeginning, the time at the end, and then compare the values. For example, howlong would it take to print all the numbers from 0 to 100,000? We can easily createa function to print them out:

>>> def lots_of_numbers(max):

... for x in range(0, max):

... print(x)

Then call the function:

135

>>> lots_of_numbers(100000)

But if we want to know how long it took, we can modify the function and use thetime module:

>>> def lots_of_number(max):

... t1 = time.time()

... for x in range(0, max):

... print(x)

... t2 = time.time()

... print(’it took %s seconds’ % (t2-t1))

If we call it again:

>>> lots_of_numbers(100000)

0

1

2

3

.

.

.

99997

99998

99999

it took 6.92557406425 seconds

How does it work? The first time we call the time() function, we assign the valueto the variable t1. We then loop and print out all the numbers. Again we call thetime() function and this time assign the value to the variable t2. Since it took afew seconds for the loop to complete, the value in t2 will be higher (or later to beexact) than t1 (the number of seconds since 1st of Jan, 1970 will have increased).So if you subtract t2 from t1, you have the number of seconds it took to print allthose numbers.

Other functions available on the time module include: asctime, ctime, local-time, sleep, strftime, and strptime.

The function asctime takes a date as a tuple (remember: a tuple is a list ofvalues that cannot be changed) and converts it into a readable form. You can alsocall it without any argument and it will display the current date and time in areadable form:

136 APENDICE C. A FEW PYTHON MODULES

>>> import time

>>> print(time.asctime())

Sun May 27 20:11:12 2007

To call it with an argument, we first need to make a tuple with the correct valuesfor date and time. Let’s assign the tuple to the variable t:

>>> t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)

The values in the sequence are year, month, day, hours, minutes, seconds, day of theweek (0 is Monday, 1 is Tuesday, and so on, up till Sunday which is 6) and finallythe day of the year and whether or not it is daylight savings (0 is isn’t, 1 it is).Calling asctime with the above tuple, we get:

>>> import time

>>> t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)

>>> print(time.asctime(t))

Sun May 27 10:30:48 2007

But be careful with the values you put in a tuple. You can end up with a nonsensicaldate if you put in the wrong values:

>>> import time

>>> t = (2007, 5, 27, 10, 30, 48, 0, 0, 0)

>>> print(time.asctime(t))

Mon May 27 10:30:48 2007

Because the value for ‘day of the week’ was set to 0 (rather than 6), asctime nowthinks that May the 27th is a Monday, rather than what it actually is—a Sunday.

The function ctime is used to convert a number of seconds into a readableform. For example, we can use the time() function explained in the beginning ofthis section:

>>> import time

>>> t = time.time()

>>> print(t)

1180264952.57

>>> print(time.ctime(t))

Sun May 27 23:22:32 2007

The function localtime returns the current date and time as a tuple in the samesequence of values we’ve just used:

137

>>> import time

>>> print(time.localtime())

(2007, 5, 27, 23, 25, 47, 6, 147, 0)

This value we can also pass into asctime:

>>> import time

>>> t = time.localtime()

>>> print(time.asctime(t))

Sun May 27 23:27:22 2007

The function sleep is quite useful when you want to delay your program for a certainperiod of time. For example, if you wanted to print out one number every second,the following loop wouldn’t be very successful:

>>> for x in range(1, 61):

... print(x)

...

1

2

3

4

It would instantly print out all the numbers from 1 to 60. However if you tellPython to go to sleep for a second between each print statement:

>>> for x in range(1, 61):

... print(x)

... time.sleep(1)

...

There will be a short (1 second) delay between the display of each number. Telling acomputer to sleep might not seem all that useful, but there are times when it can be.Think about your alarm clock that wakes you up in the morning. When you hit thesleep button, it stops buzzing for a few minutes, giving you an extra few momentsof sleep (at least until someone calls you for breakfast). The sleep function is justas useful in certain situations.

The function strftime is used to change the way a date and time value isdisplayed, and strptime is used to take a string and convert it into a date/timetuple. Let’s look at strftime first. Just before we saw how to change a tuple into astring using asctime:

138 APENDICE C. A FEW PYTHON MODULES

>>> t = (2007, 5, 27, 10, 30, 48, 6, 0, 0)

>>> print(time.asctime(t))

Sun May 27 10:30:48 2007

That works fine for most situations, but what if you don’t like the way that stringis displayed—what if you only want to display the date and not the time? We cando that with strftime:

>>> print(time.strftime(’%d %b %Y’, t))

27 May 2007

As you can see, strftime takes 2 arguments: the first is a date/time format(which describes how the date/time should be displayed), and the second is thetuple containing the time values. The format, %d %b %Y is another way of saying:‘show the day, the month and then the year’. We could also display the month as anumber, for example:

>>> print(time.strftime(’%d/%m/%Y’, t))

27/05/2007

This format is a way of saying, ‘display the day, then a forward-slash, thendisplay the month as a number, then a forward-slash, then display the year’. Thereare a number of different values you can use in a format:

139

%a a shortened version of a week day (for example, Mon, Tues, Wed,Thurs, Fri, Sat, and Sun)

%A the full weekday name (Monday, Tuesday, Wednesday, Thursday,Friday, Saturday, Sunday)

%b a shortened version of a month name (Jan, Feb, Mar, Apr, May,Jun, Jul, Aug, Sep, Oct , Nov, Dec)

%B the full version of a month name (January, February, March, April,May, and so on)

%c the full date and time, in the same format the asctime uses%d the day of the month as a number (from 01 to 31)%H the hour of the day, in 24 hour format (from 00 to 23)%I the hour of the day, in 12 hour format (from 01 to 12)%j the day of the year as a number (from 001 to 366)%m the month as a number (from 01 to 12)%M the minute as a number (from 00 to 59)%p morning or afternoon as either AM or PM%S the seconds as a number%U the week number of the year as a number (from 00 to 53)%w the day of the week as a number. Sunday is 0, Monday is 1, up to

Saturday, which is 6%x a simple date format (usually month/day/year—for example,

03/25/07)%X a simple time format (usually hour:minutes:seconds—for example

10:30:53)%y the year in 2 digits (for example, 2007 would be 07)%Y the year in 4 digits (e.g. 2007)

The function strptime is almost the reverse of strftime—it takes a string andconverts it into a tuple containing the date and time values. It also takes the samevalues in the format string. An example of using this function is:

>>> import time

>>> t = time.strptime(’05 Jun 2007’, ’%d %b %Y’)

>>> print(t)

(2007, 6, 5, 0, 0, 0, 1, 156, -1)

If the date in our string is day/month/year (for example, 01/02/2007), we mightuse:

140 APENDICE C. A FEW PYTHON MODULES

>>> import time

>>> t = time.strptime(’01/02/2007’, ’%d/%m/%Y’)

>>> print(t)

(2007, 2, 1, 0, 0, 0, 3, 32, -1)

Or if the date is month/day/year, we might use:

>>> import time

>>> t = time.strptime(’03/05/2007’, ’%m/%d/%Y’)

>>> print(t)

(2007, 3, 5, 0, 0, 0, 0, 64, -1)

We can combine the 2 functions to convert a string in one format to another. Let’sdo it in a function:

>>> import time

>>> def convert_date(datestring, format1, format2):

... t = time.strptime(datestring, format1)

... return time.strftime(format2, t)

...

We can use this function by passing in the date string, the format of that string,and then the format that we want the returned date in:

>>> print(convert_date(’03/05/2007’, ’%m/%d/%Y’, ’%d %B %Y’))

05 March 2007

Apendice D

Answers to “Things to try”

Here is where you can find the answers to the questions asked in each chapter in thesection “Things to try”.

Chapter 2

1. The answer to Exercise 1 might be something like the following:

>>> toys = [ ’car’, ’Nintendo Wii’, ’computer’, ’bike’ ]

>>> foods = [ ’pancakes’, ’chocolate’, ’ice cream’ ]

>>> favourites = toys + foods

>>> print(favourites)

[’car’, ’Nintendo Wii’, ’computer’, ’bike’, ’pancakes’, ’chocolate’, ’ice cream’]

2. The answer to Exercise 2 is simply adding the result of multiplying 3 by 25 andthe result of multiplying 10 by 32. The following equations shows the result of thisequation:

>>> print(3 * 25 + 10 * 32)

395

However, given that we looked at the use of brackets in Chapter 2, you might havedecided that you needed to put brackets around some parts of this equation. Youmight’ve done something like this:

>>> print((3 * 25) + (10 * 32))

395

The answer is the same, because multiplication is done before addition. In eitherequation, the two multiplication operations are performed first, and the results are

141

142 APENDICE D. ANSWERS TO “THINGS TO TRY”

added. However, the second equation is possibly slightly better than the first—because it’s immediately obvious to the reader which operations are performed first.A less knowledgeable programmer (who doesn’t know as much about the order ofoperations) might think that, in the first equation, you multiply 3 by 25, then add10, then multiply the result by 32 (the answer to that is 2720—completely wrong).With the brackets, it’s a bit more obvious what gets calculated first.

3. The answer to Exercise 3 will be something like the following:

>>> first_name = ’Mary’

>>> second_name = ’Wilson’

>>> print(’My name is %s %s’ % (first_name, second_name))

My name is Mary Wilson

Chapter 3

1. A rectangle is like a square, except two of its sides are longer than the other two.By telling the turtle to do the following operations, you can easily draw a rectangle:

• move forward a certain number of pixels

• turn left

• move forward a shorter number of pixels

• turn left

• move forward, the number of pixels in the first movement

• turn left

• move forward the shorter number of pixels in the second movement

For example, the following code will drawing the rectangle in figureD.1.

>>> import turtle

>>> t = turtle.Pen()

>>> t.forward(150)

>>> t.left(90)

>>> t.forward(50)

>>> t.left(90)

>>> t.forward(150)

>>> t.left(90)

>>> t.forward(50)

143

Figura D.1: Turtle drawing a rectangle.

2. A triangle is a bit more complicated to draw, because you need to know moreabout angles and line lengths. If you haven’t studied angles in school then this maybe a bit harder to do than you expect. You can draw a basic triangle (see figure D.2)using the following code:

>>> import turtle

>>> t = turtle.Pen()

>>> t.forward(100)

>>> t.left(135)

>>> t.forward(70)

>>> t.left(90)

>>> t.forward(70)

Chapter 5

1. The loop stops after the first print. So when you run the code in the Pythonconsole you get:

144 APENDICE D. ANSWERS TO “THINGS TO TRY”

Figura D.2: Turtle drawing a triangle.

>>> for x in range(0, 20):

... print(’hello %s’ % x)

... if x < 9:

... break

hello 0

The reason it stops after the first print is that during the first run of the loop, thevalue of the variable x is zero. Since zero is less than nine, the break statement stopsthe loop from running any further.

2. To figure out how much money you get when you are paid 3% interest, you needto multiply the number by 0.03. To begin with we should create a variable andpoint it at the amount of our savings:

>>> amount = 100

To the amount of interest paid for 1 year would be that amount multiplied by0.03:

145

>>> amount = 100

>>> print(amount * 0.03)

3.0

That’s $3! Not bad since we didn’t need to do anything to get it. We need toprint out this value and then add it to the total, and do it 10 times to work out theinterest that we are paid for 10 years:

>>> amount = 100

>>> for year in range(1, 11):

... interest = amount * 0.03

... print(’interest earned for year %s is %s’ % (year, interest))

... amount = amount + interest

...

interest earned for year 1 is 3.0

interest earned for year 2 is 3.09

interest earned for year 3 is 3.1827

interest earned for year 4 is 3.278181

interest earned for year 5 is 3.37652643

interest earned for year 6 is 3.4778222229

interest earned for year 7 is 3.58215688959

interest earned for year 8 is 3.68962159627

interest earned for year 9 is 3.80031024416

interest earned for year 10 is 3.91431955149

In the first line we create a for-loop using the variable year and the functionrange to count from 1 to 10. The second line calculates the interest, multiplying thevalue in variable amount by 0.03. The next line is the print statement—which usesplace holders (%s) to include the values for year and interest. Finally in the lastline, we add the interest back into the amount. All the decimal places—the numbersafter the period (.) in the print lines—are a bit confusing, but you can tell that theamount of interest each year increases a little bit as you add the interest. The codemight be a bit more helpful if we also add the total saved each year:

146 APENDICE D. ANSWERS TO “THINGS TO TRY”

>>> amount = 100

>>> for year in range(1, 11):

... interest = amount * 0.03

... print(’interest earned for savings %s for year %s is %s’ %

... (amount, year, interest))

... amount = amount + interest

...

interest earned for savings 100 for year 1 is 3.0

interest earned for savings 103.0 for year 2 is 3.09

interest earned for savings 106.09 for year 3 is 3.1827

interest earned for savings 109.2727 for year 4 is 3.278181

interest earned for savings 112.550881 for year 5 is 3.37652643

interest earned for savings 115.92740743 for year 6 is 3.4778222229

interest earned for savings 119.405229653 for year 7 is 3.58215688959

interest earned for savings 122.987386542 for year 8 is 3.68962159627

interest earned for savings 126.677008139 for year 9 is 3.80031024416

interest earned for savings 130.477318383 for year 10 is 3.91431955149

Chapter 6

1. Turning the for-loop into a function is actually quite easy. The function will looksomething like this:

>>> def calculate_interest(amount, rate):

... for year in range(1, 11):

... interest = amount * rate

... print(’interest earned for savings %s for year %s is %s’ %

... (amount, year, interest))

... amount = amount + interest

If you compare the function with the code above, you might notice that, apartfrom the first line, there’s only one change to the original code (0.03 is now theparameter rate). Because amount was already a variable, there’s no change requiredwhen it becomes a parameter. You’ll find the output is also the same when you runthe function:

147

>>> calculate_interest(100, 0.03)

interest earned for savings 100 for year 1 is 3.0

interest earned for savings 103.0 for year 2 is 3.09

interest earned for savings 106.09 for year 3 is 3.1827

interest earned for savings 109.2727 for year 4 is 3.278181

interest earned for savings 112.550881 for year 5 is 3.37652643

interest earned for savings 115.92740743 for year 6 is 3.4778222229

interest earned for savings 119.405229653 for year 7 is 3.58215688959

interest earned for savings 122.987386542 for year 8 is 3.68962159627

interest earned for savings 126.677008139 for year 9 is 3.80031024416

interest earned for savings 130.477318383 for year 10 is 3.91431955149

2. Changing the function to pass in the year as a parameter also involves only minorchanges:

>>> def calculate_interest(amount, rate, years):

... for year in range(1, years):

... interest = amount * rate

... print(’interest earned for savings %s for year %s is %s’ %

... (amount, year, interest))

... amount = amount + interest

We can now easily change the starting amount, the rate of interest and the numberof years:

>>> calculate_interest(1000, 0.05, 6)

interest earned for savings 1000 for year 1 is 50.0

interest earned for savings 1050.0 for year 2 is 52.5

interest earned for savings 1102.5 for year 3 is 55.125

interest earned for savings 1157.625 for year 4 is 57.88125

interest earned for savings 1215.50625 for year 5 is 60.7753125

3. The mini-program is a bit more complicated than the functions we’ve alreadycreated. First we need to import the sys module so we can ask for input. Then weneed to prompt the user of our program for each of the values. Apart from that,the function stays roughly the same:

148 APENDICE D. ANSWERS TO “THINGS TO TRY”

>>> import sys

>>> def calculate_interest():

... print(’Enter the amount you have to save’)

... amount = float(sys.stdin.readline())

... print(’Enter the interest rate’)

... rate = float(sys.stdin.readline())

... print(’Enter the number of years’)

... years = int(sys.stdin.readline())

... for year in range(1, years):

... interest = amount * rate

... print(’interest earned for savings %s for year %s is %s’ %

... (amount, year, interest))

... amount = amount + interest

When we run the function, we’ll see something like the following:

>>> calculate_interest()

Enter the amount you have to save

500

Enter the interest rate

0.06

Enter the number of years

12

interest earned for savings 500.0 for year 1 is 30.0

interest earned for savings 530.0 for year 2 is 31.8

interest earned for savings 561.8 for year 3 is 33.708

interest earned for savings 595.508 for year 4 is 35.73048

interest earned for savings 631.23848 for year 5 is 37.8743088

interest earned for savings 669.1127888 for year 6 is 40.146767328

interest earned for savings 709.259556128 for year 7 is 42.5555733677

interest earned for savings 751.815129496 for year 8 is 45.1089077697

interest earned for savings 796.924037265 for year 9 is 47.8154422359

interest earned for savings 844.739479501 for year 10 is 50.6843687701

interest earned for savings 895.423848271 for year 11 is 53.7254308963

Chapter 8

1. There’s a hard way to draw an octagon, and an easy way. The hard way, isn’thard because it’s complicated. It’s hard because it requires more typing:

149

import turtle

t = turtle.Pen()

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

>>> t.right(45)

>>> t.forward(50)

You can see from that code that we tell the turtle to move forward 50 pixels, thenturn right 45 degrees. We do this 8 times. Which is a lot of time. The easier way todraw an octagon is the following code (which produces the octagon in figure D.3):

>>> for x in range(0,8):

... t.forward(50)

... t.right(45)

2. If you take another look at the other functions in Chapter 8, you’ll already seehow to create a filled shape. We can convert the octagon code into a function thattakes a colour, but we’ll also want to reuse the hexcolour function

>>> def octagon(red, green, blue):

... t.color(red, green, blue)

... t.begin_fill()

... for x in range(0,8):

... t.forward(50)

... t.right(45)

... t.end_fill()

We set the colour, then turn filling on. Then we run the for loop to draw theoctagon, finally we switch filling back off again to fill in the shape. How about ablue octagon (see figure D.4):

>>> octagon(0, 0, 1)

150 APENDICE D. ANSWERS TO “THINGS TO TRY”

Figura D.3: Turtle drawing an octagon.

Figura D.4: Turtle drawing a blue octagon.

Indice Remissivo

addition, 11

blocks of code, 44

conditions, 33combining, 36

date/time formats, 138degrees, 28

equality, 38escape characters, 133

floatingpoint, 10for-loop, 41functions, 54

abs, 121bool, 121cmp, 122dir, 123eval, 124file, 57, 63, 124close, 64read, 63write, 63

float, 124int, 125len, 126max, 127min, 127range, 42, 127sum, 129

hexadecimal colors, 90

if-statement, 33

if-then-else-statement, 35Interpretador Python, 5

keywordsand, 107as, 107assert, 108break, 108class, 109del, 109elif, 110else, 110except, 110exec, 110finally, 111for, 111from, 111global, 113if, 113import, 114in, 114is, 115lambda, 115not, 115or, 116pass, 116print, 118raise, 118return, 118try, 118while, 119with, 119yield, 119

151

152 INDICE REMISSIVO

lists, 19appending, 21joining, 22removing, 21replacing, 21

modules, 59, 131os, 97random, 87, 131choice, 132randint, 131randrange, 87

shuffle, 132sys, 59, 132exit, 132stdin, 60, 133stdout, 133version, 134

time, 59, 134asctimes, 135ctime, 136localtime, 59, 136sleep, 137strftime, 137strptime, 139time (function), 134

tkinter, 83basic animation, 97bind all, 101Canvas, 85create image, 97create line, 85create oval, 92create polygon, 95create rectangle, 87events, 101move, 99

modulo operator, 68multi-line string, 17multiplication, 9, 11

named parameters, 84

None, 37

operators, 11order of operations, 11

Pen, 26pixels, 27Python, 3

return, 55

scope, 55strings, 17subtraction, 11

tuples, 23turtle, 25

advanced, 65backward, 29clear, 29color, 69black, 72

down (start drawing), 29fill, 72reset, 29turning left, 28turning right, 28up (stop drawing), 29

Variaveis, 15variable, 13

while-loop, 50white space, 44