Introduction à Python

Post on 08-Jan-2016

48 views 1 download

description

Introduction à Python. sebastien.martini@gmail.com 14/03/2007. Historique. Langage relativement récent, développé au début des années 1990 par Guido Von Rossum (GvR) Statut : BDFL (Benevolent Dictator For Life). Principales caractéristiques. Langage interprété Exécution : - PowerPoint PPT Presentation

Transcript of Introduction à Python

Introduction à Python

sebastien.martini@gmail.com

14/03/2007

Historique

• Langage relativement récent, développé au début des années 1990 par Guido Von Rossum (GvR)•Statut : BDFL (Benevolent Dictator For Life)

Principales caractéristiques

• Langage interprété– Exécution :

– python mon_source.py– Mode interpréteur

– Génére du bytecode (langage intermédiaire) ex: .pyc>>> def fun(a, b):... return a + b + 42>>> dis.dis(fun) 2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 BINARY_ADD 7 LOAD_CONST 1 (42) 10 BINARY_ADD 11 RETURN_VALUE

Principales caractéristiques• Orienté objet (pas pur ou du moins pas en apparence)• Les espaces sont significatifs

– Plus besoin de ; { } • Exemple :

If a > 42 : passelse print ‘bar’

– Utiliser un mode python• Dynamique

– Pas de déclaration de variables• Exemple :

>>> a = 42; print a; a = 'foo'; print a ;42foo

Principales caractéristiques

– Typage dynamique (à l’exécution), pas de type checking

– Support des exceptions• Exemple :

>>> def fun():… c = ‘chaine’... return c + 42... >>> fun()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in funTypeError: cannot concatenate 'str' and 'int' objects

Principales caractéristiques

• Introspection– Examiner ses propres structures à l’exécution

(attributs, méthodes, parents, type, …) • Builtins : type(), dir(), locals(), globals(), getattr(),…

• Se modifier soi-même– Modifier ses propres structures

• cf. exemple plus loin (diapo. sur les Classes)

Fonctions• Exemple :

def f(a,b=3): if a: return a + bf(2) # retourne 5f(2, 42) # retourne 44f(0) # retourne Nonef(0,42) # retourne None

• Définition d’une fonction par ‘def’• Accepte des arguments par défauts

• Ne peut-être surchargée qu’avec ce mécanisme

FonctionsPas de déclaration de type des arguments ni

de la valeur de retourDuck typing (if it walks like a duck, quacks like

a duck,…, it must be a duck)Retourne l’objet None par défaut (ou en cas

de return sans argument)Une fonction peut être imbriquée dans une

autre

Classes

• Surprenant au premier abord– N’encourage pas l’utilisation d’accesseurs (regarder du

côté des descriptors)– Pas de qualifieurs (private, protected) tout est public (en

simplifiant), “sorte” de private avec __mymeth()– Pas de destructeur (en simplifiant)– Les méthodes « spéciales » sont encadrées par deux

underscores• Exemple de constructeur :

def __init__(self):Pass

– Nécessité de l’argument self

Classes

• Pas de notions de classe abstraite• Héritage multiple (à la c++), depth-first, left-

to-right• Les méthodes sont toutes virtuelles• Attributs de classe• Méthodes statiques• Fonction super(), pour référer à la classe

parente

Classes• Exemple 1 :

class Test(object): """commentaire""" def __init__(self, a): self._a = a def meth(self): return self._a * 42 def __str__(self): return str(self._a)

print 'type de Test:', type(Test)c = Test(2)print 'appel de la methode __str__():', cprint 'type de c:', type(c)print 'attributs de c:', dir(c)print 'appel de methode:', c.meth()c.nouvel_attribut = 42print 'nouvel attribut::', c.nouvel_attributprint 'introspection:', getattr(c,'meth')

Classes

sundae:~/Desktop$ python test.pytype de Test: <type 'type'>appel de la methode __str__(): 2type de c: <class '__main__.Test'>attributs de c: ['__class__', '__delattr__', '__dict__', '__doc__',

'__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a', 'meth']

appel de methode: 84nouvel attribut: 42introspection: 84

– Que contient l’attribut __doc__ ?

Classes• Exemple 2 (héritage, self-modication) :

class A(object): passclass B(A): passclass C(object): pass

print B.__bases__ # (1)B.__bases__ += (C,)print B.__bases__ # (2)

Résultats :(<class __main__.A>,) # (1)(<class __main__.A>, <class __main__.C>) # (2)

Classes• Exemple 3 (surcharge d’opérateurs):

class MyInt(object): def __init__(self, i): self.i = i def __add__(self, rhs): return MyInt(self.i + rhs.i) def __str__(self): return str(self.i)

un = MyInt(1)deux = MyInt(2)trois = un + deuxprint trois

sundae:~/Desktop$ python myint.py3

Tuple

• Conteneur séquentiel non mutable• Ensemble ordonné d’éléments

