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

    View Slide

  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

    View Slide

  3. INTRODUÇÃO
    3

    View Slide

  4. To Love and create beauty are conditions to happiness.
    — Walter Gropius (1883–1969), founder of Bauhaus School

    View Slide

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

    View Slide

  6. 6

    View Slide

  7. 7

    View Slide

  8. 8
    Bonito é melhor que feio.

    View Slide

  9. SINTAXE SIMPLES
    9

    View Slide

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

    View Slide

  11. UM PROGRAMA SIMPLES EM C
    11
    #include
    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

    View Slide

  12. UM TABULEIRO DE XADREZ CONVENCIONAL
    12

    View Slide

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

    View Slide

  14. UM PROGRAMA SIMPLES EM PYTHON
    14
    import sys
    for arg in sys.argv:
    print(arg)

    View Slide

  15. PYTHON: UMA LINGUAGEM MODERNISTA
    15
    #include
    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)

    View Slide

  16. PYTHON: A MODERNIST LANGUAGE
    16

    View Slide

  17. PYTHON: A MODERNIST LANGUAGE
    17

    View Slide

  18. PYTHON: UMA LINGUAGEM MODERNISTA
    18

    View Slide

  19. 19

    View Slide

  20. 20
    Simples é melhor que complexo.

    View Slide

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

    View Slide

  22. DESIGN MODERNISTA
    22

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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]);
    }
    }

    View Slide

  27. Specialists are people who always repeat the same mistakes.

    — Walter Gropius

    View Slide

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

    — Walter Gropius

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

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

    View Slide

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

    View Slide

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

    e 6 alunos

    View Slide

  35. CLU REFERENCE MANUAL
    35
    ano:
    1975
    CLU Reference Manual, p. 2
    B. Liskov et. al. — © 1981
    Springer-Verlag

    View Slide

  36. ITERÁVEIS
    36

    View Slide

  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.

    View Slide

  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

    View Slide

  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

    View Slide

  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
    >>>

    View Slide

  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

    View Slide

  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.

    View Slide

  43. 43

    View Slide

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

    View Slide

  45. MÉTODOS ESPECIAIS
    45

    View Slide

  46. MÉTODOS ESPECIAIS
    46

    View Slide

  47. O ZEN DO LEN
    47

    View Slide

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

    Porque escrevemos len(s) e não s.len()?
    48

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  52. 52

    View Slide

  53. 53
    Casos especiais não são tão especiais que quebrem as regras.
    Apesar de que a praticidade ganha da pureza.

    View Slide

  54. SOBRECARGA

    DE OPERADORES
    54

    View Slide

  55. 55

    View Slide

  56. EXEMPLO: CONJUNTOS
    56

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  60. OPERAÇÕES ENTRE CONJUNTOS
    60
    Intersecção
    União
    Diferença simétrica (a.k.a. XOR)
    Diferença

    View Slide

  61. LEI DE DE_MORGAN COM OPERADORES INFIXOS
    61

    View Slide

  62. OPERADORES E MÉTODOS DE CONJUNTOS
    62

    View Slide

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

    View Slide

  64. TESTES DE CONJUNTOS
    Estes devolvem um bool:
    64

    View Slide

  65. CÓDIGO: UINTSET CLASS
    65

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  72. EXEMPLO DE MÉTODO: OPERADOR & (INTERSECÇÃO)
    72
    https://github.com/standupdev/uintset

    View Slide

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

    View Slide

  74. A BELEZA DO DOUBLE-DISPATCH
    74

    View Slide

  75. FAIL FAST
    75

    View Slide

  76. 76

    View Slide

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

    View Slide

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

    View Slide

  79. 79

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  83. 83

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  88. SLICES
    88

    View Slide

  89. COMO OBTER PARTE DE UMA STRING EM ALGUMAS LINGUAGENS
    89
    substring
    slice
    LeftStr
    RightStr
    Left
    Right
    copyFrom:To
    copyFrom:
    substr

    View Slide

  90. AS MESMAS OPERAÇÕES EM PYTHON: "NOTAÇÃO MARAVILHOSA"
    90
    s[a:b]
    s[a:]
    s[:b]
    s[-a:]
    ...

    View Slide

  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

    View Slide

  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.

    View Slide

  93. COMUNIDADE
    93

    View Slide

  94. 94

    View Slide

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

    View Slide

  96. 96

    View Slide

  97. 97

    View Slide

  98. 98

    View Slide

  99. 99

    View Slide

  100. 100

    View Slide

  101. 101

    View Slide

  102. 102

    View Slide

  103. 103

    View Slide

  104. ELEGÂNCIA
    104

    View Slide

  105. 105

    View Slide

  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

    View Slide

  107. 107

    View Slide

  108. View Slide

  109. 109
    易易經
    I Ching

    View Slide

  110. View Slide

  111. View Slide

  112. View Slide

  113. Elegance Begets Simplicity

    View Slide

  114. View Slide

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

    View Slide

  116. 116

    View Slide

  117. 117
    E agora, algo
    completamente
    diferente

    View Slide

  118. 118
    Em uma loja de
    departamentos...

    View Slide

  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.

    View Slide

  120. GOMES:
    Andrade!
    ANDRADE:
    Como posso ajudar?
    FREGUESA:
    Vocês tem alguma cama de casal na
    faixa de R$ 300?

    View Slide

  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???

    View Slide

  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.

    View Slide

  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)

    View Slide

  124. FREGUESA:
    E qual é a largura dela?
    ANDRADE:
    15 metros
    (Freguês faz cara de espanto)
    FREGUESA: (explicando pro marido)

    Um metro e meio.

    View Slide

  125. FREGUESA:
    E o comprimento?
    ANDRADE:
    O comprimento é... um momento.
    Gomes, qual é o comprimento da
    Nested Decorator?
    GOMES:
    70 centímetros

    View Slide

  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.

    View Slide

  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.

    View Slide

  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!

    View Slide

  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)
    ...

    View Slide

  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.

    View Slide

  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.

    View Slide

  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".

    View Slide

  133. (Gomes coloca uma caixa na cabeça)
    FREGUESA:
    Oi? Oi? OI?
    ANDRADE: (chegando perto)
    Você falou "colchão"?
    FREGUESA:
    Sim, mas é que...

    View Slide

  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!

    View Slide

  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

    View Slide

  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

    View Slide

  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)

    View Slide

  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)

    View Slide

  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"?

    View Slide

  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".

    View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

  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.)

    View Slide

  145. (Andrade e freguesa olham feio pro
    freguês)
    FREGUÊS:
    Mas é a minha única fala!

    View Slide

  146. FIM

    View Slide