SlideShare una empresa de Scribd logo
1 de 93
Descargar para leer sin conexión
Rendez votre code
Python plus beau !
Ronan Amicel
@amicel

PyCon FR – 25 octobre 2013 – Strasbourg
Ronan Amicel
Founder @ PocketSensei
!

Hacker in Residence
@ TheFamily
Version originale
Raymond Hettinger
!

PyCon US 2013
!

Vidéo sur pyvideo.org
Du code plus beau ?
Du code plus beau ?
•

plus simple
Du code plus beau ?
•

plus simple

•

plus concis
Du code plus beau ?
•

plus simple

•

plus concis

•

plus clair
Du code plus beau ?
•

plus simple

•

plus concis

•

plus clair

•

plus idiomatique (== plus « pythonique »)
Du code plus beau ?
•

plus simple

•

plus concis

•

plus clair

•

plus idiomatique (== plus « pythonique »)

•

plus performant
Itérations
Itérer sur

un intervalle d’entiers
Itérer sur

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

un intervalle d’entiers
for i in [0, 1, 2, 3, 4, 5]:!
print i**2

for i in range(6):!
print i**2
Itérer sur

un intervalle d’entiers
for i in [0, 1, 2, 3, 4, 5]:!
print i**2

for i in range(6):!
print i**2

for i in xrange(6):!
print i**2
Itérer sur

une collection d'objets
Itérer sur

une collection d'objets
plats = ['choucroute', 'munster', 'kouglof']
Itérer sur

une collection d'objets
plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)):!
print plats[i]
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
Itérer en partant de la fin
Itérer en partant de la fin
plats = ['choucroute', 'munster', 'kouglof']
Itérer en partant de la fin
plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)-1, -1, -1):!
print plats[i]
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
Itérer en maintenant un
indice
Itérer en maintenant un
indice
plats = ['choucroute', 'munster', 'kouglof']
Itérer en maintenant un
indice
plats = ['choucroute', 'munster', 'kouglof']

for i in range(len(plats)):!
print i, '-->', plats[i]
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
Itérer sur deux collections

en même temps
Itérer sur deux collections

en même temps
vins = ['riesling', 'edelzwicker', 'gewurztraminer']!
plats = ['choucroute', 'munster', 'kouglof']
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]
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
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
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
from itertools import izip
for name, plat in izip(vins, plats):!
print name, '-->', plat
Itérer selon un ordre de tri
Itérer selon un ordre de tri
plats = ['choucroute', 'munster', 'kouglof']
Itérer selon un ordre de tri
plats = ['choucroute', 'munster', 'kouglof']

for plat in sorted(plats):!
print plat
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
Trier selon un critère
particulier
Trier selon un critère
particulier
plats = ['choucroute', 'munster', 'kouglof']
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)
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)
Dictionnaires
Itérer sur les clés

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

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

d'un dictionnaire
d = {!
'gewurztraminer': ‘kouglof',!
'edelzwicker': ‘munster',!
'riesling': ‘choucroute’,!
}
for key in d:!
print key
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')}
Itérer sur les clés et les
valeurs d'un dictionnaire
Itérer sur les clés et les
valeurs d'un dictionnaire
for key in d:!
print key, '-->', d[key]
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
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
Construire un dictionnaire
à partir de paires
Construire un dictionnaire
à partir de paires
vins = ['riesling', 'edelzwicker', 'gewurztraminer']!
plats = ['choucroute', 'munster', 'kouglof']
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'}
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'}
Compter avec des
dictionnaires
Compter avec des
dictionnaires
plats = ['choucroute', 'munster', 'choucroute', ‘kouglof',!
'munster', 'choucroute']
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}
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
Clarifier
Clarifier les appels de fonctions
avec des arguments mots-clés
Clarifier les appels de fonctions
avec des arguments mots-clés
search(‘#pyconfr', False, 20, True)
Clarifier les appels de fonctions
avec des arguments mots-clés
search(‘#pyconfr', False, 20, True)

search(‘#pyconfr', retweets=False, numtweets=20, popular=True)
Clarifier les valeurs de retour
multiples avec des tuples nommés
Clarifier les valeurs de retour
multiples avec des tuples nommés
doctest.testmod()!
(0, 4)
Clarifier les valeurs de retour
multiples avec des tuples nommés
doctest.testmod()!
(0, 4)

doctest.testmod()!
TestResults(failed=0, attempted=4)
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'])
« Unpacking »

de séquences
« Unpacking »

de séquences
p = 'Ronan', 'Amicel', 37, '@amicel'
« Unpacking »

de séquences
p = 'Ronan', 'Amicel', 37, '@amicel'

prenom = p[0]!
nom = p[1]!
age = p[2]!
twitter = p[3]
« 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
Performance
Concaténer des chaînes
Concaténer des chaînes
vins = ['riesling', 'edelzwicker', 'gewurztraminer',!
'pinot noir', 'pinot gris', 'muscat', 'sylvaner']
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
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)
Décorateurs et

context managers
Utiliser des décorateurs pour
factoriser de la logique
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
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()
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
Ouvrir et fermer

des fichiers
Ouvrir et fermer

des fichiers
f = open('data.txt')!
try:!
data = f.read()!
finally:!
f.close()
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()
Utiliser des locks

(verrous)
Utiliser des locks

(verrous)
# Créer un lock!
lock = threading.Lock()
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 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'
« One liners »
Listes en compréhension
et expressions génératrices
Listes en compréhension
et expressions génératrices
result = []!
for i in range(10):!
s = i ** 2!
result.append(s)!
print sum(result)
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)])
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))
Questions ?
Merci !

