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

Falando Pythonês: o poder das List Comprehensio...

Falando Pythonês: o poder das List Comprehensions e Lambda Functions

Palestra apresentada por Felipe Carvalho na 48º Python Floripa on-line

Python Floripa

June 27, 2020
Tweet

More Decks by Python Floripa

Other Decks in Technology

Transcript

  1. Quem sou eu • Pai de 3 meninas, esposo e

    irmão mais velho • Manauara morando em São Paulo desde março 2020 • Formado em Jornalismo, comecei a programar aos 26 anos na faculdade de Engenharia de Computação • Trabalho como desenvolvedor desde 2013 • Membro do PyNorte, fiz parte da comissão de candidatura de Manaus para sediar a Python Brasil 2021 2022 - será a primeira edição na Região Norte! • Estudo Python, GoLang, Microsserviços e Scrum Felipe Carvalho, 33 anos Desenvolvedor back-end
  2. List Comprehensions • Lista é uma estrutura de dados provida

    pela própria linguagem Python. • Flexível, pode combinar objetos de vários tipos. misc_list = [1, True, 3.45, 'Hello', {'message': 'success'}, int, foo] tuple_list = [(1, 2), (1, 4), (1, 7), (3, 5), (6, 7)] dict_list = [{'id': '4'}, {'id': '6'}, {'id': '19'}] list_in_list = [[1, 2, 3], [4, 5, 6]]
  3. List Comprehensions • Foi concebida na PEP 202 • É

    uma forma concisa de criar uma lista a partir de outra existente, usando as cláusulas for e if. • Geralmente são mais compactas e mais rápidas. É considerada a forma pythônica de gerar listas: O que é PEP? Python Enhancement Proposal são documentos que geralmente abordam novas funcionalidades da linguagem, propósitos, procedimentos ou ambiente. python.org/dev/peps/ new_list = [expression for item in lista]
  4. List Comprehensions Comparando for loops com list comprehensions Podemos reescrever

    esse trecho com list comprehensions da seguinte forma: lista = [] for item in range(10): lista.append(item**2) lista = [item**2 for item in range(10)]
  5. List Comprehensions Reforçando o refactor com for Reescrevemos esse trecho

    com list comprehensions assim: lista = [item.upper() for item in strings_list] results = [] for item in strings_list: results.append(item.upper())
  6. List Comprehensions Filtrando a lista com if Reescrevendo, fica assim:

    even_list = [] for item in range(20): if item % 2 == 0: even_list.append(item) even_list = [item for item in range(20) if item % 2 == 0]
  7. List Comprehensions Filtrando a lista com múltiplos ifs Depois do

    refactor: num_list = [] for item in range(100): if item % 2 == 0: if item % 5 == 0: num_list.append(item) num_list = [item for item in range(100) if item % 2 == 0 if item % 5 == 0]
  8. List Comprehensions Filtrando a lista com if e else Refatorando

    com o if else dentro da expressão: lista = [] for i in range(10): if i % 2 == 0: lista.append("Even") else: lista.append("Odd") lista = ["Even" if i % 2 == 0 else "Odd" for i in range(10)]
  9. List Comprehensions Trabalhando com listas e for loops aninhados Refatorando:

    flattened = [] for row in matrix: for n in row: flattened.append(n) flattened = [n for row in matrix for n in row]
  10. List Comprehensions Trabalhando com listas e for loops aninhados Refatorando:

    transposed = [] matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] for i in range(4): transposed_row = [] for row in matrix: transposed_row.append(row[i]) transposed.append(transposed_row) transposed = [[row[i] for row in matrix] for i in range(4)]
  11. List Comprehensions Misturando tudo Em list comprehension fica: combs =

    [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] combs = [] for x in [1,2,3]: for y in [3,1,4]: if x != y: combs.append((x, y))
  12. List Comprehensions Ok, mas e quando falamos em performance? Há

    vários comparativos que mostram que List Comprehensions são mais rápidas que usar for com append(), pois além de lidar melhor com a memória, não ‘gastam’ tempo chamando o método append(). Este é um exemplo de benchmark: https://gist.github.com/StrikingLoo/202f7c6ffb88113e9fe8774c75d98a3d#file-performance_benchmarks-py
  13. Lambda Functions • São funções de primeira classe - podem

    ser atribuídas em variáveis ou armazenadas estruturas de dados e podem ser passadas como parâmetro para outras funções. • Também são definidas como funções anônimas. • É uma característica forte do paradigma funcional, presente também em outras linguagens. A sintaxe conta com a palavra reservada lambda, variável vinculada (bound variable) e um corpo (body): lambda x: x*2
  14. Lambda Functions Aceitam todos os tipos de passar parâmetros aceitos

    em funções declaradas com def lambda x, y, z: x + y + z # (1, 2, 3) lambda x, y, z=3: x + y + z # (1, 2) lambda x, y, z=3: x + y + z # (1, y=2) lambda *args: sum(args) # (1,2,3) lambda **kwargs: sum(kwargs.values()) # (one=1, two=2, three=3) lambda x, *, y=0, z=0: x + y + z # (1, y=2, z=3)
  15. Lambda Functions Lambda functions podem ser usadas em combinação com

    outros métodos map(lambda x: x.upper(), ['cat', 'dog', 'cow']) filter(lambda x: 'o' in x, ['cat', 'dog', 'cow']) reduce(sorted(ids, key=lambda x: int(x[2:])))
  16. Lambda Functions Quais as vantagens das lambda functions sobre funções

    nomeadas? • Código mais conciso - usa apenas uma linha de código. • Dispensa a necessidade de incluir uma nova variável ao código. • Podem ser chamadas de forma imediata. • Retorna um valor automaticamente.
  17. Lambda Functions Quais as desvantagens das lambda functions? • Sintaxe

    ainda é desconhecida para muitos desenvolvedores de python. • Sem um nome ou documentação, a única forma de saber o que elas fazem é analisando o código. • Aceitam apenas um estado, então não podemos realizar operações mais complexas. • A documentação oficial do Python incentiva a usar sempre funções nomeadas.
  18. Lambda Functions O PEP8 e o FAQ reservam um espaço

    para tratar de lambda functions:
  19. Ao desenvolver, lembre nas palavras do Guido “When asked, I

    would give people my opinion that maintainable code is more important than clever code,” he said. “If I encountered clever code that was particularly cryptic, and I had to do some maintenance on it, I would probably rewrite it. So I led by example, and also by talking to other people.” Guido van Rossum em entrevista ao Blog do Dropbox, em 2019 https://blog.dropbox.com/topics/company/thank-you--guido
  20. Vamos nos conectar Me add no LinkedIn e no Twitter

    https://www.linkedin.com/in/felipecarvalho07/ https://twitter.com/__felipeca