como pensar como um computólogo

Upload: telmacardoso

Post on 06-Jul-2015

89 views

Category:

Documents


0 download

TRANSCRIPT

Como pensar como um computlogoFonte:http://pensarpython.incubadora.fapesp.br/portal/livro

SumrioPrefcio .................................................................................................6 Como e porque eu vim a usar Python ............................................6 Encontrando um livro texto ...........................................................7 Introduzindo programao com Python .........................................9 Construindo uma comunidade .....................................................11 Apresentao ......................................................................................12 Captulo 1: O caminho do programa ................................................14 1.1 A linguagem de programao Python ....................................15 1.2 O que um programa? ..........................................................18 1.3 O que depurao (debugging)? ...........................................18 1.3.1 Erros de sintaxe ..............................................................19 1.3.2 Erros em tempo de execuo (runtime errors) ...............19 1.3.3 Erros de semntica .........................................................20 1.3.4 Depurao experimental (Debugging) ............................20 1.4 Linguagens naturais e linguagens formais ............................21 1.5 O primeiro programa .............................................................23 1.6 Glossrio ................................................................................24 Captulo 2: Variveis, expresses e comandos ................................25 2.1 Valores e tipos .......................................................................26 2.2 Variveis ................................................................................27 2.3 Nomes de variveis e palavras reservadas ............................29 2.4 Comandos ..............................................................................30 2.5 Avaliando expresses ............................................................31 2.6 Operadores e operandos ........................................................32 2.7 Ordem dos operadores ..........................................................33 2.8 Operaes com strings ..........................................................33 2.9 Composio ...........................................................................34 2.11 Glossrio ..............................................................................35 Captulo 3: Funes .........................................................................36 3.1 Chamadas de funes ............................................................37 3.2 Converso entre tipos ............................................................37 3.3 Coero entre tipos ................................................................38 3.4 Funes matemticas ............................................................39 3.5 Composio ...........................................................................40 3.6 Adicionando novas funes ...................................................41 3.7 Definies e uso .....................................................................43 3.8 Fluxo de execuo .................................................................44 3.9 Parmetros e argumentos .....................................................45 3.10 Variveis e parmetros so locais .......................................46 3.11 Diagramas da pilha ..............................................................47 3.12 Funes com resultados ......................................................48 3.13 Glossrio ..............................................................................49 Captulo 4: Condicionais e recursividade .........................................50

4.1 O operador mdulo ................................................................51 4.2 Expresses booleanas ............................................................51 4.3 Operadores lgicos ................................................................52 4.4 Execuo condicional .............................................................53 4.5 Execuo alternativa .............................................................53 4.6 Condicionais encadeados .......................................................54 4.7 Condicionais aninhados .........................................................55 4.8 A instruo return ..................................................................56 4.9 Recursividade ........................................................................57 4.10 Diagramas de pilha para funes recursivas .......................58 4.11 Recursividade infinita ..........................................................59 4.12 Entrada pelo teclado ............................................................60 4.13 Glossrio ..............................................................................61 Captulo 5: Funes frutferas ..........................................................62 5.1 Valores de retorno .................................................................62 5.2 Desenvolvimento de programas ............................................64 5.3 Composio ...........................................................................67 5.4 Funes booleanas ................................................................68 5.5 Mais recursividade .................................................................69 5.6 Voto de confiana (Leap of faith) ...........................................71 5.7 Mais um exemplo ...................................................................72 5.8 Checagem de tipos ................................................................73 5.9 Glossrio ................................................................................74 Captulo 6: Iterao .........................................................................75 6.1 Reatribuies .........................................................................75 6.2 O comando while ...................................................................76 6.3 Tabelas ..................................................................................79 6.4 Tabelas de duas dimenses (ou bi-dimensionais) ..................82 6.5 Encapsulamento e generalizao ..........................................82 6.6 Mais encapsulamento ............................................................84 6.7 Variveis locais ......................................................................84 6.8 Mais generalizao ................................................................85 6.9 Funes ..................................................................................87 6.10 Glossrio ..............................................................................88 Correo no cdigo ......................................................................89 Captulo 7: Strings ...........................................................................89 7.1 Um tipo de dado composto ....................................................90 7.2 Comprimento .........................................................................91 7.3 Travessia e o loop for .............................................................92 7.4 Fatias de strings .....................................................................93 7.5 Comparao de strings ..........................................................94 7.6 Strings so imutveis .............................................................95 7.7 Uma funo find (encontrar) ..................................................95 7.8 Iterando e contando ...............................................................96 7.9 O mdulo string .....................................................................97 7.10 Classificao de caracteres ..................................................98

7.11 Glossrio ..............................................................................99 7.11 Glossrio2 ..........................................................................100 Captulo 8: Listas ...........................................................................100 8.1 Valores da lista ....................................................................101 8.2 Acessado elementos ............................................................103 8.3 Comprimento da lista ...........................................................104 8.4 Membros de uma lista ..........................................................105 8.5 Listas e laos for ..................................................................105 8.6 Operaes em listas .............................................................106 8.7 Fatiamento de listas .............................................................106 8.8 Listas so mutveis .............................................................107 8.9 Remoo em lista ................................................................107 8.10 Ojetos e valores .................................................................108 8.11 Apelidos .............................................................................109 8.12 Clonando listas ...................................................................110 8.13 Lista como parmetro ........................................................111 8.14 Lista aninhadas ..................................................................112 8.15 Matrizes .............................................................................112 8.16 Strings e listas ...................................................................113 8.17 Glossrio ............................................................................114 Outros termos utilizados neste captulo .....................................115 mirabile dictu .............................................................................116 Captulo 9: Tuplas ..........................................................................116 9.1 Mutabilidade e tuplas ...........................................................116 9.2 Atribuies de tupla .............................................................118 9.3 Tuplas como valores de retorno ...........................................118 9.4 Nmeros aleatrios ..............................................................119 9.5 Lista de nmeros aleatrios .................................................120 9.6 Contando .............................................................................121 9.7 Vrios intervalos ..................................................................122 9.8 Uma soluo em um s passo .............................................124 9.9 Glossrio ..............................................................................125 Captulo 10: Dicionrios .................................................................126 10.1 Operaes dos Dicionrios .................................................128 10.2 Mtodos dos Dicionrios ....................................................128 10.3 Aliasing (XXX) e Copiar ......................................................129 10.4 Matrizes Esparsas ..............................................................130 10.5 Hint XXX .............................................................................131 10.6 Inteiros Longos ...................................................................133 10.7 Contando Letras .................................................................134 10.8 Glossrio ............................................................................135 mtodo .......................................................................................135 1089119213 ...............................................................................135 Ok ..............................................................................................135 formatao dos smbolos ...........................................................136 Captulo 11: Arquivos e excees ..................................................136

Arquivos e excees ..................................................................136 11.1 Arquivos texto ....................................................................139 11.2 Gravando variveis ............................................................140 11.3 Diretrios ...........................................................................143 11.4 Pickling ...............................................................................143 Captulo 19: Filas ...........................................................................144 19.1 Um TDA Fila .......................................................................144 19.2 Fila encadeada ...................................................................145 19.3 Caractersticas de performance .........................................146 19.4 Fila encadeada aprimorada ...............................................146 19.5 Fila por prioridade ..............................................................148 19.6 A classe Golfer ...................................................................150 19.7 Glossrio ............................................................................151 Por favor, comentem. ................................................................151 1089602150 ...............................................................................152 Queue e Priority Queue ..............................................................152 Redundncias ............................................................................152 Captulo 20: rvores ......................................................................152 20.1 Construindo rvores ...........................................................154 20.2 Percorrendo rvores ..........................................................155 20.3 rvores de expresses .......................................................155 20.4 Percurso de rvores ...........................................................156 20.5 Construindo uma rvore de expresso ..............................158 20.6 Manipulando erros .............................................................162 20.7 A rvore dos animais .........................................................163 20.8 Glossrio ............................................................................165 Dvidas de traduo no Captulo 20 ..........................................166 Sugestes de Tomasz Kowaltowski para as palavras difceis ....167 Sugestes de Mario O. de Menezes s sugestes de Tomasz Kowaltowski ...............................................................................168 Apndice A: Depurao ..............................................................170 A.1 Erros de sintaxe ...............................................................171 A.1.1 Eu no consigo fazer meu programa executar no importa o que eu faa ................................................................................172 A.2 Erros de tempo de execuo ...........................................172 A.2.1 Meu programa no faz absolutamente nada ....................173 A.2.2 Meu programa trava .........................................................173 A.2.3 Quando eu executo o programa eu recebo uma exceo 175 A.2.4 Eu adicionei tantas declaraes print que fiquei inundado coma sada .................................................................................176 A.3 Erros de semntica ..........................................................177 A.3.1 Meu programa no funciona .............................................178 A.3.2 Eu tenho uma grande expresso cabeluda e ela no faz o que eu espero ............................................................................179 A.3.3 Eu tenho uma funo ou mtodo que no devolve o que eu espero ........................................................................................180

A.3.4 Eu estou empacado mesmo e eu preciso de ajuda ..........180 A.3.5 No, eu preciso mesmo de ajuda ......................................181 byte code ...................................................................................181

PrefcioPorJeffElkner EstelivrodevesuaexistnciacolaboraotornadapossvelpelaInternete pelo movimento do software livre. Seus trs autores, um professor universitrio,umsecundrioeumprogramadorprofissional?aindanose encontraram pessoalmente, mas temos podido trabalhar bem de perto e temossidoajudadospormuitoscolegasmaravilhososquetmdedicadoseu tempoeenergiaaajudarafazerdesteumlivrocadavezmelhor. Achamos que este livro um testemunho dos benefcios e possibilidades futurasdestetipodecolaborao,cujomodelotemsidocolocadoporRichard StallmanepelaFreeSoftwareFoundation.

