Introduction à Python sebastien.martini@gmail.com 14/03/2007.

Slides:



Advertisements
Présentations similaires
Formation universitaire à .NET: Introduction à C#
Advertisements

Cours n° 7 Standard Template Library II.
Introduction au langage C++
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Intiation python, avril 2003 introduction Présenter Python –simplicité –utilisation pratiques Conserver cette info en ligne Susciter des échanges à lIrcam.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Cours n° 8 Conception et Programmation à Objets
12/10/2000Cédric Bertho - Comparaison entre Perl et Python1 vs Comparaison.
Approfondissement du langage
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Programmer en JAVA par Tama
Outils de développements
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Leçon 3 : Héritage IUP 2 Génie Informatique
CPI/BTS 2 Programmation Web Introduction au PHP
Structures collectives en Java
Structures de données linéaires
OCaml - Les listes L3 MI.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
POO-L3 H. Fauconnier1 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X(); //non xA[1]=new Z(); //non Object XX[]int[] YZY[]Z[]
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Python La programmation objet
Introduction à la programmation (Java)
Structures de données IFT-2000
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Formation Python Modules (d'après "Learning Python", de Mark Lutz)
Ensembles Définition d’un ensemble. Opérations sur les ensembles. Accès, suppression et ajout d’éléments d’un ensemble. Fonctions permettant de manipuler.
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Présentation Structures de Données et TDA
CSI2520, Hiver 2007 Python Un langage de programmation par scripting et plus…
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Chapitre 9 Les sous-programmes.
Types de données abstrait et mécanismes d'encapsulation
COURS DE PROGRAMMATION ORIENTEE OBJET :
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Structures de données IFT-10541
Modules et packages Modules, fichiers, chemin d’accès à un module, espaces de noms, importation de modules ou d’attributs de modules, packages, exemples.
Structures de données IFT-2000
Héritage et composition
Programmation Système et Réseau (sous Linux)
JavaScript Nécessaire Web.
La notion de type revisitée en POO
JavaScript.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Créer des packages.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
ETNA – 1ème année Guillaume Belmas –
ISBN Chapitre 10 L'implémentation des sous- programmes.
CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
PHP5 objet "avancé" Jérôme CUTRONA 09:56:48 Programmation Web
1 PHP 5 Notions fondamentales (niveau 1 – cours #2) Formation continue – Cégep de Sainte-Foy.
Fichier=open('monfichier.txt','w') >>> fichier.write('bonjour\n') 8 >>> liste ['le chien', 'le chat', 'le loup'] >>> for s in liste: fichier.write(s+'\n')
Initiation au JavaScript
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Correction du TD Chapitre 3.
Master 1 SIGLIS Jave Lecteur Stéphane Tallard Chapitre 5 – Correction TD.
Transcription de la présentation:

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 : pass else print ‘bar’ Utiliser un mode python Dynamique Pas de déclaration de variables >>> a = 42; print a; a = 'foo'; print a ; 42 foo

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 fun TypeError: 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 : Définition d’une fonction par ‘def’ def f(a,b=3): if a: return a + b f(2) # retourne 5 f(2, 42) # retourne 44 f(0) # retourne None f(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

Fonctions Pas de déclaration de type des arguments ni de la valeur de retour Duck 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__():', c print 'type de c:', type(c) print 'attributs de c:', dir(c) print 'appel de methode:', c.meth() c.nouvel_attribut = 42 print 'nouvel attribut::', c.nouvel_attribut print 'introspection:', getattr(c,'meth')

Classes sundae:~/Desktop$ python test.py type de Test: <type 'type'> appel de la methode __str__(): 2 type 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: 84 nouvel attribut: 42 introspection: 84 Que contient l’attribut __doc__ ?

Classes Exemple 2 (héritage, self-modication) : class A(object): pass class B(A): class C(object): 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 + deux print trois sundae:~/Desktop$ python myint.py 3

Tuple Conteneur séquentiel non mutable Ensemble ordonné d’éléments Pas forcément constants Exemples : a = (1,2,3) # instancie un nouveau tuple a[1] # retourne 2 a[0] = 4 # interdit a.append(42) # faux b = 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 liste 2 >>> 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] # 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 {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ée Traceback (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, v 1 1 3 3 4 4 >>> sorted(d.iterkeys()) # liste ordonnée des keys [1, 2, 3] >>> d.clear() # réinitialiser le dictionnaire >>> d {}

Dictionnaire Changements prévus dans Python 3.0 Inspirés de Java Ne plus retourner une liste après un appel à .values(), .items(), .keys() mais une view Plus léger, n’est pas un itérateur Permet 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 classique for 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 : 1 2 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

Exceptions Hié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és Générateurs (Python 2.4, 2.5) Mot clef ‘yield’ Décorateurs (Python 2.4) @decorator def 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/