Você está na página 1de 46

3/3/14

AprendaProgramar - PythonBrasil

Ttulos Texto

AprendaProgramar
Aprendaaprogramar
porLucianoRamalho Ooriginaldestedocumentoestem http://turing.com.br/material/appy/index.html aqui.

ParaobterumaversocompletaempdfquepodeserlidaforadaconexocomaInternet,acesse Paracontribuiroureportarerros,porgentilezautilizeorepositrio: parareportarerrosoufazersugestesdemelhoria.

https://github.com/oturing/appy.Useolink"Issues"

Este tutorial foi publicado originalmente na revista MAGNET: http://www.magnet.com.br/classic/aprendaprog/ Este link aparentementenoestmaisnoar,masfoipreservadoaquiporrazeshistricas.1 Aobra"AprendaaProgramar"deLucianoRamalhofoilicenciadacomumaLicenaCreativeCommonsAtribuioUso NoComercialPartilhanosMesmosTermos3.0Brasil. Parasolicitarpermissesadicionais,escrevaparaoautorviaemail:luciano?ramalho.org (substituindo o ? pelo smbolo apropriado).

Captulo0
Porqueaprenderaprogramar?
Arazofundamental,quenosmotivouaproduzirestetutorial,umas:programardivertido.claroquenemtodomundo vai concordar com isso, assim como muita gente no acha graa nenhuma em jogar xadrez ou explorar cavernas. Ao contrriodoxadrezedaespeleologia,aprogramaotambmumahabilidadequetemfortedemandanomercadode trabalho. Masadurarealidadequesomentecomcentenasoumilharesdehorasdeexperinciaprogramandoquevocestar aptoaincluiressadisciplinaemseucurrculoesedarbememumaentrevistadeemprego.Portantonossoobjetivoaqui bem mais modesto do que transformar voc em um programador profissional. O que estamos te oferecendo uma introduo suave a esse tpico fascinante. Ao final, esperamos que voc descubra se tem a vocao e a motivao necessriasparacriarsoftwares,comohobbyouprofisso. Antes de comear, apenas um aviso: o prazer de construir um programa pode causar dependncia psicolgica. No apenaspordinheiroqueprogramadoresdomundointeirovaramnoitesescrevendocdigo.

Materialnecessrio
Para acompanhar esse tutorial voc precisar de um computador qualquer onde tenha instalado um interpretador da linguagem Python. Em quase todas as verses modernas de Linux e Mac OS X o interpretador Python j vem instalado (experimenteabrirumconsoleedigitar"python").Napgina http://www.python.org/download/vocencontralinkspara baixarointerpretadoradequadoparaoseucomputador.NocasodoWindows,oinstalador.msidaversoatualdoPython

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

1/46

3/3/14

AprendaProgramar - PythonBrasil

temcercade11MB.

PorquPython
Todaprogramaodecomputadoresfeitaatravsdeumaoumaislinguagensdeprogramao,portantonopossvel aprender a programar sem aprender ao menos uma linguagem de programao. Nossa meta no mostrar como se programaemumalinguagemespecfica,massimcomoseprogramadeumaformageral.Ouseja,alinguagemparans serumveculo,enoodestino.Mesmoassim,pensamosbastanteantesdeescolherumalinguagemparaestetutorial,e optamosporPython. Centenasdelinguagensjforamcriadasdesdequeocomputadoreletrnicofoiinventadonosanos40.Algumasjso lnguasmortas.Outras,comoC++eJava,sopeasfundamentaisnodesenvolvimentodaeconomiadigital.Noentanto,a complexidade dessas duas linguagens nos motivou a descartlas, e focalizar o universo das chamadas linguagens de "scripting",quesomaissimpleseseprestamaumestilodeprogramaoexploratria,maissintonizadocomumtutorial comoesse. As trs linguagens de scripting mais populares atualmente so !PHP, JavaScript e !VBScript. Todas so utilizadas na construodewebsitesdinmicos,maspraticamentenotmaplicaoforadessedomnio,eporissoforamdescartadas. que, embora seja nosso objetivo abordar tambm esse tpico, achamos que complexo demais para comear, especialmentedevidodificuldadedesediagnosticarerrosdeprogramaoempginasdinmicas. EscolhemosPythonporqueumalinguagemmuitoverstil,usadanosnodesenvolvimentoWebmasemmuitosoutros tiposdeaplicao.PythonrodanosservidoresdemegasitescomoGoogleeYouTube,nosclustersdecomputaogrfica daIndustrialLight&Magic,emlaboratriosdaNASAedafarmacuticaAstraZeneca,eemgamescomoCivilizationIVe EVEOnline.Onome"Python"umahomenagemaogrupohumorsticoinglsMontyPython,adoradoporgeeksdetodoo mundo,maspelapequenaamostradeusurioscitados,noumalinguagemdebrinquedo. Apesar de sua sintaxe simples e clara, Python oferece os seguintes recursos disponveis tambm em linguagens mais complicadascomoJavaeC++: programaoorientadaaobjetos(incluindoheranamltipla,conceitoapenasparcialmentepresenteemJava) excees,ummodernomecanismoparaotratamentodeerros mdulos,umaformainteligentedeacessareorganizarcdigoaserreutilizado coleta de lixo automtica, sistema que elimina os erros causados pelo acmulo de dados inteis na memria do computador(caractersticapresentetambmemJava,masnoemC++) recursosavanadosdemanipulaodetextos,listaseoutrasestruturasdedados possibilidadedeexecutaromesmoprogramasemmodificaesemvriasplataformasde hardwareesistemas operacionais(difcildeseconseguiremC++) Em resumo, Python nos oferece uma sintaxe to simples quanto PHP ou VBScript, mas mais verstil do que elas. E permiteexplorarvriosrecursosdeJavaeC++deumaformamaisacessvel.Poressesmotivosacreditamosquesejaa melhorescolhaparaquemquercomearaprogramarhoje.

Captulo1
Abrindoefechandoointerpretador
A melhor forma de aprender a programar usando um interpretador em modo interativo. Dessa forma voc pode digitar comandoslinhaporlinhaeobservaracadapassocomoocomputadorinterpretaeexecutaessescomandos.Parafazer issoemPython,hduasmaneiras: 1executar o interpretador em modo texto (chamado "Python (command line)" no Windows, ou simplesmente p y t h o n no Linux)2usaroIDLE,queumambientebaseadoemjanelas. SevocusaWindows,escolhaoIDLEparacomearaacompanharessetutorial.OIDLEtambmestdisponvelparaa plataformaLinux(algumasdistribuiescolocamoIDLEemumpacoteseparadodopacotedoPython). Sejaqualforointerpretadorquevocescolheu,aoexecutlovocverumamensagemcominformaesde copyright maisoumenoscomoessa: P y t h o n 2 . 5 . 1 ( r 2 5 1 : 5 4 8 6 3 , O c t 5 2 0 0 7 , 1 3 : 5 0 : 0 7 )

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

2/46

3/3/14

AprendaProgramar - PythonBrasil

[ G C C 4 . 1 . 3 2 0 0 7 0 9 2 9 ( p r e r e l e a s e ) ( U b u n t u 4 . 1 . 2 1 6 u b u n t u 2 ) ] o n l i n u x 2 T y p e " h e l p " , " c o p y r i g h t " , " c r e d i t s " o r " l i c e n s e " f o r m o r e i n f o r m a t i o n . > > > Osmbolo"> > > "exibidopelointerpretadoroqueosamericanoschamamde"prompt",quealgunstraduzempor"aviso", masnsvamoschamarde"deixa"(emteatro,otermo"prompt"adeixaqueindicaaoatorahoradedizeroufazeralgoem computao,opromptinformaousurioqueosistemaestprontoparareceberumnovocomando). ParasairdointerpretadorvocpodefecharajaneladoIDLE,outeclar[ C T R L ] + [ D ] (noIDLEounointerpretadoremUNIX) ou[ C T R L ] + [ Z ] eento[ E N T E R ] (nointerpretadorDOS).

Umacalculadoramelhor
Vamosentoaproveitaradeixaeescreveralgo.Experimenteescreverumaexpressoaritmticabemsimples,como2 + 2 : > > > 2 + 2 4 > > > Arespostareconfortante:paraPython,2 + 2 iguala4.Vocpodeexperimentaroutrasexpressesmaiscomplexas,mas bomsaberqueosquatrooperadoresbsicosemPython(eemquasetodasaslinguagensmodernas)soesses: + adio subtrao * multiplicao / diviso Em Python, assim como na linguagem C, os nmeros inteiros tm um tratamento especial. Isso fica evidente quando fazemosumadiviso: > > > 7 / 2 3 > > > Emvezde3,5,oresultadofoi3.Issoacontecesemprequetodososnmerosdeumaexpressosointeiros.Nestecaso, Python imagina que se deseja um resultado inteiro tambm (esse comportamento estranho s vezes conveniente em programao). Sevocquiseroperarcomnmerosdecimais,deveusaropontoenoavrgulacomoseparadordecimal: > > > 7 . 0 / 2 3 . 5 > > > 7 / 2 . 0 3 . 5 > > > 7 / 2 . 3 . 5 > > > Notequebastadigitarumpontoapsonmero.Ocomputadornoconseguelidarcomnmerosdoconjuntodosreais,mas apenascomumaaproximaochamada"nmerodepontoflutuante"(porqueopontodecimalpodeapereceremqualquer posiodonmero).Aolidarcompontoflutuante,svezesvemosresultadosestranhos: > > > 2 . 4 * 2 4 . 7 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 > > > Oresultadonodeveriaser4.8?Deveria,masantesdeficarrevoltadonotequeadiferenafoimuitopequena.Acontece que o sistema de "pontoflutuante" padro IEEE754 usado em quase todos os computadores atuais tem uma preciso

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

3/46

3/3/14

AprendaProgramar - PythonBrasil

limitada, e Python no esconde este fato de voc, programador. O problema no est na conta, mas na prpria representaointernadovalor2 . 4 : > > > 2 . 4 2 . 3 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 Paraexibirvaloresdepontoflutuanteparaumusuriosemassustlo,useocomandop r i n t : > > > p r i n t 2 . 4 * 2 4 . 8 > > > Vocpodedigitarespaosentreosnmeroseoperadoresparafazerumaexpressolongaficarmaislegvel.Vejaesse exemplo: > > > 1 + 2 * 3 7 > > > Note que o interpretador Python mais esperto que uma calculadora comum. Ele sabe que a multiplicao deve ser efetuadaantesdaadio.Sevocteclaramesmaexpressoemumacalculadoraqualquerobteroresultado9,que incorreto.EmPython,sevocrealmentedesejaefetuarasomaantesdamultiplicao,precisausarparnteses: > > > ( 1 + 2 ) * 3 9 > > > Aocontrriodoquevocaprendeunaescola,aquiossmbolos[]e{}noservemparaagruparexpressesdentrodeoutras expresses.Apenasparntesessousados: > > > ( 9 ( 1 + 2 ) ) / 3 . 0 2 . 0 > > > ( 9 1 + 2 ) / 3 . 0 3 . 3 3 3 3 3 3 3 3 3 3 3 > > > DICA: Se voc escrever algo que o interpretador no reconhece, ver na tela uma mensagem de erro. No crie o mau hbito de ignorar essas mensagens, mesmo que elas paream difceis de entender num primeiro momento. A nica vantagemdecometererrosaprendercomeles,eseapreguiaoimpedirdelerasmensagens,seuaprendizadoserbem maislento. VejaaquicomodecifrarasmensagensdeerrodoPython.

Comolerumamensagemdeerro
Adurarealidadequeumprogramadorprofissionalpassaboapartedesuavidacaandoerros,eporissofundamental saberextrairomximodeinformaesdasmensagensresultantes. Aessaalturavoctalvezjtenhaprovocadoumerroparaveroqueacontece.Vamosfazerissoagora,eaprenderaleras mensagens resultantes. Pode parecer perda de tempo, mas importantssimo saber interpretar as mensagens de erro porqueamelhorformadeaprenderaprogramarexperimentando,eaoexperimentarvoccertamentevaiprovocarmuitos erros. Comoexemplo,vamosdigitarumaexpressoaritmticasemsentido: > > > 7 + / 2 F i l e " < s t d i n > " , l i n e 1 7 + / 2

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

4/46

3/3/14

AprendaProgramar - PythonBrasil

^ S y n t a x E r r o r : i n v a l i d s y n t a x > > > OinterpretadorindicaolocaldeerroemvermelhonoIDLE,oucomosinal^noconsole.Nosdoiscasosaltimalinha contm as informaes mais importantes: S y n t a x E r r o r :i n v a l i ds y n t a x .Aprimeiraparte, S y n t a x E r r o r o tipo do erro,eapsosinalde":"vemadescrio:errodesintaxeinvlida. Noconsoleaprimeiralinhadamensagemdeerroindicaemalinhadoseucdigoondeocorreuoproblema.Nomodo interativoessainformaopoucotil,masquandofizermosprogramasextensossermuitobomsaberexatamenteemqual linhaestafalha.Agoravamosprovocarumoutrotipodeerro: > > > 1 . 5 / 0 T r a c e b a c k ( m o s t r e c e n t c a l l l a s t ) : F i l e " < s t d i n > " , l i n e 1 , i n < m o d u l e > Z e r o D i v i s i o n E r r o r : f l o a t d i v i s i o n > > > Novamente, a parte mais importante a ltima linha, que nesse caso bem fcil de entender: Z e r o D i v i s i o n E r r o r :f l o a td i v i s i o n ,ou"errodedivisoporzeroemdivisodepontoflutuante".

Conversordedlares
Digamosquevoctemumalojadediscosimportados,eprecisaconstantementeconverterdlaresemreais.Ovalordo dlarparavendaem20/05/1999de1.686.ParaconverterUS$9,95eUS$11,95emreaisvocpodedigitar: > > > 9 . 9 5 * 1 . 6 8 6 1 6 . 7 7 5 6 9 9 9 9 9 9 9 9 9 9 7 > > > 1 1 . 9 5 * 1 . 6 8 6 2 0 . 1 4 7 6 9 9 9 9 9 9 9 9 9 9 7 > > > Mashumaformamelhor:emvezdedigitarovalor1.686otempotodo,vocpodearmazenaressevalornamemriado computador,assim: > > > d = 1 . 6 8 6 > > > Notequeointerpretadornorespondeunada(amenosquevoctenhacometidoumerro),maseleguardouonmeroem umaposiodesuamemria,eassociouosmbolo"d"aessaposio.Agora,ficamaisconfortvelconverterdlaresem reais: > > > 9 . 8 5 * d 1 6 . 6 0 7 0 9 9 9 9 9 9 9 9 9 9 9 > > > 1 1 . 9 5 * d 2 0 . 1 4 7 6 9 9 9 9 9 9 9 9 9 9 7 > > > 5 * d , 7 * d , 9 * d ( 8 . 4 2 9 9 9 9 9 9 9 9 9 9 9 9 9 7 , 1 1 . 8 0 2 , 1 5 . 1 7 3 9 9 9 9 9 9 9 9 9 9 9 9 ) > > > Noltimocaso,convertemosdeumavezsosvalores5,7e9emdlares.Paraumresultadomaisapresentvel,useo comandoprint: >>>print5*d,7*d,9*d8.4311.80215.174>>> Eseacotaododlarmudoupara1.61?Bastaarmazenaronovonmeroerefazerosclculos: > > > d = 1 . 6 1 > > > p r i n t 5 * d , 7 * d , 9 * d

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

5/46

3/3/14

AprendaProgramar - PythonBrasil

8 . 0 5 1 1 . 2 7 1 4 . 4 9 > > > Vocprecisadigitaralinhamaislongadenovo.NoIDLE,cliquesobrealinhaquedigitamosnoexemploanterioretecle [ E N T E R ] .Alinhaserreproduzidanaltimadeixa,ebastarumnovo [ E N T E R ] paraprocessla.Noconsole,teclandoa setaparacimavocacessaohistricodecomandos.

Tabeladepreosemdlaresereais
AgoravamosmostrarcomoointerpretadorPythonmuitomaispoderosoqueumacalculadora.Imaginequeemsualojade discosimportadosvoctemumbalcodeofertascomdiscosde$4at$9.Sequisessefazerumatabeladepreosemreais vocpoderiadigitar: > > > p r i n t 4 * d , 5 * d , 6 * d , 7 * d , 9 * d 6 . 4 4 8 . 0 5 9 . 6 6 1 1 . 2 7 1 4 . 4 9 > > > Mas isso um tanto chato e repetitivo. Em programao, sempre que voc fizer algo repetitivo porque no encontrou aindaamelhorsoluo.Lidarcomsriesdenmerosumaatividadecomum,ePythonpodeajudarmuitonessescasos. Digiteoseguinte: > > > l i s t a = [ 5 , 6 , 7 , 8 , 9 ] > > > Aquinscriamosumalistadepreosnamemriadocomputadoreassociamosonome"lista"aessesdados.Emseguida, digiteoseguinte(vocterqueteclar[ E N T E R ] duasvezesaofinaldessalinhadepoissaberporque). > > > f o r p i n l i s t a : p r i n t p * d 8 . 0 5 9 . 6 6 1 1 . 2 7 1 2 . 8 8 1 4 . 4 9 > > > Aquinsinstrumosointerpretadorafazerosseguintespassos: paracadaitemsucessivodalista: associeonomepaoitemdavezexibaovalordep*d Agora digamos que voc tem discos com valores de 4 a 15 dlares. Voc poderia digitar a lista de novo, mas a coisa comeaaficarrepetitivanovamente.Humaformamelhor.AlinguagemPythonpossuiumapalavrachamada"r a n g e "que serveparagerarfaixasdenmeros.Vamosusaressapalavra.Digite: > > > r a n g e < b u i l t i n f u n c t i o n r a n g e > > > > Quandovocdigitaonomedeumafunosemfornecerdados,Pythonlimitaseadizeraqueserefereonome.Nesse caso:"b u i l t i nf u n c t i o nr a n g e ",oufunoembutida r a n g e .Issoquerdizerqueapalavra r a n g e onomedeuma funo,umtipodecomandoqueproduzresultadosapartirdedadosfornecidos.Etrataseaindadeumafunoembutida, ouseja,includanoprpriointerpretador(amaioriadasfunesdalinguagemPythonnosoembutidas,masfazemparte demdulosqueoprogramadorprecisachamarexplicitamenteissoserexplicadodepois). Acabamosdedizerqueumafuno"produzresultadosapartirdedadosfornecidos",entovamosforneceralgumdado paraverqueresultadosafunorangeproduz.Digite"r a n g e ( 5 ) "evejaoqueacontece:

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

6/46

3/3/14

AprendaProgramar - PythonBrasil

> > > r a n g e ( 5 ) [ 0 , 1 , 2 , 3 , 4 ] > > > QuandoapenasumdadoNfornecido, r a n g e geraumalistadeNnmeros,dezeroatN1.umcomportamentoum poucoestranho,mastilemprogramao(oprimeiroitemdeumasrie,namaioriadaslinguagens,oitemnmerozero issoserdiscutidomaisprofundamentequandoaprendermosmaissobrelistas). Agoradigamosqueeuqueiraumasequnciaapartirde2,enozero.Digite: > > > r a n g e ( 2 , 5 ) [ 2 , 3 , 4 ] > > > Agoraparaobteralistadevaloresdediscospodemosdigitar: > > > r a n g e ( 4 , 1 6 ) [ 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 , 1 3 , 1 4 , 1 5 ] > > > Eusandoocomandofor,calculardeumasveztodososvaloresconvertidos: > > > f o r p i n r a n g e ( 4 , 1 6 ) : p r i n t p * d 6 . 4 4 8 . 0 5 9 . 6 6 1 1 . 2 7 1 2 . 8 8 1 4 . 4 9 1 6 . 1 1 7 . 7 1 1 9 . 3 2 2 0 . 9 3 2 2 . 5 4 2 4 . 1 5 > > > Masoidealmesmoeraterosvaloresemdlaresereaisladoalado.Issofcil: > > > f o r p i n r a n g e ( 4 , 1 6 ) : p r i n t p , p * d . . . 4 6 . 4 4 5 8 . 0 5 6 9 . 6 6 7 1 1 . 2 7 8 1 2 . 8 8 9 1 4 . 4 9 1 0 1 6 . 1 1 1 1 7 . 7 1 1 2 1 9 . 3 2 1 3 2 0 . 9 3 1 4 2 2 . 5 4 1 5 2 4 . 1 5 > > > Resumindooquefoifeitoataqui,comapenasduaslinhasdecdigoemPython,vocpodegerartabelasdeconversode qualquertamanho.Experimente:

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

