Microclub

Python

Il ne vaut pas la peine de connaitre un langage qui ne modifie pas votre façon de penser la programmation. (Alan Perlis)


Après Basic, Pascal, Modula-2, ADA, LISP, Prolog, C++ et sa STL , je viens de découvrir un nouveau langage qui modifie ma façon de penser la programmation : Python.

Ce langage a été créé par Guido van Rossum en une semaine de 1989, sur un Mac, et baptisé en l’honneur des « Monty Pythons »… 20 ans plus tard, son langage  est utilisé dans de très nombreux domaines et applications, entre autres au CERN, à la NASA,  et chez Google où travaille désormais Guido.

Python et la Science

Le point commun de beaucoup d’applications de Python, c’est la science. J’ai compris pourquoi grâce à  à ProjectEuler.net, qui permet de comparer des algorithmes exprimés dans différents langages de programmation. Les solutions en Python sont systématiquement les plus compactes (à l’exception d’APL) Par exemple, une seule ligne suffit à calculer la somme des décimales de 100 factorielle :

reduce(lambda x, y: x + y, [int(i) for i in str(reduce(lambda x, y: x * y, range(1, 100)))])

Dans cette seule ligne :

  • le type entier s’étend automatiquement à la demande pour représenter ici un nombre de 158 chiffres
  • on le convertit en chaîne de caractères par str()
  • on construit par « compréhension » (for) une liste [ ] des caractères re-convertis en nombres par int()
  • dont on fait la somme en utilisant la programmation fonctionnelle ( reduce+lambda) une seconde fois.

Mais encore ?

  • en utilisant l’indentation pour délimiter les blocs, on évite de compter les {{}{{}{}}}
  • les variables sont fortement typées, mais n’ont pas besoin d’être déclarées
  • la programmation objet est très complète, avec héritage multiple et surcharge d’opérateurs, mais pas de dissimulation (private):

After all, we are all consenting adults here
(slogan Python, Karl Fast dans « What is Pythonic« )

def gen_fibonacci():
    """Générateur de la suite de Fibonacci"""
    a, b = 0, 1

    while True:
        yield a  # Renvoi de la valeur de "a", résultat de l'itération en cours
        a, b = b, a + b

fi = gen_fibonacci()
for i in range(20):
    print fi.next()
  • les commentaires entre  »  »  »doc_code »  »  » sont considérés comme un champ nommé __doc__, ce qui permet de générer de la documentation (help) automatiquement.
  • l’introspection : les éléments du langage (classes, méthodes…) sont des objets qui peuvent être parcourus à l’aide de la fonction getattr

def info(object, spacing=10, collapse=1):

    """Print methods and doc strings.Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])
class SpreadSheet:
    _cells = {}
    tools = {}
    def __setitem__(self, key, formula):
        self._cells[key] = formula
    def getformula(self, key):
        return self._cells[key]
    def __getitem__(self, key ):
        return eval(self._cells[key], SpreadSheet.tools, self)

>>> from math import sin, pi
>>> SpreadSheet.tools.update(sin=sin, pi=pi, len=len)
>>> ss = SpreadSheet()
>>> ss['a1'] = '5'
>>> ss['a2'] = 'a1*6'
>>> ss['a3'] = 'a2*7'
>>> ss['a3']
210
>>> ss['b1'] = 'sin(pi/4)'
>>> ss['b1']
0.70710678118654746
>>> ss.getformula('b1')
'sin(pi/4)'
  • les décorateurs sont une extraordinaire invention de Python. Ils permettant d’insérer facilement une fonction à l’appel et au retour d’une autre:
@decorateur
def fonction(parametre):
  code() 
  return resultat

est fonctionnellement équivalent à

def fonction(parametre):
  parametre=decorateur(parametre,entree) 
  code()
  return decorateur(resultat,sortie)

les décorateurs permettent de réaliser très facilement des logs, du profilage ou du chronométrage de temps d’exécution. Ils permettent aussi d’implanter des mécanismes existant dans d’autres langages, comme les propriétés à la Delphi/C#, ou des mécanismes utiles en programmation concurrente, ou encore d’améliorer les performances par des caches de « memoization ». Une librairie de décorateurs est disponible.

Ou et Comment

  • l’interpréteur Python est gratuit, open source (écrit en C, donc appelé parfois CPython), et disponible sur Python.org pour Windows, Mac, Linux et beaucoup d’autres plateformes.
    • Il se lance par la ligne de commande, donc doit être dans le PATH…
    • la variable PYTHONPATH définit la recherche des « modules » (fichiers .py)
  • Python(x,y) est la distribution de Python la plus complète sur PC, incluant de nombreuses librairies et outils comme:
    • IDLE l’IDE standard, suffisant pour de petits développements
    • l’IDE  Eclipse avec PyDev et Qt pour la création d’applications graphiques complexes
    • Spyder, the Scientific PYthon Development EnviRonment

en prime la doc de Python(x,y) est partiellement en français. Vivement conseillé !

ATTENTION ! Python 3 est « nouveau » et le langage a passablement changé. Il ne supporte pas toutes les librairies existantes… Préférez le 2.7 (ou le 2.6 livré avec Python(x,y) ) en tenant compte des changements apportés par la 3.0 …

Existent aussi:

  • IronPython (tournant sur machine virtuelle .NET)
  • Jython (tournant sur machine virtuelle Java)
  • PyPy, un Python avec compilateur JIT, très rapide
  • Stackless, un dialecte facilitant la programmation concurrente, utilisé par le jeu EVE notamment
Zen of Python : easteregg apparaissant pour "import this"
Zen of Python : easteregg apparaissant pour "import this"

Un nombre incroyable de librairies Python est disponible un peu partout sur le web pour toutes les applications imaginables.

Beaucoup sont des « binding » vers du code C++ compilé, offrant une performance nettement supérieure à du code purement Python (voir SWIG ou Boost.Python )

Exemples:

Demosaïquification

Combien de petites images distinctes sont utilisées pour produire une image mosaïque ? Pour répondre à cette question, j’ai développé un petit programme avec Python(x,y) en utilisant la « Python Imaging Library » (PIL)

DicoLib en Python

Vous vous souvenez tous de DicoLib, la géniale structure de données qui m’a permis de résoudre le problème du word downsizing il y a quelques années. Voilà ce que ça donne réécrit en Python:

En conclusion

Python est utilisé dans de gros projets, soit directement comme langage de programmation, soit comme langage de script, soit les deux à la fois:

Mais c’est avant tout un langage permettant de réaliser des choses complexes avec peu de lignes de code grâce à un très haut niveau d’abstraction.

Références:

  1. http://fr.wikipedia.org/wiki/Python_(langage)
  2. http://www.scribd.com/doc/21314841/Tutoriel-Python
  3. Mark Pilgrim « Plongez au coeur de Python« , livre libre
  4. Python Reciepes on ActiveState.com

Une réflexion sur “Python

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.