– Pas forcément constants– Exemples :

a = (1,2,3) # instancie un nouveau tuplea[1] # retourne 2a[0] = 4 # interdita.append(42) # fauxb = a + (4,) # recopie complète de a dans b

Liste• Conteneur séquentiel mutable• Exemple

>>> l = [1,42] # liste de 2 éléments # Rem: le type des élts n'est pas forcément homogéne>>> len(l) # longeur de la liste2>>> l.append(4) # insérer un élément à la fin de la liste>>> l[1, 42, 4]>>> l.sort() # ordonner la liste, # compare les élts 2 à 2, avec la méthode __cmp__()>>> l # pour éviter que l ne soit modifiée, utiliser sorted()[1, 4, 42]>>> l.pop() # retire et retourne le dernier élément de la liste

Liste>>> l[0:2] # retourne une sous-liste[1, 4]>>> l[:-1][1, 4]>>> l[-1] # plus efficace que l[len(l)-1]4>>> l.remove(4) # retirer un élt se base sur l’op d'égalité

structurelle # au travers de la méthode __eq__()>>> del l[0] # suppression par position>>> l[]

Dictionnaire

• Conteneur associatif• Exemple

>>> d = {1:'1', 3:'3', 2:'2'} # instancier un dictionnaire, la clef doit

# être un objet constant (c’est son hash

# qui détermine sa valeur d’index)

>>> d

{1: '1', 2: '2', 3: '3'}

>>> 1 in d # test d'appartenance

True

>>> d[4] = '4' # insérer un élément

>>> d

{1: '1', 2: '2', 3: '3', 4: '4'}

Dictionnaire>>> del d[2] # supprimer un élément en fonction de sa clef>>> d{1: '1', 3: '3', 4: '4'}>>> d.keys() # retourne la liste des clefs (peut être très coûteux)[1, 3, 4]>>> d.values() # retourne la liste des valeurs ['1', '3', '4']>>> d.items() # retourne la liste des couples (clef, value)[(1, '1'), (3, '3'), (4, '4')]>>> d[6] # retourne une exception en cas de clef erronéeTraceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 6>>> d.get(6) # retourne None

Dictionnaire>>> d.get(4) # ou la valeur si la clef est correcte'4‘

>>> d.iteritems() # retourne un itérateur sur les couples d'items<dictionary-itemiterator object at 0xb79b9760>>>> for k,v in d.iteritems(): # itérer sur les couples d'items, ordre des éléments non garanti... print k, v1 13 34 4>>> sorted(d.iterkeys()) # liste ordonnée des keys[1, 2, 3]>>> d.clear() # réinitialiser le dictionnaire>>> d{}

DictionnaireChangements prévus dans Python 3.0

Inspirés de JavaNe plus retourner une liste après un appel

à .values(), .items(), .keys() mais une viewPlus léger, n’est pas un itérateurPermet de retirer un élément (pas d'ajouter ?)Supporte l'itération

=> les méthodes retournant un iterateur seront retirées iteritems(),...

Autres conteneurs

• Conteneur séquentiel d’éléments uniques non ordonnés – Classe Set (contenue dans le module sets)

• Conteneur FIFO synchronisé (thread safe)– Classe Queue

• Liste comprehension (sera implémenté par un generator dans Python 3.0)

>>> [str(i) for i in range(1,6)] # list comprehension['1', '2', '3', '4', '5']

Conteneurs• Les conteneurs peuvent être imbriqués• Par efficacité les conteneurs manipulent des

pointeurs sur les objets insérés• En cas de copie, seule une copie superficielle

(shallow copy) est souvent effectuée>>> l = [1,2,3]; ll = l; ll[1] = 42; l[1, 42, 3]

• La recopie en profondeur doit être explicite>>> l = [1,2,3]; ll = l[:]; ll[1] = 42; l[1, 2, 3]

• Dans le cas d’objets complexes, la recopie est à la charge du développeur

Itérateurs

• Tous les conteneurs séquentiels peuvent être itérés– list, tuple, dict, …– Exemple :

for i in [1,2,3,4]print i

– Remarque: la suppression d’un élément sur une séquence itérée invalide silencieusement l’itérateur

Itérateurs• Classe dont les instances sont itérables

class MyList(object): def __init__(self, l): self.l = l self.index = 0 def __iter__(self): return self def next(self): if self.index == len(self.l): raise StopIteration try: return self.l[self.index] finally: self.index += 1

Itérateurs• Itérer (consommer)

– Méthode classiquefor i in MyList([0,1,2]): print I

– Strictement equivalent à (principe réalisé en interne)it = iter(MyList([0,1,2])) # délégue à __iter__()while True: try: print it.next() except StopIteration: break

– Sortie dans les deux cas :012

– Remarque : faire un itérateur infini sans StopIteration

Exceptions• Lever une exception

raise Exception()

• Attraper une exception (à la manière Python 2.5) try: # code susceptible de déclencher une exception except Exception(), err: # ou tout type hérité de Exception # code de traitement de l’exception

print err # affiche le message d’erreur # peut attraper d’autres types d’exceptions # avec de nouvelles clauses ‘except’ else: # exécutée si la partie critique n’a pas lever une exception finally: # partie exécutée dans tous les cas

ExceptionsHiérachies des exceptions (Python 2.5)

BaseException|- KeyboardInterrupt|- SystemExit|- Exception |- (all other current built-in exceptions)

Modules

• Importer un module (équivalent d’une librairie)

>>> import sys # importer tout un module>>> sys.path # import cherche les modules dans ces répertoires['', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2',

'/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/gst-0.10', '/var/lib/python-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0', '/var/lib/python-support/python2.5/gtk-2.0', '/usr/lib/site-python']