7/46

3/3/14

AprendaProgramar - PythonBrasil

> > > d = 1 . 6 8 6 > > > f o r p i n r a n g e ( 5 0 , 1 5 0 ) : p r i n t p , p * d Parabns,vocacabadeconstruirseuprimeiroprograma!

Captulo2
Introduo
NofinaldocaptuloanteriordigitamososeguinteprogramadiretamentenointerpretadorPython: > > > d = 1 . 6 8 6 > > > f o r p i n r a n g e ( 5 0 , 1 5 0 ) : p r i n t p , p * d Oresultadodestaseqnciadecomandosumalongalistadenmerosemduascolunas.Sabemosqueaprimeiracoluna daesquerdacontmpreosemdlareaoutra,emreais.Masnadanalistagemindicaisto.Observeessetrecho: 9 5 1 6 0 . 1 7 9 6 1 6 1 . 8 5 6 9 7 1 6 3 . 5 4 2 9 8 1 6 5 . 2 2 8 9 9 1 6 6 . 9 1 4 1 0 0 1 6 8 . 6 1 0 1 1 7 0 . 2 8 6 1 0 2 1 7 1 . 9 7 2 1 0 3 1 7 3 . 6 5 8 1 0 4 1 7 5 . 3 4 4 1 0 5 1 7 7 . 0 3 Aquipodemosobservaroutrasdeficincias:ascolunasnoestocorretamentealinhadas,eosvaloresemreaisaparecem comuma,duasoutrscasasdecimais.Comosetratadeumatabeladepreos,osvaloresemambascolunasdeveriamter sempreduascasasdecimais.Vamosfazeralgumasmelhoriasemnossoprogramageradordetabelasdepreos.

Quatrotiposdedados
Paraevitaraqueledegraunasegundacolunaentreo99eo100,precisamosfazerumpequenodesvioparacomeara aprenderalidarcomtextos,almdenmeros.Digitee u= seguidodoseunomeentreaspas: > > > e u = ' F u l a n o ' Voctemquedigitarasaspasparaevitarumerro.Asaspaspodemser'simples'ou"duplas".Pythonguardarumacpiado seunomenamemriadocomputador,eassociaroidentificador e u aessedado.Agorabastadigitareuparaveroseu nome. > > > e u ' F u l a n o ' > > > Anteshavamoscriadoavarivel d referindose cotao do dlar, e no captulo anterior tambm criamos uma varivel chamada l i s t a , contendo uma lista de valores. Agora criamos a varivel e u para se referir ao seu nome. Estes so exemplosdetrstiposdedadosquePythoncapazdeprocessar:nmerodepontoflutuante,listadevalores,etexto. Vocpodesaberotipodeumavarivelouestruturadedadosusandoafunot y p e .Vejaestesexemplos: > > > e u = ' L u c i a n o ' > > > d = 1 . 9 0 2 > > > t y p e ( e u )

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

8/46

3/3/14

AprendaProgramar - PythonBrasil

< t y p e ' s t r ' > > > > t y p e ( d ) < t y p e ' f l o a t ' > > > > Pythonacabadenosdizerqueavarivele u refereseaumobjetodotipo's t r ',umaabreviaturade"string"(basicamenteo computador encara um texto como uma cadeia de caracteres). E a varivel d aponta para um objeto do tipo 'f l o a t ', ou "nmerodepontoflutuante",comojvimosantes. Vejamosmaisalgunstiposdedados: > > > t y p e ( 1 ) < t y p e ' i n t ' > > > > t y p e ( 1 . ) < t y p e ' f l o a t ' > > > > t y p e ( [ 1 , 2 , 3 ] ) < t y p e ' l i s t ' > > > > Observequeonmero1no'f l o a t ',mas'i n t '.Jonmero 1 . ("um"seguidodeumpontodecimal)consideradoum 'f l o a t '.Comojdissemosnoprimeirocaptulo,inteirosefloatstmtratamentodiferenteemPython.Umadivisodeinteiros (como 7/2), sempre fornece um resultado inteiro (3, nesse exemplo). O prximo dado testado uma lista, [ 1 , 2 , 3 ] , que Pythonchamade'l i s t '. Agora,experimentefazeressesdoistestes: > > > t y p e ( r a n g e ) < t y p e ' b u i l t i n _ f u n c t i o n _ o r _ m e t h o d ' > > > > t y p e ( r a n g e ( 3 ) ) < t y p e ' l i s t ' > > > > Aoperguntarmosqualotipoassociadoaonomer a n g e ,Pythonresponde:'b u i l t i n _ f u n c t i o n _ o r _ m e t h o d '.Tambmj vimosissonocaptuloanterior:onomer a n g e refereseaumafunoembutidanoprpriointerpretador.Notesteseguinte, fornecemosumargumentoparaafuno r a n g e ,eassimproduzimosumresultado(nestecaso,alista [ 0 , 1 , 2 ] ,quefoi criada na memria do seu computador, mas no foi exibida). sobre este resultado que a funo t y p e foi aplicada, retornando a informao de que se trata de um dado do tipo 'l i s t '. Ou seja, r a n g e uma expresso do tipo b u i l t i n _ f u n c t i o n _ o r _ m e t h o d , mas r a n g e ( 3 ) uma expresso do tipo 'l i s t '. Faz sentido? Se no faz, escreva reclamando! Cadatipodedadossuportaoperaesdiferentes.Faaalgumasexperinciaseanaliseosresultados: > > > n 1 = 1 0 > > > n 2 = 2 0 > > > n 1 + n 2 3 0 > > > n 1 = ' a b a c a t e ' > > > n 2 = ' b a n a n a ' > > > n 1 + n 2 ' a b a c a t e b a n a n a ' > > > n 2 + n 1 ' b a n a n a a b a c a t e ' > > > Porexemplo,ooperador+realizaumasomaquandoaplicadoadadosnumricos,masquandoaplicadoadadosdotipo s t r i n g ,osinal+ fazumaoperaodeconcatenao(junodeduasseqncias).Agoraexperimenteisto: > > > x = 3 . > > > x * 5 1 5 . 0

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

9/46

3/3/14

AprendaProgramar - PythonBrasil

> > > ' x ' * 5 ' x x x x x ' > > > Notequexe'x'socoisastotalmentediferentes.xonomedeumavarivelquenestemomentoserefereaovalor3 . (um f l o a t ).Oresultadode x * 5 1 5 . 0 (outro f l o a t ,comoeradeseesperar).J ' x ' uma s t r i n g com um caractere. Quandoosinal* aplicadoentreumas t r i n g eumnmerointeiro,Pythonrealizaumaoperaoderepetio.Comovoc podenotar,osoperadores+ e* fazemcoisasdiferentesdependendodostiposdedadosfornecidosnaexpresso. umprazertrabalharcomPythonporquesetratadeumalinguagemmuitocoerente.Observe: > > > [ 1 , 2 ] + [ 3 , 4 ] [ 1 , 2 , 3 , 4 ] > > > ' 1 2 ' * 3 ' 1 2 1 2 1 2 ' > > > [ 1 , 2 ] * 3 [ 1 , 2 , 1 , 2 , 1 , 2 ] > > > No primeiro exemplo, vemos o operador + concatenando duas listas. Os outros dois exemplos mostram a operao de repetio.Noteque' 1 2 ' noumnmero,masumas t r i n g compostapeloscaracteres' 1 ' e' 2 ' .ParaPython,s t r i n g s elistastmmuitoemcomum:ambassoseqnciasdeitens.Enquantos t r i n g s soseqnciasdecaracteres,listasso seqnciasdeitensquaisquer.Nosdoiscasos,concatenaoerepetiofuncionamdeformalogicamenteidntica.

Enfeitandoatabela
Agoraquesabemossobrealgunstiposdedados,equeosoperadoresfuncionamdeformadiferenteconformeosdadosda expresso,estamosprontosparaaperfeioarnossogeradordetabelasusandoopoderosooperador'%',queemPython notemnadaavercomporcentagens.Paravercomoelefunciona,vamoscriarumas t r i n g comoesta: > > > m s g = ' u m d l a r v a l e % f r e a l . ' > > > Agoravamosveroqueacontecequandochamamosavarivelm s g : > > > m s g ' u m d \ 3 6 3 l a r v a l e % f r e a l . ' > > > Python representa varaveis s t r i n g dessa forma: entre aspas simples, e trocando os acentos por cdigos especiais (estamosfalandodocdigoASCIIemnotaooctal,algoqueexplicaremosdepois).Sevocquiserexibirocontedode m s g deformamaisapresentvel,useocomandop r i n t : > > > p r i n t m s g u m d l a r v a l e % f r e a l . > > > OK,horadeexplicarporquecolocamosesseestranho% f dentrodamensagem.Tratasedeummarcadordeposiopara sinalizar onde Python dever inserir um nmero quando quisermos imprimir a mensagem com o valor da cotao. Experimentedigitaroseguinte: > > > d = 1 . 9 0 2 > > > p r i n t m s g % d u m d l a r v a l e 1 . 9 0 2 0 0 0 r e a l . > > > Vejaoqueaconteceu:Pythonsubstituiuamarca% f pelovalordavariveld .assimquefunciona:apartirdeumas t r i n g com marcas de posio e um ou mais valores, o operador % produz uma nova s t r i n g com os valores inseridos nas

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

10/46

3/3/14

AprendaProgramar - PythonBrasil

respectivasposies.Vejaagoraumexemplocomdoisvalores: > > > m s g 2 = ' U m d l a r v a l e % f r e a l e u m r e a l v a l e % f d l a r . ' > > > p r i n t m s g 2 % ( d , 1 / d ) U m d l a r v a l e 1 . 9 0 2 0 0 0 r e a l e u m r e a l v a l e 0 . 5 2 5 7 6 2 d l a r . > > > Notequeosvalores d e1 / d estoentreparnteses.Issoobrigatrioquandoqueremospassarmaisdeumvalorparao operador% (umasequnciadevaloresentreparntesesum"t u p l o ",umtipoespecialdelistaqueexplicaremosemum outrocaptulo). Osmbolo% f serveparainformaraPythonqueovaloraserinseridonaquelaposioumf l o a t .Sevocquiserlimitaro nmerodecasasapsopontodecimal,bastausarumformatocomoesse: > > > d = 1 . 6 8 5 > > > ' % . 2 f ' % d ' 1 . 6 9 ' > > > Apsomarcador% ,aindicao. 2 determinaquedevemaparecerduascasasdecimaisapsoponto.Notequeoresultado arredondado:1 . 6 8 5 virou1 . 6 9 .Vamosusaresserecursonanossatabela: > > > f o r p i n r a n g e ( 4 , 1 6 ) : p r i n t ' U S $ % . 2 f = R $ % . 2 f ' % ( p , p * d ) U S $ 4 . 0 0 = R $ 6 . 7 4 U S $ 5 . 0 0 = R $ 8 . 4 3 U S $ 6 . 0 0 = R $ 1 0 . 1 2 U S $ 7 . 0 0 = R $ 1 1 . 8 0 U S $ 8 . 0 0 = R $ 1 3 . 4 9 U S $ 9 . 0 0 = R $ 1 5 . 1 7 U S $ 1 0 . 0 0 = R $ 1 6 . 8 6 U S $ 1 1 . 0 0 = R $ 1 8 . 5 5 U S $ 1 2 . 0 0 = R $ 2 0 . 2 3 U S $ 1 3 . 0 0 = R $ 2 1 . 9 2 U S $ 1 4 . 0 0 = R $ 2 3 . 6 0 U S $ 1 5 . 0 0 = R $ 2 5 . 2 9 > > > Est quase linda. Falta s consertar o degrau que acontece entre a linha do 9 e do 10. No marcador de posio voc tambmpodecolocarumnmeroesquerdadopontoparadefiniralarguratotaldoespaoqueserreservado.Nafaixa depreosde4a15,osmaioresvalorestemcincocaracteresdecomprimento(incluindoopontodecimal),porissovamos usar'% 5 . 2 f '.Agorapodemosfazerumaversobemmelhordatabela: > > > f o r p i n r a n g e ( 4 , 1 6 ) : p r i n t ' U S $ % 5 . 2 f = R $ % 5 . 2 f ' % ( p , p * d ) U S $ 4 . 0 0 = R $ 6 . 7 4 U S $ 5 . 0 0 = R $ 8 . 4 3 U S $ 6 . 0 0 = R $ 1 0 . 1 2 U S $ 7 . 0 0 = R $ 1 1 . 8 0 U S $ 8 . 0 0 = R $ 1 3 . 4 9 U S $ 9 . 0 0 = R $ 1 5 . 1 7 U S $ 1 0 . 0 0 = R $ 1 6 . 8 6 U S $ 1 1 . 0 0 = R $ 1 8 . 5 5 U S $ 1 2 . 0 0 = R $ 2 0 . 2 3 U S $ 1 3 . 0 0 = R $ 2 1 . 9 2 U S $ 1 4 . 0 0 = R $ 2 3 . 6 0 U S $ 1 5 . 0 0 = R $ 2 5 . 2 9 > > >

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

11/46

3/3/14

AprendaProgramar - PythonBrasil

Entendendomelhorofor
Comovocpercebeu,nocomando f o r tudoaquiloqueapareceapsossinal":"repetidovriasvezes,umavezpara cada item da lista de valores indicada aps a palavra i n . Mas os comandos a serem repetidos podem ser vrios, e na maioriadasvezesnosoescritosnamesmalinhaqueof o r ,comotemosfeito,massimemlinhassubseqentes. Ocomando f o r algoquechamamosde"estruturadecontrole",queserveparadeterminaraformadeexecuodeum comando ou de uma seqncia de comandos, s vezes chamada de um "bloco". Em outras linguagens, os blocos so delimitadospormarcadoresespeciais.Java,PerleC++usamossinais{e}paraestefim.PascaleDelphiusamaspalavras B E G I N e E N D . Alm desses marcadores exigidos pelas linguagens, os programadores usam tambm o recurso da endentao, ou seja, o recuo em relao margem esquerda, para tornar mais fcil a visualizao da estrutura do programa.VejaesteexemploemPerl:

Perl
f o r ( $ i = 0 $ i < 5 $ i + + ) { $ v = $ i * 3 p r i n t " $ v \ n " } Ateno:istoPerl,enoPython. Aqui,oscomandos$ v=$ i*3 ; ep r i n t" $ v \ n " ; formamoblocoqueestsobreocontroledocomandof o r ,ouseja, osdoiscomandosseroexecutadosrepetidamente.OprogramaequivalenteemPythonescritoassim: > > > f o r i i n r a n g e ( 5 ) : . . . v = i * 3 . . . p r i n t v Emnossaopinio,ocdigoemPythonbemmaislegvel.Parasinalizarquaiscomandosfazempartedoblocoqueest sob o controle do f o r , apenas a endentao utilizada. Se voc est usando o IDLE, esse recuo acontece automaticamentequandoumalinhadecomandoterminacomosinal':',queemPythonsempreindicaoinciodeumbloco. NointerpretadorPythoninvocadoapartirdalinhadecomandonoDOSouemUNIX,aendentaonoautomtica.Voc precisadigitaraomenosumespaoembrancoparaevitarumamensagemdeerrocomoessa: > > > f o r i i n r a n g e ( 5 ) : . . . p r i n t i F i l e " " , l i n e 2 p r i n t i ^ S y n t a x E r r o r : i n v a l i d s y n t a x Notequeointerpretadorestreclamandodesintaxeinvlida,eapontando(^)paraaprimeirapalavradoblocoquedeveria estarrecuado.Vejaamesmacoisa,comasegundalinharecuadacomatecla[TAB]: > > > f o r i i n r a n g e ( 5 ) : . . . p r i n t i . . . 0 1 2 3 4 > > > Jdeveterficadoclaroporqueeraprecisoteclar[ENTER]duasvezesdepoisdo f o r nosexemplosanteriores:que,no modointerativo,ointerpretadorPythonesperaumalinhaembrancoparasinalizarofinaldeumasriedecomandosque formamumblocodentrodeumaestruturadecontrole.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

12/46

3/3/14

AprendaProgramar - PythonBrasil

Agoraqueentendemosoconceitodebloco,podemosenfeitaraindamaisanossatabelacolocandoumsegundocomando printdentrodonossofor: Vejaesteexemplo: > > > f o r p i n r a n g e ( 9 , 1 3 ) : . . . p r i n t ' U S $ % 5 . 2 f = R $ % 5 . 2 f ' % ( p , p * d ) . . . p r i n t ' ' * 2 0 . . . U S $ 9 . 0 0 = R $ 1 5 . 1 7 U S $ 1 0 . 0 0 = R $ 1 6 . 8 5 U S $ 1 1 . 0 0 = R $ 1 8 . 5 4 U S $ 1 2 . 0 0 = R $ 2 0 . 2 2 > > >

Aoutrafacedo%
Antes de encerrar este captulo, vale a pena contar que, assim como o + e o * , o operador '% ' tambm tem dupla personalidade.Quandoaplicadosobredoisnmeros,quepodemserinteirosou f l o a t s ,o'% ' retorna o resto da diviso inteiradoprimeiropelosegundo.Vejas: > > > 6 % 3 0 > > > 7 % 3 1 > > > 8 % 3 2 > > > 9 % 3 0 > > > Explicando:6 / 3 d2,eoresto0adivisointeirade7 / 3 tambmd2,masoresto1.Estaoperaochamada de "modulo" em ingls. Sua principal utilidade determinar se um nmero mltiplo de outro. Nos exemplos acima, o resultadode6 % 3 e9 % 3 zero,porque6e9somltiplosde3. Noprximocaptulovamoscomearaelaborarprogramasmaisextensos.Omodointerativo,quetemosusadoatagora, vai continuar sendo til para testarmos novas idias e observar o comportamento de funes e mdulos do Python rapidamente.Mas,apartirdaprximasesso,vamoscomearagravarnossosprogramasparausoposterior,emvezde digitlosdiretamentenointerpretador.Evamostambmdescobrircomosolicitarinformaesdousurio,deformaqueos programas possam ser utilizados por pessoas que no sabem programar e preferem ficar longe de um interpretador interativo.

Captulo3
Introduo
Depoisdedoiscaptulosbembsicos,horadeengatarumasegundaecomearacriarprogramasmaisdignosdesse nome.Novamosdesprezaroquefizemosataqui,digitandodiretamentenadeixadointerpretadorPython.Aocontrrio: tenhasempreemmentequevocpodeusloparaesclareceraqueladvidarpidaoumesmolocalizarumbugescondido emumsistemacomplexo.Amaioriadasoutraslinguagensnoofereceumambienteparaexecuoimediatadecomandos comooPython.UmaexceofamosaalinguagemLogo,ondeointerpretadorinterativoservejustamenteparafacilitara aprendizagemdaprogramaoatravsdaexploraoeexperimentos. Mas a partir de agora vamos atacar programas mais extensos, e no vamos querer digitlos linha por linha no modo interativo.Emvezdisso,vamosescreveroscomandosemumeditordetextos,salvaroarquivo,emandarointerpretador

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

13/46

3/3/14

AprendaProgramar - PythonBrasil

Pythonleroprogramasalvo.

