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

Escrevendo Python com Garbo e Elegância.

Escrevendo Python com Garbo e Elegância.

Dicas de como escrever Python elegante, bonito, semântico e limpo, como todo código Python deveria ser.

Andre Machado

November 30, 2019
Tweet

More Decks by Andre Machado

Other Decks in Programming

Transcript

  1. Iterando sobre um intervalo de numeros for number in [0,

    1, 2, 3, 4, 5] print(number**2) for number in range(6): print(number**2)
  2. Iterando sobre um intervalo de numeros for number in [0,

    1, 2, 3, 4, 5] print(number**2) for number in range(6): print(number**2) # Um iterador uma vez consumido, se esgota! for number in iter(range(6)): print(number**2)
  3. Iterando sobre um intervalo de números for number in [0,

    1, 2, 3, 4, 5] print(number**2) for number in range(6): print(number**2) # Um iterador uma vez consumido, se esgota, levantando um `StopIteration`. for number in iter(range(6)): print(number**2) ## Python Legado (2) for number in xrange(6): print(number**2)
  4. Iterando sobre uma coleção cores = [“preto”, “azul”, “amarelo”, “verde”]

    for i in range(len(cores)): print(cores[i]) for cor in cores: print(cor) # Dica para criar uma lista de forma mais fácil cores = “preto, azul, amarelo, verde”.split(‘,’)
  5. Iterando de trás pra frente cores = [“preto”, “azul”, “amarelo”,

    “verde”] for i in range(len(cores)-1, -1, -1): print(colors[i])
  6. Iterando de trás pra frente cores = [“preto”, “azul”, “amarelo”,

    “verde”] for i in range(len(cores)-1, -1, -1): print(colors[i]) for cor in reversed(cores): print(cor)
  7. Iterando de trás pra frente cores = [“preto”, “azul”, “amarelo”,

    “verde”] for i in range(len(cores)-1, -1, -1): print(colors[i]) for cor in reversed(cores): print(cor) for cor in cores[::-1]: print(cor)
  8. Iterando sobre uma coleção e seus índices cores = [“preto”,

    “azul”, “amarelo”, “verde”] for i in range(len(cores)): print(f”{i} --> {cores[i]}”)
  9. Iterando sobre uma coleção e seus índices cores = [“preto”,

    “azul”, “amarelo”, “verde”] for indice in range(len(cores)): print(f”{indice} --> {cores[indice]}”) for indice, cor in enumerate(cores): print(f”{indice} --> {cores[indice]}”)
  10. Iterando sobre uma duas coleções notas = [10, 20, 30]

    alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] n = min(len(names), len(colors)) for i in range(n): print(f”{notas[n]} --> {alunos[n]}”)
  11. Iterando sobre uma duas coleções notas = [10, 20, 30]

    alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] n = min(len(names), len(colors)) for i in range(n): print(f”{notas[n]} --> {alunos[n]}”) for nota, aluno in zip(notas, alunos): print(f”{nota} --> {aluno}”)
  12. Iterando sobre uma coleção ordenada alunos = [“mariatta”, “guido”, “lukasz”,

    “raymond”] for aluno in sorted(alunos): print(aluno) for aluno in sorted(alunos, reverse=True): print(aluno)
  13. Ordem customizada alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] # Python

    2.7 def compara_tamanho(c1, c2): if len(c1) < len(c2): return -1 if len(c1) > len(c2): return 1 return 0 print(sorted(alunos, cmp=compara_tamanho))
  14. Ordem customizada alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] # Python

    2.7 def compara_tamanho(c1, c2): if len(c1) < len(c2): return -1 if len(c1) > len(c2): return 1 return 0 print(sorted(alunos, cmp=compara_tamanho)) print(sorted(alunos, key=len))
  15. Ordenando uma lista de tuplas from operator import itemgetter notas

    = [30, 10, 50, 23] alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] nota_aluno = list(zip(notas, alunos)) print(sorted(nota_aluno, key=itemgetter(0)))
  16. Ordenando uma lista de tuplas (DESC) from operator import itemgetter

    notas = [30, 10, 50, 23] alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] nota_aluno = list(zip(notas, alunos)) print(sorted(nota_aluno, key=itemgetter(0))) print(sorted(nota_aluno, key=itemgetter(0)), reverse=True)
  17. Múltiplos pontos de saída de um loop def find(seq, target):

    found = False for i, value in enumerate(seq): if value == target: found = True break if not found: return -1 return i
  18. Múltiplos pontos de saída de um loop def find(seq, target):

    found = False for i, value in enumerate(seq): if value == target: found = True break if not found: return -1 return i # No Python, o else é um bloco individual acoplável a qualquer body (if, for, while, try...) def find(seq, target): for i, value in enumerate(seq): if value == target: break else: return -1 return i
  19. Iterando sobre as chaves de um dicionário dicionario = dict(guido=’azul’,

    matthew=’verde’, mariatta=’vermelho’) for key in dicionario: print(key)
  20. Iterando sobre as chaves de um dicionário dicionario = dict(guido=’azul’,

    matthew=’verde’, mariatta=’vermelho’) for key in dicionario: print(key) # Python3 não permite que você itere sobre uma instância do dicionário e a modifique, por # isso precisamos usar o método `copy()` for key in dicionario.copy().keys(): if key.startswith(‘m’): del dicionario[key]
  21. Iterando sobre as chaves de um dicionário dicionario = dict(guido=’azul’,

    matthew=’verde’, mariatta=’vermelho’) for key in dicionario: print(key) # Python3 não permite que você itere sobre uma instância do dicionário e a modifique, por # isso precisamos usar o método `copy()` for key in dicionario.copy().keys(): if key.startswith(‘m’): del dicionario[key] new_dict = {k: dicionario[k] for k in dicionario if not k.startswith(‘m’)}
  22. Iterando sobre as chaves e valores dicionario = dict(guido=’azul’, matthew=’verde’,

    mariatta=’vermelho’) for k in d: print(f”{k} --> {d[k]}”
  23. Iterando sobre as chaves e valores dicionario = dict(guido=’azul’, matthew=’verde’,

    mariatta=’vermelho’) for k in dicionario: print(f”{k} --> {d[k]}” for k, v in dicionario.items(): print(f”{k} --> {v}”
  24. Criando um dicionario a partir de duas listas notas =

    [30, 10, 50, 23] alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] print(dict(zip(notas, alunos))
  25. Criando um dicionário a partir de duas listas notas =

    [30, 10, 50, 23] alunos = [“mariatta”, “guido”, “lukasz”, “raymond”] print(dict(zip(notas, alunos)) print(dict(enumerate(alunos)))
  26. Contando com dicionários cores = “verde,azul,verde,amarelo,verde,azul”.split(‘,’) cor_dict = {} for

    cor in cores: if cor not in cor_dict: cor_dict[cor] = 0 cor_dict[cor] += 1 out: {'verde': 3, 'azul': 2, 'amarelo': 1}
  27. Contando com dicionários cores = “verde,azul,verde,amarelo,verde,azul”.split(‘,’) cor_dict = {} for

    cor in cores: if cor not in cor_dict: cor_dict[cor] = 0 cor_dict[cor] += 1 out: {'verde': 3, 'azul': 2, 'amarelo': 1} cor_dict = {} for cor in cores: cor_dict[cor] = cor_dict.get(cor,0) + 1
  28. Contando com dicionários from collections import defaultdict cores = “verde,azul,verde,amarelo,verde,azul”.split(‘,’)

    cor_dict = {} for cor in cores: if cor not in cor_dict: cor_dict[cor] = 0 cor_dict[cor] += 1 out: {'verde': 3, 'azul': 2, 'amarelo': 1} cor_dict = {} for cor in cores: cor_dict[cor] = cor_dict.get(cor,0) + 1 cor_dict = defaultdict(int) for cor in cores: cor_dict[cor] += 1
  29. Agrupando com dicionários nomes = ["andre", "eduardo", "judite", "juan", "ana",

    "lua", "lugao", "paty", "fabio", "ciro"] d = {} for nome in nomes: key = len(nome) if key not in d: d[key] = [] d[key].append(nome) {5: ['andre', 'lugao', 'fabio'], 7: ['eduardo'], 6: ['judite'], 4: ['juan', 'paty', 'ciro'], 3: ['ana', 'lua']}
  30. Agrupando com dicionários nomes = ["andre", "eduardo", "judite", "juan", "ana",

    "lua", "lugao", "paty", "fabio", "ciro"] d = {} for nome in nomes: key = len(nome) d.setdefault(key, []).append(nome)
  31. Agrupando com dicionários nomes = ["andre", "eduardo", "judite", "juan", "ana",

    "lua", "lugao", "paty", "fabio", "ciro"] d = {} for nome in nomes: key = len(nome) d.setdefault(key, []).append(nome) d = defaultdict(list) for nome in nomes: key = len(name) d[key].append(name)
  32. Melhorando a Clareza • Argumentos posicionais e índices são legais

    • Keywords e nomes são melhor • O primeiro é conveniente para o computador • O segundo é mais humano
  33. Melhore a clareza retornando tuplas nomeadas Test.test_result() (0, 4) Test.test_result()

    TestResults(failed=0, passed=4) TestResults = namedtuple(‘TestResults’, [‘failed’, ‘passed’])
  34. Manipulando arquivos f = open(‘data.txt’) try: data = f.read() finally:

    f.close() with open(‘data.txt’) as f: data = f.read()
  35. FIM