Más contenido relacionado

Destacado

Formation python
Formation pythonFormation python
Formation pythonj_lipaz
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Emeric Tapachès
 
Accessibilite ERP - points importants
Accessibilite ERP - points importantsAccessibilite ERP - points importants
Accessibilite ERP - points importantsCorentin Le Faucheur
 
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restauration
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restaurationGuide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restauration
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restaurationkolbjm
 
SGBDR - ACCESS
SGBDR - ACCESSSGBDR - ACCESS
SGBDR - ACCESSMusatge
 
Base NoSql et Python
Base NoSql et PythonBase NoSql et Python
Base NoSql et Pythonyboussard
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPPascal MARTIN
 
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)salah fenni
 
La guerre d'algérie en images
La guerre d'algérie en imagesLa guerre d'algérie en images
La guerre d'algérie en imagesDande1941
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonMohammed TAMALI
 
Créer une api publique avec Django REST framework
Créer une api publique avec Django REST frameworkCréer une api publique avec Django REST framework
Créer une api publique avec Django REST frameworkBleemeo
 
Développement de la personnalité : La désintégration positive
Développement de la personnalité : La désintégration positiveDéveloppement de la personnalité : La désintégration positive
Développement de la personnalité : La désintégration positivePhilippe Piquer
 
10 reasons to adopt Python 3
10 reasons to adopt Python 310 reasons to adopt Python 3
10 reasons to adopt Python 3Bleemeo
 
Seminaire Borland UML (2003)
Seminaire Borland UML (2003)Seminaire Borland UML (2003)
Seminaire Borland UML (2003)Pascal Roques
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniShellmates
 

Destacado (20)

Formation python
Formation pythonFormation python
Formation python
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2
 
Accessibilite ERP - points importants
Accessibilite ERP - points importantsAccessibilite ERP - points importants
Accessibilite ERP - points importants
 
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restauration
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restaurationGuide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restauration
Guide de l'accessibilité pour les ERP exerçant dans l'hôtellerie-restauration
 
Python packaging
Python packagingPython packaging
Python packaging
 
Td pascal tdD
Td pascal tdDTd pascal tdD
Td pascal tdD
 
SGBDR - ACCESS
SGBDR - ACCESSSGBDR - ACCESS
SGBDR - ACCESS
 
Base NoSql et Python
Base NoSql et PythonBase NoSql et Python
Base NoSql et Python
 
Bonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHPBonnes pratiques de developpement en PHP
Bonnes pratiques de developpement en PHP
 
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)
 
Accessibilite 2013
Accessibilite 2013Accessibilite 2013
Accessibilite 2013
 
Les systèmes embarqués arduino
Les systèmes embarqués arduinoLes systèmes embarqués arduino
Les systèmes embarqués arduino
 
La guerre d'algérie en images
La guerre d'algérie en imagesLa guerre d'algérie en images
La guerre d'algérie en images
 