RodandoprogramasnoIDLE
A verso Windows do Python traz o IDLE, um interpretador interativo em modo grfico que j apresentamos no primeiro captulo.SevocnousaessaversodoPython,vdiretoparaaprximaseo:Testandonosistema.OIDLEincluium editor de programas simplrio, mas til para quem est aprendendo a linguagem. O editor do IDLE exibe com cores diferentesaspalavrasdalinguagem,deacordocomsuafunosinttica(lembradaauladeportugusondeoverboera verde,osujeitovermelhoetc?).Paraabriroeditor,rodeoIDLEeacioneocomandoF i l e>N e ww i n d o w .Ajanelaquese abrir,comottulo"u n t i t l e d ",umeditor.Experimentedigitarumprograminhacomoesse: EscondernmerodaslinhasEscondernmerodaslinhas 1 f o r i i n r a n g e ( 1 0 0 ) : 2 p r i n t ' F u l a n o ' , 3 p r i n t ' e s e u s S i c r a n o s ' Notequeoeditorpintaalgumaspalavrasdelaranja.Soaschamadaspalavraschave,peastoimportantesemPython como os verbos em portugus. Outras cores indicaom funes e variveis. E os textos entre aspas aparecem em verde: dessaforma,ficadifcilesquecerdefecharaspas.Outracoisaqueacontecemagicamenteaendentao.Oeditor"sabe" queapsos":"docomandofor,devevirumblocoendentado.Paraencerraroblocoendentado,vocpodeteclar[ E N T E R ] duasvezesparapularumalinha,comoocorretambmnadeixadointerpretador,ouentoteclar[ B a c k S p a c e ] paraapagar deumavezsosquatroespaosesquerdadalinha. Umavezdigitadoesseprograminhavocpodeexecutlodeduasmaneiras:diretamentededentrodoIDLEounoconsole dosistemaoperacional.ParafazeroIDLErodaroseuprogramasteclar[ F 5 ] .Sevocaindanosalvouocdigodoseu programa,oIDLEvaiexibirumamensagempedindoparaquevocofaa.BastausarocomandoFile>Save,oumelhor ainda,[ C T R L ] + [ S ] .Sevocnosabeondesalvar,sugiroquecrieumapastachamadaCursodentrodapastaondeesto seu interpretador Python e salve ali (provavelmente a pasta ficar sendo C : \ P y t h o n 2 5 \ C u r s o , no caso do Python 2.5). Assimficafcilencontrlodepois.Useonomee g o t r i p . p y . Oprograminha e g o t r i p . p y faz o nome do autor aparecer 100 vezes, seguinda do nome de sua banda. No tempo dos computadoresde8bits,programinhascomoesseeraminvariavelmenteosprimeirosexercciosdequalquerestudantede programao. No IDLE, a "sada" do programa (aquilo que ele exibe ao rodar), aparece dentro de uma janela intitulada "P y t h o nS h e l l ".Vocpodefecharessajanelaquandooprogramaparar. Voc talvez tenha notado que o programa meio lento. Em meu velho notebook Pentium 133 o programa levava 10 segundosparaescreveras101linhas.muito.MasaculpanodoPython,esimdoIDLE,comoveremosaseguir.

Navegandopelalinhadecomando
NoLinuxalinhadecomandoestemtodaparte,masnoWindowsficaumpoucoescondida.Paraencontrla,cliquena barradetarefasdoWindowsXPemI n i c i a r>E x e c u t a r . . . .Najanelinhaqueseabre,digiteapenasc m d .Issoexecutao interpretador de comandos do Windows, equivalente ao velho MSDOS nos Windows mais antigos. Para quem nunca navegoupelosistemaviaprompt,eisaquiomnimoquevocprecisasaber.VejaoqueaparecenajaneladoPrompt: esquerdadocursor,voctemainformaomaisimportanteparaseorientar:aletradodriveeonomedapastaondevoc seencontra.SeoseuWindowsestcomaconfiguraodefbrica,vocestaremC : \ W i n d o w s .Osinal>apenasadeixa dosistema,equivalenteao > > > usadopeloPythonparaindicarqueestprontoparareceberumcomando.Antesdemais nada,vamosacionarumprograminhaquenospouparmuitadigitaoposteriormente: C : \ W i n d o w s > d o s k e y [ E N T E R ] Essecomandofazopromptdecomandolembraroquevocdigita,evocpoderacessaralistadoscomandosdigitados acionando as setas para cima e para baixo. Nas verses mais recentes do Windows a opo 'doskey' vem ativada por padro. Agora,vamosveroqueexistenapastaondeestamos(apastaWindows).Digite: C : \ W i n d o w s > d i r [ E N T E R ]

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

14/46

3/3/14

AprendaProgramar - PythonBrasil

Vocverumalongalistagemdearquivos,comseusnomesabreviados,extenses,tamanhos,datasenomeslongos.Em meu notebookaparecem236arquivosnapastaWindows.Noestamosinteressadosnelesagora,oobjetivoeraapenas mostrarqueocomandodirproduzumalistagemdosarquivosdapasta,oudiretrio,atual. Agoravamosnavegaratodiretrioondefoigravadooprogramae g o t r i p . p y .Digite: C : \ W i n d o w s > c d \ [ E N T E R ] Agoravocestnochamadodiretrioraizdoseudisco.Digited i r evejacomoamaioriadositensdentrodessapastaso outraspastas,comoaprpriapastaWindows.AgoravamosentrarnapastadoPython: C : \ > c d p y t h o n X X [ E N T E R ] E,emseguida,napastaCurso,quevocdevetercriadoquandosalvouoarquivoe g o t r i p . p y . C : \ P y t h o n X X > c d c u r s o C : \ P y t h o n X X \ C u r s o > d i r Vocdeververumalistagemcomoessa: O v o l u m e d a u n i d a d e C X X X O n m e r o d e s r i e d o v o l u m e X X X X X X X X P a s t a d e C : \ P y t h o n X X \ C u r s o . < D I R > 2 5 / 1 0 / 9 9 2 0 : 5 7 . . . < D I R > 2 5 / 1 0 / 9 9 2 0 : 5 7 . . E G O T R I P P Y 8 9 2 5 / 1 0 / 9 9 2 0 : 3 2 e g o t r i p . p y 1 a r q u i v o ( s ) 8 9 b y t e s 2 p a s t a ( s ) 2 1 . 3 3 1 . 9 6 8 b y t e s d i s p o n v e i s C : \ P y t h o n X X \ C u r s o > Agoravocestnopontocertoparadigitarocomandoquecausaraexecuodoseuprogramae g o t r i p . p y .

Testandonosistema
MeuambientefavoritopararodarprogramasemPythonaprprialinhadecomandodosistemaoperacional.Nocostumo usaroeditordoIDLE,massimo N o t e P a d + + ,umexcelenteeditordetextoslivreegratuitoparaWindows.Sejaqualforo editorquevocusa,oimportantesalvaroarquivocomotextopuro,semmarcasdeformatao.ONotepadmelhorque Wordparaessefim,masoNotePad++muitomelhor.NoLinux,Gedit,Kate,Pico,VieEmacssoalgunseditoresdetexto purobastantecomuns.Entreesses,prefiroGediteKate,quetminterfacesmaismodernas.Umavezdigitadoesalvoo arquivo,vocprecisaexecutloapartirdalinhadecomandodoseusistema. QuemusaLinuxoujesthabituadoaoDOS,podeseguirataprximaseo,ASCIIart.

ASCIIart
NoWindows,paraexecutaroprograma,digiteesseencantamento(supondoquevocfeztudoconformedescritonaseo acima,oufeztudodiferentemassabiaoqueestavafazendo): C : \ P y t h o n X X \ C u r s o > . . \ p y t h o n e g o t r i p . p y Ossinais . . \ nafrentedocomandopythonservemparadizeraoDOSparaexecutarumprogramaqueestnodiretrio anteriornocaminhoatual.Assim,acionamosoprogramap y t h o n . e x e queestnapastaC : \ P y t h o n X X . NoLinux,vocprecisarchegaratodiretrioquecontmoexemplo,edigitar: $ p y t h o n e g o t r i p . p y

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

15/46

3/3/14

AprendaProgramar - PythonBrasil

Ou,seissonofuncionar,tentealgocomosegue(ocomandoexatovaidependerdasuainstalao): $ / u s r / l o c a l / b i n / p y t h o n e g o t r i p . p y $ / u s r / b i n / p y t h o n e g o t r i p . p y Bom,deutrabalhomaschegamos.Ecomovocdeveternotado,aexecuodoprograminhafoibemmaisvelozqueno IDLE(emmeucomputador,menosde1segundo,emvezde10). Agoravamosfazerumapequenamudananoprogramaegotripqueterumgrandeefeito.Parafazeressaalterao,no Windowsomodomaisrpidoseguraratecla [ A L T ] epressionar [ T A B ] atqueoconedoeditordoIDLEidentificado pelonomedoarquivoe g o t r i p . p y estejaselecionado.Entosolteatecla[ A L T ] ,queoeditoraparecersobrepondoses demaisjanelas.Agoravamosmodificaroprogramaegotrip.Aofinaldasegundalinha,digiteumavrgula.Oseuprograma deverficarassim: EscondernmerodaslinhasEscondernmerodaslinhas 1 f o r i i n r a n g e ( 1 0 0 ) : 2 p r i n t ' L u c i a n o ' , 3 p r i n t ' e s e u s C a m a r g o s ' Salvecom[ C T R L ] + [ S ] erodeoprogramanovamente.Tecle[ F 5 ] pararodarnoIDLE,ousigaessespassosparatestarno DOS: [ A L T ] + [ T A B ] atvoltaraopromptdoDOS [ ^ ] (setaparacima)pararepetirocomando. . \ p y t h o ne g o t r i p . p y [ E N T E R ] paraexecutarocomando. 10 entre 10 programadores que usam a plataforma Windows tm muita prtica com a sequncia [ A L T ] + [ T A B ] , [ ^ ] , [ E N T E R ] .Logo,logo,emsuaprimeirasessodecaaaumbug,vocteroportunidadedepraticarbastante. Nessecaso,interessantetestaroprogramatantonoIDLEquantonalinhadecomando.Vocverqueosresultadosso bemdiferentes.Experimenteetenteexplicarporqu. Comoexercciofinal,substituaoargumento100dafunorangepelonmero1000,erodeoprogramanovamente(no recomendousaro [ F 5 ] doIDLEdessavezserbemdemorado).Tenteacrescentarouretirarletrasdosnomes.Oefeito serdiferente.Bemvindoaomundodaexpressoartsticacomcaracteresdecomputador.

Seuprimeiroprogramainterativo
Atagora,todososprogramasquemostramosnosointerativos,ouseja,umavezrodando,elesnoaceitamaentrada dedadosdeumusuriooudosistema.Programasnointerativossousadosemmuitassituaescomuns.Oprograma queemiteoschequesdafolhadepagamentosdeumagrandeempresaprovavelmentenointerativo,masrecebetodos os dados necessrios em um nico lote, antes de sua execuo. Mas os programas mais interessantes, como um processadordetextos,um gameouopilotoautomticodeumaviosotodosinterativos.Esseotipodeprogramaque passaremosadesenvolveragora. NossopasseiopelaASCIIartnoteveapenasobjetivosestticos.QuisemosmostrarcomorodarumprogramaemPythona partirdalinhadecomandoporque,apartirdeagora,vamosusarumcomandodalinguagemPythonquenofuncionana atualversodoIDLE.Ocomandochamase"r a w _ i n p u t ",esuafunoreceberumaentradadedadosdousurio(input querdizerentradadedadoscuidadoporquevocdevetersidocondicionadoaacreditarque"antesdePeBsemprevema letraM",masinputingls,eseescrevecomNmesmoeuperdiumahoracomissoquandoaprendiaBASIC). Vejamosumprimeiroexemplo.ObservequenoestamosacentuandootextonoprogramaporqueoDOSnoreproduz corretamente os acentos do Windows, e precisamos do DOS para testar esse programa. Deve haver uma forma de convenceroDOSaexibirosacentoscorretosdoWindows,masaindanodescobrimoscomo. De qualquer forma, isso no quer dizer que no d para fazer programas com acentuao correta em Python quando aprendermosacriarsoftwaresgrficosesseproblemadesaparecer. Digiteoprograminhaabaixo,salvecomod e s p d o m 1 . p y eexecutenalinhadecomando.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

16/46

3/3/14

AprendaProgramar - PythonBrasil

EscondernmerodaslinhasEscondernmerodaslinhas 1 # d e s p d o m 1 . p y C a l c u l a d o r a d e d e s p e s a s d o m e s t i c a s 2 3 p r i n t ' B a l a n c o d e d e s p e s a s d o m e s t i c a s ' 4 a n a = r a w _ i n p u t ( ' Q u a n t o g a s t o u A n a ? ' ) 5 b i a = r a w _ i n p u t ( ' Q u a n t o g a s t o u B i a ? ' ) 6 t o t a l = f l o a t ( a n a ) + f l o a t ( b i a ) 7 p r i n t ' T o t a l d e g a s t o s = R $ % s . ' % t o t a l 8 m e d i a = t o t a l / 2 9 p r i n t ' G a s t o s p o r p e s s o a = R $ % s . ' % m e d i a Osnmerosqueaparecemesquerdanalistagemacimanofazempartedoprogramaenodevemserdigitados.Eles estoaparafacilitaraexplicaoquevemlogoaseguir. Antesdeesmiuaroprograma,valeapenaexecutloparaveroqueacontece.Vocsersolicitadoadigitarumvalorpara AnaeoutroparaBia.Notequeosvaloresdeveroserapenasnmeros.Sequiserusarcentavos,useopontodecimalem vezdevrgula,comojvnhamosfazendoantes.Enadade$ouR$.Vejamosumexemplodeexecuo: C : \ P y t h o n X X \ C u r s o > . . \ p y t h o n d e s p d o m 1 . p y B a l a n c o d e d e s p e s a s d o m e s t i c a s Q u a n t o g a s t o u A n a ? 1 0 Q u a n t o g a s t o u B i a ? 2 0 T o t a l d e g a s t o s = 3 0 . 0 G a s t o s p o r p e s s o a = 1 5 . 0 C : \ P y t h o n X X \ C u r s o >

Dissecandoocdigo
Agoravamosacompanhar,linhaporlinha,comoointerpretadorexecutouoprograma.Essaaatividademaisimportante para desenvolver voc como programador ou programadora. Voc precisa aprender a ler um programa e simular mentalmentequeacontecedentrodocomputador."Quandovocaprenderasecolocarnolugardocomputadoraolerum programa,estarpronto,Gafanhoto". Linha 1: O sinal # indica comentrio. Tudo o que aparece em uma linha a partir desse sinal ignorado pelo interpretadorPython.Nestecaso,ocomentrioexplicaparans,humanos,opropsitodoprograma.Notequeo comentrionoapareceparaousuriofinalquandooprogramaexecutado.Comentriosservemapenaspara serlidosporoutrosprogramadores. Linha3:Ovelhocomando p r i n t usado para escrever o ttulo "Balanco de despesas domesticas" na tela do usurio. Linha4:Ocomando r a w _ i n p u t exibeapergunta"QuantogastouAna?",aguardaumarespostaearmazenana varavelana. Linha5:OmesmocomandousadoparaguardarosgastosdeBianavarivelbia. Linha 6: Aqui calculado o total. Note o uso da funo float. Acontece que a funo r a w _ i n p u t no retorna nmeros,esimstrings.Comovimosnocaptuloanterior,ooperador"+"temefeitosdiferentesquandoaplicadoa stringsemvezdesomar,eleconcatenaoujuntaostextos.Nessecaso,seana 10 ebia 20 ,ana+biaseria 1020 .Pararealizarasoma,precisamosantestransformarasstringsemnmeros,oquefeitopelafunes float ouint.Nessecaso,usamosfloatporquenovamosnoslimitaraaceitarnmerosinteiros. Linha7:Ototalexibido,comoauxliodooperador%queinsereovalornaposioassinaladapeloscaracteres %sdentrodamensagem.Ocdigo%sfazcomquePythontransformeonmeroemstring. Linha 8: Clculo da mdia. Como ambos os valores so float, o resultado ser preciso (se fossem inteiros, o resultadotambmseriaforadoaserinteiro,oquenessecasolevariaaerrosdotipo). Linha9:Mostramosamdia,usandoamesmatcnicadalinha7. Experimente rodar o programa algumas vezes. Note que no um programa muito robusto: se voc no digitar coisa algumaeteclar[ENTER]apsumadasperguntas,ourespondercomletrasemvezdenmeros,oprograma"quebra".No

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

17/46

3/3/14

AprendaProgramar - PythonBrasil

prximocaptuloaprenderemosalidarcomentradasinesperadas.

Umprogramamaisesperto
Oprogramaacimaquasetil.Elecalculaadespesatotaleamdia,masnorespondeperguntafundamental:quanto AnatemquepagaraBia,ouviceversa?Aaritmticaenvolvidasimples:seAnagastoumenos,elaprecisapagaraBiaum valorigualdiferenaentreoquegastoueamdia.Gostaramosquenossoprogramafuncionasseassim: B a l a n c o d e d e s p e s a s d o m e s t i c a s Q u a n t o g a s t o u A n a ? 1 0 Q u a n t o g a s t o u B i a ? 2 0 T o t a l d e g a s t o s : R $ 3 0 . 0 G a s t o s p o r p e s s o a : R $ 1 5 . 0 A n a d e v e p a g a r : R $ 5 . 0 UtilizeocomandoF i l e>S a v eA s . . . parasalvaroprogramad e s p d o m 1 . p y comod e s p d o m 2 . p y .Agoravamosmodific loparafazeroquequeremos.Abaixo,oprogramafinal,easeguir,aexplicaodecadamudanaquefoifeita. EscondernmerodaslinhasEscondernmerodaslinhas 1 # d e s p d o m 2 . p y C a l c u l a d o r a d e d e s p e s a s d o m e s t i c a s v e r s a o 2 2 3 p r i n t ' B a l a n c o d e d e s p e s a s d o m e s t i c a s ' 4 a n a = f l o a t ( r a w _ i n p u t ( ' Q u a n t o g a s t o u A n a ? ' ) ) 5 b i a = f l o a t ( r a w _ i n p u t ( ' Q u a n t o g a s t o u B i a ? ' ) ) 6 p r i n t 7 t o t a l = a n a + b i a 8 p r i n t ' T o t a l d e g a s t o s : R $ % s ' % t o t a l 9 m e d i a = t o t a l / 2 1 0 p r i n t ' G a s t o s p o r p e s s o a : R $ % s ' % m e d i a 1 1 i f a n a < m e d i a : 1 2 d i f e r e n c a = m e d i a a n a 1 3 p r i n t ' A n a d e v e p a g a r : R $ % s ' % d i f e r e n c a 1 4 e l s e : 1 5 d i f e r e n c a = m e d i a b i a 1 6 p r i n t ' B i a d e v e p a g a r : R $ % s ' % d i f e r e n c a Linha1:Acrescentamos"versao2"aocomentrio Linhas4e5:Aquifazemosaconversodosresultadosderaw_inputparafloatimediatamente,demodoqueos valoresarmazenadosnavariveisanaebiasonmeros,enostringscomoantes. Linha6:Umamudanacosmticaapenas:acrescentamosumalinhacomapenasumprint,paradeixarnatela umalinhaembrancoentreasperguntaseosresultados. Linhas7:Agorapodemossimplesmentesomarosvaloresdeanaebia,quejforamconvertidosparafloatnas linhas4e5. Linhas8a10:Exibimosototaleprocessamosamdia,comoantes. Linha11:Apresentamosumnovocomandodebloco,ocomandoif,quepodesertraduzidoexatamentecomo"se". Essalinhadiz,literalmente:"seana<media:".Ouseja,seovalordeAnaformenorqueovalordamdia,execute oblocoendentadoaseguir(linhas12e13).Casocontrrio,noexecuteessaslinhas,epassediretoparaalinha 14. Linhas12e13:CalculamoseexibimosquantoAnadevepagar. Linha14: Aqui vemos outro comando de bloco, o else, que pode ser traduzido como "seno". O else s pode existirapsumblocoiniciadoporif.Oblocoquesegueoelsesexecutadoquandoacondioprevistanoif noocorre.Issosignificaque,quandotemosumblocoifeumblocoelse,garantidoqueapenasumdosdois serexecutado.Nessecaso,aslinhas15e16sseroexecutadasseovalordeAnanoformenorqueamdia. Linhas15e16:CalculamoseexibimosquantoBiadevepagar.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

