Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Beleza de Python

A Beleza de Python

Keynote apresentado na PythonBrasil[15] em Ribeirão Preto, SP, Brasil.

27c093d0834208f4712faaaec38c2c5c?s=128

Luciano Ramalho

October 27, 2019
Tweet

Transcript

  1. A BELEZA DE PYTHON Grandes ideias no projeto da linguagem

    adorada por tantas pessoas, em tantas áreas do conhecimento E l e g â n c i a g e r a s i m p l i c i d a d e
  2. FLUENT PYTHON Publicado em 9 idiomas até 2018: •Chinese (simplified)

    •Chinese (traditional) •English •French •Japanese •Korean •Polish •Portuguese •Russian
 2nd edition: Q4 of 2020 2
  3. INTRODUÇÃO 3

  4. To Love and create beauty are conditions to happiness. —

    Walter Gropius (1883–1969), founder of Bauhaus School
  5. Amar e criar a beleza são condições para felicidade. —

    Walter Gropius (1883–1969), fundador da Escola Bauhaus
  6. 6

  7. 7

  8. 8 Bonito é melhor que feio.

  9. SINTAXE SIMPLES 9

  10. UM PROGRAMA SIMPLES EM C 10 #include <stdio.h> int main(int

    argc, char *argv[]) { for(int i = 0; i < argc; i++) printf("%s\n", argv[i]); return 0; }
  11. UM PROGRAMA SIMPLES EM C 11 #include <stdio.h> int main(int

    argc, char *argv[]) { for(int i = 0; i < argc; i++) printf("%s\n", argv[i]); return 0; } $ ./args alpha bravo charlie ./args alpha bravo charlie
  12. UM TABULEIRO DE XADREZ CONVENCIONAL 12

  13. UM TABULEIRO DE XADREZ DA BAUHAUS, CRIADO POR JOSEF HARTWIG

    13
  14. UM PROGRAMA SIMPLES EM PYTHON 14 import sys for arg

    in sys.argv: print(arg)
  15. PYTHON: UMA LINGUAGEM MODERNISTA 15 #include <stdio.h> int main(int argc,

    char *argv[]) { for(int i = 0; i < argc; i++) printf("%s\n", argv[i]); return 0; } import sys for arg in sys.argv: print(arg)
  16. PYTHON: A MODERNIST LANGUAGE 16

  17. PYTHON: A MODERNIST LANGUAGE 17

  18. PYTHON: UMA LINGUAGEM MODERNISTA 18

  19. 19

  20. 20 Simples é melhor que complexo.

  21. 21 Complexo é melhor que complicado. Simples é melhor que

    complexo.
  22. DESIGN MODERNISTA 22

  23. GO: MAIS COMPLEXO QUE O XADREZ, PORÉM MENOS COMPLICADO 23

  24. GO: CRIADO HÁ MAIS DE 2500 ANOS EM ESTILO MODERNISTA

    24
  25. ENHANCED FOR O for "melhorado" da linguagem Java 25

  26. AQUELE MESMO PROGRAMA SIMPLES EM JAVA < 1.5 26 class

    Arguments { public static void main(String[] args) { for (int i=0; i < args.length; i++) System.out.println(args[i]); } }
  27. Specialists are people who always repeat the same mistakes. 


    — Walter Gropius
  28. Especialistas são pessoas que sempre repetem os mesmos erros. 


    — Walter Gropius
  29. class Arguments2 { public static void main(String[] args) { for

    (String arg : args) System.out.println(arg); } } A PARTIR DO JAVA 1.5 29 O nome oficial de sintaxe for each é enhanced for.
  30. class Arguments2 { public static void main(String[] args) { for

    (String arg : args) System.out.println(arg); } } A PARTIR DO JAVA 1.5 30 import sys for arg in sys.argv: print(arg) O nome oficial de sintaxe for each é enhanced for.
  31. class Arguments2 { public static void main(String[] args) { for

    (String arg : args) System.out.println(arg); } } A PARTIR DO JAVA 1.5 31 ano: 2004 import sys for arg in sys.argv: print(arg) ano: 1991 O nome oficial de sintaxe for each é enhanced for.
  32. FOREACH: IMPLEMENTAÇÃO PIONEIRA DE BARBARA LISKOV 32 Barbara Liskov, Institute

    Professor at MIT
  33. FOREACH: IMPLEMENTAÇÃO PIONEIRA DE BARBARA LISKOV 33 Barbara Liskov, Institute

    Professor at MIT
  34. FOREACH: IMPLEMENTAÇÃO PIONEIRA DE BARBARA LISKOV 34 Barbara Liskov, Institute

    Professor at MIT Profª. Liskov
 e 6 alunos
  35. CLU REFERENCE MANUAL 35 ano: 1975 CLU Reference Manual, p.

    2 B. Liskov et. al. — © 1981 Springer-Verlag
  36. ITERÁVEIS 36

  37. aplicável comparável dobrável evitável iterável jogável lavável navegável usável iterável,

    adj. — Que pode ser iterado.
  38. CLU, Python, Java, etc. permitem que a gente crie objetos

    iteráveis
 
 
 
 OBJETOS ITERÁVEIS E O FOREACH GENÉRICO 38 for item in um_iterável: process(item) um_iterável
  39. CLU, Python, Java, etc. permitem que a gente crie objetos

    iteráveis
 
 
 
 OBJETOS ITERÁVEIS E O FOREACH GENÉRICO 39 for item in um_iterável: process(item) um_iterável Algumas linguagens não oferecem essa possibilidade •C não tem o conceito de iterável •Em Go, somente alguns tipos embutidos funcionam com a sintaxe for … range
  40. UM TREM ITERÁVEL Uma instância de Train pode ser iterada,

    carro por carro. 40 >>> t = Train(3) >>> for car in t: ... print(car) car #1 car #2 car #3 >>>
  41. IMPLEMENTAÇÃO CLÁSSICA COMO NO LIVRO DA GANGUE DOS 4 O

    padrão como descrito em
 Design Patterns
 Gamma, Helm, Johnson & Vlissides 41 class Train: def __init__(self, cars): self.cars = cars def __iter__(self): return TrainIterator(self.cars) class TrainIterator: def __init__(self, cars): self.next = 0 self.last = cars - 1 def __next__(self): if self.next <= self.last: self.next += 1 return 'car #%s' % (self.next) else: raise StopIteration() >>> t = Train(4) >>> for car in t: ... print(car) car #1 car #2 car #3 car #4
  42. ITERATOR CLÁSSICO × MÉTODO GERADOR A receita clássica do padrão

    Iterator é obsoleta desde Python 2.2 (2001) 42 class Train: def __init__(self, cars): self.cars = cars def __iter__(self): for i in range(self.cars): yield 'car #%s' % (i+1) class Train: def __init__(self, cars): self.cars = cars def __iter__(self): return IteratorTrem(self.cars) class TrainIterator: def __init__(self, cars): self.next = 0 self.last = cars - 1 def __next__(self): if self.next <= self.last: self.next += 1 return 'car #%s' % (self.next) else: raise StopIteration() Função geradora simplifica o código manténdo o estado da iteração em seu escopo local.
  43. 43

  44. 44 Simples é melhor que complexo. Complexo é melhor que

    complicado.
  45. MÉTODOS ESPECIAIS 45

  46. MÉTODOS ESPECIAIS 46

  47. O ZEN DO LEN 47

  48. A FUNÇÃO LEN E O MÉTODO __LEN__ 
 Porque escrevemos

    len(s) e não s.len()? 48
  49. A FUNÇÃO LEN E O MÉTODO __LEN__ 
 Porque escrevemos

    len(s) e não s.len()? Obter o tamanho de uma coleção precisa ser uma operação otimizada. 49
  50. A FUNÇÃO LEN E O MÉTODO __LEN__ 
 Porque escrevemos

    len(s) e não s.len()? Obter o tamanho de uma coleção precisa ser uma operação otimizada. No caso das coleções embutidas (str, list, tuple, dict, array, set, etc.) ou extensões (arrays de Numpy), o interpretador usa a C-API para obter o tamanho da estrutura lendo o campo ob_size da struct PyVarObject que representa a coleção na memória. 50
  51. A FUNÇÃO LEN E O MÉTODO __LEN__ 
 Porque escrevemos

    len(s) e não s.len()? Obter o tamanho de uma coleção precisa ser uma operação otimizada. No caso das coleções embutidas (str, list, tuple, dict, array, set, etc.) ou extensões (arrays de Numpy), o interpretador usa a C-API para obter o tamanho da estrutura lendo o campo ob_size da struct PyVarObject que representa a coleção na memória. Para manter a consistência, len(s) também funciona em coleções definidas pela usuária. Neste caso, o interpretador invoca s.__len__() 51
  52. 52

  53. 53 Casos especiais não são tão especiais que quebrem as

    regras. Apesar de que a praticidade ganha da pureza.
  54. SOBRECARGA
 DE OPERADORES 54

  55. 55

  56. EXEMPLO: CONJUNTOS 56

  57. Algumas linguagens e plataformas que implementam conjuntos em suas bibliotecas

    padrão. SETS EM ALGUMAS LINGUAGENS/PLATAFORMAS 57 Python set, frozenset: > 10 métodos e operadores Ruby Set: > 10 métodos e operadores Elixir MapSet: > 10 funções .Net (C# etc.) ISet interface: > 10 métodos; 2 implementações JavaScript (ES6) Set: < 10 métodos Java Set interface: < 10 métodos; 8 implementações Go Faça você mesma, ou escolha um pacote externo
  58. Algumas linguagens e plataformas que implementam conjuntos em suas bibliotecas

    padrão. SETS EM ALGUMAS LINGUAGENS/PLATAFORMAS 58 Python set, frozenset: > 10 métodos e operadores Ruby Set: > 10 métodos e operadores Elixir MapSet: > 10 funções .Net (C# etc.) ISet interface: > 10 métodos; 2 implementações JavaScript (ES6) Set: < 10 métodos Java Set interface: < 10 métodos; 8 implementações Go Faça você mesma, ou escolha um pacote externo
  59. Algumas linguagens e plataformas que implementam conjuntos em suas bibliotecas

    padrão. SETS EM ALGUMAS LINGUAGENS/PLATAFORMAS 59 Python set, frozenset: > 10 métodos e operadores Ruby Set: > 10 métodos e operadores Elixir MapSet: > 10 funções .Net (C# etc.) ISet interface: > 10 métodos; 2 implementações JavaScript (ES6) Set: < 10 métodos Java Set interface: < 10 métodos; 8 implementações Go Faça você mesma, ou escolha um pacote externo
  60. OPERAÇÕES ENTRE CONJUNTOS 60 Intersecção União Diferença simétrica (a.k.a. XOR)

    Diferença
  61. LEI DE DE_MORGAN COM OPERADORES INFIXOS 61

  62. OPERADORES E MÉTODOS DE CONJUNTOS 62

  63. OPERADORES E MÉTODOS DE CONJUNTOS (2) Diferenças: 63

  64. TESTES DE CONJUNTOS Estes devolvem um bool: 64

  65. CÓDIGO: UINTSET CLASS 65

  66. UINTSET: UMA CLASSE PARA CONJUNTOS DE INTEIROS NÃO-NEGATIVOS Inspirada pelo

    exemplo intset do capítulo 6 de The Go Programming Language de A. Donovan and B. Kernighan Um conjunto vazio é representado por um zero.
 O conjunto de inteiros {a, b, c} é representados por bits de valor 1 nas posicões a, b, e c. Código fonte: 66 https://github.com/standupdev/uintset
  67. REPRESENTANDO CONJUNTOS DE INTEIROS COMO PADRÕES DE BITS Este conjunto:

    UintSet({13, 14, 22, 28, 38, 53, 64, 76, 94, 102, 107, 121, 136, 143, 150, 157, 169, 173, 187, 201, 213, 216, 234, 247, 257, 268, 283, 288, 290}) 67
  68. REPRESENTANDO CONJUNTOS DE INTEIROS COMO PADRÕES DE BITS Este conjunto:

    UintSet({13, 14, 22, 28, 38, 53, 64, 76, 94, 102, 107, 121, 136, 143, 150, 157, 169, 173, 187, 201, 213, 216, 234, 247, 257, 268, 283, 288, 290}) É representado por este int: 2502158007702946921897431281681230116680925854234644385938703363396454971897652 283727872 68
  69. REPRESENTANDO CONJUNTOS DE INTEIROS COMO PADRÕES DE BITS Este conjunto:

    UintSet({13, 14, 22, 28, 38, 53, 64, 76, 94, 102, 107, 121, 136, 143, 150, 157, 169, 173, 187, 201, 213, 216, 234, 247, 257, 268, 283, 288, 290}) É representado por este int: 2502158007702946921897431281681230116680925854234644385938703363396454971897652 283727872
 Que tem este padrão de bits: 1010000100000000000000100000000001000000000100000000000010000000000000000010010 0000000000100000000000001000000000000010001000000000001000000100000010000001000 0000000000010000000000000100001000000010000000000000000010000000000010000000000 100000000000000100000000010000010000000110000000000000 69
  70. REPRESENTANDO CONJUNTOS DE INTEIROS COMO PADRÕES DE BITS Este conjunto:

    UintSet({290}) 70 É representado por este int: 1989292945639146568621528992587283360401824603189390869761855907572637988050133 502132224
 Que tem este padrão de bits: 1000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000
  71. REPRESENTANDO CONJUNTOS DE INTEIROS COMO PADRÕES DE BITS (2) UintSet()

    → 0 │0│ └─┘ UintSet({0}) → 1 │1│ └─┘ UintSet({1}) → 2 │1│0│ └─┴─┘ UintSet({0, 1, 2, 4, 8}) → 279 │1│0│0│0│1│0│1│1│1│ └─┴─┴─┴─┴─┴─┴─┴─┴─┘ UintSet({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) → 1023 │1│1│1│1│1│1│1│1│1│1│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ UintSet({10}) → 1024 │1│0│0│0│0│0│0│0│0│0│0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ UintSet({0, 2, 4, 6, 8, 10, 12, 14, 16, 18}) → 349525
 │1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ UintSet({1, 3, 5, 7, 9, 11, 13, 15, 17, 19}) → 699050
 
 │1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│0│1│0│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 71
  72. EXEMPLO DE MÉTODO: OPERADOR & (INTERSECÇÃO) 72 https://github.com/standupdev/uintset

  73. 73 https://github.com/standupdev/uintset

  74. A BELEZA DO DOUBLE-DISPATCH 74

  75. FAIL FAST 75

  76. 76

  77. 77 Diante da ambiguidade, recuse a tentação de adivinhar.

  78. NÃO OBTEMOS RESULTADOS SURPREENDENTES PARA "2" + 8 78

  79. 79

  80. 80 Erros não devem passar em silêncio.

  81. NÃO TEMOS "UNDEFINED" COMO UM VALOR! 81

  82. NÃO OBTEMOS VALORES NULOS INESPERADOS EM DICIONÁRIOS 82

  83. 83

  84. 84 Erros não devem passar em silêncio. A menos que

    sejam silenciados explicitamente.
  85. MAS PODEMOS ACESSAR DICIONÁRIOS SEM PROVOCAR EXCEÇÕES 85

  86. NÃO OBTEMOS VALORES NULOS INESPERADOS AO DESEMPACOTAR 86

  87. MAS PODEMOS DESEMPACOTAR SEM PROVOCAR EXCEÇÕES 87

  88. SLICES 88

  89. COMO OBTER PARTE DE UMA STRING EM ALGUMAS LINGUAGENS 89

    substring slice LeftStr RightStr Left Right copyFrom:To copyFrom: substr
  90. AS MESMAS OPERAÇÕES EM PYTHON: "NOTAÇÃO MARAVILHOSA" 90 s[a:b] s[a:]

    s[:b] s[-a:] ...
  91. E A MARAVILHOSA NOTAÇÃO DE FATIAMENTO... Aplica-se a sequências em

    geral, não apenas strings! • listas • tuplas • arrays • NumPy arrays • Django QuerySets • Qualquer estrutura onde você implementar __getitem__ corretamente! 91
  92. O ÚLTIMO PARÁGRAFO DE PYTHON FLUENTE 92 Ainda não encontrei

    outra linguagem além de Python que consiga ser tão fácil para iniciantes, tão conveniente para profissionais e tão empolgante para hackers. Muito grato Guido van Rossum e todo mundo que a fez assim.
  93. COMUNIDADE 93

  94. 94

  95. PYTHON BRASIL 2018 BY JULIO MELANDA (INSTAGRAM @JULIOMELANDA) 95

  96. 96

  97. 97

  98. 98

  99. 99

  100. 100

  101. 101

  102. 102

  103. 103

  104. ELEGÂNCIA 104

  105. 105

  106. BRUCE ECKEL Autor de vários livros, entre eles: • On

    Java 8 • Thinking in Java • Atomic Scala • Atomic Kotlin
 Adora Python . Keynote na Python Brasil 2008 (Rio) Desenhou camiseta da PyCon US 2009. 106
  107. 107

  108. None
  109. 109 易易經 I Ching

  110. None
  111. None
  112. None
  113. Elegance Begets Simplicity

  114. None
  115. import sys for arg in sys.argv: print(arg)

  116. 116

  117. 117 E agora, algo completamente diferente

  118. 118 Em uma loja de departamentos...

  119. FREGUESA: Boa tarde, somos recém casados. Precisamos comprar uma cama

    de casal urgente. GOMES: Claro, o Andrade pode ajudar vocês. FREGUESA: Obrigada.
  120. GOMES: Andrade! ANDRADE: Como posso ajudar? FREGUESA: Vocês tem alguma

    cama de casal na faixa de R$ 300?
  121. ANDRADE: Ah, infelizmente não. Nossa cama mais barata custa R$

    5.000 (aponta para uma cama) (Freguesa e freguês reagem com espanto) FREGUESA: Cinco mil reais???
  122. GOMES: Perdão, eu devia ter avisado que o Andrade é

    um pouco exagerado. Qualquer número que ele falar, dividam por dez. FREGUESA: OK... GOMES: Fora isso, ele é perfeitamente normal.
  123. FREGUESA: Certo... (virando para o Andrade) então a cama de

    casal mais barata é R$ 500? ANDRADE: Exatamente: cinco mil reais (apontando para a cama)
  124. FREGUESA: E qual é a largura dela? ANDRADE: 15 metros

    (Freguês faz cara de espanto) FREGUESA: (explicando pro marido)
 Um metro e meio.
  125. FREGUESA: E o comprimento? ANDRADE: O comprimento é... um momento.

    Gomes, qual é o comprimento da Nested Decorator? GOMES: 70 centímetros
  126. FREGUESA: 70 centímetros??? ANDRADE: Ah, sim. Tudo que a Gomes

    fala a gente precisa multiplicar por três. Ela tem esse pequeno problema. FREGUESA: Certo. Desculpe.
  127. ANDRADE: Isso significa que quando ela diz "70 centímetros", na

    verdade é 21 metros. FREGUESA: Ok, entendido. ANDRADE: O preço não inclui o colchão.
  128. FREGUESA: E quanto custa o colchão? ANDRADE: A Gomes pode

    te ajudar com isso. Gomes, você pode ajudar essas 20 pessoas a escolher uma casinha de cachorro? FREGUESA: Não, não queremos uma casinha de cachorro!
  129. ANDRADE: Perdão. Você precisa dizer "casinha de cachorro" para a

    Gomes, porque se você falar (cochichando) "colchão" ela coloca uma caixa na cabeça. Eu devia ter explicado. Fora isso, ela está OK. FREGUESA: Ah, OK. (então, virando para a Gomes) ...
  130. FREGUESA: Hmmm, com licença, você pode nos mostrar as casinhas

    de cachorro? GOMES: Casinhas de cachorro? FREGUESA: Sim, queremos ver casinhas de cachorro.
  131. GOMES: Certo. Elas ficam na seção de pets, no segundo

    andar. FREGUESA: Não, não. A gente quer ver as CASINHAS DE CACHORRO. GOMES: (irritada) Já entendi. Segundo andar.
  132. FREGUESA: Não, a gente não quer ver casinhas de cachorro,

    é que o Andrade falou que... GOMES: Ah, perdão. O que o Andrade falou dessa vez? FREGUESA: Ele disse que a gente devia falar "casinha de cachorro" em vez de "colchão".
  133. (Gomes coloca uma caixa na cabeça) FREGUESA: Oi? Oi? OI?

    ANDRADE: (chegando perto) Você falou "colchão"? FREGUESA: Sim, mas é que...
  134. GOMES: (abafado) Não vou sair! ANDRADE: Eu PEDI para não

    falarem "colchão", não? FREGUESA: Sim, mas acontece que... GOMES: (abafado) Vou ficando!
  135. FREGUESA: Nossa. ANDRADE: Agora tenho que entrar na caixa e

    cantar. (começa o hino) Salve o Corinthians O campeão dos campeões Eternamente Dentro dos nossos corações Salve o Corinthians De tradições e glórias mil Tu és orgulho, dos desportistas do Brasil
  136. VENDEDORA 3: (chegando, ao ouvir o hino) Ah, não. Alguém

    falou "colchão" pra Gomes? FREGUESA: Eu... (Vendedores cantam até Gomes tirar a caixa da cabeça) Salve o Corinthians O campeão dos campeões Eternamente Dentro dos nossos corações Salve o Corinthians De tradições e glórias mil Tu és orgulho, dos desportistas do Brasil
  137. (Andrade e Vendedora 3 param de cantar imediatamente. Vendedora 3

    sai de cena.) ANDRADE: Ela vai ficar bem agora. Mas NÃO falem aquela palavra! FREGUESA: Não, não, pode deixar. (Virando para a Gomes)
  138. FREGUESA:
 Com licença, podemos ver as casinhas de cachorro? GOMES:

    (irritada) Pois não. Seção de pets, segundo andar. FREGUESA: (desesperada) Não, não, não. Essas casinhas de cachorro, entende? (tocando o colchão na cama imaginária)
  139. GOMES: Um colchão? (Freguesa e freguês reagem espantados) FREGUESA: (aliviada)

    Siiiim! GOMES: Mas se vocês querem um colchão, porque não falar "colchão"?
  140. FREGUESA: (nervosa) Ha ha, é que... GOMES: Você me confunde

    falando "casinhas de cachorro" quando quer "colchões". Porque não dizer "colchões"? FREGUESA: É que você colocou uma caixa na cabeça da outra vez que falamos "colchão".
  141. (Gomes coloca uma caixa na cabeça) ANDRADE: (correndo para a

    cena) Ah não!!! (cantando) Salve o Corinthians... VENDEDORA 3: (para Freguesa) Mas a gente pediu!!! (Começa a cantar junto com Andrade)
  142. VENDEDORA 4: (entra correndo) Alguém falou colchão para a Gomes?

    (Vendedora 3 aponta com raiva para Freguesa) ANDRADE: DUAS VEZES!!! Salve o Corinthians O campeão dos campeões Eternamente Dentro dos nossos corações Salve o Corinthians De tradições e glórias mil Tu és orgulho, dos desportistas do Brasil
  143. VENDEDORA 4: (gritando para o resto da loja) Pessoal! Falaram

    "colchão" para a Gomes. Duas vezes! (junta-se ao coro) ANDRADE: Não tá funcionando, precisamos de mais gente! (Gomes tira a caixa da cabeça.) Salve o Corinthians O campeão dos campeões Eternamente Dentro dos nossos corações Salve o Corinthians De tradições e glórias mil Tu és orgulho, dos desportistas do Brasil
  144. (Todos param de cantar imediatamente. Coro e Vendedora 4 vão

    embora) GOMES: (se ajeitando) Perdão. Como posso ajudar vocês? FREGUÊS: Queremos um colchão! (Gomes coloca a caixa na cabeça.)
  145. (Andrade e freguesa olham feio pro freguês) FREGUÊS: Mas é

    a minha única fala!
  146. FIM