93
Rendez votre code Python plus beau ! Ronan Amicel @amicel PyCon FR – 25 octobre 2013 – Strasbourg

Rendez votre code Python plus beau !

Embed Size (px)

DESCRIPTION

Présentation à PyCon FR à Strabsourg le 25 octobre 2013.

Citation preview

Page 1: Rendez votre code Python plus beau !

Rendez votre code Python plus beau !

Ronan Amicel @amicel

PyCon FR – 25 octobre 2013 – Strasbourg

Page 2: Rendez votre code Python plus beau !

Ronan Amicel

Founder @ PocketSensei !

Hacker in Residence @ TheFamily

Page 3: Rendez votre code Python plus beau !

Version originale

Raymond Hettinger !

PyCon US 2013 !

Vidéo sur pyvideo.org

Page 4: Rendez votre code Python plus beau !

Du code plus beau ?

Page 5: Rendez votre code Python plus beau !

Du code plus beau ?

• plus simple

Page 6: Rendez votre code Python plus beau !

Du code plus beau ?

• plus simple

• plus concis

Page 7: Rendez votre code Python plus beau !

Du code plus beau ?

• plus simple

• plus concis

• plus clair

Page 8: Rendez votre code Python plus beau !

Du code plus beau ?

• plus simple

• plus concis

• plus clair

• plus idiomatique (== plus « pythonique »)

Page 9: Rendez votre code Python plus beau !

Du code plus beau ?

• plus simple

• plus concis

• plus clair

• plus idiomatique (== plus « pythonique »)

• plus performant

Page 10: Rendez votre code Python plus beau !

Itérations

Page 11: Rendez votre code Python plus beau !

Itérer sur un intervalle d’entiers

Page 12: Rendez votre code Python plus beau !

Itérer sur un intervalle d’entiers

for i in [0, 1, 2, 3, 4, 5]:! print i**2

Page 13: Rendez votre code Python plus beau !

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

Page 14: Rendez votre code Python plus beau !

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

Page 15: Rendez votre code Python plus beau !

Itérer sur une collection d'objets

Page 16: Rendez votre code Python plus beau !

Itérer sur une collection d'objets

plats = ['choucroute', 'munster', 'kouglof']

Page 17: Rendez votre code Python plus beau !

Itérer sur une collection d'objets

plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)):! print plats[i]

Page 18: Rendez votre code Python plus beau !

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

Page 19: Rendez votre code Python plus beau !

Itérer en partant de la fin

Page 20: Rendez votre code Python plus beau !

Itérer en partant de la fin

plats = ['choucroute', 'munster', 'kouglof']

Page 21: Rendez votre code Python plus beau !

Itérer en partant de la fin

plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)-1, -1, -1):! print plats[i]

Page 22: Rendez votre code Python plus beau !

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

Page 23: Rendez votre code Python plus beau !

Itérer en maintenant un indice

Page 24: Rendez votre code Python plus beau !

Itérer en maintenant un indice

plats = ['choucroute', 'munster', 'kouglof']

Page 25: Rendez votre code Python plus beau !

Itérer en maintenant un indice

plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)):! print i, '-->', plats[i]

Page 26: Rendez votre code Python plus beau !

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

Page 27: Rendez votre code Python plus beau !

Itérer sur deux collections en même temps

Page 28: Rendez votre code Python plus beau !

Itérer sur deux collections en même temps

vins = ['riesling', 'edelzwicker', 'gewurztraminer']!plats = ['choucroute', 'munster', 'kouglof']

Page 29: Rendez votre code Python plus beau !

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]

Page 30: Rendez votre code Python plus beau !

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

Page 31: Rendez votre code Python plus beau !

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

Page 32: Rendez votre code Python plus beau !

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

Page 33: Rendez votre code Python plus beau !

Itérer selon un ordre de tri

Page 34: Rendez votre code Python plus beau !

Itérer selon un ordre de tri

plats = ['choucroute', 'munster', 'kouglof']

Page 35: Rendez votre code Python plus beau !

Itérer selon un ordre de tri

plats = ['choucroute', 'munster', 'kouglof']

for plat in sorted(plats):! print plat

Page 36: Rendez votre code Python plus beau !

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

Page 37: Rendez votre code Python plus beau !

Trier selon un critère particulier

Page 38: Rendez votre code Python plus beau !

Trier selon un critère particulier

plats = ['choucroute', 'munster', 'kouglof']

Page 39: Rendez votre code Python plus beau !

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)

Page 40: Rendez votre code Python plus beau !

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)

Page 41: Rendez votre code Python plus beau !

Dictionnaires

Page 42: Rendez votre code Python plus beau !

Itérer sur les clésd'un dictionnaire

Page 43: Rendez votre code Python plus beau !

Itérer sur les clésd'un dictionnaire

d = {! 'gewurztraminer': ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,!}

Page 44: Rendez votre code Python plus beau !

Itérer sur les clésd'un dictionnaire