Normes handicapés
Normes handicapés Normes handicapés
Normes handicapés
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
Créer une api publique avec Django REST framework
Créer une api publique avec Django REST frameworkCréer une api publique avec Django REST framework
Créer une api publique avec Django REST framework
 
Développement de la personnalité : La désintégration positive
Développement de la personnalité : La désintégration positiveDéveloppement de la personnalité : La désintégration positive
Développement de la personnalité : La désintégration positive
 
10 reasons to adopt Python 3
10 reasons to adopt Python 310 reasons to adopt Python 3
10 reasons to adopt Python 3
 
Seminaire Borland UML (2003)
Seminaire Borland UML (2003)Seminaire Borland UML (2003)
Seminaire Borland UML (2003)
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 

Más de Ronan Amicel

Introduction au Customer Development
Introduction au Customer DevelopmentIntroduction au Customer Development
Introduction au Customer DevelopmentRonan Amicel
 
Programmation web asynchrone avec Tornado
Programmation web asynchrone avec TornadoProgrammation web asynchrone avec Tornado
Programmation web asynchrone avec TornadoRonan Amicel
 
Je configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtoolsJe configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtoolsRonan Amicel
 
Trompez-vous, plus vite que ça !
Trompez-vous, plus vite que ça !Trompez-vous, plus vite que ça !
Trompez-vous, plus vite que ça !Ronan Amicel
 
10 outils en 10 minutes
10 outils en 10 minutes10 outils en 10 minutes
10 outils en 10 minutesRonan Amicel
 

Más de Ronan Amicel (6)

Introduction au Customer Development
Introduction au Customer DevelopmentIntroduction au Customer Development
Introduction au Customer Development
 
Programmation web asynchrone avec Tornado
Programmation web asynchrone avec TornadoProgrammation web asynchrone avec Tornado
Programmation web asynchrone avec Tornado
 
Je configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtoolsJe configure mes serveurs avec fabric et fabtools
Je configure mes serveurs avec fabric et fabtools
 
Trompez-vous, plus vite que ça !
Trompez-vous, plus vite que ça !Trompez-vous, plus vite que ça !
Trompez-vous, plus vite que ça !
 
10 outils en 10 minutes
10 outils en 10 minutes10 outils en 10 minutes
10 outils en 10 minutes
 
Python et NoSQL
Python et NoSQLPython et NoSQL
Python et NoSQL
 

