1. Luciano Ramalho
[email protected] @ramalhoorgFácil para começar, difícil de superar Palestra apresentada na UNIFESP São José dos Campos em 10/dez/2012 2. Ada Lovelace• Ada A. Byron King,condessa deLovelace• nasceu em10/dez/1815• primeiraprogramadora(antes de qualquerhomem) @ramalhoorg 3. Python:linguagem de uso geral• Internet:YouTube, Globo.com, Bitly, Mozilla...• Computação gráfica: Disney, ILM, AutoDesk...• Desktop: Dropbox, BitTorrent, OpenOffice...• Operações: Google, Rackspace, Ubuntu, RedHat...• Enterprise: IBM, Oracle, ERP5, OpenERP...• Games, computação científica, segurança, etc... @ramalhoorg 4. @ramalhoorg 5. @ramalhoorg 6. @ramalhoorg 7. @ramalhoorg 8. @ramalhoorg 9. @ramalhoorg 10. @ramalhoorg 11. @ramalhoorg 12. @ramalhoorg 13. @ramalhoorg 14. Google em 1998 15. Google App Engine 16. code.google.com/edu/languages 17. YouTube 18. Globo.com 19. Mozilla Firefox Add-Ons 20. Dropbox 21. The Foundry, NUKE 22. Industrial Light & Magic 23. Autodesk Maya 24. Invesalius 25. Civilization IV 26. Frets on Fire 27. FBI e CIA 28. brasil.gov.br 29. Câmara dos Deputados 30. http://redmonk.com/sogrady/2012/09/12/ 31. “Vocês sãoo centro do Vale doSilício hoje” Paul Graham, Pycon US 2012 32. Linguagem“expressiva”O que isso significana prática? Linguagem COBOL 33. Java 34. JavaPython 35. Python tem sido uma parteimportante do Google desdeo início, e continua sendo àmedida que o sistema crescee evolui... estamos procurandomais pessoas com habilidadenesta linguagem.Peter Norvig, Google, Inc. 36. http://aima.cs.berkeley.edu/code.html 37. lis.py: interpretador Lisp (Scheme) em113 linhas de Python,por Peter Norvig 38. >>> from lis import replDemo: lis.py>>> repl()lis.py> (* 7 3)21lis.py> (define resposta (* 6 7))lis.py> resposta42lis.py> (define ! (lambda (n) (if (= n 0) 1 (* n (! (- n 1))))))lis.py> (! 4)24lis.py> (! 5)120lis.py> (! 197)100078405584080821221303894971344736599047761241456431563720437191558734323562679929991407036696693556694737848195477238497746661367777918006944650646265409257583733981874437495228286501182991424477395086576066353467353335798727837835328694280439305522603073118823862831864630209655642361092292378406702568679608855350476800000000000000000000000000000000000000000000000lis.py> !lis.py> 39. Sobre Python• Linguagem dinâmica • compilador é parte do ambiente de runtime• Tudo são objetos • Ex.: inteiros, funções, classes, exceções etc.• Multi-plataforma • Interpretador, APIs, bytecode, GUIs etc.@ramalhoorg 40. Implementações• CPython: a principal, escrita em C • incluída na maioria das distros GNU Linux e noMac OS X; vários pacotes para Windows• Jython: escrita em Java • parte de IBM WebSphere e Oracle WebLogic• IronPython: escrita em C#, .net CLR • desenvolvida pela Microsoft@ramalhoorg 41. Implementações (2)• PyPy: Python em Python• Implementação emlinguagem de alto-nívelfacilitando a inovação• Desempenho 5xmelhor que CPython• Incompatível com asextensões em C @ramalhoorg 42. 2.5Python: evolução 2006-09…2011-05 2.6 • Versões do CPython em dez/20122008-103.02008-12…2009-07 3.12009-06• 3.0, 2.5 e anteriores: fossilizadas • 2.6 e 3.1: manutenção por 5 anos 2.72010-07 3.22011-02 3.3 • 2.7 e 3.2: versões atuais • 2.7: versão final da série 2.x2012-09 • 3.3: lançada em set/2012 3.42014-02 ⋮ @ramalhoorg 43. Pythonista: app para iPad@ramalhoorg 44. Pythonista@ramalhoorg 45. Pythonista@ramalhoorg 46. @ramalhoorg 47. Pythonista@ramalhoorg 48. Pythonista@ramalhoorg 49. Pythonista@ramalhoorg 50. CPython 2.7: instaladores• GNU Linux: pré-instalado em quase toda distro • usar gerenciador de pacotes ou compilar (é fácil)• Windows • Python.org: instaladores MSI para 32 e 64 bits • ActiveState ActivePython: 32 e 64 bits• Mac OS: 32 bits (x86 e PPC), 64 bits (x86)@ramalhoorg 51. pythontutor.com 52. pythontutor.com 53. Exemplo de doctest# coding: utf-8"""Calcula a média de uma sequência de números>>> media([10])10.0>>> media([10, 20])15.0>>> media([1, 2])1.5"""def media(seq): return float(sum(seq))/len(seq)@ramalhoorg 54. Para executar doctests• Pela linha de comando: • $ python -m doctest meu_script.py• Usando um test-runner (unittest, nose, etc.)• No próprio script (self-test):if __name__==__main__: import doctest print doctest.testmod(optionflags=doctest.REPORT_ONLY_FIRST_FAILURE |doctest.REPORT_NDIFF |doctest.NORMALIZE_WHITESPACE) @ramalhoorg 55. Consoles interativos• python• integrado em IDEs• iPython• online• bpython• http://shell.appspot.com/• IDLE• http://pythonwebconsole.thomnichols.org/• http://www.pythonanywhere.com/ @ramalhoorg 56. IDEs, algumas opções• PyDev (Eclipse)• PyCharm (JetBrains) $$$• Komodo Edit• Komodo IDE $$$• TextMate $ - OSX• SublimeText $• WingIDE $$$@ramalhoorg 57. Em vez de IDE:The Unix environment• Linux ou OSX ou qualquer Unix:• janelas de editor, console e navegador ou sua aplicação• alternar entre janelas com alt-tab: simples, poderoso e eficaz• Emacs: python-mode.el• vi: http://www.vex.net/~x/python_and_vim.html• Geany: um Gedit mais esperto para lidar com vários arquivos@ramalhoorg 58. Configure o editor para...• Indentar com 4 caracteres de espaço ao usar atecla TAB ou comandos de indentação multi-linha• Salvar tabs como 4 espaços, nunca como tabs• Limpar brancos no final das linhas ao salvar• Indentação inteligente: preservar indentação dalinha acima e indentar automaticamente após: if,elif, else, for, while, try, except, finally, def, class, with@ramalhoorg 59. Comparando: C e Python#include int main(int argc, char *argv[]) {int i;for(i = 0; i < argc; i++)printf("%sn", argv[i]);return 0;}import sys for arg in sys.argv: print arg @ramalhoorg 60. Iteração em Javaclass Argumentos {public static void main(String[] args) {for (int i=0; i < args.length; i++)System.out.println(args[i]);}} $ java Argumentos alfa bravo charlie alfa bravo charlie@ramalhoorg 61. Iteração em Java ≥1.5ano: 2004 • Enhanced for (for melhorado)class Argumentos2 {public static void main(String[] args) {for (String arg : args)System.out.println(arg);}}$ java Argumentos2 alfa bravo charliealfabravocharlie@ramalhoorg 62. Iteração em Java ≥1.5 ano:2004 • Enhanced for (for melhorado)class Argumentos2 {public static void main(String[] args) {for (String arg : args)System.out.println(arg);}}ano:import sys1991for arg in sys.argv:print arg @ramalhoorg 63. Exemplos de iteração• Iteração em Python não se limita a tipos primitivos• Exemplos • string • arquivo • Django QuerySet @ramalhoorg 64. >>> from django.db import connection>>> q = connection.queries>>> q[]>>> from municipios.models import *>>> res = Municipio.objects.all()[:5]>>> q[]>>> for m in res: print m.uf, m.nome...GO Abadia de Goiás demonstração:MG Abadia dos DouradosGO Abadiânia queryset é umMG Abaetéiterável lazyPA Abaetetuba>>> q[{time: 0.000, sql: uSELECT"municipios_municipio"."id", "municipios_municipio"."uf","municipios_municipio"."nome","municipios_municipio"."nome_ascii","municipios_municipio"."meso_regiao_id","municipios_municipio"."capital","municipios_municipio"."latitude","municipios_municipio"."longitude","municipios_municipio"."geohash" FROM "municipios_municipio"ORDER BY "municipios_municipio"."nome_ascii" ASC LIMIT 5}] 65. List comprehensionList comprehensions● Compreensão de lista ou abrangência ● Exemplo: usar todos os elementos:• Expressões que consomem L2 = [n*10 for n in L] – iteráveis eproduzem listas qualquer iterávelresultado: uma lista>>> s = abracadabra>>> l = [ord(c) for c in s]>>> [ord(c) for c in s][97, 98, 114, 97, 99, 97, 100, 97, 98, 114, 97] ≈ notação matemática de conjuntos @ramalhoorg 66. Set & dict comprehensions• Expressões que consomem iteráveis eproduzem sets ou dicts >>> s = abracadabra >>> {c for c in s} set([a, r, b, c, d]) >>> {c:ord(c) for c in s} {a: 97, r: 114, b: 98, c: 99, d: 100} @ramalhoorg 67. Tipos iteráveis embutidos• basestring • frozenset • str • list • unicode • set• dict • tuple• file• xrange @ramalhoorg 68. Funções embutidas queconsomem iteráveis• all • max• any • min• filter • reduce• iter• sorted• len • sum• map • zip@ramalhoorg 69. Iteração em C (exemplo 2) #include int main(int argc, char *argv[]) { int i; for(i = 0; i < argc; i++) printf("%d : %sn", i, argv[i]); return 0; }$ ./args2 alfa bravo charlie0 : ./args21 : alfa2 : bravo3 : charlie@ramalhoorg 70. Iteração em Python (ex. 2) nãoimport sysPythonico!for i in range(len(sys.argv)):print i, :, sys.argv[i] $ python args2.py alfa bravo charlie 0 : args2.py 1 : alfa 2 : bravo 3 : charlie @ramalhoorg 71. Iteração em Python (ex. 2)import sysPythonico!for i, arg in enumerate(sys.argv):print i, :, arg $ python args2.py alfa bravo charlie 0 : args2.py 1 : alfa 2 : bravo 3 : charlie @ramalhoorg 72. Iteração em Python (ex. 2)import sysisso constroi um geradorfor i, arg in enumerate(sys.argv):print i, :, argo gerador produz umao gerador é um iterável preguiçoso!tupla (indice, item) sob demanda $ python args2.py alfa bravo charliea cada iteração 0 : args2.py 1 : alfa 2 : bravo 3 : charlie@ramalhoorg 73. Construtores embutidosque consomem eproduzem iteráveis• dict• reversed• enumerate • set• frozenset • tuple• list @ramalhoorg 74. Módulo itertools• geradores (potencialmente) infinitos • count(), cycle(), repeat()• geradores que combinam vários iteráveis • chain(), tee(), izip(), imap(), product(), compress()...• geradores que selecionam ou agrupam itens: • compress(), dropwhile(), groupby(), ifilter(), islice()...• Iteradores que produzem combinações • product(), permutations(), combinations()...@ramalhoorg 75. Exercício: construir e controlar Tkinter.Labelimport Tkinterrel = Tkinter.Label()rel[text] = 10:42:29rel.grid()rel[font] = Helvetica 120 boldfrom time import strftimerel[text] = strftime(%H:%M:%S)def tic(): rel[text] = strftime(%H:%M:%S) Para instalardef tac(): tic()Tkinter no rel.after(100, tac)Ubuntu Linux:tac() $ sudo apt-get install python-tk@ramalhoorg 76. Relógio com classeimport Tkinterfrom time import strftimeclass Relogio(Tkinter.Label): def __init__(self): Tkinter.Label.__init__(self) self.pack() self[text] = strftime(%H:%M:%S) self[font] = Helvetica 120 bold self.tictac() def tictac(self): agora = strftime(%H:%M:%S) if agora != self[text]: self[text] = agora self.after(100, self.tictac)rel = Relogio()rel.mainloop()oopy/exemplos/relogio_oo.py @ramalhoorg 77. Uma pequenaparte dahierarquia declasses doTkinter herança múltiplamixinheran çamú ltipl a 78. Um pouco mais da hierarquia de classes do Tkinter 79. Hierarquia de classes dos objetos gráficos doTkinter 80. Tudo é um objeto• Não existem “tipos primitivos” como em Java • desde Python 2.2, dezembro de 2001 >>> 5 + 3 8 >>> 5 .__add__(3) 8 >>> type(5) @ramalhoorg 81. Funções são objetos>>> def fatorial(n):... devolve n!... return 1 if n < 2 else n * fatorial(n-1)...>>> fatorial(5)120>>> fat = fatorial>>> fat>>> fat(42)1405006117752879898543142606244511569936384000000000L>>> fatorial.__doc__devolve n!>>> fatorial.__name__fatorial>>> fatorial.__code__>>> fatorial.__code__.co_varnames(n,)@ramalhoorg 82. Funções são objetos>>> fatorial.__code__.co_code|x00x00dx01x00jx00x00ox05x00x01dx02x00Sx01|x00x00tx00x00|x00x00dx02x00x18x83x01x00x14S>>> from dis import dis>>> dis(fatorial.__code__.co_code)0 LOAD_FAST 0 (0)3 LOAD_CONST1 (1)6 COMPARE_OP0 (> 17 POP_TOP 18 LOAD_FAST 0 (0)fatorial 21 LOAD_GLOBAL 0 (0) 24 LOAD_FAST 0 (0) 27 LOAD_CONST2 (2) 30 BINARY_SUBTRACT 31 CALL_FUNCTION 1 34 BINARY_MULTIPLY 35 RETURN_VALUE>>>@ramalhoorg 83. Tipos@ramalhoorg 84. Alguns tipos básicos>>> i = 7Python 2.7>>> i = 7 Python 3.2>>> type(i)>>> type(i) >>> j = 2**100 >>> j = 2**100>>> type(j) int e long>>> type(j)unificados no >>> f = 7. Python 3>>> f = 7.>>> type(f)>>> type(f) >>> s = abc>>> s = abc>>> type(s) str>>> type(s) x SyntaxError>>> u = uabcunicode>>> u = uabcou>>> type(u)x bytes>>> b = bABC >>> b = bABC(Python 3.3)>>> type(b)>>> type(b) >>> b[0] >>> b[0]A65@ramalhoorg 85. Tipos embutidos (built-in)• Implementados em C, por eficiência• Métodos inalteráveis (como “final”, em Java)• Texto: str, unicode (Python 2 e Python 3)• Números: int, long (Python 2), float, complex, bool• Coleções: list, tuple, dict, set, frozenset, bytes(Python 3) @ramalhoorg 86. Tipagem forte• O tipo de um objeto nunca muda, e não existem“tipos variantes”• Raramente Python faz conversão automática>>> a = 10>>> b = 9>>> a + bTraceback (most recentcall last): File "", line 1, in TypeError: unsupportedoperand type(s) for +: int and str>>> a + int(b)19>>> str(a) + b109>>> 77 * NoneTraceback (most recentcall last): File "", line 1, in @ramalhoorgTypeError: unsupportedoperand type(s) for *: int and NoneType 87. Tipagem dinâmica:variáveis não têm tipo>>> def dobro(x):...return x * 2...>>> dobro(7)14>>> dobro(7.1)14.2>>> dobro(bom)bombom>>> dobro([10, 20, 30])[10, 20, 30, 10, 20, 30]>>> dobro(None)Traceback (most recent call last): File "", line 1, in File "", line 2, in dobroTypeError: unsupported operand type(s) for *: NoneType and int @ramalhoorg 88. Duck typing• “Se voa como um pato, nada como um pato egrasna como um pato, é um pato.”• Tipagem dinâmica permite duck typing (tipagempato): estilo de programação que evita verificar ostipos dos objetos, mas apenas seus métodos• No exemplo anterior, a função dobro funcionacom qualquer objeto x que consiga fazer x * 2 • x implementa o método __mult__(n), para ninteiro @ramalhoorg 89. Exemplo: tômbola• Sortear um a umtodos os itens deuma coleção finita,sem repetir• A mesma lógica éusada em sistemaspara gerenciarbanners online @ramalhoorg 90. Interface da tômbola• Carregar itens• Misturar itens• Sortear um item• Indicar se há maisitens @ramalhoorg 91. Projeto da tômbola• UML: diagrama de classe@ramalhoorg 92. TDD: Test Driven Design• Metodologia de desenvolvimento iterativa na qual,para cada funcionalidade nova, um teste é criadoantes do código a ser implementado• Esta inversão ajuda o programador a desenvolvercom disciplina apenas uma funcionalidade de cadavez, mantendo o foco no teste que precisa passar• Cada iteração de teste/implementação deve serpequena e simples: “baby steps” (passinhos debebê) @ramalhoorg 93. Doctests• Um dos módulos para fazer testes automatizadosna biblioteca padrão de Python • o outro módulo é o unittest, da família xUnit• Doctests foram criados para testar exemplosembutidos na documentação• Exemplo de uso:$ python -m doctest cao.rst oopy/exemplos/cao.rst@ramalhoorg 94. Sobrecarga deoperadores @ramalhoorg 95. Sobrecarga de operadores• Python permite que as classes definidas pelousuário (você!) implementem métodos para osoperadores definidos na linguagem• Não é possível redefinir a função dos operadoresnos tipos embutidos • isso evita surpresas desagradáveis• Nem é possível inventar novos operadores • não podemos definir ~, , /| etc. @ramalhoorg 96. Objetos invocáveis• Você pode definir suas próprias funções...• E também novas classes de objetos que secomportam como funções: objetos invocáveis • basta definir um método __call__ parasobrecarregar o operador de invocação: () • o(x)• Exemplo: tômbola invocável@ramalhoorg 97. Tômbola invocável • Já que o principal uso de uma instância de tômbolaé sortear, podemos criar um atalho:em vez de t.sortear() >>> t = TombolaInvocavel()apenas t() >>> t.carregar([1, 2, 3])>>> t()3>>> t()from tombola import Tombola2class TombolaInvocavel(Tombola):Sorteia itens sem repetir; a instância é invocável como uma funçãodef __call__(self):return self.sortear() @ramalhoorg 98. Alguns operadores existentes• Aritméticos: + - * / ** //• Bitwise: & ^ | >• Acesso a atributos: a.b• Invocação: f(x)• Operações em coleções: c[a], len(c), a in c, iter(c)• Lista completa em Python Reference: Data Modelhttp://docs.python.org/reference/datamodel.html@ramalhoorg 99. Exemplo: vetor (2d)y• Campos: x, y• Métodos: • distanciaVetor(4, 5)Vetor(2, 4) • abs (distância até 0,0) • + (__add__)Vetor(2, 1)x• * (__mul__) escalar oopy/exemplos/vetor.py @ramalhoorg 100. Vetorfrom math import sqrtclass Vetor(object):def __init__(self, x=0, y=0):self.x = xself.y = ydef __repr__(self):return Vetor(%s, %s) % (self.x, self.y)def distancia(self, v2):dx = self.x - v2.x>>> from vetor import Vetordy = self.y - v2.y>>> v = Vetor(3, 4)return sqrt(dx*dx + dy*dy)>>> abs(v)5.0def __abs__(self): >>> v1 = Vetor(2, 4)return self.distancia(Vetor(0,0)) >>> v2 = Vetor(2, 1)>>> v1 + v2def __add__(self, v2):dx = self.x + v2.xVetor(4, 5)dy = self.y + v2.y>>> v1 * 3return Vetor(dx, dy) Vetor(6, 12)def __mul__(self, n):return Vetor(self.x*n, self.y*n) @ramalhoorg 101. Baralho polimórfico @ramalhoorg 102. Carta de baralhoclass Carta(object):naipes = paus ouros copas espadas.split()valores = 2 3 4 5 6 7 8 9 10 J Q K A.split()def __init__(self, valor, naipe):self.valor = valorself.naipe = naipedef __repr__(self):return Carta(%r, %r) % (self.valor, self.naipe)def __str__(self):return self.valor +de+ self.naipe@classmethoddef todas(cls):return [cls(v, n) for n in cls.naipesfor v in cls.valores] @ramalhoorg 103. Carta de>>> zape = Carta(4, paus) >>> zape.valor 4 baralho>>> zape Carta(4, paus) >>> monte = Carta.todas() >>> len(monte)class Carta(object): 52>>> monte[0]naipes = paus ouros copas espadas.split() Carta(2, espadas)valores = 2 3 4 5 6 7 8 9 10 J Q K A.split() >>> monte[-3:][Carta(Q, copas),def __init__(self, valor, naipe):Carta(K, copas),self.valor = valor Carta(A, copas)] self.naipe = naipe def __repr__(self): return Carta(%r, %r) % (self.valor, self.naipe) def __str__(self): return self.valor +de+ self.naipe @classmethod def todas(cls): return [cls(v, n) for n in cls.naipes for v in cls.valores] @ramalhoorg 104. Baralhopolimórfico (demo) from carta_ord import Carta class Baralho(object): def __init__(self): self.cartas = Carta.todas() def __len__(self): return len(self.cartas) def __getitem__(self, pos): return self.cartas[pos] def __setitem__(self, pos, valor): self.cartas[pos] = valor@ramalhoorg 105. Baralhopolimórfico (final) from carta_ord import Carta class Baralho(object): def __init__(self): self.cartas = Carta.todas() def __len__(self): return len(self.cartas) def __getitem__(self, pos): return self.cartas[pos] def __setitem__(self, pos, valor): self.cartas[pos] = valor@ramalhoorg 106. http://xkcd.com/353/