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« )
- les types natifs incorporent des structures de données supportés par la syntaxe:
- str ‘ ‘ ou » «
- list [] et tuple (,)
- set (ensemble) {}
- dict (ionnaire)
- Outre une belle panoplie de fonctions prédéfinies, Python dispose d’une impressionnante librairie standard.
- un système de gestion des exceptions fait évidemment partie du langage
- on peut effectuer des affectations multiples : a,b=b,a+b #remarquez le swap!
- les générateurs permettent de définir des itérateurs d’une manière bien plus simple qu’en C++ (STL)
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])
- la fonction eval permet des miracles comme ce tableur en 9 lignes de code !
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:
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
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.
Pour se lancer dans Python, un peu de doc:
le document cité ci-dessus: http://www.scribd.com/doc/21314841/Tutoriel-Python – un très bon tuto de Olivier Berger, au format PDF.
Site du zéro : http://www.siteduzero.com/tutoriel-3-223267-apprendre-python.html
Livre: « Apprenez à programmer en Python » de Vincent Le Goff, très accessible.
Livre aide mémoire: Python Pocket reference (anglais), 4 ème édition, couvre les version 2.6 et 3.x