Primeiros Elogios ao Use a Cabeça! Python “O Use a Cabeça! Python é uma ótima introdução sobre como a linguagem Python é usada no mundo real. O livro vai além da sintaxe, para ensiná-lo a criar aplicativos para telefones Android, Google App Engine e muito mais.” — David Griffiths, autor e instrutor da Agile “Onde outros livros começam com a teoria e passam para os exemplos, o Use a Cabeça! Python salta diretamente para o código e explica a teoria à medida em que você lê. Este é um ambiente muito mais eficaz de aprendizagem porque envolve o leitor desde o início. Foi uma alegria lê-lo. Foi divertido, sem ser petulante e informativo sem ser condescendente. A amplitude de exemplos e explicações abrange a maior parte do que você faz em seu trabalho diário. Eu recomendo este livro a qualquer um que esteja começando no Python.” — Jeremy Jones, coautor do Python for Unix and Linux System Administration “O Use a Cabeça Python é um livro ótimo para começar a se aprimorar em uma linguagem que é cada vez mais relevante.” — Phil Hartley, Universidade de Avanço Tecnológico Elogios sobre outros livros da série “O Use a Cabeça! Java, de Kathy e Bert transforma a página impressa na coisa mais próxima à interface gráfica do usuário que você já viu. Em tom irônico, de maneira descolada, os autores tornam o aprendizado do Java uma experiência envolvente do tipo ‘o que você fará em seguida?’” — Warren Keuffel, Software Development Magazine “Além do estilo envolvente que o leva de leigo para o status de guerreiro Java, o Use a Cabeça! Java abrange uma enorme quantidade de questões práticas que os outros livros abandonam, como o temido ‘exercício para o leitor...’. É inteligente, irônico, descolado e prático – não há muitos livros que podem fazer essa reivindicação e viver de acordo com ela, enquanto também ensinam sobre a serialização do objeto e os protocolos de inicialização da rede.” — Dr. Dan Russell, Diretor de Ciências e Pesquisa da Experiência do Usuário Centro de Pesquisa Almaden da IBM (e ensina Inteligência Artificial na Universidade de Stanford) “É rápido, irreverente, divertido e cativante. Tenha cuidado – você pode realmente aprender algo!” — Ken Arnold, ex-engenheiro sênior da Sun Microsystems e coautor (com James Gosling, criador do Java), Linguagem de Programação Java “Eu sinto como se o peso de milhares de livros acabasse de ser retirado da minha cabeça.” — Ward Cunningham, inventor do Wiki e fundador do grupo Hillside “O tom certo para o guru entendido, casual e legal em todos nós. A referência certa para as estratégias de desenvolvimento prático – faz meu cérebro avançar sem ter que passar pela fala velha e cansada do professor.” — Travis Kalanick, fundador da Scour and Red Swoosh Membro do MIT TR100 “Há livros que você compra, livros que você guarda, livros que você mantém em sua mesa e, graças à O’Reilly e à equipe do Use a Cabeça!, existem livros Use a Cabeça!. Eles são os únicos que estão com as orelhas dobradas, deformados e são levados a todos os lugares. O Use a Cabeça! SQL está no topo da minha pilha. Ah, até o PDF que tenho para revisão está surrado e rasgado.” — Bill Sawyer, Gerente de Currículos ATG, Oracle “A admirável clareza, humor e doses substanciais de inteligência fazem deste o tipo de livro que ajuda até os não programadores a pensar bem sobre a resolução do problema.” — Cory Doctorow, coeditor do Boing Boing autor, Down and Out in the Magic Kingdom e Someone Comes to Town, Someone Leaves Town Elogios sobre outros livros da série “Eu recebi o livro ontem e comecei a lê-lo... e não consegui parar. Isto é definitivamente très ‘legal’. É divertido e eles abordam muita coisa. Estão certos ao meu ver. Estou realmente impressionado.” — Erich Gamma, Engenheiro da IBM e coautor de Design Patterns “Um dos livros mais divertidos e inteligentes sobre design de software que eu já li.” — Aaron LaBerge, Tecnologia VP, ESPN.com “O que costumava ser um processo longo de aprendizagem com tentativas e erros, agora foi reduzido a um livro envolvente.” — Mike Davidson, CEO, Newsvine, Inc. “O design elegante é o destaque de cada capítulo, cada conceito transmitido em doses iguais de pragmatismo e inteligência.” — Ken Goldstein, Vice-Presidente executivo da Disney Online “Eu ! o Use a Cabeça HTML com CSS & XHTML – ensina tudo que você precisa aprender em um formato divertido.” — Sally Applin, Designer IU e Artista “Geralmente, quando leio um livro ou um artigo sobre padrões de projetos, tenho que ficar de olho em alguma coisa só para me certificar que estava prestando atenção. Não é o caso. Por mais estranho que possa parecer, este livro torna divertido o aprendizado sobre padrões de projetos.” “Enquanto outros livros sobre padrões de projetos estão dizendo ‘Bueller... Bueller... Bueller...’, este está sobre o carro alegórico, cantando‘Shake it up, baby!’” — Eric Wuehler “Eu literalmente amo este livro. Na verdade, eu beijei este livro na frente da minha esposa.” — Satish Kumar Outros livros da série Use a Cabeça! !"#$%$&%'#(%)$*+%,$-./0""1/2%3 !"#$%$&%'#(%)$435#'.% !"#$%$&%'#(%)$*2631"#$7$-./+#8/$9.1#28%:/$%/$9'+#8/ !"#$%$&%'#(%)$*2631"#$:#$;%:/" !"#$%$&%'#(%)$&<$=$>?$@:1(A/ !"#$%$&%'#(%)$;#"#2B/3B1C#28/$:#$D/E8F%.# !"#$%$&%'#(%)$;#"#2B/3B#2:/$G%.%$1-H/2# !"#$%$&%'#(%)$@"8%8I"81J% !"#$%$&%'#(%)$@,J#3 !"#$%$&%'#(%)$KI"1J% !"#$%$&%'#(%)$L#/C#8.1%$>; !"#$%$&%'#(%)$M%B%$>?$@:1(A/ !"#$%$&%'#(%)$M%B%DJ.1G8 !"#$%$&%'#(%)$-%:.N#"$:#$-./+#8/"$=$>?$@:1(A/ !"#$%$&%'#(%)$-./5.%C%(A/ !"#$%$&%'#(%)$-O-$7$PQDRS !"#$%$&%'#(%)$-P!"#$%$&%'#(%)$T%13"$=$>?$@:1(A/ !"#$%$&%'#(%)$T#:#"$:#$&/CGU8%:/.#" !"#$%$&%'#(%)$D#.B3#8"$7$MD-$=$>?$@:1(A/ !"#$%$&%'#(%)$DRS !"#$%$&%'#(%)$V#'$;#"152 Use a Cabeça! Python Não seria um sonho se existisse um !"#$%&'()*%+&,-.&+/%&01.22.&#%34&,-.$.$& .2)5$&.6&,-5!,-.$&!-75$8&6.+%2&035$& 9$.2%&+5&:$.+).&;%&2.-&3%69-)5;%$& .23$.#.+;%&3<;"7%=&>-&53*%&,-.&"22%&?& apenas uma fantasia... Paul Barry Rio de Janeiro, 2012 Dedico este livro a todas aquelas pessoas generosas na comunidade Python, que ajudaram a tornar esta grande pequena linguagem a tecnologia de programação excelente que ela é. E àquelas que tornaram a aprendizagem do Python, e suas tecnologias, complexas o suficiente para que as pessoas precisassem de um livro como este para aprendê-las. o autor Autor de Use a Cabeça Python Paul Barry recentemente concluiu que vem Paul programando por quase um quarto de século, um fato que surgiu como um choque. Nesse tempo, Paul programou em diferentes linguagens de programação, viveu e trabalhou em dois países em dois continentes, casou-se, teve três filhos (bem... na verdade, sua esposa Deirdre os teve, mas Paul estava lá), fez bacharelado e mestrado em Informática, escreveu e coescreveu três outros livros, bem como muitos artigos técnicos para o Linux Journal (onde ele é editor colaborador). Quando Paul viu pela primeira vez o Use a Cabeça HTML com CSS & XHTML, amou tanto que soube imediatamente que a abordagem do Use a Cabeça seria uma ótima maneira de ensinar programação. Ele ficou muito feliz então em criar o Use a Cabeça Programação, junto com David Griffiths, em uma tentativa de provar que o seu palpite estava correto. Paul trabalha hoje como professor no Instituto de Tecnologia, Carlow, na Irlanda. Como parte do Departamento de Informática e Redes, Paul começa o seu dia explorando, aprendendo e ensinando tecnologias da programação, incluindo o Python, aos seus alunos. Paul terminou recentemente seu curso de pós-graduação em Ensino e Aprendizagem, e ficou um pouco mais aliviado ao descobrir que grande parte do que ele faz está de acordo com o terceiro nível das melhores práticas atuais. viii introdução conteúdo (sumário) Conteúdo (Sumário) 1 2 3 4 5 6 7 8 9 10 11 i Introdução Conhecendo o Python: Todos amam listas Compartilhando seu código: Módulos de funções Arquivos e Exceções: Lidando com erros Persistência: Salvando dados em arquivos Compreendendo os Dados: Trabalhe esses dados! Objetos de Dados Personalizados: Reunindo códigos com dados Desenvolvimento Web: Juntando tudo Desenvolvimento de aplicativo móvel: Pequenos dispositivos Gerencie seus dados: Tratamento da entrada Dimensionando seu aplicativo web: Caindo na real Lidando com a complexidade: Disputa de dados Sobras: As dez melhores coisas (que não cobrimos) xxiii 1 33 73 105 139 173 213 255 293 351 397 435 Conteúdo (a coisa real) Introdução Seu cérebro no Python. Aqui está você tentando aprender algo, "#$%&#'()*"%)+,-".-()/&0)()/&1(-)2")*")+"-'34+&-)$%")()&5-"#230&2()#6()*")47&-89) :"%)+,-".-()"*'8)5"#*&#2(;)<=">?(-)2"37&-)"*5&@()5&-&)+(3*&*)=&3*)3=5(-'&#'"*A) +(=()5(-)"7"=5>(A)$%&3*)&#3=&3*)*">1&B"#*)"13'&-)")*")5-&'3+&-)*#(C.(&-2)#%)),) %=&)=8)32"3&D9)E#'6(A)+(=()1(+F)"#B&#&-8)*"%)+,-".-()5&-&)5"#*&-)$%")*%&)132&) depende de conhecer Python? A quem se destina este livro? Sabemos o que você está pensando Metacognição pensando sobre pensar Force seu cérebro à submissão. Leia-me A equipe de revisão técnica Agradecimentos xxiv xxv xxvii xxix xxx xxxii xxxiii você está aqui ! ix conteúdo (sumário) 1 conhecendo o python Todos amam listas Você está fazendo uma pergunta: “o que torna o Python diferente?” G)-"*5(*'&)+%-'&),;)=%3'&*)+(3*&*9)G*)-"*5(*'&*)=&3*)>(#B&*)H8) +(="@&=)&4)-=&#2()$%")?8)=%3'&*)+(3*&*)/&=3>3&-"*)'&=.,=9)I)JK'?(#),)=%3'() 5&-"+32()+(=)$%&>$%"-)(%'-&)>3#B%&B"=)B"-&>)2")5-(B-&=&@6(A)+(=)3#*'-%@L"*A) "75-"**L"*A)(5"-&@L"*A)/%#@L"*A)=M2%>(*A)=,'(2(*)")+>&**"*9)N(2&*)&*)+(3*&*) ?&.3'%&3*A)#&)1"-2&2"9)E#'6(A)?8)(%'-&*)+(3*&*)$%")()JK'?(#)/(-#"+")$%")'(-#&=) &)132&)2()5-(B-&=&2(-)O)&)*%&)132&)O)%=)5(%+()=&3*)/8+3>9)P(+F)+(="@&-8)()*"%) '(%-)#()JK'?(#)&5-"#2"#2()*(.-")&*)>3*'&*9)Q&*A)&#'"*)2")+?"B&-)>8A)?8)(%'-&) 5"-B%#'&)3=5(-'&#'")$%")5-"+3*&)*"-)-"*5(#232&999) O que há para se gostar sobre o Python? Instale o Python 3 Use o IDLE para ajudá-lo a aprender o Python Trabalhe efetivamente com o IDLE Lide com dados complexos Crie listas simples no Python As listas são como arrays Adicione mais dados à sua lista Trabalhe com os dados de sua lista Os loops for trabalham com listas de qualquer tamanho Armazene listas dentro de listas Verifique uma lista para obter outra lista Dados complexos são difíceis de processar Lide com os muitos níveis de listas aninhadas Não repita o código; crie uma função Crie uma função no Python Recursão ao resgate Sua caixa de ferramentas Python rry Gilliam, 91 mins Te & s ne Jo y rr Te , 75 19 , ail Gr ly Ho The Graham Chapman Idle & Terry Jones ic Er m, llia Gi y rr Te e, ees Cl hn Jo , Michael Palin x introdução 2 3 4 5 6 7 9 11 15 16 18 20 23 24 28 29 31 32 conteúdo (sumário) 2 compartilhando seu código Módulos de funções Código reutilizável é ótimo, mas módulo compartilhável é melhor. G()+(=5&-'3>?&-)*"%)+M23B()+(=()%=)=M2%>()JK'?(#A)1(+F)&.-") *"%)+M23B()5&-&)&)+(=%#32&2")JK'?(#)3#'"3-&999)"),)*"=5-").(=)+(=5&-'3>?&-A) #6(),R)S"*'")+&5T'%>(A)1(+F)&5-"#2"-8)&)+-3&-A)3#*'&>&-)")23*'-3.%3-)*"%*)5-M5-3(*) =M2%>(*)+(=5&-'3>?81"3*9)E#'6(A)+&--"B&-8)*"%)=M2%>()#()*(/'C&-")2()*3'")2") +(=5&-'3>?&="#'()2()JK'?(#A)5&-&)$%")'(2(*)5(**&=)&5-(1"3'&-)*"%)'-&.&>?(9) G()>(#B()2()+&=3#?(A)1(+F)&5-"#2"-8)&>B%#*)'-%$%"*)#(1(*)-">&'31(*)U*)/%#@L"*) JK'?(#)'&=.,=9 nester É bom demais para não compartilhar Transforme sua função em um módulo Os módulos estão em todos os lugares Comente seu código Prepare sua distribuição Construa sua distribuição Uma rápida revisão de sua distribuição Importe um módulo para usá-lo Os módulos Python implementam namespaces 34 35 36 37 40 41 42 43 45 Registrando-se no site PyPI Faça o upload de seu código para o PyPI Bem-vindo à comunidade PyPI Controle o comportamento com um argumento extra Antes de escrever um código novo, pense no BIF O Python faz o melhor para executar seu código Rastreie seu código Trabalhe no que está errado Atualize o PyPI com seu novo código Você mudou sua API Use argumentos opcionais Seu módulo suporta as duas APIs Sua API ainda não está certa A reputação do seu módulo é restaurada Sua caixa de ferramentas Python 47 48 49 52 53 57 58 59 60 62 63 65 66 70 71 nester.py setup.py você está aqui ! xi conteúdo (sumário) 3 arquivos e exceções Lidando com erros Simplesmente não é suficiente processar os dados de sua lista em seu código. P(+F)5-"+3*&)/(-#"+"-)(*)2&2(*)"=)*"%*) 5-(B-&=&*)+(=)/&+3>32&2")'&=.,=9)S6(),)#"#?%=&)*%-5-"*&)$%")()JK'?(#)'(-#") &)>"3'%-&)2(*)2&2(*)2(*)&-$%31(*)/8+3>9)I)$%"),)M'3=(A)&',)1(+F)+(#*32"-&-)()$%") pode dar errado)&()3#'"-&B3-)+(=)2&2(*)"7'"-#(*)&(*)*"%*)5-(B-&=&*999)")?8) muitas coisas esperando para enganá-lo! Quando coisas ruins acontecem, você precisa de uma estratégia para solucionar o problema, e tal estratégia é lidar com $%&3*$%"-)*3'%&@L"*)"7+"5+3(#&3*)%*&#2()()="+&#3*=()2")'-&'&="#'()2")"7+"@6() 2()JK'?(#)=(*'-&2()#"*'")+&5T'%>(9 Os dados são externos ao seu programa São todas linhas de texto Dê uma olhada nos dados Conheça seus dados Conheça seus métodos e peça ajuda Conheça seus dados (melhor) Duas abordagens muito diferentes Adicione uma lógica extra Lide com as exceções Tente primeiro, depois recupere Identifique o código a proteger Continue com o erro E os outros erros? Adicione mais código de verificação de erros... ... Ou adicione outro nível de tratamento de exceção Então, qual abordagem é a melhor? Está pronto... exceto por um pequeno detalhe Seja específico em suas exceções Sua caixa de ferramentas Python split(beans) xii introdução 74 75 77 79 80 82 83 84 88 89 91 93 96 97 98 99 101 102 103 conteúdo (sumário) V 4 persistência Salvando dados em arquivos É muito bom ser capaz de processar seus dados baseados em arquivos. Q&*A)()$%")&+(#'"+")+(=)*"%*)2&2(*) quando você termina? Claro, é melhor salvá-los em um arquivo do disco, o que 5"-=3'")%*8V>(*)#(1&="#'")=&3*)'&-2"9)J"B&-)(*)2&2(*).&*"&2(*)"=)="=M-3&) ")&-=&0"#8V>(*)#()23*+(),)()$%")2"4#")&)5"-*3*'F#+3&9)I)JK'?(#)*%5(-'&)'(2&*) as ferramentas habituais para gravar os arquivos e também fornece algumas facilidades legais para armazenar de!"#$%&!'()*'+,')*"%*)2&2(*9 Programas produzem dados Abra seu arquivo no modo de gravação Os arquivos ficam abertos após uma exceção! Estenda try com finally Conhecer o tipo de erro não é o suficiente Use with para trabalhar com arquivos Os formatos padrão são inadequados para os arquivos Por que não modificar print_lol()? Conserve seus dados Salve com dump e restaure com load A E/S genérica do arquivo com pickle é o caminho a seguir Sua caixa de ferramentas Python [‘Is this the right room for an argument?’, “No you haven’t!”, ‘When?’, “No you didn’t!”, “You didn’t!”, ‘You did not!’, ‘Ah! (taking out his wallet and paying) Just the five minutes.’, ‘You most certainly did not!’, “Oh no you didn’t!”, “Oh no you didn’t!”, “Oh look, this isn’t an argument!”, “No it isn’t!”, “It’s just contradiction!”, ‘It IS!’, ‘You just contradicted me!’, ‘You DID!’, ‘You did just then!’, ‘(exasperated) Oh, this is futile!!’, ‘Yes it is!’] 106 110 114 115 117 120 124 126 132 133 137 138 ['Is this the right room for an argument?', "No you haven't!", 'When?', "No you didn't!", "You didn't!", 'You did not!', 'Ah! (taking out his wallet and paying) Just the five minutes.', 'You most certainly did not!', "Oh no you didn't!", "Oh no you didn't!", "Oh look, this isn't an argument!", "No it isn't!", "It's just contradiction!", 'It IS!', 'You just contradicted me!', 'You DID!', 'You did just then!', '(exasperated) Oh, this is futile!!', 'Yes it is!'] você está aqui ! xiii conteúdo (sumário) 5 compreendendo os dados Trabalhe com dados! Os dados têm todas as formas e tamanhos, formatos e codificações. J&-&)'-&.&>?&-)2")/(-=&)"4+&0)+(=)*"%*)2&2(*A)=%3'&*)1"0"*) você tem que manipulá-los e transformá-los em um formato comum para permitir 5-(+"**&="#'(A)+>&**34+&@6()")&-=&0"#&="#'()"4+3"#'"*9)S"*'")+&5T'%>(A)1(+F) 3-8)"75>(-&-)(*)&'-&'31(*)2()JK'?(#)$%")()&H%2&=)&)'-&.&>?&-)+(=)(*)2&2(*)*"=) 5-"(+%5&@L"*A)5"-=3'3#2()(.'"-)&)B-&#2"0&)2&)=%2&#@&)#">"*9 O treinador Kelly precisa de sua ajuda Escolha um dos dois caminhos O problema com o tempo Compreendendo as listas Itere para remover as duplicatas Remova as duplicatas com conjuntos Sua caixa de ferramentas Python Garanto que este 359@)-!%&;5$A&5&#%34& 6-")%2&.B.$3@3"%2C xiv introdução 140 144 148 155 161 166 172 conteúdo (sumário) 6 objetos de dados personalizados Reunindo código com dados É importante coincidir sua escolha de estrutura de dados com seus dados.E)"**&)"*+(>?&)5(2")/&0"-)%=&)B-&#2") 23/"-"#@&)#&)+(=5>"732&2")2()*"%)+M23B(9)S()JK'?(#A)&5"*&-)2")=%3'()W'"3*A)&*) >3*'&*)")(*)+(#H%#'(*)#6()*6()&*)W#3+&*)(5@L"*9)I)dicionário Python permite que você organize seus dados para fazer uma pesquisa rápida &--#)*&+.# seus dados )#%!+#%'-A)#6()#W="-(*9)E)$%&#2()&*)"*'-%'%-&*)2")2&2(*)5-"2"4#32&*) 2()JK'?(#)#6()*"-1"=)."=A)&)3#*'-%@6()2&)classe)JK'?(#)5"-=3'")$%")1(+F)2"4#&) %=&)5-M5-3&9)E*'")+&5T'%>()=(*'-&)+(=()/&0"-9 O treinador Kelly está de volta (com um novo formato de arquivo) Use um dicionário para associar dados Agrupe seu código e seus dados em uma classe Defina uma classe Use a classe para definir classes A importância de self O primeiro argumento de cada método é self Herde a lista predefinida do Python O treinador Kelly está impressionado Sua caixa de ferramentas Python você está aqui ! 174 178 189 190 191 192 193 204 211 212 xv conteúdo (sumário) 7 desenvolvimento web Juntando tudo Cedo ou tarde, você vai querer compartilhar seu aplicativo com muitas pessoas. P(+F)'"=)=%3'&*)(5@L"*)5&-&) /&0"-)3**(9)G.-&)*"%)+M23B()#()JKJXA)"#13")=%3'(*)"V=&3>*A)+(>($%")*"%)+M23B() em um CD ou USB, ou simplesmente instale seu aplicativo manualmente nos +(=5%'&2(-"*)2&*)5"**(&*)$%")5-"+3*&=)2">"9)J&-"+")=%3'()'-&.&>?(*(999)*"=) ="#+3(#&-)&)+?&'3+"9)G>,=)23**(A)()$%")&+(#'"+")$%&#2()1(+F)5-(2%0)%=&) 1"-*6()=">?(-)2()*"%)+M23B(R)I)$%")&+(#'"+"A)"#'6(R)Y(=()1(+F)B"-"#+3&) &)&'%&>30&@6(R)E#+&-"=(*;),)%=)5-(.>"=&)'&>)$%")1(+F)-"&>="#'")3#1"#'&-8) 2"*+%>5&*)+-3&'31&*)5&-&)#6()/&0FV>(9)Z">30="#'"A)1(+F)#6()5-"+3*&)/&0"-)#&2&) 23**(;).&*'&)+-3&-)%=)&5>3+&'31()C".9)E)+(=()"*'")+&5T'%>()2"=(#*'-&A)%*&-)() JK'?(#)5&-&)()2"*"#1(>13="#'()C".),)/8+3>9 É bom compartilhar Você pode colocar seu programa na Web O que o aplicativo web precisa fazer? Planeje seu aplicativo web com MVC Modele seus dados Visualize sua interface Controle seu código O CGI permite que seu servidor web execute programas Exiba a lista de atletas O temido erro 404! Crie outro script CGI Ative o rastreamento CGI para ajudar com os erros Uma pequena mudança pode fazer toda a diferença Seu aplicativo web é um sucesso! Sua caixa de ferramentas Python xvi introdução 214 215 218 221 222 226 234 235 236 242 244 248 250 252 253 conteúdo (sumário) 8 desenvolvimento de aplicativo móvel Pequenos dispositivos Colocar seus dados na web abre todos os tipos de possibilidades. [%&>$%"-)5"**(&)2")$%&>$%"-)>%B&-)5(2")#6()*M)3#'"-&B3-) +(=)*"%)&5>3+&'31()C".A)+(=()'&=.,=)"*'8A)+&2&)1"0)=&3*A)/&0"#2()3**()&)5&-'3-) 2")%=&)+(>"@6()2")231"-*(*)23*5(*3'31(*)2")+(=5%'&@6(;)JY*A)>&5'(5*A)'&.>"'*A) 5&>='(5*)")&',)'">"/(#"*)+">%>&-"*9)E)#6()*6())*M)(*)?%=&#(*)$%")3#'"-&B"=)+(=) ()*"%)&5>3+&'31()C".)+(=)(*)$%&3*)1(+F)'"=)$%")*")5-"(+%5&-)")*%5(-'&-;)/#,-)*6() 5"$%"#(*)5-(B-&=&*)$%")5(2"=)&%'(=&'30&-)&*)3#'"-&@L"*)\".)")#(-=&>="#'") 2"*"H&=)*"%*)2&2(*A)#6()*"%)&=3B81">)]NQ^9)S"*'")+&5T'%>(A)1(+F)3-8)"75>(-&-)() JK'?(#)#()+">%>&-)2()'-"3#&2(-)_">>K)5&-&)"*+-"1"-)%=)&5>3+&'31()$%")3#'"-&H&)+(=) (*)2&2(*)2()*"%)&5>3+&'31()C".9) O mundo está ficando menor O treinador Kelly está no Android Não se preocupe com o Python 2 Configure seu ambiente de desenvolvimento Configure o SDK e o emulador Instale e configure o Android Scripting Adicione o Python à sua instalação SL4A Teste o Python no Android Defina as exigências do seu aplicativo A API do SL4A Android Selecione em uma lista no Android O script CGI de dados do atleta Os dados parecem ter mudado de tipo O JSON não pode lidar com seus tipos de dados personalizados Execute o aplicativo em um telefone real Configure o AndFTP O treinador está feliz com seu aplicativo Sua caixa de ferramentas Python 256 257 259 260 261 262 263 264 266 274 278 281 284 285 288 289 290 291 você está aqui ! xvii conteúdo (sumário) 9 gerencie seus dados Tratamento da entrada A Web e o seu telefone não são apenas ótimas maneiras de exibir dados.N&=.,=)*6()M'3=&*)/"--&="#'&*)5&-&)&+"3'&-)&)"#'-&2&)2") *"%*)%*%8-3(*9)S&'%-&>="#'"A)%=&)1"0)$%")*"%)&5>3+&'31()C".)&+"3'&)2&2(*A)">") precisa colocá-los em algum lugar e as escolhas que você faz quando decide quais *6()")(#2")"*'6()<"**"*)>%B&-"*D)*6(A)=%3'&*)1"0"*A)&)23/"-"#@&)"#'-")%=)&5>3+&'31() C".)/8+3>)2")&%="#'&-)")"*'"#2"-A)")%=)$%")#6(),9)S"*'")+&5T'%>(A)1(+F)"*'"#2"-8) *"%)&5>3+&'31()C".)5&-&)&+"3'&-)(*)2&2(*)2&)C".)`&'-&1,*)2")%=)#&1"B&2(-)(%)%=) '">"/(#")G#2-(32aA)."=)+(=()1"-8)")&5"-/"3@(&-8)*"%*)*"-13@(*)2")B"-"#+3&="#'()2(*) dados de /&)01'+.9 O aplicativo dos tempos dos atletas obteve alcance nacional Use um formulário ou uma caixa de diálogo para aceitar a entrada Crie um modelo de formulário HTML Os dados são entregues ao seu script CGI Peça a entrada em seu telefone Android É hora de atualizar os dados do seu servidor Evite as condições race Você precisa de um mecanismo de armazenamento de dados melhor Use um sistema de gerenciamento do banco de dados Python inclui o SQLite Explore a API do banco de dados do Python A API do banco de dados como código Python Um pequeno projeto de banco de dados vai longe Defina seu esquema do banco de dados Como são os dados? Transfira os dados do arquivo pickle para o SQLite Qual ID é atribuído a qual atleta? Insira seus dados de tempo Ferramentas de gerenciamento de dados SQLite Integre o SQLite em seu aplicativo web existente Você ainda precisa da lista dos nomes Obtenha os detalhes de um atleta com base no ID Você precisa corrigir seu aplicativo Android também Atualize os dados do atleta com base no SQLite A NUAC está na lua! Sua caixa de ferramentas Python xviii introdução 294 295 296 300 304 308 309 310 312 313 314 315 316 317 318 321 322 323 326 327 332 333 342 348 349 350 conteúdo (sumário) 10 dimensionando seu aplicativo web Caindo na real A web é um ótimo lugar para hospedar seu aplicativo... até que as coisas caiam na real. Cedo ou tarde, você irá tirar a *(-'")B-&#2")")*"%)&5>3+&'31()C".)*"-8)%=)-2)'--#!'-,$#+.#-#9)[%&#2()3**() &+(#'"+"-A)*"%)&5>3+&'31()C".)5&**&-8)2")%=)5%#?&2()2")&+"**(*)5(-)23&)5&-&) milhares, possivelmente dezenas de milhares ou &,3!%&*-9)P(+F)"*'&-8)5-(#'(R) :"%)*"-132(-)\".)>32&-8)+(=)&)carga? Como você saberá? Qual será o custo? Quem pagaráR):"%)=(2">()2")2&2(*)5(2")23="#*3(#&-V*")5&-&)=3>?L"*)")=3>?L"*) de itens de dados sem -'!&$$&-,&$R)N"-)%=)&5>3+&'31()C".)3#*'&>&2()")/%#+3(#&#2() ,)/8+3>)+(=)()JK'?(#)")&B(-&A)B-&@&*)&()b((B>")G55)E#B3#"A)dimensionar um &5>3+&'31()C".)JK'?(#),)5(**T1">)'&=.,=9 Existem observadores de baleias em todos os lugares O HFWWG precisa automatizar-se Construa um aplicativo web com o Google App Engine Baixe e instale o App Engine Certifique-se que o App Engine esteja funcionando O App Engine usa o padrão MVC Modele seus dados com o App Engine Para que serve um modelo sem visualização? Use modelos no App Engine A estrutura de validação de formulário do Django Verifique seu formulário Controlando seu aplicativo web App Engine Limite a entrada fornecendo opções Conheça a “tela em branco da morte” Processe o POST em seu aplicativo web Coloque seus dados em um armazenamento de dados Não quebre o “princípio da robustez” Aceite praticamente qualquer data e hora Parece que você não acabou ainda Às vezes, a menor mudança pode fazer toda a diferença... Capture o Google ID de seu usuário também Implemente seu aplicativo web na nuvem do Google Seu aplicativo Web HFWWG está implementado! Sua caixa de ferramentas Python 352 353 354 355 356 359 360 363 364 368 369 370 376 378 379 380 384 385 388 389 390 391 394 395 você está aqui ! xix conteúdo (sumário) 11 lidando com a complexidade Disputa de dados É ótimo quando você pode aplicar o Python a uma área de domínio específico. :"H&)%=).'-'+4#54*%'+,#!6'/, 7'$'+)*&%'+,#! .#!/&+)#!.'!.&.#-A)*"H&=)&5>3+&'31(*)=M1"3*A)()JK'?(#)&H%2&)1(+F)&)/&0"-)() trabalho +8#)&'-&5&>?&#2()()=(2()+(=()+(234)+&)*%&)*(>%@6(9)E)2"5(3*A)?8)(%'-(*) '35(*)2")5-(.>"=&*;)&$%">"*)$%")1(+F)#6()5(2")+&'"B(-30&-)(%)&#"7&-)&)%=) 2(=T#3(9)J-(.>"=&*)$%")"=)*3)*6()'6()9+*)#-, que você tem que vê-los de uma =&#"3-&)23/"-"#'")")&>'&="#'")"*5"+T4)+&9)Y-3&-)*(>%@L"*)2")*(/'C&-")*(.)="232&) para esses tipos de problemas é uma área onde o Python -'!.'-,&)&9)S"*'")*"%) +&5T'%>()4)#&>A)1(+F)'-,'+.'$: suas habilidades no Python ao limite e resolverá 5-(.>"=&*)&()>(#B()2()+&=3#?(9) Qual é uma boa meta de tempo para a próxima corrida? Então... qual é o problema? Comece com os dados Armazene cada tempo como um dicionário Disseque o código de previsão Obtenha a entrada a partir do seu usuário Obter entrada gera um problema Pesquise a correspondência mais próxima O problema está no tempo O módulo hora-segundos-hora O problema ainda está no tempo... Porta para o Android Seu aplicativo Android é um monte de caixas de diálogos Reúna seu aplicativo Seu aplicativo está pronto! Sua caixa de ferramentas Python xx introdução 398 400 401 407 409 413 414 416 418 419 422 424 425 429 431 432 conteúdo (sumário) i sobras As dez melhores coisas (que não cobrimos) Você percorreu um longo caminho. Q&*A)&5-"#2"-)()JK'?(#),) %=&)&'3132&2")$%")#%#+&)5&-&9)[%&#'()=&3*)JK'?(#)1(+F)+(234)+&-A)=&3*)5-"+3*&-8) &5-"#2"-)#(1&*)=&#"3-&*)2")/&0"-)+"-'&*)+(3*&*9)P(+F)5-"+3*&-8)2(=3#&-)#(1&*) /"--&="#'&*)")#(1&*)',+#3+&*)'&=.,=9):3=5>"*="#'")#6()?8)"*5&@()*%4)+3"#'") neste livro para mostrar tudo o que você possivelmente precisaria saber sobre o JK'?(#9)E#'6(A)&$%3)1&3)#(**&)>3*'&)2&*)2"0)=">?(-"*)+(3*&*)$%")#6()+(.-3=(*)") $%")1(+F)5(2")$%"-"-)*&."-)=&3*)#&)5-M73=&)1"09) 1: Usando um IDE “profissional” 2: Lutando com o escopo 3: Testando 4: Os recursos avançados da linguagem 5: Expressões regulares 6: Mais sobre as estruturas Web 7: Mapeadores relacionais do objeto e NoSQL 8: Programando as GUIs 9: Coisas a evitar 10: Outros livros 436 437 438 439 440 441 442 443 444 445 você está aqui ! xxi