d = {! 'gewurztraminer': ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,!}

for key in d:! print key

Page 45: Rendez votre code Python plus beau !

Itérer sur les clésd'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')}

Page 46: Rendez votre code Python plus beau !

Itérer sur les clés et les valeurs d'un dictionnaire

Page 47: Rendez votre code Python plus beau !

Itérer sur les clés et les valeurs d'un dictionnaire

for key in d:! print key, '-->', d[key]

Page 48: Rendez votre code Python plus beau !

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

Page 49: Rendez votre code Python plus beau !

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

Page 50: Rendez votre code Python plus beau !

Construire un dictionnaire à partir de paires

Page 51: Rendez votre code Python plus beau !

Construire un dictionnaire à partir de paires

vins = ['riesling', 'edelzwicker', 'gewurztraminer']!plats = ['choucroute', 'munster', 'kouglof']

Page 52: Rendez votre code Python plus beau !

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

Page 53: Rendez votre code Python plus beau !

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

Page 54: Rendez votre code Python plus beau !

Compter avec des dictionnaires

Page 55: Rendez votre code Python plus beau !

Compter avec des dictionnaires

plats = ['choucroute', 'munster', 'choucroute', ‘kouglof',! 'munster', 'choucroute']

Page 56: Rendez votre code Python plus beau !

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}

Page 57: Rendez votre code Python plus beau !

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

Page 58: Rendez votre code Python plus beau !

Clarifier

Page 59: Rendez votre code Python plus beau !

Clarifier les appels de fonctions avec des arguments mots-clés

Page 60: Rendez votre code Python plus beau !

search(‘#pyconfr', False, 20, True)

Clarifier les appels de fonctions avec des arguments mots-clés

Page 61: Rendez votre code Python plus beau !

search(‘#pyconfr', False, 20, True)

search(‘#pyconfr', retweets=False, numtweets=20, popular=True)

Clarifier les appels de fonctions avec des arguments mots-clés

Page 62: Rendez votre code Python plus beau !

Clarifier les valeurs de retour multiples avec des tuples nommés

Page 63: Rendez votre code Python plus beau !

Clarifier les valeurs de retour multiples avec des tuples nommés

doctest.testmod()!(0, 4)

Page 64: Rendez votre code Python plus beau !

Clarifier les valeurs de retour multiples avec des tuples nommés

doctest.testmod()!(0, 4)

doctest.testmod()!TestResults(failed=0, attempted=4)

Page 65: Rendez votre code Python plus beau !

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'])

Page 66: Rendez votre code Python plus beau !

« Unpacking »de séquences

Page 67: Rendez votre code Python plus beau !

« Unpacking »de séquences

p = 'Ronan', 'Amicel', 37, '@amicel'

Page 68: Rendez votre code Python plus beau !

« Unpacking »de séquences

p = 'Ronan', 'Amicel', 37, '@amicel'

prenom = p[0]!nom = p[1]!age = p[2]!twitter = p[3]

Page 69: Rendez votre code Python plus beau !

« 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

Page 70: Rendez votre code Python plus beau !

Performance

Page 71: Rendez votre code Python plus beau !

Concaténer des chaînes

Page 72: Rendez votre code Python plus beau !

Concaténer des chaînes

vins = ['riesling', 'edelzwicker', 'gewurztraminer',! 'pinot noir', 'pinot gris', 'muscat', 'sylvaner']

Page 73: Rendez votre code Python plus beau !

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

Page 74: Rendez votre code Python plus beau !

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)

Page 75: Rendez votre code Python plus beau !

Décorateurs etcontext managers

Page 76: Rendez votre code Python plus beau !

Utiliser des décorateurs pour factoriser de la logique

Page 77: Rendez votre code Python plus beau !

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

Page 78: Rendez votre code Python plus beau !

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

Page 79: Rendez votre code Python plus beau !

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

Page 80: Rendez votre code Python plus beau !

Ouvrir et fermer des fichiers

Page 81: Rendez votre code Python plus beau !

Ouvrir et fermer des fichiers

f = open('data.txt')!try:! data = f.read()!finally:! f.close()

Page 82: Rendez votre code Python plus beau !

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

Page 83: Rendez votre code Python plus beau !

Utiliser des locks (verrous)

Page 84: Rendez votre code Python plus beau !

Utiliser des locks (verrous)

# Créer un lock!lock = threading.Lock()

Page 85: Rendez votre code Python plus beau !

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

Page 86: Rendez votre code Python plus beau !

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'

Page 87: Rendez votre code Python plus beau !

« One liners »

Page 88: Rendez votre code Python plus beau !

Listes en compréhension et expressions génératrices

Page 89: Rendez votre code Python plus beau !

Listes en compréhension et expressions génératrices

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

Page 90: Rendez votre code Python plus beau !

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

Page 91: Rendez votre code Python plus beau !

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

Page 92: Rendez votre code Python plus beau !

Questions ?

Page 93: Rendez votre code Python plus beau !

Merci !