Rendez votre code Python plus beau !

  • 1. Rendez votre code Python plus beau ! Ronan Amicel @amicel PyCon FR – 25 octobre 2013 – Strasbourg
  • 2. Ronan Amicel Founder @ PocketSensei ! Hacker in Residence @ TheFamily
  • 3. Version originale Raymond Hettinger ! PyCon US 2013 ! Vidéo sur pyvideo.org
  • 4. Du code plus beau ?
  • 5. Du code plus beau ? • plus simple
  • 6. Du code plus beau ? • plus simple • plus concis
  • 7. Du code plus beau ? • plus simple • plus concis • plus clair
  • 8. Du code plus beau ? • plus simple • plus concis • plus clair • plus idiomatique (== plus « pythonique »)
  • 9. Du code plus beau ? • plus simple • plus concis • plus clair • plus idiomatique (== plus « pythonique ») • plus performant
  • 12. Itérer sur
 un intervalle d’entiers for i in [0, 1, 2, 3, 4, 5]:! print i**2
  • 13. Itérer sur
 un intervalle d’entiers for i in [0, 1, 2, 3, 4, 5]:! print i**2 for i in range(6):! print i**2
  • 14. Itérer sur
 un intervalle d’entiers for i in [0, 1, 2, 3, 4, 5]:! print i**2 for i in range(6):! print i**2 for i in xrange(6):! print i**2
  • 16. Itérer sur
 une collection d'objets plats = ['choucroute', 'munster', 'kouglof']
  • 17. Itérer sur
 une collection d'objets plats = ['choucroute', 'munster', 'kouglof'] for i in range(len(plats)):! print plats[i]
  • 18. 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
  • 19. Itérer en partant de la fin
  • 20. Itérer en partant de la fin plats = ['choucroute', 'munster', 'kouglof']
  • 21. Itérer en partant de la fin plats = ['choucroute', 'munster', 'kouglof'] for i in range(len(plats)-1, -1, -1):! print plats[i]
  • 22. 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
  • 24. Itérer en maintenant un indice plats = ['choucroute', 'munster', 'kouglof']
  • 25. Itérer en maintenant un indice plats = ['choucroute', 'munster', 'kouglof'] for i in range(len(plats)):! print i, '-->', plats[i]
  • 26. 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
  • 27. Itérer sur deux collections
 en même temps
  • 28. Itérer sur deux collections
 en même temps vins = ['riesling', 'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof']
  • 29. 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]
  • 30. 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
  • 31. 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
  • 32. 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 from itertools import izip for name, plat in izip(vins, plats):! print name, '-->', plat
  • 33. Itérer selon un ordre de tri
  • 34. Itérer selon un ordre de tri plats = ['choucroute', 'munster', 'kouglof']
  • 35. Itérer selon un ordre de tri plats = ['choucroute', 'munster', 'kouglof'] for plat in sorted(plats):! print plat
  • 36. 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
  • 37. Trier selon un critère particulier
  • 38. Trier selon un critère particulier plats = ['choucroute', 'munster', 'kouglof']
  • 39. 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)
  • 40. 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)
  • 42. Itérer sur les clés
 d'un dictionnaire
  • 43. Itérer sur les clés
 d'un dictionnaire d = {! 'gewurztraminer': ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,! }
  • 44. Itérer sur les clés
 d'un dictionnaire d = {! 'gewurztraminer': ‘kouglof',! 'edelzwicker': ‘munster',! 'riesling': ‘choucroute’,! } for key in d:! print key
  • 45. 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')}
  • 46. Itérer sur les clés et les valeurs d'un dictionnaire
  • 47. Itérer sur les clés et les valeurs d'un dictionnaire for key in d:! print key, '-->', d[key]
  • 48. 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
  • 49. 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
  • 50. Construire un dictionnaire à partir de paires
  • 51. Construire un dictionnaire à partir de paires vins = ['riesling', 'edelzwicker', 'gewurztraminer']! plats = ['choucroute', 'munster', 'kouglof']
  • 52. 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'}
  • 53. 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'}
  • 55. Compter avec des dictionnaires plats = ['choucroute', 'munster', 'choucroute', ‘kouglof',! 'munster', 'choucroute']
  • 56. 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}
  • 57. 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
  • 59. Clarifier les appels de fonctions avec des arguments mots-clés
  • 60. Clarifier les appels de fonctions avec des arguments mots-clés search(‘#pyconfr', False, 20, True)
  • 61. Clarifier les appels de fonctions avec des arguments mots-clés search(‘#pyconfr', False, 20, True) search(‘#pyconfr', retweets=False, numtweets=20, popular=True)
  • 62. Clarifier les valeurs de retour multiples avec des tuples nommés
  • 63. Clarifier les valeurs de retour multiples avec des tuples nommés doctest.testmod()! (0, 4)
  • 64. Clarifier les valeurs de retour multiples avec des tuples nommés doctest.testmod()! (0, 4) doctest.testmod()! TestResults(failed=0, attempted=4)
  • 65. 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'])
  • 66. « Unpacking »
 de séquences
  • 67. « Unpacking »
 de séquences p = 'Ronan', 'Amicel', 37, '@amicel'
  • 68. « Unpacking »
 de séquences p = 'Ronan', 'Amicel', 37, '@amicel' prenom = p[0]! nom = p[1]! age = p[2]! twitter = p[3]
  • 69. « 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
  • 72. Concaténer des chaînes vins = ['riesling', 'edelzwicker', 'gewurztraminer',! 'pinot noir', 'pinot gris', 'muscat', 'sylvaner']
  • 73. 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
  • 74. 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)
  • 76. Utiliser des décorateurs pour factoriser de la logique
  • 77. 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
  • 78. 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()
  • 79. 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
  • 81. Ouvrir et fermer
 des fichiers f = open('data.txt')! try:! data = f.read()! finally:! f.close()
  • 82. 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()
  • 84. Utiliser des locks
 (verrous) # Créer un lock! lock = threading.Lock()
  • 85. 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()
  • 86. 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'
  • 88. Listes en compréhension et expressions génératrices
  • 89. Listes en compréhension et expressions génératrices result = []! for i in range(10):! s = i ** 2! result.append(s)! print sum(result)
  • 90. 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)])
  • 91. 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))