Historique
• Langage relativementrécent, développé au
début des années 1990 par Guido Von
Rossum (GvR)
•Statut : BDFL (Benevolent Dïctator For Life)
3.
Principales caractéristiques
• Langageinterpré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
3 LOAD FAST
6 BINARY ADD
7 LOAD CONST
10 BINARY ADD
11 RETURN VALUE
0
(a)
1
(b)
1 (42)
4.
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
• Exemple
>>> a = 42; print a; a = 'foo'; print a ;
42
5.
Principales caractéristiques
— Typagedynamique (à 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 <moduIe>
File "<stdin>", line 2, in fun
6.
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 Ioin (diapo. sur les Classes)
7.
• Exemple :
deff(a,b=3):
if a:
return a + b
Fonctions
f(2)
f(2, 42)
f(0)
f(0,42)
# retourne 5
# retourne 44
# retourne None
# 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
8.
ncti
ns
Pas de déclarationde 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
9.
Surprenant au premierabord
—N'encourage pas l'utilisation d'accesseurs (regarder du côté
des descrïptors)
—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
10.
-
-”
”
” Clas”ses
• Pasde notions de classe abstraite
• Héritage multiple (à la c++), depth-fïrst,
left- to-right
• Les méthodes sont toutes virtuelles
• Attrïbuts de classe
• Méthodes statiques
• Fonctïon super(), pour référer à la classe
parente
11.
• Exemple 1:
class Test(object):
t
CCt
mmentaire' t
def init (self, a):
self. a = a
def meth(self):
return self. a * 42
def Astra(self):
return str(self.
a)
print 'type de Test:',
type(Test)
c = Test(2)
print tappeI de la
methode
str
12.
sundae:”/Desktop$ python test.py
typede Test: <type 'type’>
appel de la methode str
(): 2 type de c:
<cIass ' main .Test'>
attributs de c: [’ class ’,
delattr ', ' dict ’, '
doc
3
getattribute ', ' hash ’, init ’, ' module t new
reduce ', ' reduce ex ’, repr ', ' setattr ’,
str
weakref ', a', 'meth']
appel de methode:
84 nouvel attribut: 42
introspection: 84
— Que contient
l‘attribut
13.
• Exemple 2(héritage, self-modication):
class A(object):
pass
class 8(A):
pass
class C(object):
pass
print B. bases #
(1) B. bases +=
(C,) print B.
bases # (2)
Résultats :
(<cIass main .A>,) #
(1) (<cIass main .A>,
<cIass
main .C>) # (2)
14.
• Exemple 3(surcharge d'opérateurs):
class Mylnt(object):
del init
(self, i):
self.i = i
def paddy(self,
rhs):
return Mylnt(self.i
+ rhs.i)
def astro(self):
return str(self.i)
un = MyInt(1)
deux = MyInt(2)
trois = un + deux
print trois
sundae:"/Desktop$ python myint.py
15.
• Conteneur séquentielnon
mutable
• Ensemble ordonné d'éléments
—Pas forcément constants
—Exemples :
a (1,2,3)
a[1]
a[0] 4
# instancie un nouveau tuple
# retourne 2
# interdit
a..append(42) # faux
b. a + (4,) # recopie complète de a
dans b
16.
• Conteneur séquentielmutable
• Exemple
>>> I = [1,42] # liste de 2 éléments
# Rem: le type des élts n'est pas forcément
homogène
>>> len(I) # longeur de la liste
2
>>> I.append(4) # insérer un élément à la fin de la liste
>>> I
[1, 42, 4]
>>> I.sort() # ordonner la liste,
# compare les élts 2 à 2, avec la méthode
emp
()
>>> I d pour éviter que I ne soit modifiée, utiliser sorted()
17.
Liste
>>> 1[o:z] #retourne une sous-
liste
1 41
>>> 1[-i] # plus efficace que l[len(l)-i]
4
>>> 1.remove(4) *
* retirer un élt se base sur l'op d'égalité structurelle
# au travers de la méthode eq ()
>>> del 1[o] # suppression par position
>> l
18.
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
19.
>>> del d[2]# supprimer un élément en fonction de sa clef
>> d
Î*• 3• 4]
>>> d.values() # retourne la liste des valeurs
>>> d.items() # retourne la liste des couples (clef, value)
1(' 1') (3 '3') (4 4)s
>>> d 6] # retourne une exception en cas de clef erronée
Tracebacl‹ (most recent call last):
File "<stdin>", line i, in <module>
KeyError: 6
>>> d.get(6) # retourne None
20.
icti nnaire
”
>>> 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 oxb7sb976o>
for k,v in d.iteritems(): # itérer sur les couples d'items, ordre des
éléments non garanti
print k, v
11
33
4 4
>>> sorted(d.iterkeys()) # liste ordonnée des lieys
[*• *• 3]
>>> d.clear() # réinitialiser le dictionnaire
21.
Dictionnair
eChangements prévus dansPythOn 3
• 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(),...
22.
-
-”
”
” Autre's
con”teneurs
• Conteneursé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(ï) for ï ïn range(1,6)]
# list comprehension
['1', '2', '3', '4', '5']
23.
Contene-urs
• Les conteneurspeuvent ê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
>>> I = [1,2,3]; ll = I; ll[1] = 42;
I [1, 42, 3]
• La recopie en
profondeur
doit être explicite
>>> I = [1,2,3]; II = I[:]; II[1] =
42; I
(1, 2, 3]
24.
Itérateurs
• Tous lesconteneurs 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
25.
—
—I
——
—
—
” Iterateurs
• Classedont les instances sont itérables
class MyList(object):
def init
(self, I):
self.I = I
self.indeX = 0
def
iter
(self):
return self
def neKt(self):
if self.index
len(self.I):
raise
Stoplteratio
n
26.
—
—
1
——
—
—
” Iterateurs
• Itérer(consommer)
—Méthode classique
for i in
MyList([0,1,2]):
print I
—Strictement
equivalent à
(principe réalisé
en ïnterne)
it = iter(MyList([0,1,2])) # délégue à
iter () while True:
try:
print it.neKt()
eKcept Stoplteration:
break
—
27.
• Lever uneexception
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:
Exceptions
28.
Exce
ns
Hiérachies des exceptions(Python • s)
BaseException
- Keyboardlnterrupt
- SystemExit
Exception
(all other
current
built in
exceptio
ns)
29.
• Importer unmodule (équivalent
d'une
librairïe)
>>> import sys # importer tout un module
>>> sys.path # import cherche les modules dans ces
répertoires
[", '/usr/Iib/python25.zip', '/usr/Iib/python2.5', '/usr/Iib/python2.5/plat-linux2',
'/usr/Iib/python2.5/Iib-tk', '/usr/Iib/python2.S/Iib-dynIoad',
'/usr/local/Iib/python2.5/site-packages', '/usr/Iib/python2.5/site-packages',
'/usr/Iib/python2.5/site-packages/Numeric', '/usr/Iib/python2.S/site-packages/gst-0.10',
'/var/Iib/python-support/python2.5', '/usr/Iib/python2.5/site-packages/gtk-2.0',
'/var/Iib/python-support/python2.5/gtk-2.0', '/usr/Iib/site-python']
>>> from foo import bar # n'importe pas tout le module foo
# mais seulement bar
• Import relatifs (fonctïonnalïté introduïte dans python 2.5)
30.
• La Iïbrairiestandart est installée dans :
— /usr/Iib/python2.(3,4,5)
• Les modules non standarts :
- /usr/Iib/python2.(3,4,5}/site-packages/
• Outils pour construire des packages
(équivalent de
ant pour java)
— distutils, Python Eggs (produit .egg)
31.
-
-”
”
” Domaines””avancés
• Appelerdu 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 maïs est assez performant
32.
Domaines avancés
Pour laculture, çà existe
—Meta-classes
—Programmation fonctionnelle
• Lambda (fonction anonyme)
>>> fiIter(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.pa
rtial(add, y—
1)
>>> plus
un(41)
42
33.
Domaines avancés
• Générateurs(Python z 4, 2.s)
• Mot clef‘yield'
• Décorateurs (Python z.4)
@decorator
def foo(...)
• Instruction ‘with’ (Python 2 )
• Particulièrement utile pour la manipulation des fichiers et pour
les locks
• Personnalisable pour ses propres objets
• Le module itertools
34.
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 écrït pour convertïr
les incompatibilités contenues dans les anciens
codes
—...mais pas trop (éviter l'effet Perl 6)
35.
Autres interpréteurs Python
•Version officielle : CPython (
—Financé par Google (humour )
• Pypy : python en python (
—Financé par l'UE
• IronPython : interpréteur en C# pour Visual .net
—Financé par Satan (humour ?)
• JPython : interpréteur python en Java
()
36.
• YouTube.com estécrit en Python
• Python est un des 3 langages officiels
chez Google (avec Java et C++)
• Django est capable de rivalïser 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, ...
37.
• Plonger danspython (peut donner des exemples de code à lire)
• Tutoriel (notions de bases)
• Documentation de la bibliothèque standart (ressource vitale):
• Recettes (contient de bonnes surprises)
• 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):
chaque
• PEPs (mine d'information):
nouvel idiome du langage fait l'objet préalable d'un draft
• Wiki (moyen):
• Autres sources . mailing lists, blog de GvR, et des autres core
developpeurs
38.
Que ues PEPs
utiles
•Ecrire du code à la « norme » officielle :
• WSGI (Web Server Gateway Interface):
• Eléments du langage à éviter pour rester compatible avec les
anciennes versions de CPython
• Peps traitant des nouveautés dans python 2.5
• Architecture interne du compilateur :