18/46

3/3/14

AprendaProgramar - PythonBrasil

Experimenteumpoucocomoprogramad e s p d o m 2 . p y .OqueacontecequandoosgastosdeAnaeBiasoiguais?Tente responderessaperguntasemrodaroprograma.Achaveestnalinha11.Qualamdiaquandoosgastossoiguais? Tente simular mentalmente o comportamento do computador na execuo passo a passo do programa. Dedique alguns minutosaessedesafio,esentorodeoprogramacomvaloresiguaisparaverseaconteceoquevocimaginou.

Tudosobreoif
Ocomandoif,queacabamosdeconheceratravsdeumexemplo,umapeafundamentaldalinguagemPython,ede quasetodasaslinguagensdeprogramaoexistentes.Suafunodescritacomo"comandodeexecuocondicionalde bloco",ouseja,umcomandoquedeterminaaexecuoounodeumblocodecomandos,deacordocomumacondio lgica.Noexemplo,acondiolgica"ana<media".Ooperador<serveparacomparardoisnmerosedeterminarseo primeiromenorqueosegundo(eletambmfuncionacomstrings,masaacomparaosegueumaregraparecidacoma ordemusadadosdicionrios).OsoperadoresdecomparaodePythonsoosmesmosusadosemJavaeC++: Operador Descrio == != < > >= <= igual diferente menorque maiorque maiorouiguala Exemplo a==b a!=b a<b a>b a>=b

menorouiguala a<=b

Parasentirofuncionamentodessesoperadores,abraointerpretadorinterativodoPythonedigiteessestestes(novamos mostrarosresultadosaquifaavocmesmo). > > > a = 1 > > > b = 2 > > > a = = 1 > > > a = = 2 > > > a = = b > > > 2 = = b > > > a ! = b > > > a ! = 1 > > > a < b > > > a > = b Aslinhas1e2noproduzemnenhumresultado,comojvimosantes.Elasapenasatribuemvalorsvariveisaeb.A linha3pareceumpoucocomalinha1,massignificaalgocompletamentediferente.Aquinoacontecenenhumaatribuio, apenas uma comparao, que vai gerar um resultado. Um erro bastante comum cometido por quem est aprendendo Python,CouJavausar=nolugarde==aofazerumacomparao(emBasic,porexemplo,o=usadonosdoiscasos). Aps cada as linhas a partir da linha 3, o interpretador mostrar um nmero 1 ou 0, para indicar que a comparao verdadeira(1)oufalsa(0). DependendodointerpretadoredaversodoPythonquevocestejautilizando,elepoderexibirdiretamenteosvalores 'True'ou'False'.Issoaconteceporquevarivelfoiatribudootipobooleano.EssetiporetornaFalsepara0eTruepara qualquervalordiferenteezero,incluindonmerosnegativosedecimais. > > > b o o l e a n o = 5 > > > b o o l ( 5 ) T r u e > > > b o o l e a n o = b o o l e a n o 5 > > > b o o l ( b o o l e a n o ) F a l s e Voltandoaocomandoi f ,noexistenenhumaleiqueobrigueapresenadeumoperadordecomparaonacondiodo i f .Anicacoisaqueinteressaqueaexpressoqueestivernolugardacondioserconsideradafalsaseforiguala0

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

19/46

3/3/14

AprendaProgramar - PythonBrasil

(zero),uma stringvazia,umalistavaziaouovalorespecialNone,sobreoqualvoltaremosafalardepois.Qualquervalor quenosejaumdessesserconsiderado"verdadeiro",eprovocaraexecuodoblocosubordinadoaoif.porissoque osoperadoresdecomparaoretornam0ou1pararepresentarfalsoouverdadeiro. Noobrigatriaapresenadeumblocoelseapsumif.Masumelsespodeexistirapsumif.Eumifpodeconter,no mximo,umelse.Existeumterceirocomandodeblocorelacionadoaesses,chamadoelif.Elecorrespondecombinao elseifexistenteemoutraslinguagens.Assimcomooif,cadaelifdeveseracompanhadodeumacondioquedeterminar aexecuodoblocosubordinado.Comotodocomandodebloco,aprimeiralinhadoelifdeveserterminadaporumsinalde :. Umifpodeserseguidodequalquerquantidadedeblocoselif,esehouverumblocoelseeledevervirdepoisdetodosos elif.Vejaessefragmentodecdigo,partedeumjogosimplesquecriaremosnoprximocaptulo: EscondernmerodaslinhasEscondernmerodaslinhas 1 i f v f = = 0 : 2 p r i n t ' A l u n i s s a g e m p e r f e i t a ! ' 3 e l i f v f < = 2 : 4 p r i n t ' A l u n i s s a g e m d e n t r o d o p a d r a o . ' 5 e l i f v f < = 1 0 : 6 p r i n t ' A l u n i s s a g e m c o m a v a r i a s l e v e s . ' 7 e l i f v f < = 2 0 : 8 p r i n t ' A l u n i s s a g e m c o m a v a r i a s s e v e r a s . ' 9 e l s e : 1 0 p r i n t ' M o d u l o l u n a r d e s t r u i d o n o i m p a c t o . ' Numasequenciadeif/elif/elif/.../elsegarantidoqueum,eapenasumdosblocosserexecutado.Ficacomodesafioparao leitordescobrircomousarocomandoelifparacorrigirobugdosgastosiguais,queaparecenoprogramad e s p d o m 2 . p y .

Captulo4
Oramentos,pousoslunaresetratamentodeerros
Ocaptuloanteriorterminoucomumaquestonoar.Apsestudarmostodasasformasdeseusarocomandoif,restouo desafiodeusarumblocoelifparaconsertarumpequenodefeitonoprogramad e s p d o m 2 . p y .Obugsemanifestaquandoos gastosdeAnaeBiasoiguais.Nessecaso,oprogramaescrevenatela: B i a d e v e p a g a r : R $ 0 . 0 Em vez de fazer a Bia escrever um cheque de zero reais, o melhor seria tratar esse caso especial. Veja como fazlo, usandoumaconstruoif/elif/else(listagem1).Sevocguardouoarquivodespdom2.pydalioanterior,termuitopouco oquedigitar.Abraoesalvecomonomededespdom3.py.Ocdigoidnticoversoanterioratalinha14.Ali,vocfaz a primeira alterao: o else substitudo por um elif que verifica se Bia gastou menos que a mdia. As linhas 15 e 16 continuamcomoantes,masagoraelassseroexecutadassebia<mediaforverdadeiro.Aslinhas17e18sonovas,e servemparatratarocasoemquenemana<medianembia<media,ouseja,quandonohdiferenaaserpaga.Agora vocpodetestaroprogramadigitandovaloresdiferentesedepoisvaloresiguaisparaasdespesasdeAnaeBia. EscondernmerodaslinhasEscondernmerodaslinhas 1 # d e s p d o m 3 . p y C a l c u l a d o r a d e d e s p e s a s d o m e s t i c a s v e r s a o 3 2 3 p r i n t ' B a l a n c o d e d e s p e s a s d o m e s t i c a s ' 4 a n a = f l o a t ( r a w _ i n p u t ( ' Q u a n t o g a s t o u A n a ? ' ) ) 5 b i a = f l o a t ( r a w _ i n p u t ( ' Q u a n t o g a s t o u B i a ? ' ) ) 6 p r i n t 7 t o t a l = a n a + b i a 8 p r i n t ' T o t a l d e g a s t o s : R $ % s ' % t o t a l 9 m e d i a = t o t a l / 2 1 0 p r i n t ' G a s t o s p o r p e s s o a : R $ % s ' % m e d i a 1 1 i f a n a < m e d i a :

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

20/46

3/3/14

AprendaProgramar - PythonBrasil

1 2 d i f e r e n c a = m e d i a a n a 1 3 p r i n t ' A n a d e v e p a g a r : R $ % s ' % d i f e r e n c a 1 4 e l i f b i a < m e d i a : 1 5 d i f e r e n c a = m e d i a b i a 1 6 p r i n t ' B i a d e v e p a g a r : R $ % s ' % d i f e r e n c a 1 7 e l s e : 1 8 p r i n t ' A n a e B i a g a s t a r a m a m e s m a Q u a n t i a . '

Somadorainfinita
Logoadianteiremosreescreveroprograminhaacimaparatornlomaisflexvel,permitindodigitarosnomeseosgastosde qualquernmerodepessoas.Assimelesertilpararepartirascontasdeumaviagemdefriasoudaquelafestaentre amigos. Para comear, vamos construir um programa um pouco mais simples, capaz de somar uma srie de nmeros (listagem2). EscondernmerodaslinhasEscondernmerodaslinhas 1 # s o m a d o r a 1 . p y s o m a d o r a i n f i n i t a v e r s a o 1 2 3 p r i n t ' D i g i t e o s v a l o r e s a s o m a r s e g u i d o s d e [ E N T E R ] . ' 4 p r i n t ' P a r a e n c e r r a r d i g i t e z e r o : 0 ' 5 n = f l o a t ( r a w _ i n p u t ( ' : ' ) ) 6 t o t a l = n 7 w h i l e n ! = 0 : 8 n = f l o a t ( r a w _ i n p u t ( ' : ' ) ) 9 t o t a l = t o t a l + n 1 0 p r i n t ' T O T A L : % s ' % t o t a l Vamosveroquefazesseprograma,linhaporlinha. Linhas3e4:Exibimosasinstruesdeuso. Linha5: Usamos o comando raw_input() para exibir o sinal ":" e ler o primeiro valor digitado pelo usurio, e a funofloatparatransformara stringresultanteemumnmerodepontoflutuante.Oresultadoarmazenadona variveln. Linha6:Avariveltotalservirparaguardarasomaacumulada.Paracomear,colocamosnelaoprimeirovalor digitado. Linha7:Aquiusamosumnovocomandodebloco,owhile.Essalinhapodesertraduzidaassim:"enquanton diferentedezero...".Assimcomoocomandofor,owhilecausaaexecuorepetidadoblocosubordinado(linhas8 e9).Emumcomandowhile,arepetiocondicionadaaumaexpressolgicadomesmotipoqueusamoscom ocomandoif.Nesseexemplo,acondion!=0causararepetiodoblocoenquantoforverdadeiroquen diferentede0.Nomomentoquencontiverovalor0,acondioserfalsaearepetiodeixardeocorrer.O programaentoseguirparaalinha10. Linha10:Mostramosototalacumulado.Fimdoprograma.

Maissobreowhile
Os comandos while e for so semelhantes por causarem a repetio de um bloco. Ambos so chamados, pelos computlogos,decomandosdeiterao(iteraosinnimoderepetionoconfundacom"interao",queumaao recprocaentredoisoumaisagentes). Adiferenaquenocomandoforaiteraoserveparapercorrerumalistadeitens,comofizemosanteriormentequando trabalhamoscomtabelasdeconverso.Nocasodofor,onmeroderepetiessempreconhecidodeantemo:obloco serexecutadoumavezparacadaitemdalista.Ocomandowhileserveparatodososoutroscasosdeiterao,quandoo nmeroderepetiesindefinido.Nossasomadorainfinitaumexemplotpico:aiteraoquesolicitavaloreseostotaliza poderserrepetidaqualquernmerodevezes,dependendoapenasdasuavontade. Agoravamosanalisardepertoduascircunstnciasespeciais.Rodeoprogramaedigite0(zero)comoprimeirovalor.Nas linhas 5 e 6 o programa armazenar o zero nas variveis n e total. A seguir, na linha 7, o comando while verificar a condion!=0.Nessecaso,acondioserfalsa.Entooblocosubordinadoaowhilenoserexecutadonenhumavez,

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

21/46

3/3/14

AprendaProgramar - PythonBrasil

eoprogramapassardiretoparaalinha10,mostrandoototal. Outromomentointeressanteocorrequandooprimeirovalordigitadonozero,eaiteraoexecutada.Digamosqueo usuriodigitou[1][Enter],[2][Enter]e[0][Enter].Ozerodigitadopelousurioserlidoearmazenadoemnnalinha8,comoj vimos.Nalinha9ovalordensomadoaototal.Nessaiteraoovalordenzero,portantoestamossomandozeroao total,umaoperaoinofensiva.Sapsefetuaressasomaintil,oprogramaretornaraoinciodoblocoeverificarquea condiodowhilenomaisverdadeira,poisagoranossonigualazero.importanteperceberque,apesardeovalor denpassaraserzeronalinha8,aexecuocontinuaatofimdobloco,passandopelalinha9,parasentoocorrero retornoaoinciodoblocoeaverificaodacondiodecontinuidadedarepetio. Quandoestudamosascondieslgicasnofinaldocaptuloanterior,aprendemosquePythonconsideraovalor0(zero) comosinnimode"falso",evaloresnozerocomo"verdadeiros".ProgramadoresexperientesemPythoncostumamtirar proveitodessefatoparaabreviarascondiesquecolocamemseusifsewhiles.Emnossoprograma s o m a d o r a 1 . p y , a linha7: w h i l e n ! = 0 : podeserescritadeformamaisabreviadaassim: w h i l e n : Faaessaalteraonoprogramaeexperimente.Vocverquenadamudounoseufuncionamento.Issoporque,quandon diferentedezero,acondio"n"expressaem w h i l en : consideradaverdadeira,eaiteraoexecutada.Quandon passaaserzero,acondiofalsa,encerrandoaiterao.

Loops(quase)infinitos
Outraformadeescreverasomadora,maiseleganteemminhaopinio,amostradanalistagem3. EscondernmerodaslinhasEscondernmerodaslinhas 1 # s o m a d o r a 2 . p y s o m a d o r a i n f i n i t a v e r s a o 2 2 3 p r i n t ' D i g i t e o s v a l o r e s a s o m a r s e g u i d o s d e [ E N T E R ] . ' 4 p r i n t ' P a r a e n c e r r a r d i g i t e z e r o : 0 ' 5 t o t a l = 0 6 w h i l e 1 : 7 n = f l o a t ( r a w _ i n p u t ( ' : ' ) ) 8 i f n = = 0 : b r e a k 9 t o t a l = t o t a l + n 1 0 p r i n t ' T O T A L : % s ' % t o t a l Aquialgicaumpoucodiferente:nalinha6oloopwhiletemcomocondioonmero1.Comoonmero1constante,e considerado "verdadeiro" pelo interpretador Python, o loop das linhas 6 a 9 seria repetido infinitas vezes, em tese. Na prtica,alinha8verificaseovalordenzero.Emcasoafirmativo,ocomando"break"acionado.Issofazcomqueoloop whilesejainterrompidoimediatamente,eaexecuodoprogramapassadiretamenteparaaprximalinhaapsobloco (linha10emnossoexemplo). Essaformadecodificar,usandoloopsinfinitoscombreaks,noestdeacordocomaProgramaoEstruturada,afilosofia dominanteentreosprogramadoresnosanos70.Oproblemaquenoficaimediatamenteaparentequalacondiode terminaodoloopealgunsprofessoresdecomputaopodemdescontarpontosporisso.Masemsetratandodeumbloco deapenastrslinhas,noachoqueissosejaumgrandeproblema.Avantagemqueagoraafunodeleituradedados ocorre em apenas um lugar no programa (na linha 7) e no em dois, como na verso anterior (linhas 5 e 8 de somadora1.py). Isso simplificar nossa prxima alterao. Alm disso, no acontece mais a totalizao intil da linha 9, somandozeroaototalnasada,porqueocomandobreakdalinha8fazoprogramapassardiretoparaalinha10. Umaformamaisnaturaldecodificaresseloopseriausarcomandoscomodo/whileourepeat/untilexistentesemlinguagens comoC/C++/JavaePascal/Delphinessasestruturasdecontrole,otestefeitonofimdoloop,garantindoaexecuodo blocoaomenosumavez.oqueprecisamosfazeraqui,masPythonnopossuiumcomandodeloopespecialparaessa situao.Vejamosoutroexemplo.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

22/46

3/3/14

AprendaProgramar - PythonBrasil

Suponhaquevocqueira,poralgummotivoestranho,somarosnmerosnaturais(1,2,3etc.)atobterumtotalmaiorou iguala100.Observenalistagem4comoficariaoloopcentralparafazerissoemDelphi,JavaePython.

Delphi
R E P E A T n : = n + 1 t o t a l : = t o t a l + n U N T I L ( t o t a l > = 1 0 0 )

Java
d o { n = n + 1 t o t a l = t o t a l + n } w h i l e ( t o t a l < 1 0 0 )

Python
EscondernmerodaslinhasEscondernmerodaslinhas 1 w h i l e T r u e : 2 n = n + 1 3 t o t a l = t o t a l + n 4 i f t o t a l > = 1 0 0 : b r e a k Notequeostrsprogramasacimaestoincompletosreproduzimosapenasoloopprincipal.Generalizando,qualquerloop comtestenofinalpodesercodificadoemPythonusandoseumacombinaodewhile1eif/break,assim: w h i l e T r u e : c o m a n d o 1 c o m a n d o 2 # e t c . i f c o n d i c a o _ f i n a l : b r e a k

Umprogramamaistolerante
Um defeito das nossas somadoras, e de todos os programas que fizemos at agora, que eles no toleram falhas na digitao.Sevocrodaroprograma s o m a d o r a 2 . p y edigitarapenas[Enter]paraencerrar,veraseguintemensagemna tela: T r a c e b a c k ( i n n e r m o s t l a s t ) : F i l e ' s o m a d o r a 1 . p y ' , l i n e 7 , i n ? n = f l o a t ( r a w _ i n p u t ( ) ) V a l u e E r r o r : e m p t y s t r i n g f o r f l o a t ( ) Asegundalinhadessamensagemidentificaolocaldoerro:linha7doarquivo(file) s o m a d o r a 1 . p y .Naterceiralinhaest reproduzidaalinhadoprogramaondeocorreuoproblema,eamensagemfinalinformaqualfoioerro.Podemostraduzla assim:"Errodevalor:stringvaziaparaafunof l o a t ( ) ". Oproblemaque,aodigitarmos[ E n t e r ] semfornecerumnmero,afunor a w _ i n p u t ( ) retornaumastringvazia(nada maisjusto,poisnadafoidigitado).Emseguinda,afuno f l o a t ( ) tentatransformara stringvaziaemumpontoflutuante, mas no sabe como. ela que dispara a mensagem de erro, fazendo com que o programa seja interrompido antes de mostrarovalortotaldasoma. Efeitosemelhantepodeserobtidosevocdigitarumtextoqualqueremvezdeumnmero.Experimente.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

23/46

3/3/14

AprendaProgramar - PythonBrasil