>>> from foo import bar # n’importe pas tout le module foo # mais seulement bar

• Import relatifs (fonctionnalité introduite dans python 2.5)

Modules

• La librairie standart est installée dans :– /usr/lib/python2.{3,4,5}

• Les modules non standarts :– /usr/lib/python2.{3,4,5}/site-packages/

• Outils pour construire des packages (équivalent de ant pour java)

– distutils, Python Eggs (produit .egg)

Domaines avancés

• Appeler du code C à partir du code python– Améliorer les performances de sections critiques– S’interfacer avec des librairies C

• Comment créer le « glue » code ?– « à la main »– Utiliser un générateur de code : swig

• Génère beaucoup de code mais est assez performant

Domaines avancés

• Pour la culture, çà existe– Meta-classes – Programmation fonctionnelle

• Lambda (fonction anonyme)>>> filter(lambda x: True if x > 42 else False, [1,84,-42,45,42])[84, 45]

• Application partielle (Python 2.5) def add(x,y): return x+y plus_un = functools.partial(add, y=1) >>> plus_un(41) 42

• Fonctions : map, reduce, filter, sum, all, any, zip, enumerate

Domaines avancésGénérateurs (Python 2.4, 2.5)

Mot clef ‘yield’Décorateurs (Python 2.4)

@decoratordef foo(…)

[…]Instruction ‘with’ (Python 2.5)

Particulièrement utile pour la manipulation des fichiers et pour les locks

Personnalisable pour ses propres objets

Le module itertools

Futur

• Court terme (06/07) : Python 2.6– Continuité de la branche 2.x– Transition avec Python 3.0 (ajout de warnings)

• Moyen terme (06/08) : Python 3.0– Changements incompatibles/importants

• Un outil (best effort) doit être écrit pour convertir les incompatibilités contenues dans les anciens codes

– …mais pas trop (éviter l’effet Perl 6)

Autres interpréteurs Python

• Version officielle : CPython (http://www.python.org)

– Financé par Google (humour )• Pypy : python en python (http://codespeak.net/pypy/)

– Financé par l’UE

• IronPython : interpréteur en C# pour Visual .net– Financé par Satan (humour ?)

• JPython : interpréteur python en Java (http://www.jython.org/)

Propagande

• YouTube.com est écrit en Python• Python est un des 3 langages officiels chez

Google (avec Java et C++)• Django est capable de rivaliser avec RoR• Forte communauté, en particulier sous Linux,

de nombreuses librairies, souvent de bons niveaux

• Utilisé pour les jeux, le calcul numérique, le dév. Web, la prog. système, …

Liens utiles• Plonger dans python (peut donner des exemples de code à lire) : http://

www.diveintopython.org/• Tutoriel (notions de bases) : http://docs.python.org/tut/tut.html• Documentation de la bibliothèque standart (ressource vitale):

http://docs.python.org/lib/lib.html• Recettes (contient de bonnes surprises) :

http://aspn.activestate.com/ASPN/Python/Cookbook/• Livres (dans l’idéal commencer par çà) : Learning Python (M. Lutz)• Répertoire de packages (plutôt que de coder tout un module soi-même) :

http://python.org/pypi• PEPs (mine d’information) : http://www.python.org/dev/peps/ chaque

nouvel idiome du langage fait l’objet préalable d’un draft• Wiki (moyen) : http://wiki.python.org/moin/• Autres sources : mailing lists, blog de GvR, et des autres core

developpeurs

Quelques PEPs utiles• Ecrire du code à la « norme » officielle :

http://www.python.org/dev/peps/pep-0008/• WSGI (Web Server Gateway Interface) :

http://www.python.org/dev/peps/pep-0333/• Eléments du langage à éviter pour rester compatible avec les anciennes

versions de CPython : http://www.python.org/dev/peps/pep-0291/• Peps traitant des nouveautés dans python 2.5 :

http://docs.python.org/whatsnew/whatsnew25.html• Architecture interne du compilateur :

http://www.python.org/dev/peps/pep-0339/