Como e porque eu vim a usar PythonEm1999,oExamedeColocaoAvanadaemCinciadaComputaoda Comisso de Faculdades (College Board's Advanced Placement (AP) Computer Science XXX) foi aplicado em C++ pela primeira vez. Como em muitasescolassecundriasatravsdopas,adecisodemudarlinguagens teveumimpactodiretonocurrculodecinciadacomputaonaYorktown High School em Arlington, Virginia, onde leciono. At ento, Pascal era a linguagemdidticaparanossoscursosdeprimeiroanoeavanado.Mantendo a prtica corrente dedar aos estudantes dois anos deexposio mesma linguagem,tomamosadecisodemudarparaC++nocursodeprimeiroano paraoanoletivode199798demodoqueestaramosemsincronismocoma mudanadaComissodeFaculdades(CollegeBoard?sXXX)emrelaoao cursoavanado(APXXX)paraoanoseguinte. Doisanosdepois,euestavaconvencidoqueC++foiumaescolhainfelizpara introduzirosalunosemcinciadacomputao.Aomesmotempoemque certamenteumalinguagemdeprogramaomuitopoderosa,tambmuma linguagemextremamentedifcildeaprenderedeensinar.Eumeencontrava constantementelutandocomasintaxedifcildoC++easmltiplasmaneiras defazeramesmacoisa,eestava,comoresultado,perdendomuitosalunos desnecessariamente. Convencido de que deveria existir uma linguagem melhorparaanossaclassedeprimeiroano,fuiprocurarporumaalternativa

aoC++. Euprecisavadeumalinguagemquepudesserodarnasmquinasemnosso laboratrio Linux bem como nas plataformas Windows e Macintosh que a maioria dos alunos tinha em casa. Eu precisava que ela fosse gratuita e disponvel eletronicamente, assim os alunos poderiam utilizla em casa independentemente de suas rendas. Eu queria uma linguagem que fosse utilizadaporprogramadoresprofissionais,equetivesseumacomunidadede desenvolvimento ativa em torno dela. Ela teria que suportar ambas, programaoproceduraleorientadaaobjetos.E,maisimportante,deveria serfcildeaprenderedeensinar.Quandoconsidereiasalternativastendo em mente aquelas metas, Python sobressaiuse como a melhor candidata paraatarefa. Pedi para um dos talentosos estudantes de Yorktown, Matt Ahrens, que experimentasse Python. Em dois meses ele no s aprendeu a linguagem comotambmescreveuumaaplicaochamadapyTicketquepossibilitou nossaequipereportarproblemasdetecnologiapelaWeb.EusabiaqueMatt nopoderiaterfinalizadoumaaplicaodaqueleporteemperodotocurto emC++,estarealizao,combinadacomaavaliaopositivadoPythondada porMatt,sugeriamquePythoneraasoluoqueeuestavaprocurando.

Encontrando um livro textoTendo decididousarPythonemambasasminhas classes introdutriasde cinciadacomputaodoanoseguinte,oproblemamaisurgenteeraafalta deumlivrotextodisponvel. O contedo livre veio em socorro. Anteriormente naquele ano, Richard StallmantinhameapresentadoaAllenDowney.Amboshavamosescritoa Richard expressando interesse em desenvolver contedo educacional livre. Allen j tinha escrito um livro texto para o primeiro ano de cincia da computao, HowtoThinkLikeaComputerScientist.Quandoliestelivro, soube imediatamente que queria utilizlo nas minhas aulas. Era o texto mais claro e proveitoso em cincia da computao que eu tinha visto. Ele enfatizava o processo de reflexo envolvido em programao em vez de caractersticas de uma linguagem em particular. Llo fez de mim imediatamenteummelhorprofessor. O HowtoThinkLikeaComputerScientist eranosumexcelentelivro, comotambmforalanadosobumalicenapblicaGNU,oquesignificava

que ele poderia ser usado livremente e modificado para atender as necessidadesdeseuusurio.UmavezqueeuhaviadecididousarPython,me ocorreuqueeupoderiatraduziraversooriginaldolivrodeAllendoJava para a nova linguagem. Apesar de no estar capacitado para escrever eu mesmoumlivrotexto,tendoolivrodeAllenapartirdoqualtrabalhartornou possvelparamimfazlo,aomesmotempodemonstrandoqueomodelode desenvolvimentocooperativotobemutilizadoemsoftwarepoderiatambm funcionarparacontedoeducacional. Trabalharnestelivropelosltimosdoisanostemsidorecompensadorpara mimemeusalunos,eelestiveramumgrandepapelnesteprocesso.Apartir domomentoemqueeupodiafazermudanasinstantneasassimquealgum encontrasse um erro ortogrfico ou um trecho difcil, eu os encorajei a procurarporerrosnolivro,dandoaelespontosdebonificaocadavezque elesfizessemumasugestoqueresultasseemumamudananotexto.Isto teveoduplobenefciodeencorajlosalerotextomaiscuidadosamenteede ter o texto totalmente revisado por seus crticos mais importantes: alunos utilizandooparaaprendercinciadacomputao. Paraasegundametadedolivro,sobreprogramaoorientadaaobjetos,eu sabiaqueseriaprecisoalgumcomumamaiorexperinciadoqueaminha em programao real para fazlo corretamente. O livro esteve em estado inacabado por quase um ano at que a comunidade de software livre providenciassemaisumavezosmeiosnecessriosparasuaconcluso. EurecebiumemaildeChrisMeyersmostrandointeressenolivro.Chris umprogramadorprofissionalquecomeouadarumcursodeprogramaono anoanteriorusandoPythonnoLaneCommunityCollegeemEugene,Oregon. AperspectivadedaraquelecursoligouChrisaolivro,eelecomeouaajudar otrabalhoimediatamente.Pelofinaldoanoletivoeletinhacriadoumprojeto colaborativo em nosso Website em http://www.ibiblio.org/obp chamado PythonforFun eestavatrabalhandocomalgunsdosmeusalunos mais avanados como um guru (master teacher XXX), guiandoos alm de ondeeupoderialevlos.

Introduzindo programao com PythonOprocessodetraduzireutilizar HowtoThink LikeaComputer Scientist pelosltimosdoisanostemconfirmadoaconveninciadePythonnoensino de alunos iniciantes. Python simplifica tremendamente os programas exemploetornaidiasimportantesdeprogramaomaisfceisdeensinar.

Oprimeiroexemplodotextoilustraesteponto.otradicionalprogramaAl mundo,doqualnaversoC++dolivroseparececomisto:#include void main() { cout > print 1 + 1 2

A primeira linha deste exemplo o comando que inicia o interpretador Python.Astrslinhasseguintessomensagensdointerpretador.Aquarta linhacomeacom >>>,queosinalusadopelointerpretadorparaindicar que ele est pronto. No exemplo anterior, digitamos print 1 + 1 e o interpretadorrespondeu2. Voc tambm pode escrever um programa em um arquivo e usar o interpretadorparaexecutarocontedodessearquivo.Umarquivocomoeste chamadodescript.Porexemplo,usamosumeditordetextoparacriarum arquivochamadoleticia.pycomoseguintecontedo:print 1 + 1

Porconveno, arquivosquecontenhamprogramasemPythontmnomes queterminamcom.py. Paraexecutaroprograma,temosdedizeraointerpretadoronomedoscript:$ python leticia.py 2

Em outros ambientes de desenvolvimento, os detalhes da execuo de programaspodemserdiferentes.Almdisso,amaioriadosprogramasso maisinteressantesdoqueesse... A maioria dos exemplos neste livro so executados a partir da linha de comando. Trabalhar com a linha de comando conveniente no desenvolvimento e testagem de programas, porque voc pode digitar os programaseexecutlosimediatamente.Umavezquevoctemumprograma quefunciona,deveguardloemumscript,deformaapoderexecutloou modificlonofuturo.

1.2 O que um programa?Umprogramaumaseqnciadeinstruesqueespecificamcomoexecutar umacomputao.Acomputaopodeseralgomatemtico,comosolucionar um sistema de equaes ou encontrar as razes de um polinmio, mas tambmpodeserumacomputaosimblica,comobuscaresubstituiruma

palavraemumdocumentoou(estranhamente)compilarumprograma. Osdetalhessodiferentesemdiferenteslinguagens,masalgumasinstrues bsicasaparecemempraticamentetodasaslinguagens: entrar Pegar dados do teclado, de um arquivo ou de algum outro dispositivo. sair Mostrar dados na tela ou enviar dados para um arquivo ou outro dispositivo. calcular Executar operaes matemticas bsicas, como adio e multiplicao. executar condicionalmente Checar certas condies e executar a seqncia apropriada de instrues. repetir Executar alguma ao repetidamente, normalmente com alguma variao. Acreditesequiser:issopraticamentetudo.Todososprogramasquevocj usou,noimportaquocomplicados,sofeitosdeinstruesmaisoumenos parecidascomessas.Assim,poderamosdefinirprogramaocomooprocesso dedividirumatarefagrandeecomplexaemsubtarefascadavezmenores, atqueassubtarefassejamsimplesosuficienteparaseremexecutadascom umadessasinstruesbsicas. Isso pode parecer um pouco vago, mas vamos voltar a esse tpico mais adiante,quandofalarmossobrealgoritmos.

1.3 O que depurao (debugging)?Programar um processo complicado e, como feito por seres humanos, freqentementeconduzaerros.Pormerocapricho,errosemprogramasso chamadosde bugs eoprocessodeencontrlosecorrigiloschamadode depurao(debugging). Trstiposdeerropodemaconteceremumprograma:errosdesintaxe,erros emtempodeexecuo(runtimeerrors)eerrosdesemntica.Distinguiros trstiposajudaalocalizlosmaisrpido: 1.3.1 Erros de sintaxe Pythonsexecutaumprogramaseeleestiversintaticamentecorreto;caso contrrio, o processo falha e retorna uma mensagem de erro. Sintaxe se refere estrutura de um programa e s regras sobre esta estrutura. Por exemplo,emportugus,umafrasedevecomearcomumaletramaisculae terminarcomumponto. estafrasecontmumerrodesintaxe.Assimcomoesta Paraamaioriadosleitores,unserrinhosdesintaxenochegamaserum problemasignificativoeporissoqueconseguimoslerapoesiamodernadee. e.cummingssemcuspirmensagensdeerro.Pythonnotoindulgente.Se o seu programa tiver um nico erro de sintaxe em algum lugar, o interpretadorPythonvaiexibirumamensagemdeerroevaiterminareo programanovairodar.Duranteasprimeirassemanasdasuacarreiracomo programador,vocprovavelmenteperderumbocadodetempoprocurando errosdesintaxe.Conformeforganhandoexperincia,entretanto,cometer menoserroseoslocalizarmaisrpido. 1.3.2 Erros em tempo de execuo (runtime errors) Osegundotipodeerrooerrode runtime,ouerroemtempodeexecuo, assimchamadoporquesaparecequandovocrodaoprograma.Esseserros sotambm conhecidos como excees,porque normalmenteindicam que algumacoisaexcepcional(eruim)aconteceu. Erros de runtime so raros nos programas simples que voc vai ver nos primeiroscaptulosento,vaidemorarumpoucoatvocsedepararcom

umerrodessetipo. 1.3.3 Erros de semntica Oterceirotipodeerroo errodesemntica (maiscomumentechamado errodelgica).Mesmoqueoseuprogramatenhaumerrodesemntica,ele vai rodar com sucesso, no sentido de que o computador no vai gerar nenhumamensagemdeerro.Squeoprogramanovaifazeracoisacerta, vaifazeralgumaoutracoisa.Especificamente,aquiloquevoctiverditopara elefazer. Oproblemaqueoprogramaquevocescreveunoaquelequevocqueria escrever.Osignificadodoprograma(suasemnticaoulgica)esterrado. Identificar erros semnticos pode ser complicado, porque requer que voc trabalhe de trs para frente, olhando a sada do programa e tentando imaginaroqueeleestfazendo. 1.3.4 Depurao experimental (Debugging) Umadashabilidadesmaisimportantesquevocvaiadquiriradedepurar. Embora possa ser frustrante, depurar uma das partes intelectualmente maisricas,desafiadoraseinteressantesdaprogramao. De certa maneira, a depurao como um trabalho de detetive. Voc se deparacompistas,etemquededuzirosprocessoseeventosquelevaramaos resultadosqueaparecem. Depurartambmcomoumacinciaexperimental.Umavezquevoctem umaidiadoqueesterrado,vocmodificaoseuprogramaetentadenovo. Seasuahipteseestavacorreta,entovocconseguepreveroresultadoda modificaoeficaumpassomaispertodeumprogramaquefunciona.Sea suahipteseestavaerrada,voctemquetentarumanova.ComoSherlock Holmes mostrou, "Quando voc tiver eliminado o impossvel, aquilo que restou,aindaqueimprovvel,deveseraverdade."(ArthurConanDoyle, O signodosquatro). Paraalgumaspessoas,programaoedepuraosoamesmacoisa.Ouseja, programaroprocessodegradualmentedepurarumprograma,atqueele faaoquevocquer.Aidiacomearcomumprogramaquefaa alguma coisaeirfazendopequenasmodificaes,depurandoasconformeavana,de modoquevoctenhasempreumprogramaquefunciona.

Por exemplo, o Linux um sistema operacional que contm milhares de linhas de cdigo, mas comeou como um programa simples, que Linus Torvalds usou para explorar o chip Intel 80386. De acordo com Larry Greenfield,"UmdosprimeirosprojetosdeLinusTorvaldsfoiumprograma quedeveriaalternarentreimprimirAAAAeBBBB.Issodepoisevoluiuato Linux".(TheLinuxUser'sGuideVersoBeta1) Captulosposterioresfaromaissugestessobredepuraoeoutrasprticas deprogramao.

1.4 Linguagens naturais e linguagens formaisLinguagens naturais so as linguagens que as pessoas falam, como o portugus, o ingls eoespanhol.Elas no foram projetadaspelaspessoas (muito embora as pessoas tentem colocar alguma ordem nelas); elas evoluramnaturalmente. Linguagensformaissolinguagensqueforamprojetadasporpessoas,para aplicaes especficas.Por exemplo, a notao queos matemticos usam umalinguagemformal,queparticularmenteboaemdenotarrelaesentre nmeros e smbolos. Os qumicos usam uma linguagem formal para representaraestruturaqumicadasmolculas.E,maisimportante: Linguagens de programao so linguagens formais que foram desenvolvidas para expressar computaes. As linguagens formais tendem a ter regras estritas quanto sintaxe. Por exemplo,3+3=6umaexpressomatemticasintaticamentecorreta,mas 3=+6$no.H2Oumnomequmicosintaticamentecorreto,mas2Zzno. Asregrasdesintaxesodedoistipos,umrelacionadoaos tokens,outro estrutura."Tokens"sooselementosbsicosdalinguagem,comoaspalavras, nmeros,eelementosqumicos.Umdosproblemascom3=+6$que$no um token vlidoemlinguagemmatemtica(pelomenosatondesabemos). Do mesmomodo, 2Zz invlidaporquenoexistenenhum elementocuja abreviaturasejaZz. O segundo tipo de erro de sintaxe est relacionado estrutura de uma expressoquerdizer,aomodocomoostokensestoarrumados.Aexpresso

3=+6$estruturalmenteinvlida,porquevocnopodecolocarumsinalde "mais"imediatamenteapsumsinalde"igual".Domesmomodo,frmulas moleculares devem ter ndices subscritos colocados depois do nome do elemento,noantes. Faa este exerccio: crie o que parea ser uma frase bem estruturada em portugus com "tokens" irreconhecveis dentro dela. Depois escreva outra frase com todos os "tokens" vlidos, mas com uma estrutura invlida. Quando voc l uma frase em portugus ou uma expresso em uma linguagemformal,voctemdeimaginarcomoaestruturadafrase(embora, emumalinguagemnatural,vocfaaissoinconscientemente).Esteprocesso chamadoparsing(anlisesinttica). Porexemplo,quandovocouveafrase,"Caiuaficha",entendeque"aficha" o sujeito e "caiu" o verbo. Uma vez que voc analisou a frase, consegue entender o seu significado, ou a semntica da frase. Assumindo que voc saibaoqueumafichaeoquesignificacair,vocentenderosentidogeral dessafrase. Muito embora as linguagens formais e as naturais tenham muitas caractersticasemcomumtokens,estrutura,sintaxeesemnticaexistem muitasdiferenas: ambigidade As linguagens naturais esto cheias de ambigidades, que as pessoas contornam usando pistas contextuais e outras informaes. J as linguagens formais so desenvolvidas para serem quase ou totalmente desprovidas de ambigidade, o que significa que qualquer expresso tem precisamente s um sentido, independentemente do contexto. redundncia Para compensar a ambigidade e reduzir mal-entendidos, emprega-se muita redundncia nas linguagens naturais, o que freqentemente as torna prolixas. As linguagens formais so menos redundantes e mais concisas. literalidade As linguagens naturais esto cheias de expresses idiomticas e metforas. Se eu digo "Caiu a ficha", possvel que no exista ficha nenhuma, nem nada que tenha cado. Nas linguagens formais, no h sentido ambguo.

Pessoasquecrescemfalandoumalinguagemnaturalouseja,todomundo muitasvezestmdificuldadedeseacostumarcomumalinguagemformal.De certa maneira, a diferena entre linguagens formais e naturais como a diferenaentrepoesiaeprosa,pormmaisacentuada: poesia As palavras so usadas pela sua sonoridade, alm de seus sentidos, e o poema como um todo cria um efeito ou uma reao emocional. A ambigidade no apenas freqente, mas na maioria das vezes, proposital. prosa O sentido literal das palavras mais importante, e a estrutura contribui mais para o significado. A prosa mais fcil de analisar do que a poesia, mas ainda muitas vezes ambgua. programas O significado de um programa de computador exato e literal, e pode ser inteiramente entendido pela anlise de seus tokens e de sua estrutura. Aqui vo algumas sugestes para a leitura de programas (e de outras linguagens formais). Primeiro, lembrese de que linguagens formais so muitomaisdensasdoquelinguagensnaturais,porisso,maisdemoradol las.Aestrutura,tambm,muitoimportante,logo,geralmentenouma boaidialerdecimaparabaixo,daesquerdaparaadireita.Emvezdisso, aprenda a analisar o programa na sua cabea, identificando os tokens e interpretando a estrutura. Finalmente, os detalhes so importantes. Pequenascoisas,como,errosortogrficosempontuao,comasquaisvoc podesesafarnaslinguagensnaturais,podemfazerumagrandediferenaem umalinguagemformal.

1.5 O primeiro programaTradicionalmente,oprimeiroprogramaescritoemumanovalinguagemde programao chamado de "Al, Mundo!" porque tudo que ele faz apresentaraspalavras"Al,Mundo!".EmPython,eleassim:print "Al, Mundo!"

Issoumexemplodeumcomandoprint,que,narealidade,no"imprime" nadaempapel.Eleapresentaovalornatela.Nestecaso,oresultadosoas palavras:Al, Mundo!

Asaspasnoprogramamarcamocomeoeofimdovalor;elasnoaparecem noresultadofinal. Algumaspessoasjulgamaqualidadedeumalinguagemdeprogramaopela simplicidadedoprograma"Al,Mundo!".Poressepadro,Pythonsesaito bemquantopossvel.

1.6 Glossriosoluo de problemas (problem solving) O processo de formular um problema, encontrar uma soluo e expressar esta soluo. linguagem de alto nvel (high-level language) Uma linguagem de programao como Python: projetada para ser fcil para os seres humanos a utilizarem. linguagem de baixo nvel (low-level language) Uma linguagem de programao que concebida para ser fcil para um computador, tal como a linguagem de mquina ou a linguagem montagem (assembly language) portabilidade (portability) Propriedade que um programa tem, de rodar em mais de um tipo de computador. interpretar (interpret) Executar um programa escrito em uma linguagem de alto nvel, traduzindo-o uma linha de cada vez. compilar (compile) Traduzir todo um programa escrito em uma linguagem de alto nvel para uma de baixo nvel de um s vez, em preparao para uma execuo posterior. cdigo fonte (source code) Um programa em uma linguagem de alto nvel, antes de ter sido compilado. cdigo objeto (object code) A sada do compilador, depois que ele traduziu o programa. executvel (executable) Um outro nome para cdigo objeto que est pronto para ser executado. script Um programa guardado em um arquivo (normalmente um que ser interpretado). programa (program) Conjunto de instrues que especifica uma computao. algoritmo (algorithm) Processo geral para soluo de uma certa categoria de problemas.

bug Erro em um programa. depurao (debugging) O processo de encontrar e remover qualquer um dos trs tipos de erros de programao. sintaxe (syntax) A estrutura de um programa. erro de sintaxe (syntax error) Erro em um programa, que torna impossvel a anlise sinttica (logo, tambm impossvel a interpretao). erro em tempo de execuo (runtime error) Erro que no ocorre at que o programa seja executado, mas que impede que o programa continue. exceo (exception) Um outro nome para um erro em tempo de execuo ou erro de runtime. erro de semntica (semantic error) Erro em um programa, que o leva a fazer algo diferente do que pretendia o programador. semntica (semantics) O significado de um programa. linguagem natural (natural language) Qualquer lngua falada pelos seres humanos que tenha evoludo naturalmente. linguagem formal (formal language) Qualquer linguagem desenvolvida pelas pessoas para propsitos especficos, tais como, a representao de idias matemticas ou programas de computadores; todas as linguagens de programao so linguagens formais. tomo (token) Um elemento bsico da estrutura sinttica de um programa, anlogo a uma palavra em uma linguagem natural. anlise sinttica (parse) Examinar um programa e analisar sua estrutura sinttica. comando print (`print` statement) Instruo que leva o interpretador Python a apresentar um valor na tela.

Captulo 2: Variveis, expresses e comandosTpicos 2.1Valoresetipos 2.2Variveis 2.3Nomesdevariveisepalavrasreservadas 2.4Comandos 2.5Avaliandoexpresses 2.6Operadoreseoperandos 2.7Ordemdosoperadores 2.8Operaescomstrings 2.9Composio 2.11Glossrio

2.1 Valores e tiposOvalor(porexemplo,letrasenmeros)umadascoisasfundamentaisque umprogramamanipula.Osvaloresquejvimosatagoraforamo 2 (como resultado,quandoadicionamos1 + 1)e"Al, Mundo!". Esses valores pertencem a tipos diferentes: 2 um inteiro, e "Al, Mundo!"umastring,assimchamadaporque"string",emingls,querdizer seqncia,srie,cadeia(decaracteres),ounestecaso,"sriedeletras".Voc (eointerpretador)consegueidentificarstringsporqueelasaparecementre aspas.

Ocomandoprinttambmfuncionacominteiros:>>> print 4 4

Sevocestiveremdvidasobrequalotipodeumdeterminadovalor,o interpretadorpoderevelar:>>> type("Al, Mundo!") >>> type(17)

Nenhumasurpresa:stringspertencemaotipo string einteirospertencem aotipoint.Menosobviamente,nmeroscomumpontodecimalpertencema um tipo chamado float, porque estes nmeros so representados em um formatochamadopontoflutuante[1]:>>> type(3.2)

[1] N.T.:Observeousodepontonolugardavrgulaparaseparar aparteinteiradapartefracionria.

Oquedizerdevalorescomo"17"e"3.2"?Elesparecemnmeros,masesto entreaspas,comostrings:>>> type("17") >>> type("3.2")

Elessostrings. Aodigitarumnmerogrande,tentadorusarpontosentregruposdetrs dgitos,assim:1.000.000.IssonofuncionaporquePythonusaopontocomo separador decimal. Usar a vrgula, como se faz em ingls, resulta numa expressovlida,masnononmeroquequeramosrepresentar:>>> print 1,000,000 1 0 0

No nada do que se esperava! Python interpreta 1,000,000 como uma tupla,algoqueveremosnoCaptulo9.Porhora,lembreseapenasdeno colocarvrgulasnosnmeros.

2.2 VariveisUmadascaractersticasmaispoderosasdeumalinguagemdeprogramao ahabilidadedemanipularvariveis.Umavarivelumnomequeserefere aumvalor. Ocomandodeatribuiocrianovasvariveisedaelasvalores:>>> mensagem = "E a, Doutor?" >>> n = 17 >>> pi = 3.14159

Este exemplo faz trs atribuies. A primeira atribui a string "E a, Doutor?" aumanovavarivelchamada mensagem.Asegundadovalor inteiro 17 a n,eaterceiraatribuionmerodepontoflutuante 3.14159 varivelchamadapi. Umamaneiracomumderepresentarvariveisnopapelescreveronome delascomumasetaapontandoparaovalordavarivel.Essetipodefigura chamado de diagrama de estado porque mostra em que estado cada varivelest(pensenissocomooestadodeespritodavarivel).Odiagrama aseguirmostraoresultadodasinstruesdeatribuio:

Ocomandoprinttambmfuncionacomvariveis:>>> print mensagem E a, Doutor? >>> print n 17 >>> print pi 3.14159

Emcadaumdoscasos,oresultadoovalordavarivel.Variveistambm tmtipo;novamente,podemosperguntaraointerpretadorquaissoeles:>>> type(mensagem) >>> type(n) >>> type(pi)

Otipodeumavarivelotipodovaloraoqualelaserefere.

2.3 Nomes de variveis e palavras reservadasOs programadores geralmente escolhem nomes significativos para suas variveiselesdocumentamparaoquavarivelusada. Nomes de variveis podem ser arbitrariamente longos. Eles podem conter tantoletrasquantonmeros,mastmdecomearcomumaletra.Embora sejavlidaautilizaodeletrasmaisculas,porconveno,nousamos.Se vocofizer,lembresedequemaisculaseminsculassodiferentes.Bruno ebrunosovariveisdiferentes. Ocaractereparasublinhado( _ )podeapareceremumnome.Elemuito utilizado em nomes com mltiplas palavras, tal como em meu_nome ou preco_do_cha_na_china. Sevocderaumavarivelumnomeinvlido,causarumerrodesintaxe:>>> 76trombones = "grande parada" SyntaxError: invalid syntax >>> muito$ = 1000000 SyntaxError: invalid syntax >>> class = "Ciencias da Computacao 101" SyntaxError: invalid syntax

76trombones invlida porque no comea com uma letra. muito$ invlidaporquecontmumcaractereilegal,ocifro.Masoqueesterrado

comclass? Ocorre que class uma das palavras reservadas em Python. Palavras reservadasdefinemasregraseaestruturadalinguagemenopodemser usadascomonomesdevariveis. Pythontem29palavrasreservadas:and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while yield

Podesertilteressalistamo[2].Seointerpretadoracusarerrosobreum deseusnomesdevarivelevocnosouberporqu,vejaseonomeestna lista. N.T.:estalistapodeserobtidaatravsdoprpriointerpretador [2] Python,comapenasdoiscomandos: SystemMessage:WARNING/2(,line126) Literalblockexpected;nonefound. importkeywordprintkeyword.kwlist

2.4 ComandosUm comando uma instruo que o interpretador Python pode executar. Vimosatagoradoistiposdecomandos:deexibio(print)edeatribuio. Quandovocdigitaumcomandonalinhadecomando,oPythonoexecutae mostraoresultado,sehouverum.Oresultadodeumcomando print a exibiodeumvalor.Comandosdeatribuionoproduzemumresultado visvel. Umscriptnormalmentecontmumaseqnciadecomandos.Sehouvermais de um comando, os resultados aparecero um de cada vez, conforme cada comandosejaexecutado. Porexemplo,o"script":

print 1 x = 2 print 2

produzasada:1 2

Novamente,ocomandodeatribuionoproduzsada.

2.5 Avaliando expressesUmaexpressoumacombinaodevalores,variveiseoperadores.Sevoc digitarumaexpressonalinhadecomando,ointerpretadoravaliaeexibeo resultado:>>> 1 + 1 2

Embora expresses contenham valores, variveis e operadores, nem toda expressocontmtodosesteselementos.Umvalorporsisconsiderado umaexpresso,domesmomodoqueumavarivel:>>> 17 17 >>> x 2

Avaliarumaexpressonoexatamenteamesmacoisaqueimprimirum valor:>>> mensagem = "E a, Doutor?" >>> mensagem 'E a, Doutor?' >>> print mensagem E a, Doutor?

QuandoPythonexibeovalordeumaexpresso,usaomesmoformatoque vocusariaparaentrarcomovalor.Nocasodestrings,issosignificaqueas aspassoincludas[#]_.Masocomandoprintimprimeovalordaexpresso, que,nestecaso,ocontedodastring. Numscript,umaexpressosozinhaumcomandovlido,pormsemefeito. Oscript:17

3.2 "Al, Mundo!" 1 + 1

no produz qualquer sada. Como voc mudaria o "script" para exibir os valoresdestasquatroexpresses?

2.6 Operadores e operandosOperadores so smbolos especiais que representam computaes como adio e multiplicao. Os valores que o operador usa so chamados operandos. TodasasexpressesseguintessovlidasemPythoneseussignificadosso maisoumenosclaros:20+32 hora-1 hora*60+minuto minuto/60 5**2 (5+9)*(15-7)

EmPython,ossmbolos+,,/eousodeparntesesparaagrupamentotmo mesmo significado que em matemtica. O asterisco (*) o smbolo para multiplicaoe**osmboloparapotenciao. Quando um nome de varivel aparece no lugar de um operando, ele substitudopelovalordavarivel,antesdaoperaoserexecutada. Adio,subtrao,multiplicaoepotenciaofazemoqueseespera,mas vocpodeficarsurpresocomadiviso.Aoperaoseguintetemumresultado inesperado:>>> minuto = 59 >>> minuto/60 0

Ovalordeminuto59e,emaritmticaconvencional,59divididopor60 0,98333,no0.Arazoparaadiscrepncia quePythonestrealizando umadivisointeira. Quandoambososoperandossointeiros,oresultadotemdesertambmum inteiro e, por conveno, a diviso inteira sempre arredonda para baixo, mesmoemcasoscomoeste,emqueointeiroseguinteestmuitoprximo:>>> minuto*100/60 98

De novo, o resultado arredondado para baixo, mas agora pelo menos a respostaaproximadamentecorreta.Aalternativausaradivisoemponto flutuante,oqueveremosnocaptulo3.

2.7 Ordem dos operadoresQuando mais de um operador aparece em uma expresso, a ordem de avaliaodependedas regras de precedncia. Python segue as mesmas regrasdeprecednciaparaseusoperadoresmatemticosqueamatemtica. O acrnimo PEMDAS uma maneira prtica de lembrar a ordem das operaes: Parntesestmamaisaltaprecednciaepodemserusadosparaforar uma expresso a ser avaliada na ordem que voc quiser. J que expressesentreparntesessoavaliadasprimeiro,2 * (3-1)4,e (1+1)**(5-2) 8.Voc tambmpodeusarparnteses para tornar umaexpressomaisfcildeler,comoem (minuto * 100) / 60, aindaqueissonoaltereoresultado. Exponenciaooupotenciaotemaprximaprecedncia maisalta, assim2**1+13eno4,e3*1**33eno27. MultiplicaoeDivisotmamesmaprecedncia,quemaisaltado que a da Adio e da Subtrao, que tambm tm a mesma precedncia. Assim 2*3-1 d 5 em vez de 4, e 2/3-1 -1, no 1 (lembresedequenadivisointeira,2/3=0). Operadorescomamesmaprecednciasoavaliadosdaesquerdapara a direita. Assim, na expresso minuto*100/60, a multiplicao acontece primeiro, resultando em 5900/60, o que se transforma produzindo98.Seasoperaestivessemsidoavaliadasdadireitapara a esquerda, o resultado poderia ter sido 59*1, que 59, que est errado.

2.8 Operaes com stringsDemaneirageral,vocnopodeexecutaroperaesmatemticasemstrings, ainda que as strings se paream com nmeros. O que segue invlido (assumindoquemensagemdotipostring):mensagem-1 "Al"/123 mensagem*"Al" "15"+2

Interessanteooperador +,quefuncionacomstrings,emboraelenofaa exatamenteoquevocpoderiaesperar.Parastrings,ooperador+representa concatenao, que significa juntar os dois operandos ligandoos pelos extremos.Porexemplo:fruta = "banana" assada = " com canela" print fruta + assada

Asadadesteprogramabanana com canela.Oespaoantesdapalavra compartedastringenecessrioparaproduziroespaoentreasstrings concatenadas. O operador * tambm funciona com strings; ele realiza repetio. Por exemplo,"Legal"*3"LegalLegaLegal".Umdosoperadorestemqueser umastring;ooutrotemqueseruminteiro. Por um lado, esta interpretao de + e * faz sentido pela analogia entre adioemultiplicao.Assimcomo4*3equivalea4+4+4,nodeestranhar que "Legal"*3 sejaomesmoque "Legal"+"Legal"+"Legal".Poroutro lado,umadiferenasignificativaseparaconcatenaoerepetiodeadioe multiplicao. Voc saberia mencionar uma propriedade da adio e da multiplicaoquenoocorrenaconcatenaoenarepetio?

2.9 ComposioAtagora, vimos os elementosdeum programa variveis, expresses,e instruesoucomandosisoladamente,semmencionarcomocombinlos. Umadascaractersticasmaisprticasdaslinguagens deprogramaoa possibilidadedepegarpequenosblocosecombinlosnumacomposio.Por exemplo, ns sabemos como somar nmeros e sabemos como exibilos; acontecequepodemosfazerasduascoisasaomesmotempo:>>> print 17 + 3 20

Narealidade,asomatemqueacontecerantesdaimpresso,assim,asaes noestonarealidadeacontecendoaomesmotempo.Opontoquequalquer expressoenvolvendonmeros,strings,evariveispodeserusadadentrode umcomandoprint.Vocjtinhavistoumexemplodisto:print "Nmero de minutos desde a meia-noite: ", hora*60+minuto

Estapossibilidadepodenoparecermuitoimpressionanteagora,masvoc ver outros exemplos em que a composio torna possvel expressar computaescomplexasdemodolimpoeconciso. Ateno:Existemlimitesquantoaolugarondevocpodeusarcertostiposde expresso.Porexemplo,oladoesquerdodeumcomandodeatribuiotem queserumnomedevarivel,enoumaexpresso.Assim,oseguinteno vlido:minuto+1 = hora.

2.11 Glossriovalor (value) Um nmero ou string (ou outra coisa que ainda vamos conhecer) que pode ser atribuda a uma varivel ou computada em uma expresso. tipo (type) Um conjunto de valores. O tipo de um valor determina como ele pode ser usado em expresses. At agora, os tipos vistos so: inteiros (tipo int), nmeros em ponto-flutuante (tipo float) e strings (tipo string). ponto-flutuante (floating-point) Formato para representar nmeros que possuem partes fracionrias. varivel (variable) Nome que se refere a um valor. comando (statement) Trecho de cdigo que representa uma instruo ou ao. At agora, os comandos vistos foram de atribuio e exibio. atribuio (assignment) Comando que atribui um valor a uma varivel. diagrama de estado (state diagram) Representao grfica de um conjunto de variveis e os valores aos quais elas se referem. palavra-chave (keyword) Palavra reservada usada pelo compilador para analisar o programa; voc no pode usar palavras-chave como if, def, e while como nomes de variveis. operador (operator) Smbolo especial que representa uma computao simples, como adio, multiplicao ou concatenao de strings. operando (operand) Um dos valores sobre o qual o operador opera. expresso (expression) Combinao de variveis, operadores e valores, que representa

um resultado nico. avaliar (evaluate) Simplificar uma expresso atravs da realizao de operaes, para produzir um valor nico. diviso inteira (integer division) Operao que divide um inteiro por outro e resulta em um inteiro. A diviso inteira resulta no nmero de vezes que o numerador divisvel pelo denominador e descarta qualquer resto. regras de precedncia (rules of precedence) O conjunto de regras que governa a ordem em que expresses envolvendo mltiplos operadores e operandos so avaliadas. concatenar (concatenate) Juntar dois operandos lado a lado. composio (composition) Habilidade de combinar expresses e comandos simples em expresses e comandos compostos, de forma a representar computaes complexas de forma concisa. comentrio (comment) Informao em um programa dirigida a outros programadores (ou qualquer pessoa que esteja lendo o cdigo fonte) e que no tem efeito na execuo do programa.

Captulo 3: FunesTpicos 3.1Chamadasdefunes 3.2Conversoentretipos 3.3Coeroentretipos 3.4Funesmatemticas 3.5Composio 3.6Adicionandonovasfunes 3.7Definieseuso 3.8Fluxodeexecuo 3.9Parmetroseargumentos 3.10Variveiseparmetrossolocais 3.11Diagramasdapilha 3.12Funescomresultados 3.13Glossrio

3.1 Chamadas de funesVocjviuumexemplodeumachamadadefuno:>>> type('32')

Onomedafunotypeeelaexibeotipodeumvalorouvarivel.Ovalor ou varivel, que chamado de argumento da funo, tem que vir entre parnteses.comumsedizerqueumafuno'recebe'umvalore'retorna' umresultado.Oresultadochamadodevalorderetorno.

Emvezdeimprimirumvalorderetorno,podemosatribuiloaumavarivel:>>> bia = type('32') >>> print bia

Comooutroexemplo,afunoidrecebeumvalorouumavariveleretorna uminteiro,queatuacomoumidentificadornicoparaaquelevalor:>>> id(3) 134882108 >>> bia = 3 >>> bia(beth) 134882108

Todovalortemumid,queumnmeronicorelacionadoaolocalondeele estguardadonamemriadocomputador.O id deumavarivelo id do valoraqualelaserefere.

3.2 Converso entre tiposPythonprovumacoleodefunesnativasqueconvertemvaloresdeum tipoemoutro.Afuno int recebeumvaloreoconverteparainteiro,se possvel,ou,seno,reclama:>>> int('32') 32 >>> int('Al') ValueError: invalid literal for int() : Al

int tambm pode converter valores em ponto flutuante para inteiro, mas lembrequeissotruncaapartefracionria:>>> int(3.99999) 3 >>> int(-2.3) -2

Afunofloatconverteinteirosestringsemnmerosempontoflutuante:>>> float(32) 32.0 >>> float('3.14159') 3.14159

Finalmente,afunostrconverteparaotipostring:>>> str(32) '32'

>>> str(3.14149) '3.14149'

PodeparecercuriosoquePythonfaadistinoentreovalorinteiro 1 eo valorempontoflutuante1.0.Elespodemrepresentaromesmonmero,mas pertencematiposdiferentes.Arazoqueelessorepresentadosdemodo diferentedentrodocomputador.

3.3 Coero entre tiposAgoraquepodemosconverterentretipos,temosoutramaneiradelidarcoma diviso inteira. Voltando ao exemplo do captulo anterior, suponha que queiramoscalcularafraodehoraquejpassou.Aexpressomaisbvia, minuto / 60,fazaritmticainteira,assim,oresultadosempre0,mesmo aos59minutospassadosdahora. Umasoluoconverter minuto parapontoflutuanteefazeradivisoem pontoflutuante:>>> minuto = 59 >>> float(minuto) / 60 0.983333333333

Opcionalmente,podemostirarvantagemdasregrasdeconversoautomtica entretipos,chamadadecoerodetipos.Paraosoperadoresmatemticos, sequalqueroperandoforum float,ooutroautomaticamenteconvertido parafloat:>>> minuto = 59 >>> minuto / 60.0 0.983333333333

Fazendoodenominadorum float,foramosoPythonafazeradivisoem pontoflutuante.

3.4 Funes matemticasEmmatemtica,vocprovavelmentejviufunescomoseno(sin)elog,e aprendeuaresolverexpressescomosin(pi/2)elog(1/x).Primeirovoc resolve e expresso entre parnteses (o argumento). Por exemplo, pi/2 aproximadamente1,571,e1/x0.1(sexfor10,0). Avocavaliaafunopropriamentedita,sejaprocurandonumatabelaou

realizandovriosclculos.Osinde1,5711eologde0,11(assumindo quelogindicaologaritmonabase10). Esteprocessopodeseraplicadorepetidamenteparaavaliarexpressesmais complicadas,comolog(1/sin(pi/2)).Primeirovocavaliaoargumentona funomaisinterna,depoisavaliaafunoeassimpordiante. Python tem um mdulo matemtico que prov a maioria das funes matemticasmais familiares.Um mdulo um arquivoquecontmuma coleodefunesrelacionadasagrupadasjuntas. Antes de podermos usar as funes contidas em um mdulo, temos de importlo:>>> import math

Parachamarumadasfunes,temosqueespecificaronomedomduloeo nome da funo, separados por um ponto. Esse formato chamado de notaodeponto:>>> decibel = math.log10(17.0) >>> angulo = 1.5 >>> altura = math.sin(angulo)

Aprimeirainstruoatribuiadecibelologaritmode17nabase10.Existe tambmumafunochamadalog,quepegaologaritmonabasee. Aterceirainstruoencontraosenodovalordavarivel angulo. sin eas outras funes trigonomtricas (cs, tan, etc.) recebem argumentos em radianos.Paraconverterdegrausemradianos,dividapor360emultiplique por2*pi.Porexemplo,paraencontrarosenode45graus,primeirocalculeo nguloemradianosedepoisacheoseno:>>> graus = 45 >>> angulo = graus * 2 * math.pi / 360.0 >>> math.sin(angulo) 0.707106781187

Aconstantepitambmpartedomdulomath.Sevocsabegeometria,pode checar o resultado anterior comparandoo com a raiz quadrada de dois divididopordois:>>> math.sqrt(2) / 2.0 0.707106781187

3.5 ComposioDomesmomodocomonasfunesmatemticas,asfunesdoPythonpodem sercompostas,oquesignificaquevocpodeusarumaexpressocomoparte de outra. Por exemplo, voc pode usar qualquer expresso como um argumentoparaumafuno:>>> x = math.cos(angulo + pi/2)

Estainstruotomaovalordepi,divideopor2,esomaoresultadoaovalor deangulo.Asomaentopassadacomoumargumentoparaafunocos. Voc tambm pode pegar o resultado de uma funo e passlo como um argumentoparaoutra:>>> x = math.exp(math.log(10.0))

Esta instruo encontra o logaritmo base e de 10 e ento eleva e quela potncia.Oresultadoatribudoax.

3.6 Adicionando novas funesAt aqui, temos utilizado somente as funes que vm com Python, mas tambmpossveladicionarnovasfunes.Criarnovasfunespararesolver seusprpriosproblemasumadascoisasmaisteisdeumalinguagemde programaodepropsitogeral. Nocontextodeprogramao,funoumaseqncianomeadadeinstrues ou comandos, que realizam uma operao desejada. Esta operao especificadanuma definiodefuno.Atagora,asfunesqueusamos nestelivrosoprdefinidasesuasdefiniesnoforamapresentadas.Isso demonstra que podemos usar funes sem ter que nos preocupar com os detalhesdesuasdefinies. Asintaxeparaumadefiniodefuno:def NOME( LISTA DE PARAMETROS ) : COMANDOS

Voc pode usar o nome que quiser para as funes que criar, exceto as palavras reservadas do Python. A lista de parmetros especifica que informao,sehouveralguma,voctemquefornecerparapoderusaranova funo.

Umafunopodeterquantoscomandosforemnecessrios,maselesprecisam ser endentados a partir da margem esquerda. Nos exemplos deste livro, usaremosumaendentaodedoisespaos. As primeiras funes que vamos mostrar no tero parmetros, ento, a sintaxeterestaaparncia:def novaLinha(): print

EstafunochamadadenovaLinha.Osparntesesvaziosindicamqueela notemparmetros.Contmapenasumnicocomando,quegeracomosada um caractere de nova linha (isso o que acontece quando voc usa um comandoprintsemqualquerargumento). A sintaxe para a chamada desta nova funo a mesma sintaxe para as funesnativas:print 'Primeira Linha.' novaLinha() print 'Segunda Linha.'

Asadadesteprograma:Primeira Linha. Segunda Linha.

Observeoespaoextraentreasduaslinhas.Esequisssemosmaisespao entreaslinhas?Poderamoschamaramesmafunorepetidamente:print 'Primeira Linha.' novaLinha() novaLinha() novaLinha() print 'Segunda Linha.'

Ou poderamos escrever uma nova funo chamada tresLinhas, que produzissetrsnovaslinhas:def tresLinhas() : novaLinha() novaLinha() novaLinha() print 'Primeira Linha.' tresLinhas() print 'Segunda Linha.'

Estafunocontmtrscomandos,todoscomrecuodedoisespaosapartir damargemesquerda.Jqueoprximocomandonoestendentado,Python reconhecequeelenofazpartedafuno. Algumascoisasquedevemserobservadassobreesteprograma: 1. Vocpodechamaromesmoprocedimentorepetidamente.Issomuito comum,almdetil. 2. Voc pode ter uma funo chamando outra funo; neste caso tresLinhaschamanovaLinha. Podenoestarclaro,atagora,dequevaleoesforodecriarnovasfunes existemvriasrazes,masesteexemplodemonstraduasdelas:

Criarumanovafunopermitequevoccoloquenomeemumgrupode comandos.Asfunespodemsimplificarumprogramaaoocultaruma computaocomplexaportrsdeumsimplescomandocujonomepode serumapalavraemportugus,emvezdealgumcdigomisterioso. Criarumanovafunopodetornaroprogramamenor,poreliminar cdigo repetido. Por exemplo, um atalho para 'imprimir' nove novas

linhasconsecutivaschamartresLinhastrsvezes. Como exerccio, escreva uma funo chamada noveLinhas que use tresLinhas para imprimir nove linhas em branco. Como voc poderia imprimir vinte e sete novas linhas?

3.7 Definies e usoReunindo os fragmentosdecdigoda Seo3.6,oprograma completofica assim:def novaLinha() : print def tresLinhas() : novaLinha() novaLinha() novaLinha() print 'Primeira Linha.' tresLinhas() print 'Segunda Linha.'

Esse programa contm duas definies de funes: novaLinha e tresLinhas. Definies de funes so executadas como quaisquer outros comandos, mas o efeito criar a nova funo. Os comandos dentro da definiodafunonosoexecutadosatqueafunosejachamada,logo,a definiodafunonogeranenhumasada. Comovocjdeveterimaginado,precisocriarumafunoantesdepoder executla.Emoutraspalavras,adefiniodafunotemqueserexecutada antesqueelasejachamadapelaprimeiravez. Como exerccio, mova as ltimas trs linhas deste programa para o topo, de modo que a chamada da funo aparea antes das definies. Rode o programa e veja que mensagem de erro voc ter. Tambm a ttulo de exerccio, comece com a verso que funciona do programa e mova a definio de novaLinha para depois da definio de tresLinhas. O que acontece quando voc roda este programa?

3.8 Fluxo de execuoParaassegurarqueumafunoestejadefinidaantesdoseuprimeirouso, precisosaberemqueordemoscomandossoexecutados,oquechamadode fluxodeexecuo. A execuo sempre comea com o primeiro comando do programa. Os comandossoexecutadosumdecadavez,pelaordem,decimaparabaixo. Asdefiniesdefunonoalteramofluxodeexecuodoprograma,mas lembresequecomandosdentrodafunonosoexecutadosatafunoser chamada.Emboranosejacomum,vocpodedefinirumafunodentrode outra.Nestecaso,adefiniomaisinternanoexecutadaatqueafuno maisexternasejachamada. Chamadasdefunosocomoumdesvionofluxodeexecuo.Emvezdeir para o prximo comando, o fluxo salta para a primeira linha da funo chamada,executatodososcomandosleentovoltaatrspararetomarde ondehaviadeixado. Parecemuitosimples,atahoraemquevoclembraqueumafunopode chamaroutra.Enquantoestivernomeiodeumafuno,oprogramapoderia terdeexecutaroscomandosemumaoutrafuno.Masenquantoestivesse executandoestanovafuno,oprogramapoderiaterdeexecutaraindaoutra funo! Felizmente,Pythonadeptodemonitoraraposioondeest,assim,cada vezqueumafunosecompleta,oprogramaretomadeondetinhaparadona funoqueachamou.Quandochegaaofimdoprograma,eletermina. Qualamoraldessahistriasrdida?Quandovoclerumprograma,noo leiadecimaparabaixo.Emvezdisso,sigaofluxodeexecuo.

3.9 Parmetros e argumentosAlgumasdasfunesnativasquevocjusourequeremargumentos,aqueles valoresquecontrolamcomoafunofazseutrabalho.Porexemplo,sevoc queracharosenodeumnmero,voctemqueindicarqualnmero.Deste modo,sinrecebeumvalornumricocomoumargumento. Algumasfunesrecebemmaisdeumargumento.Porexemplo, pow recebe

doisargumentos,abaseeoexpoente.Dentrodafuno,osvaloresquelhe sopassadossoatribudosavariveischamadasparmetros. Veja um exemplo de uma funo definida pelo usurio, que recebe um parmetro:def imprimeDobrado(bruno): print bruno, bruno

Estafunorecebeumnicoargumentoeoatribuiaumparmetrochamado bruno. O valor do parmetro (a essa altura, no sabemos qual ser) impresso duas vezes, seguido de uma nova linha. Estamos usando bruno paramostrarqueonomedoparmetrodecisosua,masclaroquemelhor escolherumnomequesejamaisilustrativo. A funo imprimeDobrado funciona para qualquer tipo que possa ser impresso:>>> imprimeDoobrado('Spam') Spam Spam >>> imprimeDobrado(5) 5 5 >>> imprimeDobrado(3.14159) 3.14159 3.14159

Naprimeirachamadadafuno,oargumentoumastring.Nasegunda, uminteiro.Naterceiraumfloat. Asmesmasregrasdecomposioqueseaplicamafunesnativastambmse aplicamsfunesdefinidaspelousurio,assim,podemosusarqualquertipo deexpressocomoumargumentoparaimprimeDobrado:>>> imprimeDobrado('Spam'*4) SpamSpamSpamSpam SpamSpamSpamSpam >>> imprimeDobrado(math.cos(math.pi)) -1.0 -1.0

Comoacontecenormalmente,aexpressoavaliadaantesdaexecuoda funo,assimimprimeDobradoimprimeSpamSpamSpamSpam SpamSpamSpamSpamemvezde'Spam'*4'Spam'*4. Como exerccio, escreva um chamada a imprimeDobrado que imprima 'Spam'*4 'Spam'*4. Dica: strings podem ser colocadas tanto entre aspas simples quanto duplas e o tipo de aspas que no for usado para envolver a string pode ser

usado dentro da string, como parte dela. Tambmpodemosusarumavarivelcomoargumento:>>> miguel = 'Eric, the half a bee.' >>> imprimeDobrado(miguel) Eric, the half a bee. Eric, the half a bee.

N.T.: "Eric, the half a bee" uma msica do grupo humorstico britnico MontyPython.AlinguagemPythonfoibatizadaemhomenagemaogrupoe, porisso,osprogramadoresgostamdecitarpiadasdelesemseusexemplos. Reparenumacoisaimportante:onomedavarivelquepassamoscomoum argumento(miguel)notemnadaavercomonomedoparmetro(bruno). Noimportadequemodoovalorfoichamadodeondeveio(do'chamador'); aqui,emimprimeDobrado,chamamosatodomundodebruno.

3.10 Variveis e parmetros so locaisQuandovoccriauma varivellocal dentrodeumafuno,elasexiste dentrodafunoevocnopodeuslaforadel.Porexemplo:def concatDupla(parte1, parte2) concat = parte1 + parte2 imprimeDobrado(concat)

Esta funo recebe dois argumentos, concatenaos, e ento imprime o resultadoduasvezes.Podemoschamarafunocomduasstrings:>>> >>> >>> Pie canto1 = 'Pie Jesu domine, ' canto2 = 'dona eis requiem. ' concatDupla(canto1, canto2) Jesu domine, Dona eis requiem. Pie Jesu domine, Dona eis requiem.

Quandoafuno concatDupla termina,avarivel concat destruda.Se tentarmosimprimila,teremosumerro:>>> print concat NameError: concat

Parmetros so sempre locais. Por exemplo, fora da funo imprimeDobrado,noexistealgumacoisachamada bruno.Sevoctentar utilizla,Pythonvaireclamar.

3.11 Diagramas da pilhaPara entender que variveis podem ser usadas aonde, s vezes til desenharumdiagramadapilha.Comoosdiagramasdeestado,diagramas dapilhamostramovalordecadavarivel,mastambmafunoqualcada varivelpertence. Cadafunorepresentadaporumframe(quadro).Umframeumacaixa comonomedeumafunoaoladodelaeosparmetrosevariveisdafuno dentro dela.Odiagramadepilha para oexemploanteriortemaseguinte aparncia:

Aordemdapilhamostraofluxodeexecuo.imprimeDobradofoichamado por concatDupla,e concatDupla foi chamado por __main__ (principal), queumnomeespecialparaafunomaisnotopo.Quandovoccriauma varivelforadequalquerfuno,elapertence__main__. Cada parmetro se refere ao mesmo valor que o seu argumento correspondente.Assim,parte1temomesmovalordecanto1,parte2temo mesmovalordecanto2ebrunotemomesmovalordeconcat. Se um erro acontece durante uma chamada de funo, Python imprime o nomedafuno,eonomedafunoqueachamou,eonomedafunoque chamouaquechamou,percorrendotodoocaminhodevoltaa__main__. Porexemplo,setentssemosacessarconcatdedentrodeimprimeDobrado, teramosumNameError:Traceback (innermost last): File "teste.py", line 13, in __main__

concatDupla(canto1, canto2) File "teste.py", line 5, in concatDupla imprimeDobrado(concat) File "teste.py", line 9, in imprimeDobrado print concat NameError: concat

Estalistadefuneschamadadetraceback.Elamostraemqualarquivo deprogramaoerroocorreu,emquelinha,equaisfunesestavamsendo executadasnaquelemomento.Mostratambmalinhadecdigoquecausouo erro. Note a similaridade entre o traceback e o diagrama da pilha; no coincidncia.

3.12 Funes com resultadosAessaaltura,vocdeveterpercebidoquealgumasdasfunesqueestamos usando, tais como as funes matemticas, produzem resultados. Outras funes,comonovaLinha,executamumaao,masnoretornamumvalor. Oquelevantaalgumasquestes: 1. O que acontece se voc chama uma funo e no faz nada com o resultado(porexemplo,noatribuioresultadoaumavarivelouousa comopartedeumaexpressomaior)? 2. Oqueacontecesevocusaumafunoquenoproduzresultadoem umaexpressotalcomonovaLinha() + 7? 3. Vocpodeescreverfunesqueproduzemresultados,ouestpresoa funescomonovaLinhaeimprimeDobrado? Arespostaparaaterceiraquestoafirmativaensvamosfazerissono Captulo5. A ttulo de exerccio, responda as outras duas questes testando-as. Se tiver dvida sobre o que vlido ou invlido em Python, tente buscar a resposta perguntando ao interpretador.

3.13 Glossriochamada de funo (function call) Comando que executa uma funo. Consiste do nome da funo seguido de uma lista de argumentos entre parnteses. argumento (argument) Valor fornecido a uma funo quando ela chamada. Este valor atribudo ao parmetro correspondente na funo. valor de retorno (return value) O resultado da funo. Se uma chamada de funo usada como expresso, o valor de retorno o valor da expresso. converso de tipo (type conversion) Comando explcito que pega um valor de um tipo e devolve o valor correspondente em outro tipo. coercividade de tipo (type coercion) Uma converso de tipo que ocorre automaticamente, de acordo com as regras de coercividade do Python. mdulo (module) Arquivo que contm uma coleo de funes e classes relacionadas entre si. notao de ponto (dot notation) A sintaxe para chamar uma funo que est em outro mdulo, especificando o nome do mdulo, seguido por um ponto (.) e o nome da funo. funo (function) Seqncia de comandos nomeada, que realiza alguma tarefa til. As funes podem ou no receber parmetros e podem ou no retornar valores. definio de funo (function definition) Comando que cria uma nova funo, especificando seu nome, parmetros e comandos que ela executa. fluxo de execuo (flow of execution) A ordem na qual os comandos so executados durante a execuo do programa. parmetro (parameter) Nome usado numa funo para referir-se ao valor passado como argumento. varivel local (local variable) Varivel definida dentro da funo. Uma varivel local s pode ser usada dentro da funo onde foi definida. diagrama da pilha (stack diagram) Representao grfica da pilha de funes, suas variveis e os valores aos quais elas se referem. frame Retngulo no diagrama da pilha que representa uma chamada de funo. Contm as variveis locais e os parmetros da funo.

traceback Lista de funes que esto em execuo, impressa quando um erro de execuo ocorre.

Captulo 4: Condicionais e recursividadeTpicos 4.1Ooperadormdulo 4.2Expressesbooleanas 4.3Operadoreslgicos 4.4Execuocondicional 4.5Execuoalternativa 4.6Condicionaisencadeados 4.7Condicionaisaninhados 4.8Ainstruo return 4.9Recursividade 4.10Diagramasdepilhaparafunesrecursivas 4.11Recursividadeinfinita 4.12Entradapeloteclado 4.13Glossrio

4.1 O operador mduloO operadormdulo trabalhacominteiros(eexpressesquetminteiros comoresultado)eproduzorestodadivisodoprimeiropelosegundo.Em Python,ooperadormduloumsmbolodeporcentagem(%).Asintaxea mesmaqueadeoutrosoperadores:>>> quociente = 7 / 3

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

Ento,7divididopor32eoresto1. O operador mdulo se revela surpreendentemente til. Por exemplo, voc podechecarseumnmerodivisvelporoutrosex % ydzero,entox divisvelpory. Voctambmpodeextrairoalgarismooualgarismosmaisdireitadeum nmero.Porexemplo, x % 10 resultaoalgarismomaisdireitade x (na base10).Similarmente,x % 100resultanosdoisdgitosmaisdireita.

4.2 Expresses booleanasUmaexpressobooleanaumaexpressoqueverdadeira(true)oufalsa (false).EmPython,umaexpressoqueverdadeiratemovalor1,euma expressoquefalsatemovalor0. Ooperador==comparadoisvaloreseproduzumaexpressobooleana:>>> 5 == 5 True >>> 5 == 6 False

Noprimeirocomando,osdoisoperadoressoiguais,entoaexpressoavalia comoTrue(verdadeiro);nosegundocomando,5noiguala6,entotemos False(falso). Ooperador==umdosoperadoresdecomparao;osoutrosso:x x x x x != y > y < y >= y 0 and x < 10verdadeirosomentesexfor maiorque0emenorque10. n%2 == 0 or n%3 == 0 verdadeiro se qualquer das condies for verdadeira,querdizer,seonmeronfordivisvelpor2oupor3. Finalmente, o operador lgico not nega uma expresso booleana, assim, not(x > y)verdadeirose(x > y)forfalso,querdizer,sexformenorou igualay. A rigor, os operandos de operadores lgicos deveriam ser expresses booleanas,masPythonnomuitorigoroso.Qualquernmerodiferentede zerointerpretadocomoverdadeiro(True):>>> >>> 1 >>> >>> 0 x = 5 x and 1 y = 0 y and 1

Emgeral,essetipodecoisanoconsideradodebomestilo.Sevocprecisa compararumvalorcomzero,devefazloexplicitamente.

4.4 Execuo condicionalParapoderescreverprogramasteis,quasesempreprecisamosdahabilidade dechecarcondiesemudarocomportamentodoprogramadeacordocom elas.As instruescondicionais nosdoessahabilidade.Aformamais simplesainstruoif(se):if x > 0 print "x positivo"

Aexpressobooleanadepoisdainstruoifchamadadecondio.Seela verdadeira(true),entoainstruoendentadaexecutada.Seno,nada acontece. Assimcomooutrasinstruescompostas,ainstruoifconstitudadeum cabealhoedeumblocodeinstrues:

CABECALHO: PRIMEIRO COMANDO ... ULTIMO COMANDO

Ocabealhocomeacomumanovalinhaeterminacomdoispontos(:).Os comandosouinstruesendentadosqueseguemsochamadosde bloco.A primeira instruo no endentada marca o fim do bloco. Um bloco de comandosdentrodeumcomandocompostoouinstruocompostachamado decorpodocomando. Noexistelimiteparaonmerodeinstruesquepodemaparecernocorpo deumainstruoif,mastemquehaverpelomenosuma.Ocasionalmente, tilterumcorposemnenhumainstruo(usualmente,comoumdelimitador deespaoparacdigoquevocaindanoescreveu).Nessecaso,vocpode usarocomandopass,quenofaznada.

4.5 Execuo alternativaUm segundo formato da instruo if a execuo alternativa, na qual existem duas possibilidades e a condio determina qual delas ser executada.Asintaxeseparececom:if x % 2 == 0: print x, " par" else: print x, " impar"

Seorestodadivisodexpor2for0,entosabemosquexpar,eoprograma exibeamensagemparaestacondio.Seacondiofalsa,osegundogrupo deinstruesexecutado.Desdequeacondiodevaserverdadeira(true)ou falsa (false), precisamente uma das alternativas vai ser executada. As alternativassochamadasramos(branches),porqueexistemramificaesno fluxodeexecuo. Porsinal,sevocprecisachecaraparidadedenmeroscomfreqncia,pode colocarestecdigodentrodeumafuno:def imprimeParidade(x): if x % 2 == 0: print x, " par" else: print x, " impar"

Para qualquer valor de x, imprimeParidade exibe uma mensagem

apropriada.Quandovocachama,podefornecerumaexpressoderesultado inteirocomoumargumento:>>> imprimeParidade(17) >>> imprimeParidade(y+1)

4.6 Condicionais encadeadossvezesexistemmaisdeduaspossibilidadeseprecisamosdemaisquedois ramos. Uma condicional encadeada uma maneira de expressar uma computaodessas:if x < y: print x, " menor que", y elif x > y: print x, " maior que", y else: print x, "e", y, "so iguais"

elif umaabreviaode"elseif"("entose").Denovo,precisamenteum ramoserexecutado.Noexistelimiteparaonmerodeinstrues elif, masseexistirumainstruoelseelatemquevirporltimo:if escolha == 'A': funcaoA() elif escolha == 'B': funcaoB() elif escolha == 'C': funcaoC() else: print "Escolha invlida."

Cada condio checada na ordem. Se a primeira falsa, a prxima checada, e assim por diante. Se uma delas verdadeira, o ramo correspondenteexecutado,eainstruotermina.Mesmoquemaisdeuma condiosejaverdadeira,apenasoprimeiroramoverdadeiroexecuta. Como exerccio, coloque os exemplos acima em funes chamadas comparar(x, y) e executar(escolha).

4.7 Condicionais aninhadosUmcondicionaltambmpodeseraninhadodentrodeoutra.Poderamoster escritooexemplotricotmico(divididoemtrs)comosegue:

if x == y: print x, "e", y, "so iguais" else: if x < y: print x, " menor que", y else: print x, " maior que", y

Ocondicionalmaisexternotemdoisramos.Oprimeiroramocontmuma nicainstruodesada.Osegundoramocontmoutrainstruoif,quepor suaveztemdoisramos.Osdoisramossoambosinstruesdesada,embora pudessemconterinstruescondicionaistambm. Emboraaendentaodasinstruestorneaestruturaaparente,condicionais aninhadostornamsedifceisdelerrapidamente.Emgeral,umaboaidia evitaroaninhamentoquandoforpossvel. Operadores lgicos freqentemente fornecem uma maneira de simplificar instruescondicionaisaninhadas.Porexemplo,podemosreescreverocdigo aseguirusandoumanicacondicional:if 0 < x: if x < 10: print "x um nmero positivo de um s algarismo."

Ainstruo print executadasomenteseafizermospassarporambosos condicionais,ento,podemosusarumoperadorand:if 0 < x and x < 10: print "x um nmero positivo de um s algarismo."

Esses tipos de condio so comuns, assim, Phython prov uma sintaxe alternativaquesimilarnotaomatemtica:if 0 < x < 10: print "x um nmero positivo de um s algarismo."

4.8 A instruo returnOcomandoreturnpermiteterminaraexecuodeumafunoantesqueela alcanceseufim.Umarazoparauslosevocdetectarumacondiode erro:import math def imprimeLogaritmo(x): if x >> contagemRegressiva(3)

AexecuodecontagemRegressivacomeacomn=3,edesdequenno0, produzcomosadaovalor3,eentochamaasimesma... AexecuodecontagemRegressivacomeacomn=2,edesdequenno0, produzcomosadaovalor2,eentochamaasimesma... AexecuodecontagemRegressivacomeacomn=1,edesdequenno0, produzcomosadaovalor1,eentochamaasimesma... Aexecuode contagemRegressiva comeacom n=0,edesdeque n 0, produzcomosadaapalavra"Fogo!"eentoretorna. AcontagemRegressivaquetemn=1retorna. AcontagemRegressivaquetemn=2retorna. AcontagemRegressivaquetemn=1retorna. E ento estamos de volta em __main__ (que viagem!). Assim, a sada completaseparececom:

3 2 1 Fogo!

Como um segundo exemplo, d uma olhada novamente nas funes novaLinhaetresLinhas:def novaLinha(): print def tresLinhas(): novaLinha() novaLinha() novaLinha()

Muitoemboraissofuncione,noseriamuitotilseprecisssemosgerarcomo sada2novaslinhas,ou106.Umaalternativamelhorseriaesta:def nLinhas(n): if n > 0: print nLinhas(n-1)

Esseprogramasimilara contagemRegressiva;semprequenformaior que0,elegeracomosadaumanovalinhaeentochamaasimesmopara gerarcomosadan-1linhasadicionais.Destemodo,onmerototaldenovas linhas 1 + (n-1) que,sevocestudoulgebradireitinho,vemasero prprion. O processo de uma funo chamando a si mesma chamado de recursividade,etaisfunessoditasrecursivas.

4.10 Diagramas de pilha para funes recursivasNaSeo3.11,usamosumdiagramadepilhapararepresentaroestadode umprogramaduranteumachamadadefuno.Omesmotipodediagrama podeajudarainterpretarumafunorecursiva. Todavezqueumafunochamada,Pythoncriaumnovoquadro(frame) paraafuno,quecontmasvariveislocaiseparmetrosdafuno.Para umafunorecursiva,terqueexistirmaisdeumquadronapilhaaomesmo tempo. Esta figura mostra um diagrama de pilha para contagemRegressiva, chamadacomn = 3:

Comodecostume,notopodapilhaestoquadropara __main__.Eleest vazio porquenemcriamosqualquervarivel em __main__ nempassamos qualquervalorparaele. Os quatro quadros contagemRegressiva tm valores diferentes para o parmetron.Apartemaisembaixonapilha,onden=0,chamadadecaso base.Elenofazumachamadarecursiva,entonohmaisquadros. Como exerccio, desenhe um diagrama de pilha para nLinhas chamada com n=4.

4.11 Recursividade infinitaSe uma recursividade nunca chega ao caso base, ela prossegue fazendo chamadas recursivas para sempre, e o programa nunca termina. Isto conhecidocomorecursividadeinfinita,egeralmentenoconsideradauma boaidia.Aquiestumprogramamnimocomumarecursividadeinfinita:def recursiva(): recursiva()

Namaioriadosambientesdeprogramao,umprogramacomrecursividade infinitanaverdadenorodaparasempre.Pythonreportaumamensagemde erroquandoaprofundidademximaderecursividadealcanada:File "", line 2, in recursiva (98 repetitions omitted) File "", line 2, in recursiva RuntimeError: Maximum recursion depth exceeded

Este traceback um pouco maior do que aquele que vimos no captulo anterior.Quandooerroocorre,existem100quadrosrecursivanapilha!

Como exerccio, escreva uma funo com recursividade infinita e rode-a no interpretador Python.

4.12 Entrada pelo tecladoOsprogramasquetemosescritoatagorasoumpoucocrus,nosentidode no aceitarem dados entrados pelo usurio. Eles simplesmente fazem a mesmacoisatodasasvezes. Python fornece funes nativas que pegam entradas pelo teclado. A mais simpleschamadaraw_input.Quandoestafunochamada,oprograma praeesperaqueousuriodigitealgumacoisa.Quandoousurioapertaa teclaEnterouReturn,oprogramaprossegueeafunoraw_inputretornao queousuriodigitoucomoumastring:>>> entrada = raw_input() O que voc est esperando? >>> print entrada O que voc est esperando?

Antesdechamarraw_input,umaboaidiaexibirumamensagemdizendo ao usurio o que ele deve entrar. Esta mensagem uma deixa (prompt). Podemossuprirumadeixacomoumargumentopararaw_input:>>> nome = raw_input("Qual... o seu nome? ") Qual... o seu nome? Arthur, Rei dos Bretes! >>> print nome Arthur, Rei dos Bretes!

Seesperamosqueaentradasejauminteiro,podemosusarafunoinput:deixa = "Qual... a velocidade de vo de uma andorinha?\n" velocidade = input(deixa)

Seousuriodigitaumastringdenmeros,elaconvertidaparauminteiroe atribudaavelocidade.Infelizmente,seousuriodigitarumcaractereque nosejaumnmero,oprogramatrava:>>> velocidade = input(deixa) Qual... a velocidade de vo de uma andorinha? De qual voc fala, uma andorinha Africana ou uma Europia? SyntaxError: invalid syntax

Paraevitaressetipodeerro,geralmentebomusarraw_inputparapegar umastringe,ento,usarfunesdeconversoparaconverterparaoutros

tipos.

4.13 Glossriooperador mdulo (modulus operator) Operador denotado por um smbolo de porcentagem (%), que trabalha com inteiros e retorna o resto da diviso de um nmero por outro. expresso booleana (boolean expression) Uma expresso que verdadeira ou falsa. operador de comparao (comparison operator) Um dos operadores que compara dois valores: ==, !=, >, =, e 0: return x

Esteprogramanoestcorretoporquese x for0,nenhumadascondies serverdadeira,eafunoterminarsemencontrarumcomando return. Nestecaso,ovalorderetornoserumvalorespecialchamadoNone:>>> print valorAbsoluto(0)

None

Comoexerccio,escrevaumafunocomparequeretorne1sex>y,0sex== ye1sex>> distancia(1, 2, 4, 6) 0.0

Escolhemosestesvaloresdemodoqueadistnciahorizontalsejaiguala3ea distnciaverticalsejaiguala4;destemodo,oresultado5(ahipotenusade umtringulo345).Quandotestamosumafuno,tilsabermosqualo resultadocorreto. Neste ponto, j confirmamos que a funo est sintaticamente correta, e podemos comear a adicionar linhas de cdigo. Depois de cada mudana adicionada,testamosafunodenovo.Seumerroocorreemqualquerponto, sabemosaondeeledeveestar:naslinhasadicionadasmaisrecentemente. Umprimeiropassolgiconestacomputaoencontrarasdiferenasx2x1 e y2 y1. Ns iremos guardar estes valores em variveis temporrias chamadasdxedyeimprimilas:def distancia(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 print "dx vale", dx print "dy vale", dy return 0.0

Se a funo estiver funcionando, as sadas devero ser3 e 4.Seassim, sabemosqueafunoestrecebendoosparmetroscorretoserealizandoa primeira computao corretamente. Se no, existem poucas linhas para checar. Emseguida,computaremosasomadosquadradosdedxedy:def distancia(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 dquadrado = dx**2 + dy**2 print "dquadrado vale: ", dquadrado return 0.0

Note que removemos os comandos print que havamos escrito no passo anterior.CdigocomoestechamadodeandaimeXXX(scaffolding)porque ajudaaescreveroprograma,masnopartedoprodutofinal. De novo,nsvamosrodaroprogramanesteestgioechecarasada(que deveriaser25).

Finalmente,senstnhamosimportadoomdulomatemticomath,podemos usarafunosqrtparacomputareretornaroresultado:def distancia(x1, x2, y1, y2): dx = x2 - x1 dy = y2 - y1 dquadrado = dx**2 + dy**2 resultado = math.sqrt(dquadrado) return resultado

Seistofuncionarcorretamente,vocconseguiu.Casocontrrio,talvezfosse precisoimprimir(exibir)ovalorderesultadoantesdainstruoreturn. Enquantoforiniciante,vocdeveacrescentarapenasumaouduaslinhasde cdigo de cada vez. Conforme ganhar mais experincia, voc se ver escrevendoedepurandopedaosmaiores.Dequalquermodo,oprocessode desenvolvimentoincrementalpodepouparumbocadodetempodedepurao. Osaspectoschavedoprocessoso: 1. Comece com um programa que funciona e faa pequenas mudanas incrementais.Emqualquerpontodoprocesso,sehouverumerro,voc saberexatamenteondeeleest. 2. Usevariveistemporriasparamantervaloresintermediriosdemodo quevocpossaexibilosecheclos. 3. Umavezqueoprogramafuncione,vocpodequererremoveralgum cdigo muleta, ou andaime (scaffolding) ou consolidar mltiplos comandos dentro de expresses compostas, mas somente se isto no tornaroprogramadifcildeler. Como um exerccio, use o desenvolvimento incremental para escrever uma funo chamada hipotenusa que retorna a medida da hipotenusa de um tringulo retngulo dadas as medidas dos dois catetos como parmetros. Registre cada estgio do desenvolvimento incremental conforme voc avance.

5.3 ComposioConforme voc poderia esperar agora, voc pode chamar uma funo de dentrodeoutra.Estahabilidadechamadadecomposio.

Como um exemplo, vamos escrever uma funo que recebe dois pontos, o centrodeumcrculoeumpontoemseupermetro,ecalculaareadocrculo. Assumaqueopontodocentroestguardadonasvariveisxceyc,equeo pontodopermetroestnasvariveisxpeyp.Oprimeiropassoencontraro raiodocrculo,oqualadistnciaentreosdoispontos.Felizmente,temos umafuno,distancia,quefazisto:Raio = distancia(xc, yc, xp, yp)

Osegundopassoencontrarareadeumcrculocomoraiodadoeretorn la:resultado = area(raio) return resultado

Juntandotudonumafuno,temos:def area2(xc, yc, xp, yp): raio = distancia(xc, yc, xp, yp) resultado = area(raio) return resultado

Chamamosestafunodearea2paradistinguirdafunoarea,definida anteriormente.Spodeexistirumanicafunocomumdeterminadonome emumdeterminadomdulo. As variveis temporrias raio e resultado so teis para o desenvolvimentoeparadepurao(debugging),masumavezqueoprograma estejafuncionando,podemostornlomaisconcisoatravsdacomposiodas chamadasdefuno:def area2(xc, yc, xp, yp): return area(distancia(xc, yc, xp, yp))

Comoexerccio,escrevaumafuno inclinacao(x1, y1, x2, y2) que retorne a inclinao (ou coeficienteAngular? XXX) de uma linha dados os pontos(x1,y1)e(x2,y2).Depoisuseestafunoemumafunochamada cortaY(x1, y1, x2, y2)queretorneainterseodalinhacomoeixoy, dadosospontos(x1,y1)e(x2,y2).

5.4 Funes booleanasFunespodemretornarvaloresbooleanos,oquemuitasvezesconveniente porocultartestescomplicadosdentrodefunes.Porexemplo:

def ehDivisivel(x, y): If x % y == 0: return True # verdadeiro (true), divisvel else: return False # falso (false), no divisvel

O nomedesta funo ehDivisivel ("divisvel"). comum dar a uma funo booleana nomes que soem como perguntas sim/no. ehDivisivel retornaouTrueouFalseparaindicarsexounodivisvelpory. Podemos tornar a funo mais concisa setirarmos vantagem do fato de a condiodainstruo if serelamesmaumaexpressobooleana.Podemos retornladiretamente,evitandototalmenteoif:def ehDivisivel(x, y): return x % y == 0

Estasessomostraanovafunoemao:>>> ehDivisivel(6, 4) False >>> ehDivisivel(6, 3) True

Funesbooleanassofreqentementeusadasemcomandoscondicionais:if ehDivisivel(x, y): print "x divisvel por y" else: print "x no divisvel por y"

Masacomparaoextradesnecessria. Como exerccio, escreva uma funo estaEntre(x, y, z) que retorne True se y < x < z ou False se no.

5.5 Mais recursividadeAt aqui, voc aprendeu apenas um pequeno subconjunto da linguagem Python,maspodeserqueteinteressesaberqueestepequenosubconjunto umalinguagemdeprogramaocompleta,oquesignificaquequalquercoisa que possa ser computada pode ser expressa nesta linguagem. Qualquer programa j escrito pode ser reescrito usando somente os aspectos da linguagemquevocaprendeuatagora(usualmente,vocprecisariadeuns poucoscomandosparacontrolardispositivoscomooteclado,mouse,discos, etc.,masistotudo).

Provar esta afirmao um exerccio nada trivial, que foi alcanado pela primeira vez por AlanTuring, um dos primeiros cientistas da computao (algumpoderiadizerqueelefoiummatemtico,masmuitosdosprimeiros cientistas da computao comearam como matemticos). Por isso, ficou conhecido como Tese de Turing. Se voc fizer um curso em Teoria da Computao,vocterchancedeveraprova. Para te dar uma idia do que voc pode fazer com as ferramentas que aprendeu a usar at agora, vamos avaliar algumas funes matemticas recursivamentedefinidas.Umadefiniorecursivasimilarumadefinio circular,nosentidodequeadefiniofazrefernciacoisaqueestsendo definida.Umaverdadeiradefiniocircularnomuitotil: vorpal:adjetivousadoparadescreveralgoquevorpal. Sevocvisseestadefinioemumdicionrio,ficariaconfuso.Poroutrolado, se voc procurasse pela definio da funo matemtica fatorial, voc encontrariaalgoassim:0! = 1 n! = n.(n-1)!

Estadefiniodizqueofatorialde01,equeofatorialdequalqueroutro valor,n,nmultiplicadopelofatorialden1. Assim,3!(lse"3fatorial"ou"fatorialde3")3vezes2!,oqual2vezes1!, oqual1vezes0!.Colocandotudoissojunto,3!igual3vezes2vezes1vezes 1,oque6. Se voc pode escrever uma definio recursiva de alguma coisa, voc geralmente pode escrever um programa em Python para executla. O primeiropassodecidirquaissoosparmetrosparaestafuno.Compouco esforo,vocdeverconcluirquefatorialrecebeumnicoparmetro:def fatorial(n):

Seacontecedeoargumentoser0,tudooquetemosdefazerretornar1:def fatorial(n): if n == 0: return 1

Poroutrolado,eestaaparteinteressante,temosquefazerumachamada recursivaparaencontrarofatorialden1eentomultiplicloporn:

def fatorial(n): if n == 0: return 1 else: recursivo = fatorial(n-1) resultado = n * recursivo return resultado

O fluxo de execuo para este programa similar ao fluxo de contagemRegressivanaSeo4.9.Sechamarmosfatorialcomovalor3: Jque3no0,tomamososegundoramoecalculamosofatorialden-1... Jque2no0,tomamososegundoramoecalculamosofatorialden-1... Jque1no0,tomamososegundoramoecalculamosofatorialden-1... J que 0 0, tomamos o primeiro ramo e retornamos 1 sem fazer mais qualquerchamadarecursiva. Ovalorretornado(1)multiplicadoporn,que1,eoresultadoretornado. Ovalorretornado(1)multiplicadoporn,que2,eoresultadoretornado. Ovalorretornado(2)multiplicadoporn,que1,eoresultado,6,setornao valorderetornodachamadadefunoqueinicioutodooprocesso. Eisodiagramadepilhaparaestaseqnciadechamadasdefuno:

Osvaloresderetornosomostradossendopassadosdevoltaparacimada pilha.Emcadaquadro,ovalorderetornoovalorderesultado,oqualo produtodenporrecursivo.

5.6 Voto de confiana (Leap of faith)Seguirofluxodeexecuoumamaneiradelerprogramas,masquepode rapidamente se transformar em um labirinto. Uma alternativa o que chamamosde"votodeconfiana".Quandovoctemumachamadadefuno, em vez de seguir o fluxo de execuo, voc assume que a funo funciona corretamenteeretornaovalorapropri