Nessecaso,amensagemdeerrofinal:"ValueError:invalidliteralforfloat():blah".Nessecaso,areclamaode"invalid literal",significandoqueotextofornecidoparaafunof l o a t ( ) noseparececomumnmero. A melhor maneira de resolver esse problema envolve o uso de mais uma comando de bloco de Python: o conjunto t r y / e x c e p t (tentar/exceto).Essepardepalavraschaveformamomecanismode"tratamentodeexcees"dePython,algo que s se encontra em linguagens bastante modernas como Java e as verses mais recentes de C++. A idia bsica simples:nocasodanossasomadora,vamostentar(t r y )convertera stringdigitadaem floatseissonodercerto,temos uma exceo, que deve ter tratamento especial. No nosso caso, vamos simplesmente acionar o comando b r e a k para interromperoloopeexibiratotalizao. Vejanalistagemabaixocomoficaas o m a d o r a 3 . p y ,agoracomtratamentodeexcees. EscondernmerodaslinhasEscondernmerodaslinhas 1 # s o m a d o r a 3 . p y s o m a d o r a i n f i n i t a v e r s a o 3 2 3 p r i n t ' D i g i t e o s v a l o r e s a s o m a r s e g u i d o s d e [ E N T E R ] . ' 4 p r i n t ' P a r a e n c e r r a r a p e n a s [ E N T E R ] . ' 5 t o t a l = 0 6 w h i l e 1 : 7 t r y : 8 n = f l o a t ( r a w _ i n p u t ( ' : ' ) ) 9 t o t a l = t o t a l + n 1 0 e x c e p t : 1 1 b r e a k 1 2 p r i n t ' T O T A L : % s ' % t o t a l Vamoscomentarapenasasdiferenasemrelaoversoanterior: Linha4:mudamosamensagemparaousurio,jqueagorabastaum[Enter]paraencerrar. Linha7:inciodoblocotry:tentaremosexecutaraslinhas8e9.Qualquererroqueocorreraquisertratadono blocoexcept. Linha8:aquiolocalmaisprovveldoerro,quandofloat()tentaconverteroresultadoderaw_input(). Linha9:seocorrerumerronalinha8,alinha9noserexecutadaporque,dentrodoblocotryqualquererro causaatransfernciaimediatadaexecuoparaoblocoexceptcorrespondente. Linha10:inciodoblocoexceptassociadoaoblocotrydalinha7 Linha11: tratamento do erro: em caso de exceo, vamos simplesmente interromper o loop com um comando break. Linha12:comoestalinhavemlogoapsumloopinfinito(while1),anicaformadechegarmosaquiatravsde umbreak.Ouseja,nessecasooloopsterminaemconseqnciadeumaexceo. Experimenteoprogramaagora:eleficoumuitomaisconvenientedeusar.Parainterromperasomaeobterototal,basta teclar[Enter]emumalinhaembranco.Umaboamelhoriana"usabilidade"dasomadora!

Comotratarumerrodeverdade
Aterceiraversodanossasomadoraaindanochegoul:tratamosdamesmaformaasituaoemqueusurionodigitou nadaeaquelaondeeledigitoualgoquenoumnmerovlidoemPython.Podeserqueousuriosejaumdatilgrafo moda antiga, que digita L minsculo no lugar do dgito 1. Ou ainda algum que quer usar, com toda razo, a "," como separador decimal (Python s aceita nmeros com ponto decimal). Para diferenciar um tipo de erro do outro, e saber quandoousurioapenasquerencerraroprograma,precisamosguardaralinhaqueeledigitouantesdetentartransform laemumnmero.Vejacomonalistagemabaixo: EscondernmerodaslinhasEscondernmerodaslinhas 1 # s o m a d o r a 4 . p y s o m a d o r a i n f i n i t a v e r s a o 4 2 3 p r i n t ' D i g i t e o s v a l o r e s a s o m a r s e g u i d o s d e [ E N T E R ] . ' 4 p r i n t ' P a r a e n c e r r a r a p e n a s [ E N T E R ] . '

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

24/46

3/3/14

AprendaProgramar - PythonBrasil

5 t o t a l = 0 6 w h i l e 1 : 7 t r y : 8 l i n h a = r a w _ i n p u t ( ' : ' ) 9 n = f l o a t ( l i n h a ) 1 0 t o t a l = t o t a l + n 1 1 e x c e p t : 1 2 i f l e n ( l i n h a ) = = 0 : 1 3 b r e a k 1 4 e l i f ' , ' i n l i n h a : 1 5 p r i n t ' U s e o . ( p o n t o ) c o m o s e p a r a d o r d e c i m a l . ' 1 6 e l s e : 1 7 p r i n t ' I s s o n a o p a r e c e u m n u m e r o v a l i d o . ' 1 8 p r i n t ' T O T A L : % s ' % t o t a l Vamosanalisarasnovidadesdessaverso: Linha8:anovavariavell i n h a armazenaalinhadigitadapelousurio,paraverificaoposterior. Linha9:alinhaconvertidaemnmero. Linha11:inciodoblocoquetrataroserros,provavelmenteocorridosnalinha9. Linha12:afuno l e n ( ) retornaonmerodeitensdeumaseqncianessecaso,onmerodecaracteresda stringl i n h a .Seonmeroigualazero,entoastringestvazia. Linha13:nocasodastringvazia,executamosumb r e a k porqueousurionoquermaisdigitar. Linha14:ooperadorin(em)retornaverdadeiroseoitemesquerdaforencontradonaseqnciadireitanesse casoverificamosseexisteumavrguladentrodastringl i n h a . Linha15:comoencontramosumavrgula,vamossuporqueousuriotentoudigitarumnmerofracionrio.Ento vamossugerirqueeleuseopontodecimal.Nessecaso,noexecutamoso b r e a k .Nenhumoutrocomandono blocoif/elif/elseserexecutado,eolooprecomeardenovoapartirdalinha6. Linhas16e17:aquivamostratartodososdemaiscasos,dizendoqueoquefoidigitadonoseparececomum nmero. Novamente, sem o b r e a k , o loop reiniciar, e logo o sinal ':' aparecer na tela aguardando nova digitao.

