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

Python Idiomático

Python Idiomático

Alejandro Gómez

October 20, 2013
Tweet

Other Decks in Programming

Transcript

  1. ☹ favorite_color = [0xBA, 0xDA, 0x55] red = favorite_color[0] green

    = favorite_color[1] blue = favorite_color[2]
  2. 3 head, *body, tail = range(5) # head == 0

    # body == [1, 2, 3] # tail == 4
  3. ☹ person_info = ('Alejandro', 19, 12, 1988, '#BADA55') person =

    Person(person_info[0], person_info[1:4], person_info[4])
  4. ☺ person_info = ('Alejandro', 19, 12, 1988, '#BADA55') NAME =

    slice(0, 1) BIRTH_DATE = slice(1, 4) FAVORITE_COLOR = slice(4, 5) person = Person(person_info[NAME], person_info[BIRTH_DATE], person_info[FAVORITE_COLOR])
  5. • ¿Necesitas definir el orden? – Prefiere key a cmp

    – key sólo se llama una vez por elemento – cmp compara pares de elementos, no está en Python 3
  6. d = { 'red': 0xBA, 'green': 0xDA, 'blue': 0x55 }

    # `for` itera sobre las claves for k in d: print(k)
  7. ☺ from itertools import izip d = {c: v for

    (c, v) in izip(colors, values)}
  8. one = { 'foo': 42 } another = { 'bar':

    None, 'baz': 8 } yet_another = { 'foo': 1, 'baz': 0 }
  9. Django from django.utils.datastructures import MergeDict # funciona al revés que

    `collections.ChainMap` ☹ d = MergeDict(yet_another, another, one)
  10. ☺ from itertools import izip d = {c: v for

    (c, v) in izip(colors, values)}
  11. results = search('#codemotion', 10) # ¿qué es 10? results =

    search('#codemotion', min_retweets=10) results = search('#codemotion', limit=10)
  12. • Argumentos con nombre – ☺ Código más legible –

    ☺ Parámetros documentados – ☹ Coste en rendimiento
  13. from collections import namedtuple TestResults = namedtuple('TestResults', [ 'passed', 'failed',

    'skipped']) def run_tests(): # … return TestResults(passed, failed, skipped)
  14. • Equivalentes a las comprensiones de listas pero perezosas –

    Manipulación de secuencias en múltiples pasos – Secuencias como resultados intermedios
  15. ☹ uppercase_lines = [l.upper() for l in open('readme.md')] filtered_lines =

    [l for l in uppercase_lines if l.startswith('#')] # ¿qué pasa si readme.md es un fichero ENORME? for l in filtered_lines: print(l)
  16. ☺ uppercase_lines = (l.upper() for l in open('readme.md')) filtered_lines =

    (l for l in uppercase_lines if l.startswith('#')) # la iteración dirige la evaluación de las genexpressions for l in filtered_lines: print(l)