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.

Luciano Ramalho

October 27, 2019
Tweet

More Decks by Luciano Ramalho

Other Decks in Programming

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. To Love and create beauty are conditions to happiness. —

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

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

  6. 7

  7. 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; }
  8. 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
  9. 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)
  10. 19

  11. 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]); } }
  12. 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.
  13. 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.
  14. 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.
  15. CLU REFERENCE MANUAL 35 ano: 1975 CLU Reference Manual, p.

    2 B. Liskov et. al. — © 1981 Springer-Verlag
  16. 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
  17. 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
  18. 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 >>>
  19. 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
  20. 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.
  21. 43

  22. 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
  23. 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
  24. 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
  25. 52

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

    regras. Apesar de que a praticidade ganha da pureza.
  27. 55

  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 76

  38. 79

  39. 83

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

    sejam silenciados explicitamente.
  41. COMO OBTER PARTE DE UMA STRING EM ALGUMAS LINGUAGENS 89

    substring slice LeftStr RightStr Left Right copyFrom:To copyFrom: substr
  42. 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
  43. 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.
  44. 94

  45. 96

  46. 97

  47. 98

  48. 99

  49. 100

  50. 101

  51. 102

  52. 103

  53. 105

  54. 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
  55. 107

  56. 116

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

    de casal urgente. GOMES: Claro, o Andrade pode ajudar vocês. FREGUESA: Obrigada.
  58. 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???
  59. 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.
  60. 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)
  61. FREGUESA: E qual é a largura dela? ANDRADE: 15 metros

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

    Gomes, qual é o comprimento da Nested Decorator? GOMES: 70 centímetros
  63. 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.
  64. 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.
  65. 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!
  66. 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) ...
  67. FREGUESA: Hmmm, com licença, você pode nos mostrar as casinhas

    de cachorro? GOMES: Casinhas de cachorro? FREGUESA: Sim, queremos ver casinhas de cachorro.
  68. 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.
  69. 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".
  70. (Gomes coloca uma caixa na cabeça) FREGUESA: Oi? Oi? OI?

    ANDRADE: (chegando perto) Você falou "colchão"? FREGUESA: Sim, mas é que...
  71. 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!
  72. 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
  73. 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
  74. (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)
  75. 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)
  76. 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"?
  77. 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".
  78. (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)
  79. 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
  80. 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
  81. (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.)
  82. FIM