Associaodenomesavalores
Voltemosaoproblemadoclculodedespesas.Nossametafazerumprogramaquesejacapazdecalcularapartilhade gastosdequalquergrupodepessoas,enoapenasdeAnaeBia.Paraisso,vamosprecisarassociaronomedaspessoas aosseusrespectivosgastos.AlinguagemPythonpossuiumaestruturadedadosidealparaessaaplicao.odicionrio, conhecidopelosprogramadoresPerlcomo hashouassociao.ComoocorreemPerl,emPythonodicionrioservepara associar chaves a valores. O mais comum que as chaves sejam strings, como no nosso caso, onde as chaves sero nomesdepessoas.Masaschavespodemserqualquertipodeobjeto. EmPythonodicionriobemmaispoderosoqueemPerl,poisseusvalorespodemconterqualquertipodeobjetocomo listas e at mesmo outros dicionrios. Para entender rapidamente o funcionamento de um dicionrio, nada melhor que experimentarcomointerpretadorinterativoIDLE.Faaosseguintestestes,queexplicaremosaseguir,comaabaixo: P y t h o n ( # 0 , A p r 1 3 1 9 9 9 , 1 0 : 5 1 : 1 2 ) [ M S C 3 2 b i t ( I n t e l ) ] o n w i n 3 2 C o p y r i g h t 1 9 9 1 1 9 9 5 S t i c h t i n g M a t h e m a t i s c h C e n t r u m , A m s t e r d a m > > > d i c = { } > > > d i c [ ' z e ' ] = 3 0 0 > > > d i c [ ' m a u r i c i o ' ] = 1 0 0 > > > d i c [ ' h e l o i s a ' ] = 1 5 0 > > > d i c [ ' z e ' ] 3 0 0 > > > d i c { ' m a u r i c i o ' : 1 0 0 , ' z e ' : 3 0 0 , ' h e l o i s a ' : 1 5 0 } > > > d i c [ ' z e ' ] = 2 0 0 > > > d i c { ' m a u r i c i o ' : 1 0 0 , ' z e ' : 2 0 0 , ' h e l o i s a ' : 1 5 0 }

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

25/46

3/3/14

AprendaProgramar - PythonBrasil

> > > d i c . k e y s ( ) [ ' m a u r i c i o ' , ' z e ' , ' h e l o i s a ' ] > > > d i c [ ' p a u l o ' ] T r a c e b a c k ( i n n e r m o s t l a s t ) : F i l e ' ' , l i n e 1 , i n ? d i c [ ' p a u l o ' ] K e y E r r o r : p a u l o > > > d i c . h a s _ k e y ( ' h e l o i s a ' ) T r u e > > > d i c . h a s _ k e y ( ' p a u l o ' ) F a l s e > > > Linha3:antesdeusarumdicionrio,precisocrilo.Nessecaso,criamosumdicionriovazio.Aschaves{}so usadaspararepresentardicionrios,comoveremosnovamentenaslinhas10e13. Linhas4,5e6:criamostrsitensnodicionrio,usandoaschaves'ze','mauricio'e'heloisa'eosvalores300,100 e150,respectivamente. Linhas7e8:aquiacessamosovalorassociadochave'ze'eobtemosonmero300. Linhas9e10:agoraacessamosodicionriocomoumtodo,eobtemosumalistagementrechaves,comositens separadosporvrgula.Cadapardechaveevalorapareceseparadopelosinal':'.Notequeaordemdositensno temlgicaaparente.Pythonnogaranteaordemdositensdeumdicionrio. Linha11: associamos um novo valor a uma chave existente. Num dicionrio, todas as chaves so nicas. No podehaverdoisitenscomamesmachave'ze'.Assim,essaoperaomudaovalorassociadoestachave. Linhas12e13:exibimosdenovoodicionriointeiro.Notequeovalorassociadochave'ze'mudou. Linha14: o mtodo k e y s ( ) retorna a lista de chaves do dicionrio. Um mtodo nada mais que uma funo associada a um objeto, que deve ser invocada usando a sintaxe objeto.metodo(). Em nosso exemplo temos dic.keys(). Linha 15: aqui aparece a lista de chaves. Note que a lista, como sempre, vem delimitada por colchetes. O resultadodomtodokeys()umalistadechaves,enoumdicionrio. Linhas16a20:tentamosacessarovalordeumachaveinexistente.Pythonreclamacomamensagem'KeyError: paulo',indicandoqueodicionrionopossuiumachaveiguala'paulo'. Linhas 21 a 24: para verificar se uma determinada chave existe, usamos o mtodo has_key() (tem_chave). Os exemplosmostramquehas_key()retorna1quandoachaveexiste,ezeroquandoelanoexiste.

ResolvendooOramentodaRepblica
Agora que conhecemos o funcionamento bsico dos dicionrios, podemos implementar o nosso aplicativo de acerto de contas, que pode ser muito til por exemplo na administrao de uma repblica de universitrios. Antes de mais nada, vejamoscomovaifuncionaroprograma: C : \ P y t h o n X X \ C u r s o > p y t h o n d e s p r e p 1 . p y B a l a n c o d e d e s p e s a s d a R e p u b l i c a R e c a n t o S u i c o ( d e i x e u m n o m e e m b r a n c o p a r a e n c e r r a r ) D i g i t e o n o m e d a p e s s o a : M a r c o s Q u a n t o g a s t o u M a r c o s ? 1 0 D i g i t e o n o m e d a p e s s o a : A l e x a n d r e Q u a n t o g a s t o u A l e x a n d r e ? 5 0 0 D i g i t e o n o m e d a p e s s o a : T y r o n e Q u a n t o g a s t o u T y r o n e ? 2 5 0 D i g i t e o n o m e d a p e s s o a : H a r l e y Q u a n t o g a s t o u H a r l e y ? 1 2 4 , 6 7 N u m e r o i n v a l i d o . Q u a n t o g a s t o u H a r l e y ? 1 2 4 . 6 7 D i g i t e o n o m e d a p e s s o a :

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

26/46

3/3/14

AprendaProgramar - PythonBrasil

N u m e r o d e p e s s o a s : 4 T o t a l d e g a s t o s : R $ 8 8 4 . 6 7 G a s t o s p o r p e s s o a : R $ 2 2 1 . 1 7 S a l d o d e M a r c o s : 2 1 1 . 1 7 S a l d o d e A l e x a n d r e : 2 7 8 . 8 3 S a l d o d e T y r o n e : 2 8 . 8 3 S a l d o d e H a r l e y : 9 6 . 5 0 C : \ P y t h o n X X \ C u r s o > Linha1:invocaodoprogramaapartirdalinhadecomando. Linhas2e4:apresentaoeinstruesdeuso. Linha6:oprogramaperguntaonomedeumapessoa. Linha7:aseguir,solicitaovalordosgastosdaquelapessoa. Linhas8a12:oprocessorepetidoquantasvezesfornecessrio. Linha13:ousuriodigitaumnmerocomvrgulanolugardopontodecimal. Linha14:oprogramainformaqueonumero"invlido". Linha15:novamenteoprogramapedeovalorgastoporHarley. Linha16:ousurionoforneceoutronome,encerrandoadigitao. Linhas18a20:onmerodepessoas,ototalgastoeogastomdioporpessoasocalculados. Linhas22a25:paracadapessoa,oprogramaexibeseusaldo.Aquelesquetmsaldonegativotmvaloresa pagarosquedesaldopositivotmvaloresareceber. Agora,vamoslistagemdoprogramad e s p r e p 1 . p y : EscondernmerodaslinhasEscondernmerodaslinhas 1 # d e s p r e p 1 . p y c a l c u l o d e d e s p e s a s d a r e p u b l i c a 2 3 p r i n t ' B a l a n c o d e d e s p e s a s d a R e p u b l i c a R e c a n t o S u i c o ' 4 p r i n t 5 p r i n t ' ( d e i x e u m n o m e e m b r a n c o p a r a e n c e r r a r ) ' 6 p r i n t 7 t o t a l = 0 8 c o n t a s = { } 9 w h i l e 1 : 1 0 p e s s o a = r a w _ i n p u t ( ' D i g i t e o n o m e d a p e s s o a : ' ) 1 1 i f n o t p e s s o a : b r e a k 1 2 w h i l e 1 : 1 3 r e s p = r a w _ i n p u t ( ' Q u a n t o g a s t o u % s ? ' % p e s s o a ) 1 4 t r y : 1 5 g a s t o = f l o a t ( r e s p ) 1 6 b r e a k 1 7 e x c e p t : 1 8 p r i n t ' N u m e r o i n v a l i d o . ' 1 9 c o n t a s [ p e s s o a ] = g a s t o 2 0 t o t a l = t o t a l + g a s t o 2 1 2 2 n u m _ p e s s o a s = l e n ( c o n t a s ) 2 3 p r i n t 2 4 p r i n t ' N u m e r o d e p e s s o a s : % d ' % n u m _ p e s s o a s 2 5 p r i n t ' T o t a l d e g a s t o s : R $ % . 2 f ' % t o t a l 2 6 m e d i a = t o t a l / n u m _ p e s s o a s 2 7 p r i n t ' G a s t o s p o r p e s s o a : R $ % . 2 f ' % m e d i a 2 8 p r i n t 2 9 f o r n o m e i n c o n t a s . k e y s ( ) : 3 0 s a l d o = c o n t a s [ n o m e ] m e d i a

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

27/46

3/3/14

AprendaProgramar - PythonBrasil

3 1 p r i n t ' S a l d o d e % s : % . 2 f ' % ( n o m e , s a l d o ) Linhas3a5:exibiridentificaoeinstrues. Linha7:avariveltotalinicializadacomovalorzero.Issonecessrioemfunodalinha21. Linha8:odicionriodecontascriado,semcontedo.Elearmazenarascontasdecadapessoa. Linha9:inciodoloopprincipal. Linha10:solicitamosumnomeearmazenamosnavarivelpessoa. Linha11:seavarivelpessoaestivervazia,nenhumnomefoidigitado.Entoexecutamosumbreakparadeixaro loopprincipal,jqueousurionoquermaisfornecernomes. Linha12:inciodoloopsecundrio,paradigitaodovalornumrico. Linha13:solicitamosovalorgastopelapessoaemquesto. Linha14:inciodoblocotry,ondetentaremosconverterastringdigitadaemnmero. Linha15:aconversofatdica.Emcasodeerroaqui,oprogramasaltarparaoblocoexcept,nalinha17. Linha 16: esse break s ser executado se no ocorrer erro na linha 15. Sua funo interromper o loop secundrioquandoobtivermosumvalornumrico. Linhas17e18:oblocoexceptsimplesmenteexibenatelaamensagem"Numeroinvalido".Aquiseencerraoloop secundrio,querepetirnovamenteapartirdalinha12,solicitandooutrovalor. Linha19:ogastoobtidoarmazenadonodicionrio,usandoonomedapessoacomochave. Linha20:ototaldegastosatualizado.Aquiofinaldoloopprincipal.Daquioprogramavoltarparaalinha9,e pedirosdadosdaprximapessoa. Linha22:afunolen()usadaparacontaronmerodeitensnodicionrio. Linhas23a25:soexibidosonmerodepessoasetotalgasto.Anotao%.2ffazcomqueosgastosapaream comduascasasdecimais,poistratasedeumvaloremdinheiro. Linhas26a27:ogastoporcabeacalculadoemostrado,tambmcomduascasasdecimais. Linha29: aqui comeamos um loop for que ser repetido para cada nome que constar na lista de chaves do dicionrio.Alistadechavesobtidaatravsdomtodokeys().Avarivelnomeapontar,sucessivamente,para cadanomeencontradonestalista. Linha 30: os valor gasto por uma pessoa obtido acessando o dicionrio com a expresso contas[nome]. Subtramosogastomdioparaobterosaldodaquelapessoa. Linha31:exibimosonomeeosaldodapessoa.Estaaltimalinhadoloopfor,quepercorrertodasaschaves dodicionrio.

Nossaprimeirasimulao
Agora j sabemos tudo o que precisvamos para implementar um jogo simples, como havamos prometido no captulo anterior. Tratase de uma simulao de pouso lunar, em modo texto. Esse programinha baseado em um jogo clssico escritoparacalculadorasHP25.Nossaversobemmaisfcildeentenderqueooriginalparacalculadora.Emvezde explicarlinhaporlinhaofuncionamentodoprograma,colocamoscomentriosabundantesnaprprialistagem,delimitados pelosinal#.Lembresedequenoprecisodigitaroscomentrios(eoprogramainteiropodesersimplesmentecopiado aquinosite).Essesimuladordealunissagemumgamederecursosmnimos,masaindaassimdevevaleralgunsminutos dediverso,especialmentesevoccurteafsicanewtonianaensinadanocolegial. EscondernmerodaslinhasEscondernmerodaslinhas 1 # O j o g o d a a l u n i s s a g e m 2 # l u n a r . p y 3 # i m p o r t a r f u n c a o s q r t d o m o d u l o m a t h 4 f r o m m a t h i m p o r t s q r t 5 6 x = 5 0 0 . # a l t i t u d e e m p e s 7 v = 5 0 . # v e l o c i d a d e e m p e s / s 8 g = 5 . # a c e l e r a c a o g r a v i t a c i o n a l l u n a r e m p e s / s / s 9 t = 1 . # t e m p o e n t r e j o g a d a s e m s e g u n d o s

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

28/46

3/3/14

AprendaProgramar - PythonBrasil

1 0 c o m b = 1 2 0 . # q u a n t i d a d e d e c o m b u s t v e l 1 1 1 2 p r i n t ' S i m u l a c a o d e a l u n i s s a g e m ' 1 3 p r i n t 1 4 p r i n t ' ( d i g i t e a q u a n t i d a d e d e c o m b u s t i v e l a q u e i m a r ) ' 1 5 1 6 f m t = ' A l t : % 6 . 2 f V e l : % 6 . 2 f C o m b : % 3 d ' 1 7 w h i l e x > 0 : # e n q u a n t o n a o t o c a m o s o s o l o 1 8 m s g = f m t % ( x , v , c o m b ) # m o n t a r m e n s a g e m 1 9 i f c o m b > 0 : # a i n d a t e m o s c o m b u s t i v e l ? 2 0 # o b t e r q u a n t i d a d e d e c o m b u s t i v e l a q u e i m a r 2 1 r e s p = r a w _ i n p u t ( m s g + ' Q u e i m a = ' ) 2 2 t r y : # c o n v e r t e r r e s p o s t a e m n u m e r o 2 3 q u e i m a = f l o a t ( r e s p ) 2 4 e x c e p t : # a r e s p o s t a n a o e r a u m n u m e r o 2 5 q u e i m a = 0 2 6 i f q u e i m a > c o m b : # q u e i m o u m a i s d o q u e t i n h a ? 2 7 q u e i m a = c o m b # e n t a o q u e i m a o q u e t e m 2 8 c o m b = c o m b q u e i m a # s u b t r a i q u e i m a d o 2 9 a = g + q u e i m a # a c e l = g r a v + q u e i m a 3 0 e l s e : # s e m c o m b u s t i v e l 3 1 p r i n t m s g # m e n s a g e m s e m p e r g u n t a r 3 2 a = g # a c e l e r a c a o = g r a v i d a d e 3 3 x 0 = x # a r m a z e n a r p o s i c a o i n i c i a l 3 4 v 0 = v # a r m a z e n a r v e l o c i d a d e i n i c i a l 3 5 x = x 0 + v 0 * t + a * t * t / 2 # c a l c . n o v a p o s i c a o 3 6 v = v 0 + a * t # c a l c . n o v a v e l . 3 7 # s e o l o o p a c a b o u , t o c a m o s n o s o l o ( x < = 0 ) 3 8 v f = s q r t ( v 0 * v 0 + 2 * a * x 0 ) # c a l c u l a r v e l . f i n a l 3 9 p r i n t ' > > > C O N T A T O ! V e l o c i d a d e f i n a l : % 6 . 2 f ' % ( v f ) 4 0 # a v a l i a r p o u s o d e a c o r d o c o m a v e l o c i d a d e f i n a l 4 1 i f v f = = 0 : 4 2 m s g = ' A l u n i s s a g e m p e r f e i t a ! ' 4 3 e l i f v f < = 2 : 4 4 m s g = ' A l u n i s s a g e m d e n t r o d o p a d r a o . ' 4 5 e l i f v f < = 1 0 : 4 6 m s g = ' A l u n i s s a g e m c o m a v a r i a s l e v e s . ' 4 7 e l i f v f < = 2 0 : 4 8 m s g = ' A l u n i s s a g e m c o m a v a r i a s s e v e r a s . ' 4 9 e l s e : 5 0 m s g = ' M o d u l o l u n a r d e s t r u i d o n o i m p a c t o . ' 5 1 p r i n t ' > > > ' + m s g

Comojogar
Seuobjetivodesaceleraranave,queimandocombustvelnadosagemcertaaolongodaqueda,paratocarosololunar comumavelocidadebemprximadezero.Sevocquiser,podeusarumdiagramacomoomostradoabaixo(colocamosem nossositeumdessesembranco,paravocimprimireusar).Asunidadesestonosistemaingls,comonooriginal.Omais importantevocsaberquecada5unidadesdecombustvelqueimadasanulamaaceleraodagravidade.Sequeimar mais do que 5 unidades, voc desacelera menos do que 5, voc ganha velocidade. Primeiro, pratique seus pousos preocupandose apenas com a velocidade final. Depois voc pode aumentar a dificuldade, estabelecendo um limite de tempo: por exemplo, o pouso tem que ocorrer em exatos 13 segundos. Uma ltima dica: cuidado para no queimar combustvelcedodemais.Sevocsubir,vaiacabarcaindodeumaalturaaindamaior!Boasalunissagens!

Captulo5
Osegredodosobjetosfuno:saibacomocriarseusprprioscomandos
Osimuladordealunissagem l u n a r . p y ,apresentadonoltimocaptulo,tem50linhasdecdigo.umjogobemsimples, masfoinossoexemplomaisextensoatomomento.Emtermosdeprogramaoprofissional,tratasedeumprogramabem

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

29/46

3/3/14

AprendaProgramar - PythonBrasil

pequeno. No mundo real, softwares modestos tm milhares de linhas de cdigo, e essa contagem chega aos milhes quando se fala de grandes aplicativos como o Microsoft Word ou o sistema operacional Linux. Ao se trabalhar com programasmaiores,fundamentalpoderdividirotrabalhoemmdulos,emvezdecriarumasoluo"monoltica"comoa donossolunar.py,ondeoprogramainteiroestexpressoemumanicasequnciadecomandos.Apartirdeagora,vamos verporqueecomomodularizarnossosprogramas,utilizandoosconceitosdefuno,objeto,classe,mduloepacote.

Dividirparaconquistar
Um programa modularizado facilita o planejamento, a distribuio de tarefas entre vrios programadores, o controle de qualidadeeareutilizaodesolues.Porexemplo,nocaptuloanteriorutilizamosvriasvezessequnciasdecomandos paralerdadosdousurio,parecidascomofragmentodoprogramad e s p r e p 1 . p y (mostradonalistagemabaixo). Oidealseriareunirsequnciascomoestaemummduloquenspudssemosreutilizarfacilmenteemqualquerumde nossos programas, em vez de redigitar ou cortar e colar esse cdigo sempre que precisarmos reutilizlo. Ao evitar a redigitao, no s economizamos tempo, mas ainda limitamos a propagao de "bugs", ou falhas de programao. Imaginese,apsmesesdeprogramao,usandocentenasdevezesofragmento,descobrimosqueelecontmumerroem sualgica.Seocdigofoicopiadomanualmenteparacadaprogramaondefoiutilizado,seremosobrigadosalocalizloe corrigiloemcentenasdearquivosdiferentes.Poroutrolado,seofragmentofoidevidamenteempacotadoemummdulo,a correosomenteprecisaserfeitaemumarquivo. EscondernmerodaslinhasEscondernmerodaslinhas 1 w h i l e 1 : 2 r e s p = r a w _ i n p u t ( ' Q u a n t o g a s t o u % s ? ' % p e s s o a ) 3 t r y : 4 g a s t o = f l o a t ( r e s p ) 5 b r e a k 6 e x c e p t : 7 p r i n t ' N u m e r o i n v a l i d o . '

Programaoestruturada
A primeira grande onda a favor da modularizao no desenvolvimento de software foi a chamada "programao estruturada".Noinciodosanos70,essaexpressoestavatonamodaquantoa"programaoorientadaaobjetos"de hoje. Na realidade, a programao orientada a objetos, ou OOP, pode ser entendida como uma radicalizao da programao estruturada. A peachave da programao estruturada o conceito de subprograma, um fragmento com comeo, meio e fim, que desempenha um papel bem definido dentro de um programa maior. Na linguagem Python, um subprogramadefinidoatravsdocomandodeblocodef.Existemdoistiposdesubprogramas:procedimentosefunes. EmPython,anicadiferenaentreelesqueasfunesproduzemvalores,eosprocedimentosno.Seguindoatradio dalinguagemC,oscriadoresdoPythonpreferemfalarapenasdefunes,considerandoosprocedimentosapenasumtipo especialdefuno. Vamos usar o IDLE para ver como se define uma funo. Digite as duas linhas abaixo e tecle [Enter] duas vezes para concluir: > > > d e f d o b r o ( x ) : . . . r e t u r n x * 2 Aparentemente, nada acontece. Mas voc acabou de definir uma funo, chamada dobro, que est armazenada na memriadointerpretadorPython.Paraversuafunofuncionar,bastainvoclaassim: > > > d o b r o ( 3 ) 6 Agoravamosaosdetalhesdanossadefiniodefuno.Aprimeiralinha,defdobro(x):,trazduasinformaesimportantes: onomedafuno,dobro,eapresenadeumargumento,x.Oargumentoumavarivelespecialqueassociadaaovalor fornecidopelousurionainvocaodafuno.Aoreceberainstruodobro(3),Pythonassociaxaovalor3.Asegunda linhadafuno,returnx*2podeserlidadadireitaparaaesquerda.PrimeiroPythoncalculaaexpressox*2.Emnosso exemplo,oxestassociadoaovalor3,portantooresultado6.Ocomandoreturnsinalizaofimdafuno,efazcomqueo

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

30/46

3/3/14

AprendaProgramar - PythonBrasil

resultado seja passado para quem a invocou. No exemplo abaixo, a funo invocada no meio de uma expresso aritmtica: > > > y = d o b r o ( 7 ) + 1 > > > y 1 5 > > > horadequebraralgumasregrasparaveroqueacontece.Primeiro,experimentedigitarisso: > > > d o b r o ( ) O resultado ser um "traceback" com a mensagem de erro "not enough arguments expected 1, got 0", ou "argumentos insuficientes1esperado,0recebido".Issoaconteceuporquenossadefinio,defdobro(x),obrigaousuriodafunoa fornecerumargumento.possvelcriarumafunoquenopedeargumentos,comoveremosdepois. Outroexperimentointeressantedigitarapenasonomedafuno: > > > d o b r o < f u n c t i o n d o b r o a t 8 2 f a 3 0 > Valeapenapararepensarnoqueacaboudeacontecer. Sevocdigitaonomedafunosemparnteses,ointerpretadornoaexecuta,masapenasinformaaqueserefereaquele nome.Oqueocorrequandousamosocomandodefacriao,namemria,deumobjetodotipo"function",oufuno.O nomefornecidoapsocomandodefassociadoaoobjetofuno.Masoobjetofunoexisteindependentedonome.

Funescomoobjetos
Acabamosdefazerumaafirmaoimportante,quevaleapenarepetir:Pythonpermitecriarfunesquesotratadasda mesmaformaqueoutrosobjetosdalinguagem,comonmeroselistas.Paraentenderasimplicaesdisso,bomreforar onossoentendimentodecomoPythonlidacomosobjetosquecriamos.Paratanto,vamosdeixarasfunesumpoucode ladoevoltarabrincarcomlistas: > > > l = [ 1 0 , 2 0 , 3 0 , 4 0 ] Acabamosdecriarumalista"l"comquatroelementos.Essaaformasucintadedizeroqueocorreu.Umadescriobem melhoraseguinte:criamosumalistacomquatroelementoseassociamosavarivel"l"aestalista.Aletra"l"apenas umaetiquetaqueidentificaalistaimportantenotarquealistaexistemesmoantesdereceberumaetiqueta. Comprove: > > > m = l > > > m [ 1 0 , 2 0 , 3 0 , 4 0 ] > > > Agora associamos m a l, ou melhor, lista associada a l. Nosso objetolista agora tem duas etiquetas. Podemos usar qualquerumadelasparanosreferirmosaele,tantoque,aodigitarmosm,ointerpretadormostraamesmalista.Podemos tambmacessaremodificarumitemespecficodalista: > > > m [ 2 ] 3 0 > > > m [ 2 ] = 5 5 > > > m [ 1 0 , 2 0 , 5 5 , 4 0 ] > > >

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

31/46

3/3/14

AprendaProgramar - PythonBrasil

Agoradigitelevejaoresultado: > > > l [ 1 0 , 2 0 , 5 5 , 4 0 ] > > > O que aconteceu com o l? Absolutamente nada! Ele continua sendo uma mera etiqueta colada em nosso objetolista. Mudamosalistaatravsdaetiquetam,mastantomquantolreferemsemesmalista,comovocacaboudecomprovar. Omesmoocorrecomfunes.Aointerpretarocdigodefdobro(x):returnx*2,Pythoncriaumobjetofunoeoassocia etiquetadobro.Nadaimpedequevocassocieoutrasetiquetasaomesmoobjeto,assim: > > > f = d o b r o > > > f < f u n c t i o n d o b r o a t 8 2 f a 3 0 > Notequeonomefagoraestassociadoaomesmoobjetofunoqueanteschamamosdedobro. Onovonometambmpodeserusadoparainvocarafuno: > > > f ( 1 9 ) 3 8 > > > y = f ( 1 7 ) + 2 > > > y 3 6 > > > Aotratarfunescomoobjetos,PythondeixaparatrslinguagensmaistradicionaiscomoC++eJava,esejuntaauma classedelinguagensutilizadasemtrabalhosavanadosdeCinciadaComputao:linguagensdeprogramaofuncional. Amaisfamosadelas,Lisp,temsidoferramentafundamentalnapesquisadeIntelignciaArtificialhvriasdcadas.Um dialetosimplificadodeLisp,chamadoScheme,usadonoscursosintrodutriosdecomputaodoMIT(Massachussetts InstituteofTechnology),umdosmaisimportantescentrosdepesquisaeminformticadoplaneta.Comovocv,estudando Pythonestamosemtimacompanhia. Vejamosnaprticaumavantagemdetratarmosfunescomoobjetos.Pythonpossuiumafunopoderosachamadamap. Vamosuslaagora: > > > m a p ( d o b r o , m ) [ 2 0 , 4 0 , 1 1 0 , 8 0 ] > > > Invocamosafunomapcomdoisargumentos.Oprimeiroanossafunodobro,eosegundoalistam,[10,20,55,40]. Afunomapaplicaoobjetofunoacadaitemdosegundoargumento.Oresultadoacriaodeumnovoobjetolista, semmodificarooriginal. Vejaesteoutroexemplo: > > > m a p ( s t r , m ) [ ' 1 0 ' , ' 2 0 ' , ' 5 5 ' , ' 4 0 ' ] > > > Nestecaso,usamosafunoembutida(ouprdefinida)strparaconvertercadaumdositensnumricosemumastring.

Argumentosdefault
Comojdissemos,umafunonoprecisaretornarumvalor.Vejaesteexemplo: > > > d e f b o m _ d i a ( ) : . . . p r i n t ' B o m d i a , h u m a n i d e ! '

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

32/46

3/3/14

AprendaProgramar - PythonBrasil

Issooquechamamosdeprocedimento:umafunoquefazalgumacoisa(nestecaso,imprimeumamensagem),masno retornaumvalor.Vocpodeinvocloassim: > > > b o m _ d i a ( ) B o m d i a , h u m a n i d e ! > > > intilusaresseprocedimentoemumaexpresso: > > > x = b o m _ d i a ( ) B o m d i a , h u m a n i d e ! > > > x > > > x = = N o n e 1 > > > Nossa funo bom_dia dispensa argumentos, j que em sua definio no colocamos nada entre os parnteses. Para sermosmaissimpticoscomnossosusurios,poderamosmodificlaparaaceitarumnome,destamaneira: > > > d e f b o m _ d i a ( n o m e = ' h u m a n i d e ' ) : . . . p r i n t ' B o m d i a , % s ! ' % n o m e Note que, neste caso, associamos um valor ao argumento nome. o chamado valor "default", que ser usado caso o argumentonosejafornecido. Vejacomo: > > > b o m _ d i a ( ' M a r t i n h a ' ) B o m d i a , M a r t i n h a ! > > > b o m _ d i a ( ) B o m d i a , h u m a n i d e ! > > > A idia de argumento default outro ponto forte da linguagem Python, oferecendo grande flexibilidade na definio de funes.

Usandomdulos
Uma vez entendido o bsico de funes, podemos passar para os mdulos, que so colees de funes. Antes de criarmosnossosprpriosmdulos,bomaprenderausarmdulosprontos,paranoficarmos"reinventadoaroda".Assim como qualquer boa linguagem moderna, Python possui uma coleo de mdulos com milhares de funes testadas e prontas para uso em diferentes tipos de aplicaes. O Python inclui mais de 140 mdulos, sem contar com a extenso grficaTk.EmuitosoutrospodemserencontradosapartirdositePython.org,quasetodoslivresegratuitos. Que tipo de coisa pode ser encontrada nessa vasta biblioteca? Eis alguns exemplos de mdulos, apenas para dar uma idia: c g i :programaodepginasdinmicasparaaWeb f t p l i b :montagemdescriptsparainteraocomservidoresFTP g z i p :leituraeescritadearquivoscomprimidos m a t h :funesmatemticas(trigonometria,logaritmosetc.) r e :buscasdetextoavanadascomexpressesregulares(comonalinguagemPerl) s t r i n g :operaescomstrings,incluindoconversesdelistas t i m e :horaatualeconversodeformatosdedata x m l l i b :interpretaodearquivosemformatoXML

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

33/46

3/3/14

AprendaProgramar - PythonBrasil

Comoprimeiroexemplodecomoseusaummdulo,vamosrecorreraomdulocalendar,umconjuntodefunesdealto nvel(ouseja,fceisdeusar)paragerarcalendrios.VoltandoaoseuinterpretadorPython,digiteoseguinte: > > > i m p o r t c a l e n d a r Ocomandoimportgeralmentenoproduzumresultadovisvel.Elelocalizaomdulomencionado,carregaparaamemria suas funes e executa os comandos de inicializao do mdulo, se existirem. Em nosso caso, as funes do arquivo calendar.py acabaram de ser lidas para a memria. Para uslas, voc digita o nome do mdulo e o nome da funo separadosporum".": > > > c a l e n d a r . p r m o n t h ( 2 0 0 0 , 3 ) M a r c h 2 0 0 0 M o T u W e T h F r S a S u 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 > > > Fornecendo o ano e o ms, voc recebe o calendrio do ms prontinho. Existe tambm uma funo para gerar um calendrioanual.Experimente: > > > c a l e n d a r . p r c a l ( 2 0 0 0 ) DevidoalimitaesdasbibliotecaspadrodalinguagemCquesoabasedoPython,omdulocalendarnochegaaser um"calendrioperptuo".Elestrabalhacomdatasdejaneirode1970ajaneirode2038.Paraoscuriosos,aexplicao que, internamente, as funes de C armazenam datas contando o nmero de segundos transcorridos desde 1/1/1970. Exatamente sete segundos aps 1:14 da madrugada do dia 19/01/2038, esse nmero exceder o limite de um nmero inteirode32bits.maisumbugdonovomilnio... Agora,vamossuporquevocdesejaexibirocalendriomensaldeumaoutramaneira,porexemplo,separandoosdiaspor tabs,parafacilitaraexportaoparaumprogramadeeditoraoeletrnica.Ouainda,podemosquerergerarumcalendrio em HTML. Nesses dois casos, o resultado da funo prmonth() no muito til. A funo monthcalendar() nos d mais liberdade.Vejacomoelafunciona: > > > c a l e n d a r . m o n t h c a l e n d a r ( 2 0 0 0 , 3 ) [ [ 0 , 0 , 1 , 2 , 3 , 4 , 5 ] , [ 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 ] , [ 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 ] , [ 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 ] , [ 2 7 , 2 8 , 2 9 , 3 0 , 3 1 , 0 , 0 ] ] > > > Oresultadoumalistadelistas.Cadaumadascincolistasdedentrorepresentaumasemanacomseusrespectivosdias. Zerosaparecemnosdiasqueficamforadoms. Agoravamoscomearadestrincharoresultadodafunomonthcalendar.Antesdemaisnada,jquevamosusarmuitas vezesessafuno,podemoseconomizaralgumadigitaoseusarmosumaoutraformadocomandoimport: > > > f r o m c a l e n d a r i m p o r t m o n t h c a l e n d a r Agora no precisaremos mais usar o prefixo calendar, podendo chamar a funo monthcalendar() diretamente por seu nomeassim: > > > f o r s e m a n a i n m o n t h c a l e n d a r ( 2 0 0 0 , 3 ) : . . . p r i n t s e m a n a . . . [ 0 , 0 , 1 , 2 , 3 , 4 , 5 ] [ 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2 ]

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

34/46

3/3/14

AprendaProgramar - PythonBrasil

[ 1 3 , 1 4 , 1 5 , 1 6 , 1 7 , 1 8 , 1 9 ] [ 2 0 , 2 1 , 2 2 , 2 3 , 2 4 , 2 5 , 2 6 ] [ 2 7 , 2 8 , 2 9 , 3 0 , 3 1 , 0 , 0 ] > > > Atravs do comando for, listamos separadamente cada semana. Para trabalhar com cada dia individualmente, podemos criaroutrocomandoforparapercorrercadaumadassemanas.Oresultadovocpodevernalistagem2. > > > f o r s e m a n a i n m o n t h c a l e n d a r ( 2 0 0 0 , 3 ) : . . . f o r d i a i n s e m a n a : . . . p r i n t ' % s \ t ' % d i a , . . . p r i n t . . . 0 0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 0 0 > > > Acadaciclodoprimeirofor,avarivelsemanarepresentaumalistadesetedias.Nosegundofor,cadacicloescrevenatela umdia.Paraquetodososdiasdasemanaapareamnamesmalinha,usamosumtruquedocomandoprint:avrgulano finaldeprint'%s\t'%dia,fazcomqueoPythonnoinicieumanovalinha.Notepelaindentaoqueoltimocomandoprint estdentrodoprimeirofor,enodentrodosegundo.Issosignificaqueesseprintserexecutadoumaapenasvezpara cadasemana. Emprogramao,semprehumaoutraformadeobteralgumresultado.Nestecaso,noresistimostentaodemostrar umoutrojeitodegeraramesmalistagem.Omdulostringcontmumafuno,join,queserveparatransformarlistasem strings,concatenando(juntando)oselementosdalistacomalgumelementoseparador.Parausarestafuno,precisamos primeiroimportla: > > > f r o m s t r i n g i m p o r t j o i n Paratestla,experimentedigitaralgoassim: > > > j o i n ( [ ' 1 ' , ' 2 ' , ' 3 ' ] ) ' 1 2 3 ' > > > j o i n ( [ ' 1 ' , ' 2 ' , ' 3 ' ] , ' + ' ) ' 1 + 2 + 3 ' > > > Notequeosegundoargumentodefineastringqueserusadacomoseparador.Noprimeiroexemplo,omitimososeparador e Python usou o argumento default, um espao. Agora vamos pegar uma semana do ms para fazer mais algumas experincias: > > > s = m o n t h c a l e n d a r ( 2 0 0 0 , 3 ) [ 0 ] > > > s [ 0 , 0 , 1 , 2 , 3 , 4 , 5 ] > > > Aqui usamos o mecanismo de indexao de Python para obter apenas uma semana do ms. Chamamos a funo monthcalendar(2000,3)comumndice,[0].Lembresequemonthcalendarretornaumalistadelistas.Ondice[0]referese aoprimeiroelementodalista,ousejaalistadosdiasdaprimeirasemanademarode2000.Paraexibirosdiasdessa semanaseparadosportabs,usamosafunojoincomocaracteredetabulao,representadopor'\t',assim: > > > j o i n ( s , ' \ t ' ) T r a c e b a c k ( i n n e r m o s t l a s t ) : F i l e " < i n t e r a c t i v e i n p u t > " , l i n e 1 , i n ? T y p e E r r o r : f i r s t a r g u m e n t m u s t b e s e q u e n c e o f s t r i n g s

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

35/46

3/3/14

AprendaProgramar - PythonBrasil

> > > Oops,Pythonreclamou:"Errodetipo:oprimeiroargumentotemqueserumasequnciadestrings".Precisamostransformar alistas,quecontmnmeros,emumalistadestrings.Felizmente,acabamosdedescobrircomofazerissousandoafuno map,noinciodestecaptulo: > > > m a p ( s t r , s ) [ ' 0 ' , ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' ] Agorapodemosexecutarojoin: > > > j o i n ( m a p ( s t r , s ) , ' \ t ' ) ' 0 \ 0 1 1 0 \ 0 1 1 1 \ 0 1 1 2 \ 0 1 1 3 \ 0 1 1 4 \ 0 1 1 5 ' Oresultadoficoupoucoapresentvel,porquePythonexibeocaractere"tab"atravsdeseucdigoemnumeraooctal, \011.Masissonoocorreseusamosocomandoprint: > > > p r i n t j o i n ( m a p ( s t r , s ) , ' \ t ' ) 0 0 1 2 3 4 5 > > > Agorapodemosfazeremduaslinhasoquefizemosemquatrolinhasnalistagemanterior. Veja: > > > f o r s e m a n a i n m o n t h c a l e n d a r ( 2 0 0 0 , 3 ) : . . . p r i n t j o i n ( m a p ( s t r , s e m a n a ) , ' \ t ' ) . . . 0 0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 0 0 > > > Agora que aprendemos o bsico sobre funes e sabemos como importar mdulos, estamos prontos para criar nossas prprias"bibliotecasdecdigo".Hojevimoscomodefinireimportarfunes.Emseguida,aprenderemoscomoorganizlas em mdulos e uslas no contexto de programas maiores, aplicando primeiro conceitos da programao estruturada, e depois,daorientaoaobjetos.Masissoterqueficarparaomsquevem.

Captulo6
PercaomedodoservidorApacheedoprotocoloCGI
horadecolocaremprticaosnossosconhecimentosdefunesemdulosparacriarnossoprimeiroprogramaparaa Internet:oCalendrioDinmico.Umavezinstaladoemumservidorweb,eleexibirocalendriodomsatualcomodiade hojeassinalado.AofinaldessecaptulovocterconstrudoseusprimeirosprogramasCGIemlinguagemPython.Maspara chegarl,precisoentenderofuncionamentodeumCGI,econhecercomosedaoperaobsicadeumservidorHTTP. QuemquemdoHTTP AWebconstrudaapartirdeduastecnologiasfundamentais:alinguagemHTMLeoprotocoloHTTP.HTML,ouHypertext MarkupLanguageacodificaousadaparacriaraspginasdaWeb.Estenooassuntodestecurso,masvamosusar umpoucodeHTMLnosexemplosdessecaptulo. OsegundopilardaWeboHTTP,ouHypertextTransportProtocolprotocolodetransportedehipertexto.Esseoconjunto decomandoseregrasquedefinecomodeveseracomunicaoentreumbrowser(comooInternetExplorerouoMozilla)e um servidor HTTP (como o Apache ou o Interner Information Server). A expresso "servidor HTTP" pode significar duas coisas: o software que serve pginas via HTTP, ou o computador onde esse software est instalado. No mundo Unix,

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

36/46

3/3/14

AprendaProgramar - PythonBrasil

softwaresservidoressochamadosde"daemons",easiglaHTTPddescreveum"HTTPdaemon"genrico.Essaasigla quevamosusarparadiferenciarosoftwaredohardware.

A relao entre um browser e um HTTPd descrita pelos computlogos como "clienteservidor". Isso significa que a interao entre esses dois softwares sempre parte do browser, que o cliente. O servidor no tem nenhuma iniciativa, limitandosearesponderaoscomandosenviadospelocliente. QuandovocdigitaumaURLcomo http://www.tomb.com/nomono/index.html,oseubrowserlocalizaeconectaseao servidorwww.tomb.comeenvialheocomandoGET/nomono/index.html.Oservidorentoloarquivoindex.htmldapasta nomono,transmiteseucontedoparaoclienteeencerraaconexo.Essessoospassosbsicosdequalquerinteraode umbrowsercomumHTTPd:conexo,solicitao,respostaedesconexo.

Pginasdinmicas
Noexemploqueacabamosdever,i n d e x . h t m l oquechamamosdeumapginaesttica.Arespostadoservidorconsiste apenasemenviarumacpiadodocumentoparaocliente.Sitesqueincluemtransaes(comolojasvirtuais),interatividade (comochats),ouatualizaesmuitofreqentes(comoeste)utilizampginasdinmicas.Nestecaso,aoreceberaURL http://www.magnet.com.br/index_html,nossoservidorHTTPdApachepassaasolicitaoparaoaplicativoZope,instalado no servidor. O Zope monta imediatamente a pgina i n d e x _ h t m l listando as notcias mais recentes de nosso banco de dados, a hora atual e outros elementos. A pgina recm montada ento passada para o Apache, que finalmente a transmiteparaoseunavegador. O Zope apenas uma das tecnologias de pginas dinmicas que existem hoje. O ASP da Microsoft, o ColdFusion da MacromediaeosoftwarelivrePHPsooutrossistemasdinmicosdemontagemdepginas.Masomecanismomaisantigo, etambmomaissimplesdeentenderedeconfigurar,ovelhoebomCGIouCommonGatewayInterface,umprotocolo bsicoparainteraoentreumHTTPdeumprogramageradordepginasdinmicas.comelequenosvamostrabalhara partirdeagora.

ConfigurandooseuHTTPd
ParadesenvolveraplicativosCGIimportanteterumbomambientedetestes.OidealteracessoaumHTTPdspara vocnafasededesenvolvimento,paramaioragilidadenadepurao,enocorreroriscodecomprometerofuncionamento deumservidorpblicocombugsnosseusCGIsemconstruo. PodeserqueoseumicrojpossuaumservidorHTTP.AMicrosoftincluioPersonalWebServerouoIISemdiferentes versesdoWindows.VocpodetentarusarumdessesHTTPdparafazerosexemplos,massugerimosfortementequevoc

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

37/46

3/3/14

AprendaProgramar - PythonBrasil

v at o http://www.apache.org baixe o Apache, que no custa nada ( open source), roda em qualquer plataforma Win32ouUnix,fcildeinstalaretorobustoeverstilqueoHTTPdmaisusadoemtodomundo,alemdeserofavorito disparadoentreosmelhoresemaioressitesdaWeb.Valeapenaconheclo,eodownloadtemapenas3MB. NoWindows,oApachevemcomuminstaladorbemamigvel.Nossanicarecomendaoinstalardiretamenteemum diretriocomoc:\apacheenonofamosoc:\ArquivosdeProgramas.Issoporqueosespaosemnomesdediretrioss vezescausamproblemasnaexecuodeprogramasoriginriosdoUnixcomoPythoneoprprioApache. Umavezterminadaainstalao,vocdeverodaroservidor,acionandooprograma"StartApache"quefoiinstaladoem Iniciar>Programas>ApacheWebServer.IssofazabrirumajanelaDOScomumamensagemcomo"Apache/1.3.9(Win32) running...". No feche esta janela, pois isso encerrar a execuo do servidor. Agora voc pode ver se est tudo certo digitandoessaURLmgicaemseubrowser: http://127.0.0.1/.Seainstalaofoibemsucedida,vocverumapgina comotexto:"ItWorked!TheApacheWebServerisInstalledonthisWebSite!"(Funcionou!OservidorApacheestinstalado nesteWebSite!).(Figura1).

Valeapenasaberqueoendereo127.0.0.1temumsignificadoespecial.OscriadoresdaInternetreservaramessenmero IP para o "loopback", ou seja, testes de conexo de uma mquina com ela mesma. Em outras palavras, o endereo 127.0.0.1 sempre se refere maquina onde voc est, que conhecida tambm pelo nome "localhost". Se o seu micro estiverbemconfigurado,aURL frente. http://localhost/deveteromesmoefeito.Casocontrrio,utilizeonmeroIPevamosem

SeuprimeiroCGI
Chegamosaograndemomento.Seguindoatradiomilenar,vamoscomearfazendoumCGIemPythonqueproduzuma pginacomaspalavras"Ol,Mundo!".Oprogramacompletovocvnalistagemabaixo: EscondernmerodaslinhasEscondernmerodaslinhas 1 # ! / p y t h o n / p y t h o n 2 3 p r i n t ' C o n t e n t t y p e : t e x t / h t m l ' 4 p r i n t 5 p r i n t ' < H T M L > < B O D Y > ' 6 p r i n t ' < H 1 > O l , M u n d o ! < / H 1 > ' 7 p r i n t ' < / B O D Y > < / H T M L > ' Antes de digitar este exemplo, bom destacar dois aspectos essenciais. Primeiramente, o comentrio da linha 1 importante.OCGInovaifuncionarsemele.AoexecutarumscriptCGI,oApacheprocuranaprimeiralinhaumcomentrio especialmarcadopeloscaracteres'#!'.Ossinais'#!'devemestarencostadosnamargemesquerdadapgina,eorestante dessalinhadeveconterocaminhoatoprogramaexecutveldointerpretadorquerodaroscript.Notequeocaminho podeserespecificadousandoabarra'/'doUnix,emvezdacontrabarra'\'preferidapeloWindows. Em meu computador, o Python est instalado em uma pasta chamada "python" localizada no mesmo drive onde est o Apache (D:, no meu caso). Se o seu Python est instalado em outro lugar, voc precisar alterar a linha 1. Em caso de dificuldades,nossasugestoquevocdesinstaleointerpretadoreoreinstaleemumapasta"python"diretamentenaraiz domesmodiscoondevocacaboudeinstalaroApache. Outrodetalheimportantesoosprintdaslinhas3e4.Suafunonomeramentedecorativa.Ocomandoprint'Content

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

38/46

3/3/14

AprendaProgramar - PythonBrasil

type:text/html'produzaparteobrigatriadocabealhodapgina,exigidapeloprotocoloCGI.Estecabealhodefineotipo dodocumentoasertransmitidodeacordocomumesquemadeclassificaochamado"MIME".O"text/html"o"MIMEtype" padro de documentos HTML. Um texto ASCII puro teria o MIME type "text/plain" e um arquivo de foto JPEG seria "image/jpeg".Oprintdalinha4geraumalinhaembranco,quemarcaofimdocabealho.Seumadessasduaslinhasno fordigitadacorretamente,oCGInofuncionar. OrestantedalistagemapenasproduzocdigoHTMLdeumapginamuitosimples.Oscomandosmarcadospelossinais< e>sooschamadostags,oumarcaes,dalinguagemHTML.Amarcao<H1>Manchete</H1>,porexemplo,defineque umamanchetedenvel1,queserexibidapelonavegadorcomoumtextoemletrasgrandes.

InstalaretestaroCGI
Oprograminhadeexemplodaseoanteriordeversersalvocomonomeo l a . p y nodiretrioc g i b i n dentrodapastado Apache.EstediretriocriadoautomaticamentepeloinstaladordoApachenoWindows,masdeveestarvazioinicialmente. Coloqueoo l a . p y alidentroefaaograndeteste:digite http://127.0.0.1/cgibin/ola.pyemseubrowser.Dasduas,uma: ouvocviuapgina"Ol,Mundo!"eestfelizcomseuprimeiroCGI,ouficoudeprimidoporencontrarumamensagemde "InternalServerError".Nestecaso,saibaquevocestemboacompanhia:todoprogramadordeCGIjsedeparoucom estamensagem.Osquedizemquenuncaaviramestomentindo.Mesmoqueseuscripttenhafuncionado,proveitoso entenderascausasdeum"InternalServerError"parasabercomodepurlo. O"InternalServerError"ocorrequandooscriptCGInogeraumcabealhomnimo,formadoporumalinhadeContenttype eumalinhaembranco.oqueonossoola.pydeveriafazernaslinhas3e4.Vejamospassoapassocomodiagnosticara causadoproblema. 1)VerifiqueseoscriptpodeserexecutadoapartirdopromptdoDOS. AbraumajaneladoDOSedigite: X : \ > c : ( o u d : ) Opassoacimanonecessriosevocjestnodiscocerto. X : \ > c d \ a p a c h e \ c g i b i n X : \ > p y t h o n o l a . p y Nestemomento,trscoisaspodemacontecer: 1. oscriptfuncionaperfeitamente,exibindoocabealho,umalinhaembranco,eoHTMLdapginapuleparaopasso 2. 2. oDOSresponde"Comandoounomedearquivoinvlido"leiaopasso3 3. ointerpretadorPythonexibeumtracebackeumamensagemdeerroqualquervatopasso4 2)SeoscriptfuncionaapartirdopromptmasnoatravsdoApache,existemquatrocausaspossveis: 1. Ocomentriodalinha1estincorreto.LembresequeelequeinformaaoApachequalinterpretadorinvocarpara rodaroscript.SeoseuinterpretadorPython(python.exe)foiinstaladonapastad:\python,entoalinha1doseu scriptdeveserassim:#!d:\python\python.exe(Naverdade,aextenso.exedispensvel,eseoApacheeoPython estonomesmodisco,vocpodeusaranotaomaiselegantedoUnixeescreverapenas#!/python/python) 2. Oscriptnofoicolocadonapastacgibin.SeoseuApachefoiinstaladoemc:\apache,oprogramaola.pytemque estarexatamentenestelocal:c:\apache\cgibin\ola.py.Seestefoioproblema,corrijaevolteaopasso1. 3. Apache pode no estar configurado para executar programas na pasta cgibin. Isso no deve acontecer em uma instalaonovadoApache,massevocestusandoumHTTPdquefoiinstaladoporoutrapessoa,elapodeter mudadoestaconfigurao.Nestecaso,peaajudaaoresponsvelpelainstalao. 4. NoLinux,ouemqualquerUnix,oApachedeverterpermissodeexecutaroscriptola.py.Paratanto,vocpode precisarusarocomandochmodparasetarobitdeexecuodeola.py.EmLinux,ocomandoabaixodevedarconta dorecado: $ c h m o d a + x o l a . p y SevocusaoutroUnix,experimente:

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

39/46

3/3/14

AprendaProgramar - PythonBrasil

$ c h m o d 7 5 5 o l a . p y Umavezmarcadocomoexecutveloscriptpoderserinvocadodiretamentepelonome,semnecessidadedemencionaro interpretador,assim: $ . / o l a . p y Se este teste funcionou, tente acionar o script novamente pelo browser, porque um shell do Unix tambm utiliza o comentrio#!dalinha1paralocalizarointerpretador.Seistonodeucerto,volteaoitem2aacima.Seotestefuncionou masoprogramaexibeumtraceback,vatopasso4. 3)VerifiqueseointerpretadorPython(arquivopython.exenoDOS)estinstaladocorretamenteeemlocalacessvel.Seele foiinstaladoemumapastachamadac:\python,oseguintecomandodeveacionaroseuCGI: X : \ > c : \ p y t h o n \ p y t h o n o l a . p y Oquefazerento: 1. seagoraoscriptfuncionouperfeitamente,exibindoocabealho,umalinhaembranco,eoHTMLdapgina,pule paraopasso2. 2. se voc continua vendo "Comando ou nome de arquivo invlido" ou outra mensagem do sistema operacional, verifiquenovamenteolocalexatodainstalaodoseuPythonesenecessrio,reinstale.Feitoisso,volteparao passo1. 4)SeaorodaroscriptapartirdopromptvocestvendoumtracebackdointerpretadorPython,oproblemaestmesmo dentrodoseuprograma.Quandoocorreumerrodesintaxe(S y n t a x E r r o r )ointerpretadorapenasleu,masnochegoua executarnenhumalinhadoseuscript.Assim,ofamosocabealho"Contenttype:..."ealinhaembranconosoenviados paraoservidor,eotracebackqueoajudariaadetectaroproblemanochegaaoseubrowser,masvaiparaumarquivo ondeoApacheregistramensagensdeerro.Estearquivochamaseerror.logeficaem/apache/logs/.Vocpodeinspecion lo com qualquer editor de texto. Outras vezes, o erro pode acontecer durante a execuo e aps o envio do cabealho. Neste caso, o traceback perdido para sempre. por isso que programadores de CGI experientes procuram testar exaustivamenteseusscriptsapartirdalinhadecomandoantesdetentaracionlopelobrowser.Htambemagunstruques quepodemserusadosduranteadepuraodeumCGIparaqueasmensagensdeerrosejamtransmitidasparaobrowser. Emseguidaveremoscomo.

Afinal,umCGIdinmico
NossoprimeiroexemplodeCGIfoiboladoparasersimples,mastambmumtantotolo.Nogeranenhumainformao varivelomesmoefeitopoderiaserobtidocomumapginaesttica.Apginadinmicamaissimplesqueconseguimos imaginar uma que mostre a hora certa (de acordo com o relgio do servidor). Para fazer um CGI assim, bom conhecermosduasfunesdomdulotime.VamosveroqueelasfazemacionandoointerpretadorPython.Primeiro,temos queimportarasduasfunesdedentrodomdulo: > > > f r o m t i m e i m p o r t t i m e , l o c a l t i m e Podemosinvocardiretamenteafunotime(): > > > t i m e ( ) 9 5 3 5 0 0 5 3 6 . 8 Quenmeroesse?Comoexplicamosnofinaldocaptulopassado,oPython,assimcomomuitosprogramasoriginriosda plataformaUnix,marcaotempocontandoonmerodesegundosdesde1dejaneirode1970.Istoquerdizerquehaviamse passado 953 milhes, 500 mil e 536 segundos e 8 dcimos desde 1/1/1970 quando eu digitei time() no IDLE do meu computador.Istomuitointeressante,mascomotransformarsegundostranscorridosnahoraatual?paraissoqueservea funolocaltime(): > > > t = t i m e ( ) > > > l o c a l t i m e ( t )

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

40/46

3/3/14

AprendaProgramar - PythonBrasil

( 2 0 0 0 , 3 , 1 9 , 1 8 , 3 3 , 1 9 , 6 , 7 9 , 0 ) > > > Agoransassociamosossegundostranscorridosvarivelt,eemseguidausamosafunolocaltimeparatransformaros segundosemumaseqnciade9nmerosquefornecemosseguintesdados: l o c a l t i m e ( t ) [ 0 : 3 ] > 2 0 0 0 , 3 , 1 9 ( a n o , m s e d i a ) l o c a l t i m e ( t ) [ 3 : 6 ] > 1 8 , 3 3 , 1 9 ( h o r a , m i n u t o s e s e g u n d o s ) l o c a l t i m e ( t ) [ 6 ] > 6 ( d i a d a s e m a n a 0 = s e g u n d a f e i r a 6 = d o m i n g o ) l o c a l t i m e ( t ) [ 7 ] > 7 9 ( n m e r o d o d i a n o a n o d e 1 a 3 6 6 e m a n o s b i s s e x t o s ) l o c a l t i m e ( t ) [ 8 ] > 0 ( i n d i c a d o r d e h o r r i o d e v e r o 0 = n o 1 = s i m ) Estafunosechamalocaltimeporquealmdeconverterdesegundostranscorridosparadataehora,elaofazlevandoem contaofusohorrioconfiguradonosistemaoperacional,fornecendoportantoahoralocal.Parasaberahoranomeridiano deGreenwich,ouUTCnojargomoderno,usaramosafunogmtime(): > > > f r o m t i m e i m p o r t g m t i m e > > > g m t i m e ( t ) ( 2 0 0 0 , 3 , 1 9 , 2 1 , 3 3 , 1 9 , 6 , 7 9 , 0 ) > > > AgoravamoscombinarasnovasfunesparamontarumCGI,hora.py,quemostreahoralocaldoservidor: EscondernmerodaslinhasEscondernmerodaslinhas 1 # ! / p y t h o n / p y t h o n 2 # h o r a . p y C G I q u e e x i b e a h o r a l o c a l d o s e r v i d o r 3 4 f r o m t i m e i m p o r t t i m e , l o c a l t i m e 5 6 p r i n t ' C o n t e n t t y p e : t e x t / h t m l ' 7 p r i n t 8 9 h , m , s = l o c a l t i m e ( t i m e ( ) ) [ 3 : 6 ] 1 0 p r i n t ' < H T M L > < B O D Y > ' 1 1 p r i n t ' < H 1 > H o r a : % 0 2 d : % 0 2 d : % 0 2 d < / H 1 > ' % ( h , m , s ) 1 2 p r i n t ' < P > * d e a c o r d o c o m o r e l g i o i n t e r n o d e s t e s e r v i d o r < / P > ' 1 3 p r i n t ' < / B O D Y > < / H T M L > ' Umavezsalvonodiretriocgibin,estescriptpoderseracessadopelaURL http://127.0.0.1/cgibin/hora.py.Apgina geradaconterahora,minutosesegundosdoinstanteemqueelafoiinvocada.QualodefeitodonossorelgioemCGI? Experimenteevocver.

Umrelgioqueseatualiza
umpoucofrustranteacessarumapginaquemostraahoracerta,comprecisodesegundos,masficaparadanotempo (Figura2).Paraatualizarossegundos,voctemqueacionarocomandode"reload"doseubrowser(ExibirAtualizarou [F5]noInternetExplorerViewReloadou[Control][R]noNavigator).Nossapginapareceumrelgioquebrado,ques mostraahoracertaquantochacoalhado.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

41/46

3/3/14

AprendaProgramar - PythonBrasil

Oidealseriaqueoservidoratualizasseapginaqueestnoseubrowseracadasegundo.Infelizmente,issoimpossvel. Comojdissemos,oprotocoloHTTPdotipoclienteservidor,eistoquerdizerqueainiciativadetodainteraoficado ladodocliente.Nohcomooservidorporcontaprpriaenviarumanovapginasemqueelasejaantessolicitadapelo navegador.EstaumalimitaoimportantedoprotocoloHTTPquevocprecisateremmenteaobolarseusprogramas CGI. Osbrowsersmodernossuportamumaumasoluoparcialparaesteproblema.Elesreconhecemumcabealhoespecial chamado Refresh, cuja presena em um documento serve para instruir o browser a solicitar novamente a pgina aps algumtempo.OargumentodoRefreshumnmerodesegundosqueonavegadordeveesperarparapediraatualizao. Logoveremoscomoissofuncionanaprtica. ParausaroRefreshbastaacrescentarumalinhaaocabealhodarespostageradopelonossoCGIhora.py.Anovaverso, h o r a 2 . p y ficarassim: EscondernmerodaslinhasEscondernmerodaslinhas 1 # ! / p y t h o n / p y t h o n 2 # h o r a 2 . p y C G I q u e e x i b e c o n t i n u a m e n t e h o r a l o c a l d o s e r v i d o r 3 4 f r o m t i m e i m p o r t t i m e , l o c a l t i m e 5 6 p r i n t ' C o n t e n t t y p e : t e x t / h t m l ' 7 p r i n t ' R e f r e s h : 0 . 6 ' 8 p r i n t 9 1 0 h , m , s = l o c a l t i m e ( t i m e ( ) ) [ 3 : 6 ] 1 1 p r i n t ' < H T M L > < B O D Y > ' 1 2 p r i n t ' < H 1 > H o r a : % 0 2 d : % 0 2 d : % 0 2 d < / H 1 > ' % ( h , m , s ) 1 3 p r i n t ' < P > * d e a c o r d o c o m o r e l g i o i n t e r n o d e s t e s e r v i d o r < / P > ' 1 4 p r i n t ' < / B O D Y > < / H T M L > ' Anicanovidadealinha7,ondeacrescentamos"Refresh:0.6"aocabealho.Emvezdemandarobrowseratualizara pgina a cada 1 segundo, aps alguns testes decidimos fazlo a cada 6 dcimos de segundo. Fizemos assim porque quantoexperimentamoscom"Refresh:1"acontagemfreqentementepulavaumsegundo,porexemplode10:30:20direto para 10:30:22. Isso no quer dizer que o relgio adiantava, porque a cada nova solicitao a hora certa estava sendo consultada pelo nosso CGI mas como o tempo de espera somado ao tempo de solicitao e resposta era maior que 1 segundo,aexibiodahorasofriaalgunssobressaltos. Fazendoorefreshacada6dcimos,muitasvezesestamosatualizandoapginaduasvezesnomesmosegundo,oque umdesperdciodeprocessamento.Maspelomenosnoslivramosdaenervanteperturbaonacontagem.claroqueseo servidorestiversobrecarregado,elepodelevarmaisdeumsegundopararesponder.Nessecaso,denadaadiantarse browserfizernovassolicitaesacada0.6segundo.

CalendrioDinmico
Agora vamos juntar o que j sabemos sobre CGI com o mdulo calendar que vimos no captulo anterior para fazer um prottiporpidodonossoCalendrioDinmico.Aspassagensmaisinteressantesdalistagemabaixosocomentadosa seguir: EscondernmerodaslinhasEscondernmerodaslinhas 1 # ! / p y t h o n / p y t h o n 2 # c a l e n d i n . p y c a l e n d r i o d i n m i c o p r o t t i p o 1 3 4 p r i n t ' C o n t e n t t y p e : t e x t / h t m l \ n ' 5 6 t r y : 7 f r o m t i m e i m p o r t t i m e , l o c a l t i m e 8 f r o m c a l e n d a r i m p o r t m o n t h c a l e n d a r 9 f r o m s t r i n g i m p o r t j o i n 1 0 1 1 a n o , m e s = l o c a l t i m e ( t i m e ( ) ) [ : 2 ]

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

42/46

3/3/14

AprendaProgramar - PythonBrasil

1 2 1 3 p r i n t ' < H T M L > < T I T L E > C a l e n d r i o D i n m i c o < / T I T L E > ' 1 4 p r i n t ' < B O D Y > ' 1 5 1 6 p r i n t ' < H 1 > C a l e n d r i o d o m s % 0 2 d / % 0 4 d < / H 1 > ' % ( m e s , a n o ) 1 7 p r i n t ' < P R E > ' 1 8 f o r s e m a n a i n m o n t h c a l e n d a r ( a n o , m e s ) : 1 9 p r i n t j o i n ( m a p ( s t r , s e m a n a ) , ' \ t ' ) 2 0 p r i n t ' < / P R E > ' 2 1 2 2 e x c e p t : 2 3 i m p o r t s y s 2 4 s y s . s t d e r r = s y s . s t d o u t 2 5 f r o m t r a c e b a c k i m p o r t p r i n t _ e x c 2 6 p r i n t ' < H R > < H 3 > E r r o n o C G I : < / H 3 > < P R E > ' 2 7 p r i n t _ e x c ( ) 2 8 p r i n t ' < / P R E > ' 2 9 3 0 p r i n t ' < / B O D Y > < / H T M L > ' Linha4:logodesadaproduzimosocabealhomnimonecessrio.Alinhaembranco,emvezdesergeradapor um segundo comando print, est includa no final prpria string do cabealho (o '\n' representa uma quebra de linha,eoprprioprintproduzoutraquebraassimobtemosalinhaembrancoparaencerrarocabealho). Linha6:parafacilitaradepurao,colocamospraticamenteoCGIinteirodentrodeumblocotry/except.Qualquer falhanaexecuodesteblocosertratadaapartirdalinha23.Comisso,essescriptsdevergerarum"Internal ServerError"sehouverumerrodesintaxe,justamenteotipodefalhamaisfcildelocalizarrodandooscripta partirdeumalinhadecomando.Destaformaadepuraoficabemmaissimples. Linhas7a9:importamosvriasfunes,todasvelhasconhecidas. Linha11:extramosoanoeomsdoresultadodelocaltime(time()). Linha13:iniciamosaproduodoHTML,agoracolocandoumttulonapgina(queaparecernabarradettulo dajaneladobrowser). Linhas17a20:parasimplificaraformataodocalendrio,colocamosseucontedoentreumpardetags<PRE> </PRE>. O tag <PRE> faz com que o browser respeite as quebras de linha at o tag </PRE>. Normalmente, o navegadorignoratabulaesequebrasdelinha,tratandotudocomosimplesespaos,masissoestragarianosso calendrio,poisqueremosmostrarumasemanaporlinha.Ocdigodaslinhas18e19foiroubadosemalteraes dalistagem3docaptuloanterior. Linha22:abrimosumblocoexceptparatratarqualquererroquetenhaocorridoataqui.Abrirumblocoexcept sem qualificar o tipo de exceo que ser tratado normalmente uma m idia, porque pode mascarar muitos bugs. Nesse caso, o except "pegatudo" est justificado porque em seguida exibiremos o traceback completo, revelandoqualquerbugquetentarseesconder. Linhas 23 e 24: importamos o mdulo sys, para podermos manipular os objetos stdout e stderr. Esses so os chamados"dispositivoslgicos"paraondetodaasadadedadosdoPythondirecionada.Mensagensgeradas pelocomandoprintsoenviadasparastdout,quenormalmenteestassociadoteladocomputadorouterminal. DuranteaexecuodeumCGI,ostdoutredirecionadoparaoHTTPd,quevaienviarparaoclientetudooque passarporestedispositivo.MensagensdeerroetracebacksdoPython,noentanto,voparastderr.Seoscript invocadopelalinhadecomando,ostderrtambmestassociadotela,eassimpodemosverostracebacks.Mas aoexecutarumCGI,oHTTPdsimplesmenteignoraodispositivostderrapsoenviodocabealho,ocasionandoa perdadostracebacks.Nalinha24associamossys.stderraoobjetosys.stdout.Destamaneiraasmensagensde erropassamaserenviadasparaobrowseratravsdoHTTPd,comoocorrecomostextosgeradosporprint. Linha25:importamosumafunodomdulotracebackparausonalinha27. Linha26:geramostagsparaumalinhahorizontal(<HR>)eottulo'ErronoCGI:'abrimosumtag<PRE>para manteraformataooriginaldaslinhasdotraceback. Linha27:usamosafunoprint_exc()domdulotracebackparagerarotextodeumadescriodeerro. Linha30:encerramosoprogramagerandoostagsquemarcamofimdeumapginaHTML. ===Prottipomelhorado Agoraquecolocamosocalendriobsicoparafuncionar,estnahorademelhorarsuaapresentao.Vamosdeixarde

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

43/46

3/3/14

AprendaProgramar - PythonBrasil

ladoorecursopreguiosodotag<PRE>ecolocarosdiasdomsdentrodeumatabelaconstrudaemHTML(Figura3). Aproveitando outros recursos daquela linguagem, vamos tambm colorir os finais de semana e assinalar o dia de hoje. Vocencontraoprogramac a l e n d i n 2 . p y nalistagemabaixo.

EscondernmerodaslinhasEscondernmerodaslinhas 1 # ! / p y t h o n / p y t h o n 2 # c a l e n d i n 2 . p y c a l e n d r i o d i n m i c o p r o t t i p o 2 3 4 p r i n t ' C o n t e n t t y p e : t e x t / h t m l \ n ' 5 6 t r y : 7 f r o m t i m e i m p o r t t i m e , l o c a l t i m e 8 f r o m c a l e n d a r i m p o r t m o n t h c a l e n d a r 9 f r o m s t r i n g i m p o r t j o i n 1 0 1 1 a n o , m e s , h o j e = l o c a l t i m e ( t i m e ( ) ) [ : 3 ] 1 2 1 3 p r i n t ' < H T M L > < T I T L E > C a l e n d r i o D i n m i c o < / T I T L E > ' 1 4 p r i n t ' < B O D Y > ' 1 5 p r i n t ' < C E N T E R > ' 1 6 p r i n t ' < H 1 > C a l e n d r i o d e % 0 2 d / % 0 4 d < / H 1 > ' % ( m e s , a n o ) 1 7 p r i n t ' < T A B L E > ' 1 8 p r i n t ' < T R > ' 1 9 f o r d i a _ s e m i n [ ' s e g ' , ' t e r ' , ' q u a ' , ' q u i ' , ' s e x ' , ' s a b ' , ' d o m ' ] : 2 0 i f d i a _ s e m i n [ ' s a b ' , ' d o m ' ] : b g c o l o r = ' g r e e n ' 2 1 e l s e : b g c o l o r = ' b l u e ' 2 2 p r i n t ' < T H W I D T H = " 4 5 " B G C O L O R = " % s " > ' % b g c o l o r 2 3 p r i n t ' < H 3 > % s < / H 3 > < / T H > ' % d i a _ s e m 2 4 p r i n t ' < / T R > ' 2 5 f o r s e m a n a i n m o n t h c a l e n d a r ( a n o , m e s ) : 2 6 p r i n t ' < T R > ' 2 7 n u m _ d i a _ s e m = 0 2 8 f o r d i a i n s e m a n a : 2 9 i f d i a = = h o j e : 3 0 b g c o l o r = ' p i n k ' 3 1 e l i f n u m _ d i a _ s e m > = 5 : 3 2 b g c o l o r = ' l i g h t g r e e n ' 3 3 e l s e : 3 4 b g c o l o r = ' l i g h t b l u e ' 3 5 p r i n t ' < T D A L I G N = " R I G H T " B G C O L O R = " % s " > ' % b g c o l o r 3 6 i f d i a ! = 0 : 3 7 p r i n t ' < H 2 > % 2 d < / H 2 > ' % d i a 3 8 p r i n t ' < / T D > ' 3 9 n u m _ d i a _ s e m = n u m _ d i a _ s e m + 1 4 0 p r i n t ' < / T R > ' 4 1 p r i n t ' < / T A B L E > < / C E N T E R > ' 4 2 4 3 e x c e p t : 4 4 i m p o r t s y s

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

44/46

3/3/14

AprendaProgramar - PythonBrasil

4 5 f r o m t r a c e b a c k i m p o r t p r i n t _ e x c 4 6 s y s . s t d e r r = s y s . s t d o u t 4 7 p r i n t ' < H R > < H 3 > E r r o n o C G I : < / H 3 > < P R E > ' 4 8 p r i n t _ e x c ( ) 4 9 p r i n t ' < / P R E > ' 5 0 5 1 p r i n t ' < / B O D Y > < / H T M L > ' Principaisnovidadesemrelaoversoanterior: Linha11:almdoanoedoms,guardamosodiadehoje,parapoderassinallonocalendrio. Linha15:vamoscentralizartudonapgina. Linha17:abrimosotag<TABLE>queconterocalendriopropriamentedito.Estatabelasserfechadapelo tag</TABLE>nalinha41doprograma. Linha18:iniciamosaprimeiralinhadatabela(<TR>=TableRowoulinhadatabela). Linha19:vamospercorrerosnomesdosdiasdasemanaparaconstruirocabealhodatabela. Linhas20e21:sbadosedomingosterofundosverdes(green)demaisdiasterofundosazuis(blue). Linha22:tabelasemHTMLsodivididasem"clulas".Hdoistagsparadefinirclulas,o<TH>(tablehead= cabea)eo<TD>(tabledata=dados).OsdiasdasemanaficarodentrodeclulasTHcomlargurade45pixelse acordefundodefinidaacima.Alarguradessasclulasdeterminaralarguradascolunas. Linha23:onomedecadadiadasemanacolocadoentretags<H3></H3>,paranfase,eotag</TH>aplicado parafecharcadaclula. Linha24:fechamosaprimeiralinhadatabela. Linha25:iniciamosumloopparapercorrercadasemanadoms. Linha26:abrimosalinhadatabelacorrespondenteaumadassemanas. Linha 27: zeramos o contador que permitir identificar sbados e domingos (a funo monthcalendar retorna semanascominciossegundasfeirasemnossacontagem,segundafeiraserodiazero). Linha28:iniciamosoutroloop,agoraparapercorrercadadiadasemana. Linhas 29 a 34: a cor do fundo da prxima clula definida assim: a clula de hoje rosa (pink) sbados e domingos(dias5e6nasemana)seroverdeclaro(lightgreen)eosdemaisdiasseroazulclaro(lightblue) Linha35:abrimosacluladodia,comacorescolhida.Elaserfechadanalinha38. Linhas36e37:seonmerododiadiferentedezero,colocamosocontedodaclula.Lembresequeafuno monthcalendarcompletacomzerosassemanasdoprimeiroeltimodiadoms. Linha39:incrementamosocontadordediadasemana.Aquiseencerraoblocoquepercorreosdias. Linha40:fechamosalinhadatabela.Fimdoloopquecorrespondessemanas.

Prximasparadas
AquiterminanossoprimeirocontatocomprogramaoaplicadaWeb.Nestecaptulovocinstalouseuprprioservidor Apache,eimplementouseusprimeirosprogramasCGI.Osprincpiosquevocestaprendendoaquiseaplicamaqualquer tecnologiadegeraodepginasdinmicas.Paraconstruirosexemplos,lanamosmodecdigoHTML.Nonosso objetivoaquiabordarestaoutralinguagem,masnopodemosfazercoisasinteressantesnaWebsemconhecerumpouco dela.VamosmanterousodeHTMLemumnvelbemelementar,econtinuaremosexplicandoostagsmaisimportantesde cadaexemplo,masseuaproveitamentopodersermelhorsevocestudarporcontaprpria.OtutorialdoCaique,quevoc encontranositeda Magnet,maisquesuficienteparaacompanharorestantedestecurso.

No prximo nmero, aperfeioaremos nosso calendrio para tornlo interativo: em vez de mostrar sempre o ms atual, vamospermitirqueousurioescolhaummseumanoqualquer,etambmnavegueparafrenteeparatrsdemsem ms.IssonoslevaraexplorarousodeURLscomargumentoseformulriosemHTML.Atl! PS.ArevistaMAGNETdeixoudeserpublicada,entoestetutorialnotevecontinuao... 1. Algumasrefernciasao siteMagnetqueficaramforadecontextodestetutorialaquinoPythonBrasil,noentanto, deveficarclaroqueosdireitoseaautoriadestetutorialdeLucianoRamalhoefoipublicadoinicialmentenosite

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

45/46

3/3/14

AprendaProgramar - PythonBrasil

http://www.magnet.com.br/(1)
Sobreestapgina AprendaProgramar(editadapelaltimavezem2012073121:01:22porromulocollopy) VisualizarTexto|VisualizarImpresso|Information|FazerUsurioAcompanhar|Anexos "Python"eoslogosdePythonsomarcasregistradasdaPythonSoftwareFoundation,usadasaquimediantepermissodamesma.O contedodestesiteestdisponvelsobostermosdaCreativeCommonsAttribution2.5excetoquandoexplicitamenteespecificadooutra licena.

file:///home/saymon/Desktop/AprendaProgramar - PythonBrasil.html

46/46