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

Rendez votre code Python plus beau !

Rendez votre code Python plus beau !

Présentation à PyCon FR à Strasbourg.

Ronan Amicel

October 26, 2013
Tweet

More Decks by Ronan Amicel

Other Decks in Technology

Transcript

  1. Rendez votre code Python plus beau ! Ronan Amicel @amicel

    PyCon FR – 25 octobre 2013 – Strasbourg
  2. Du code plus beau ? • plus simple • plus

    concis • plus clair • plus idiomatique (== plus « pythonique »)
  3. Du code plus beau ? • plus simple • plus

    concis • plus clair • plus idiomatique (== plus « pythonique ») • plus performant
  4. Itérer sur
 un intervalle d’entiers for i in range(6):! print

    i**2 for i in [0, 1, 2, 3, 4, 5]:! print i**2
  5. Itérer sur
 un intervalle d’entiers for i in range(6):! print

    i**2 for i in [0, 1, 2, 3, 4, 5]:! print i**2 for i in xrange(6):! print i**2
  6. Itérer sur
 une collection d'objets plats = ['choucroute', 'munster', 'kouglof']

    for i in range(len(plats)):! print plats[i] for plat in plats:! print plat
  7. Itérer en partant de la fin plats = ['choucroute', 'munster',

    'kouglof'] for i in range(len(plats)-1, -1, -1):! print plats[i]
  8. Itérer en partant de la fin plats = ['choucroute', 'munster',

    'kouglof'] for i in range(len(plats)-1, -1, -1):! print plats[i] for plat in reversed(plats):! print plat
  9. Itérer en maintenant un indice plats = ['choucroute', 'munster', 'kouglof']

    for i in range(len(plats)):! print i, '-->', plats[i]
  10. Itérer en maintenant un indice plats = ['choucroute', 'munster', 'kouglof']

    for i in range(len(plats)):! print i, '-->', plats[i] for i, plat in enumerate(plats):! print i, '-->', plat
  11. Itérer sur deux collections
 en même temps vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof']
  12. Itérer sur deux collections
 en même temps vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] n = min(len(vins), len(plats))! for i in range(n):! print vins[i], '-->', plats[i]
  13. Itérer sur deux collections
 en même temps vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] n = min(len(vins), len(plats))! for i in range(n):! print vins[i], '-->', plats[i] for name, plat in zip(vins, plats):! print name, '-->', plat
  14. Itérer sur deux collections
 en même temps vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] n = min(len(vins), len(plats))! for i in range(n):! print vins[i], '-->', plats[i] for name, plat in zip(vins, plats):! print name, '-->', plat for name, plat in izip(vins, plats):! print name, '-->', plat
  15. Itérer sur deux collections
 en même temps vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] n = min(len(vins), len(plats))! for i in range(n):! print vins[i], '-->', plats[i] for name, plat in zip(vins, plats):! print name, '-->', plat for name, plat in izip(vins, plats):! print name, '-->', plat from itertools import izip
  16. Itérer selon un ordre de tri plats = ['choucroute', 'munster',

    'kouglof'] for plat in sorted(plats):! print plat
  17. Itérer selon un ordre de tri plats = ['choucroute', 'munster',

    'kouglof'] for plat in sorted(plats):! print plat for plat in sorted(plats, reverse=True):! print plat
  18. Trier selon un critère particulier plats = ['choucroute', 'munster', 'kouglof']

    def compare_length(c1, c2):! if len(c1) < len(c2):! return -1! if len(c1) > len(c2):! return 1! return 0! ! print sorted(plats, cmp=compare_length)
  19. Trier selon un critère particulier plats = ['choucroute', 'munster', 'kouglof']

    def compare_length(c1, c2):! if len(c1) < len(c2):! return -1! if len(c1) > len(c2):! return 1! return 0! ! print sorted(plats, cmp=compare_length) print sorted(plats, key=len)
  20. Itérer sur les clés
 d'un dictionnaire d = {! 'gewurztraminer':

    ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,! }
  21. Itérer sur les clés
 d'un dictionnaire d = {! 'gewurztraminer':

    ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,! } for key in d:! print key
  22. Itérer sur les clés
 d'un dictionnaire d = {! 'gewurztraminer':

    ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,! } for key in d:! print key d = {key: d[key] for key in d if not key.startswith('r')}
  23. Itérer sur les clés et les valeurs d'un dictionnaire for

    key in d:! print key, '-->', d[key] for key, value in d.items():! print key, '-->', value
  24. Itérer sur les clés et les valeurs d'un dictionnaire for

    key in d:! print key, '-->', d[key] for key, value in d.items():! print key, '-->', value for key, value in d.iteritems():! print key, '-->', value
  25. Construire un dictionnaire à partir de paires vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof']
  26. Construire un dictionnaire à partir de paires vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] d = dict(izip(vins, plats))! {'gewurztraminer': 'kouglof', 'edelzwicker': ‘munster',! 'riesling': 'choucroute'}
  27. Construire un dictionnaire à partir de paires vins = ['riesling',

    'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof'] d = dict(izip(vins, plats))! {'gewurztraminer': 'kouglof', 'edelzwicker': ‘munster',! 'riesling': 'choucroute'} d = dict(enumerate(vins))! {0: 'riesling', 1: 'edelzwicker', 2: 'gewurztraminer'}
  28. Compter avec des dictionnaires plats = ['choucroute', 'munster', 'choucroute', ‘kouglof',!

    'munster', 'choucroute'] d = {}! for plat in plats:! if plat not in d:! d[plat] = 0! d[plat] += 1! {'kouglof': 1, 'munster': 2, 'choucroute': 3}
  29. Compter avec des dictionnaires plats = ['choucroute', 'munster', 'choucroute', ‘kouglof',!

    'munster', 'choucroute'] d = {}! for plat in plats:! if plat not in d:! d[plat] = 0! d[plat] += 1! {'kouglof': 1, 'munster': 2, 'choucroute': 3} d = defaultdict(int)! for plat in plats:! d[plat] += 1
  30. Clarifier les valeurs de retour multiples avec des tuples nommés

    doctest.testmod()! (0, 4) doctest.testmod()! TestResults(failed=0, attempted=4)
  31. Clarifier les valeurs de retour multiples avec des tuples nommés

    doctest.testmod()! (0, 4) doctest.testmod()! TestResults(failed=0, attempted=4) from collections import namedtuple! TestResults = namedtuple('TestResults', ['failed', 'attempted'])
  32. « Unpacking »
 de séquences p = 'Ronan', 'Amicel', 37,

    '@amicel' prenom = p[0]! nom = p[1]! age = p[2]! twitter = p[3]
  33. « Unpacking »
 de séquences p = 'Ronan', 'Amicel', 37,

    '@amicel' prenom = p[0]! nom = p[1]! age = p[2]! twitter = p[3] prenom, nom, age, twitter = p
  34. Concaténer des chaînes vins = ['riesling', 'edelzwicker', 'gewurztraminer',! 'pinot noir',

    'pinot gris', 'muscat', 'sylvaner'] s = vins[0]! for name in vins[1:]:! s += ', ' + name! print s
  35. Concaténer des chaînes vins = ['riesling', 'edelzwicker', 'gewurztraminer',! 'pinot noir',

    'pinot gris', 'muscat', 'sylvaner'] s = vins[0]! for name in vins[1:]:! s += ', ' + name! print s print ', '.join(vins)
  36. Utiliser des décorateurs pour factoriser de la logique def web_lookup(url,

    saved={}):! if url in saved:! return saved[url]! page = urllib.urlopen(url).read()! saved[url] = page! return page
  37. Utiliser des décorateurs pour factoriser de la logique def web_lookup(url,

    saved={}):! if url in saved:! return saved[url]! page = urllib.urlopen(url).read()! saved[url] = page! return page @cache! def web_lookup(url):! return urllib.urlopen(url).read()
  38. Décorateur cache def cache(func):! saved = {}! ! @wraps(func)! def

    newfunc(*args):! if args in saved:! return newfunc(*args)! result = func(*args)! saved[args] = result! return result! ! return newfunc
  39. Ouvrir et fermer
 des fichiers f = open('data.txt')! try:! data

    = f.read()! finally:! f.close() with open('data.txt') as f:! data = f.read()
  40. Utiliser des locks
 (verrous) # Créer un lock! lock =

    threading.Lock() # Utiliser un lock (ancienne méthode)! lock.acquire()! try:! print 'Critical section 1'! print 'Critical section 2'! finally:! lock.release()
  41. Utiliser des locks
 (verrous) # Créer un lock! lock =

    threading.Lock() # Utiliser un lock (ancienne méthode)! lock.acquire()! try:! print 'Critical section 1'! print 'Critical section 2'! finally:! lock.release() # Utiliser un lock (nouvelle méthode)! with lock:! print 'Critical section 1'! print 'Critical section 2'
  42. Listes en compréhension et expressions génératrices result = []! for

    i in range(10):! s = i ** 2! result.append(s)! print sum(result)
  43. Listes en compréhension et expressions génératrices result = []! for

    i in range(10):! s = i ** 2! result.append(s)! print sum(result) print sum([i**2 for i in xrange(10)])
  44. Listes en compréhension et expressions génératrices result = []! for

    i in range(10):! s = i ** 2! result.append(s)! print sum(result) print sum([i**2 for i in xrange(10)]) print sum(i**2 for i in xrange(10))