Vous êtes sur la page 1sur 57

INTRODUCTION AU LANGAGE

PYTHON

Pierre Puiseux, Universit de Pau et des Pays de l'Adour


pierre.puiseux@univ-pau.fr

www.univ-pau.fr/~puiseux
Ce document reprend en trs grande partie le tutoriel de Guido Van Rossum [VR].
Quelques modications et simplications y sont apportes.
Rsum.

Janvier 2010

Python

Pierre Puiseux

1. Introduction

Python est developp depuis 1989 par Guido van Rossum et de nombreux contributeurs.
Un classement des langages de programmation les plus populaires, par

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
The ratings are calculated by counting hits of the most popular search engines. The search
query that is used is +"<language> programming". The search query is executed for the
regular Google, Google Blogs, MSN, Yahoo !, Wikipedia and YouTube web search for the last
12 months.
2009

2010

Langage

Ratings Jan 2010

delta

Java

17.482%

-1.54%

16.215%

+0.28%

PHP

10.071%

+1.19%

C++

9.709%

-0.41%

(Visual) Basic

7.354%

-1.81%

C#

5.767%

+0.16%

Python

4.453%

-0.28%

Perl

3.562%

-0.74%

JavaScript

2.707%

-0.65%

11

10

Ruby

2.474%

-0.67%

10

11

Delphi

2.392%

-0.91%

37

12

Objective-C

1.379%

+1.24%

13

Go

1.247%

+1.25%

14

14

SAS

0.809%

+0.01%

13

15

PL/SQL

0.718%

-0.29%

18

16

ABAP

0.641%

+0.10%

15

17

Pascal

0.624%

-0.04%

23

18

Lisp/Scheme

0.576%

+0.14%

20

19

ActionScript

0.566%

+0.11%

24

20

MATLAB

0.540%

+0.11%

A noter : le succs improbable du langage go (Google) runissant les avantages de C++ et

Python, vitant les cueils de C++ et de Python.

1.1. Caractristiques du langage

B
B

langage qui volue version 3

Python .

logiciel libre, licence PSF (Python Software Foundation), GPL-compatible

perrne,

ouvert

B portable (Mac OS, Linux, Unix, Windows...) universalit


B une librairie standard trs fournie voir http://docs.python.org/library/
B nombreuses extensions et paquetages (Qt, VTK, SQL...) puissance
B inter-oprable, extensible (avec Fortran, Java, C, C++...) extensions
B Jython, est crit en Java et gnre du bytecode Java
B refcounting Garbage Collector gestion mmoire par comptage de rfrences

(sans

intervention du programmeur)

Pas de pointeurs explicites en Python )

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Fig. 1.1. Popularit des dirents langages

B
B

(optionnellement) multi-thread
orient-objet

I
I
I
B
B

rutilisable

hritage multiple
surcharge des oprateurs
toutes les mthodes sont virtuelles

systme d'exceptions
dynamique

gestion des erreurs simplie

la fonction eval() peut valuer des chanes de caractres reprsentant des

expressions ou des instructions Python

typage dynamique tout objet possde un type bien dnit l'excution, qui n'a pas
besoin d'tre dclar l'avance.

B
B
B
B
B

un petit nombre de concepts sut engendrer des constructions trs riches


delattr(), getattr()).
introspectif debugger ou le proler, sont implants en Python lui-mme
L'utilisation de la fonction property() permet de simuler les variables prives.
Facile utiliser et apprendre, intuitif pdagogie

orthogonal
rectif

supporte la mtaprogrammation, (setattr(),

1Wikipedia : un thread ou processus lger, galement appel l d'excution (autres appellations connues :
unit de traitement, unit d'excution, l d'instruction, processus allg), est similaire un processus car tous
deux reprsentent l'excution d'un ensemble d'instructions du langage machine d'un processeur. Du point de
vue de l'utilisateur, ces excutions semblent se drouler en parallle. Toutefois, l o chaque processus possde
sa propre mmoire virtuelle, les threads d'un mme processus se partagent sa mmoire virtuelle. Par contre,
tous les threads possdent leur propre pile d'appel.
UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

B
1.2.

B
B
B
B

Python

Langage interprt (et compil)

Python

Pierre Puiseux

dveloppements rapides

pourquoi faire ?

Calculatrice vectorielle volue


Traitements de chiers texte
scripts, ou commandes

unix

pour traitements de chiers par lot par exemple.

Langage "glue" pour enchaner les traitements par dirents programmes. Par exemple un mailleur produit un maillage, repris par un code lments nis pour simulation
numrique, dont les rsultats sont leur tour exploits pour visualisation.

Ergonomie, interface homme machine : la plupart des bibliothques de "widgets" (qt,

wxwidget, tk,

UPPA

...) sont interfaces pour

Python.

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

1.3. Excution d'un programme

B
B
B

en ligne de commande

Python

Pierre Puiseux

. Trois mode d'excution :

par chier module, ou scripts Python


par script Unix

1.3.1. Excution en ligne de commande. lancer la commande

Python

en mode interactif (ou

calculatrice de luxe), depuis une console :

$ python
>>>
le prompt de

ipython

Python

est

>>>

ou bien

...

lorsque Python attend une suite.

propose quant lui

In [n] :
pour les entres et

Out [n+1] :
pour les sorties, n tant le numro de l'instruction.
pour quitter

Python

ctl-d

>>> import sys #importez le module sys :


>>> sys.argv #consultez le contenu de la variable sys.argv:
Les lignes de continuation sont ncessaires lorsqu'on saisit une construction sur plusieurs lignes.
Comme exemple, voici une instruction

if

>>> le_monde_est_plat = 1
>>> if le_monde_est_plat :
... print " G a f f e p a s t o m b e r p a r d e s s u s b o r d ! "
...
1.3.2. Excution de chiers de modules. On peut sauvegarder un programme excutable dans
un chier module

toto.py,

import sys
print " L e s a r g u m e n t s s o n t : " , sys . argv
puis excuter ce programme en invoquant

Python, suivi du nom du chier et de paramtres :

puiseux@iplmap109:~$ python toto.py -i escalade -o Ossau


[ ' toto .py' , ' i' , ' escalade ' , ' o', 'Ossau']
1.3.3. Excution de scripts Unix. dans ce cas, le programme excutable est plac dans un
chier script Unix, c'est dire un chier dont la premire ligne indique quel interprteur doit
tre utilis. Ici, l'interprteur est Python, bien sur. Par exemple, le script Unix

Ossau.py

# !/ usr / bin / python


# -*- coding : utf -8 -*import sys
print u " L e z a r g u m e n t s : " , sys . argv

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

sera rendu excutable, puis excut directement :

puiseux@iplmap109 :~$ chmod +x Ossau.py


puiseux@iplmap109 :~$ ./Ossau.py -i SudEst -o TD
[ ' ./Ossau.py' , ' i' , 'SudEst' , ' o', 'TD']

1.3.4. Les diteurs et environnements Python.

Ligne de commande python

Fig. 1.2. Python en ligne de commande

B ipython

est une interface l'interprteur Python orant de nombreuses facilits dont

une compltion automatique ecace.

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Fig. 1.3. ipython

B bpython

galement

Fig. 1.4. bpython

B idle est

un l'environnement complet de programmation Python, crit en Python

tkinter

par Van Rossum lui-mme

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Fig. 1.5. idle

B eclipse+PyDev

le plus abouti

Fig. 1.6. Pydev

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

B Eric
B etc...
1.4. O trouver la documentation ? La documentation Python est trs riche et plutt
bien organise.
(1) Le document de base est
(a)
(b)

http://docs.python.org

et surtout

http://docs.python.org/tutorial
http://docs.python.org//library/index.html

(2) Une bonne entre en matire pour comprendre les concepts :http://diveintopython.

org/

(3) Pour un rsum trs complet :


(a)
(b)

http://rgruet.free.fr/#QuickRef
http://www.python.org/doc/QuickRef.html

1.5. Exercices.
(1) Trouver dans la documentation la fonction

input()

et testez cette fonction.

(2) Que signie PEP pour un programmeur Python averti ?


(3) On suppose que vous avez crit une classe

MonObjet.

Quelle mthode de cette classe

devez-vous dnir pour pouvoir additionner (c'est dire utiliser l'oprateur d'addition)
deux instances de

MonObjet

ainsi :

a = MonObjet(1)+MonObjet(2)

UPPA

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

2. Python comme calculatrice


Ouvrez une session Python puis testez, jouez avec les instructions suivantes :
2.1. Commentaires.

# voici le premier commentaire


SPAM = 1 # et voici le deuxime commentaire
# ... et maintenant un troisime !
STRING = "# C e c i n e s t p a s un c o m m e n t a i r e . "
2.2. Nombres, oprations.

>>> 2+2
>>> (50 -5*6)/4
>>>
>>>
>>>
>>>

# La division des entiers retourne l ' entier immdiatement infrieur


7/3 # Attention
7/ -3
7%4

>>>
>>>
>>>
>>>
>>>
>>>

# Le signe =
largeur = 20
hauteur = 5*9
largeur * hauteur
x = y = z = 0 # Mettre zro x , y et z
x ,y ,z = 0 ,0 ,0

>>> # Nombres virgule flottante , conversions


>>> 3 * 3.75 / 1.5
>>> 7.0 / 2
2.3. Complexes.

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

UPPA

1j * 1J
1 j * complex (0 ,1)
3+1 j *3
(3+1 j )*3
(1+2 j )/(1+1 j)
a = 1.5+0.5 j
a . real
a . imag
abs (a )

10

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

2.4. La variable _.

>>>
>>>
>>>
>>>

tva = 12.5 / 100


prix = 100.50
prix * tva
prix + _

2.5. Chanes de caractres.

simples quotes (apostrophes) ou doubles quotes (guillemets) ou triples guillemets :

>>> ' spam e g g s '


>>> ' n \ ' e s t c e p a s '
>>> " n ' e s t c e p a s "
>>> ' " Oui , " d i t i l . '
>>> " \" Oui , \ " d i t i l . "
>>> ' "N\ ' e s t c e pas , " r e p o n d i t e l l e .
>>> u ' Pour une c h a n e c o n t e n a n t d e s
. . . p r f r e z l e type unicode '
>>> salut = u " " " C e c i e s t une c h a n e
plusieurs
l i g n e s de t e x t e e x a c t e m e n t
N o t e z que l e s b l a n c s au d b u t de
sont s i g n i f i c a t i f s . """
>>> print salut
B

'
c a r a c t r e s non a s c i i , \
unicode plutot longue contenant
l a l i g n e e t l e s s a u t s de l i g n e

Les chanes peuvent tre concatnes (accoles) avec l'oprateur +, et rptes avec * :

>>> word = ' H e l p ' + 'A '


>>> '< ' + word *5 + '> '
B

Pas de type caractre (char) : un caractre est simplement une chane de taille un.

>>> type ( ' a ' )


>>> type ( " a a a " )
B

Les chanes peuvent tre dcomposes (indexes) le premier caractre d'une chane est
en position 0.

>>>
>>>
>>>
>>>
B

mot = ' HelpA '


mot [4]
mot [0:2]
mot [2:4]

Valeurs d'index par dfaut

>>> mot [:2] # Les deux premiers caractres


>>> mot [2:] # Tout sauf les deux premiers caractres
UPPA

11

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Voici un invariant utile des oprations de dcoupage :

s[:i] + s[i:]==s

>>> mot [:2] + mot [2:]


>>> mot [:3] + mot [3:]
B

Gestion des indices de dcoupage errons :

>>> mot [1:100]


>>> mot [10:]
>>> mot [2:1]
B

Les indices peuvent tre des nombres ngatifs, pour compter partir de la droite.

>>> mot [ -2] # Lavant dernier caractre


>>> mot [ -2:] # Les deux derniers caractres
>>> mot [: -2] # Tout sauf les deux derniers caractres
B

Que retourne la fonction intgre

len() ?

>>> len(' anticonstitutionnellement ' )


2.6. Listes.

Une liste de valeurs (lments) entre crochets et spars par des virgules. Les lments
d'une liste nont pas ncessairement le mme type.

>>> a = [ ' spam ' , ' e g g s ' , 100 , 1234]


>>> a
B

Comme les indices des chanes, les indices des listes commencent

0, et les listes peuvent

tre dcoupes, concatnes, et ainsi de suite :

>>>
>>>
>>>
>>>
>>>
>>>
B

a [0]
a [3]
a [ -2]
a [1: -1]
a [:2] + [ ' b a c o n ' , 2*2]
3* a [:3] + [ ' Boe ! ' ]

A la dirence des chanes, qui sont non-modiables, il est possible de changer les lments individuels d'une liste

>>> a [2] = ' '


>>> a
B

l'aectation dans des tranches est aussi possible, et cela peut mme changer la taille de
la liste :

UPPA

12

Laboratoire de Mathmatiques Appliques

Janvier 2010

>>>
>>>
>>>
>>>
B

Python

Pierre Puiseux

a [0:2] = [1 , 12]
a [0:2] = []
a [1:1] = [ ' b l e t c h ' , ' x y z z y ' ]
a [:0] = a # Insre ( une copie de ) soi - mme au dbut

La fonction intgre

len()

s'applique aussi aux listes :

>>>len(a)
B

Il est possible d'emboter des listes (crer des listes contenant dautres listes), par exemple :

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

q = [2 , 3]
p = [1 , q , 4]
len (p )
p [1]
p [1][0]
p [1]. append ( ' x t r a ' )
p
q

Notez que dans l'exemple prcdent,

p[1]

et

se rfrent rellement au mme objet ! Nous

reviendrons plus tard sur la smantique des objets.


2.7. Dictionnaires. fonctionne par couple (cl :valeur)
Voici un petit exemple utilisant un dictionnaire :

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

tel = { ' j a c k ' : 4098 , ' s a p e ' : 4139}


tel [ ' g u i d o ' ] = 4127
tel
tel [ ' j a c k ' ]
del tel [ ' s a p e ' ]
tel [ ' i r v ' ] = 4127
tel
tel . keys ()
tel . values ()
tel . items ()
tel . has_key ( ' g u i d o ' )
tel . pop ( ' g u i d o ' )

2.8. Premiers pas vers la programmation. Bien sr, nous pouvons utiliser Python pour
des tches plus compliques que d'ajouter deux et deux. Par exemple, nous pouvons crire
une sous-squence de la suite de Fibonacci de la faon suivante :

>>>
...
...
>>>
...

# Suite de Fibonacci
# La somme de deux lments dfinit le suivant
a , b = 0, 1
while b < 10:
print b

UPPA

13

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

... a , b = b , a+b
Cet exemple introduit plusieurs fonctionnalits nouvelles.

La premire ligne contient une aectation multiple : les variables


tanment les nouvelles valeurs

B
B

et

1.

et

prennent simul-

Les expressions en partie droite sont d'abord toutes values avant toute aectation.
La boucle

I
I
I
I
I

while

s'excute tant que la condition (ici :

b < 10)

reste vraie. En Python,

toute valeur entire dirente de zro est vraie ;


zro est faux.
N'importe quoi avec une longueur dirente de zro est vrai,
les squences vides correspondent faux.
Le test utilis dans l'exemple est une simple comparaison. Les oprateurs de comparaison standard sont :

<, >, ==, <=, >=

et !=.

Le corps de la boucle est indent : l'indentation est le moyen par lequel Python regroupe
les instructions.

l'instruction

print

crit la valeur de la ou des expressions qui lui sont donnes. Elle

accepte plusieurs expressions et chanes. Une virgule nale empche le retour chariot
aprs l'achage :

>>>
>>>
...
...
...

a , b = 0, 1
while b < 1000:
print b ,
a , b = b , a+b

2.8.1. Une premire fonction. On peut faire de la suite d'instructions prcdente une fonction
qui renvoit le n-me terme de la suite :

>>> def Fibonacci (n ):


...
a ,b = 0 ,1
...
for i in range (n ) : a ,b = b , a+b
...
return b
...
>>> [ Fibonacci ( i) for i in range (8)]
2.9. Exercices.
Exercise 1. Utiliser une boucle

while,

type() pour dterminer la


n N : M + 1 = 2n . Calculer M 2

la fonction

plus grand entier, en Python. Montrer que

Exercise 2. Quel est le plus petit rel strictement positif de la forme

Exercise 3. Quelle dirence y a-t-il entre les fonctions

input

et

valeur,

M,

du

2n , n N ?

raw_input ?

On pourra

tester les instructions suivantes :

UPPA

14

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

>>> x = input ()
3.14
>>> type ( x)
>>> x = raw_input ()
3.14
>>> type ( x)
>>> x = input ()
u ' Demain i l f a i t beau , j e v a i s l \ ' Ossau '
>>> x

UPPA

15

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

3. Plus de dtails sur...


Ce chapitre dcrit avec plus de dtail quelques lments que vous avez dj tudi, et ajoute
aussi quelques nouveauts.
3.1. ... les chanes de caractres.

Unicode

3.1.1.

de facilit :

B
B

Le type
Le type

et

str.

En Python3.x, le traitement des chanes de caractres volue vers plus

unicode de Python 2.x devient le type str de Python3 (standard)


str de Python2 devient le type byte de Python3 (obsolte)

(1) Python 2.x : ds que l'on doit manipuler des chanes de caractres contenant les caractres non-ASCII, il est conseill d'utiliser le type
la chane par la lettre

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

u.

unicode,

obtenu en faisant prcder

u =u ' '
u
print u , type ( u)
v= ' eb '
v
print v , type ( v)
u +v
# ouuups !
v =u ' e b '
u +v
# yes !

(2) En Python3 on crira plus simplement :

>>>
>>>
>>>
>>>
>>>
>>>
>>>

u =u ' '
u , print (u ), type (u)
v= ' eb '
type ( v), print (v )
u +v
# ok !
u =b ' a b c '
# le type byte de Python3 est le type str de Python2 . x
v =b ' ' # ouuups non ascii !

3.1.2. Mthode propres aux chanes de caractres.


Exercise 4. Que fait l'instruction

F=open('toto. csv ' )


[[[g.strip() for g in f.strip().split(';')] for f in e.strip().split('n')] for e in F.readli
F.close()

3.2. ... les entres et sorties.


3.2.1. Un formatage personnalis,

%, str()

et

repr().

Jusqu'ici nous avons rencontr deux

manires d'acher des valeurs : les instructions d'expression et l'instruction

print.2

Il y a deux manires de formater vos sorties ;

2(Une troisime manire est d'utiliser la mthode write() des objets chier ; le chier de sortie standard
peut tre rfrenc par sys.stdout. Voyez le manuel Library Reference pour plus d'informations.)
UPPA

16

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

(1) Manipulez vous-mme les chanes de caractres. Le module standard

string

contient

quelques oprations utiles pour remplir des chanes de caractres une largeur de
colonne donne. Pour convertir n'importe quelle valeur en chane de caractres : passezla la fonction

repr(),

ou

str()

(2) La deuxime manire est d'utiliser l'oprateur de formattage % :

format%variables
comme pour la fonction

sprintf()

du langage C. Cette forme retourne une chane de

caractres rsultant de cette opration de formatage.


La fonction

repr()

str()

pour renvoit des reprsentations faciles lire par les humains, alors que

est renvoit des reprsentations lisibles par l'interprteur. De nombreuses valeurs,

comme les nombres ou les structures comme les listes et les dictionnaires, ont la mme
reprsentation dans les deux fonctions. Les chanes et les nombres virgule ottante, ont
deux reprsentations distinctes.
Quelques exemples :

>>>
>>>
>>>
>>>

s = ' S a l u t , t o u t l e monde . '


str (s ), repr (s)
s
str (0.1)

>>> x ,y = 3.25 , 150


>>> print ' x=%f t a n d i s que y=%f ' %(x ,y)
>>> print ' x= ' + x + ' t a n d i s que y= ' + y
Convertir une chane ajoute des quotes de chane et des antislash :

>>> saluts = 'salut'


>>> print saluts
Exercise 5. crire une table des carrs et des cubes prsente comme suit :

0
1
2
3
4
5
6
7
8
9
10

0
1
4
9
16
25
36
49
64
81
100

0
1
8
27
64
125
216
343
512
729
1000

(Notez qu'un espace entre chaque colonne a t ajout cause de la faon dont

print

fonc-

tionne : elle ajoute toujours des espaces entre ses arguments.)

UPPA

17

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

3.2.2. Le module

string.

La fonction

Pierre Puiseux

string.ljust(),

justie droite une chane de carac-

tres dans un champ d'une largeur donne en la compltant avec des espaces du ct gauche.

>>> a = ' e e e '


>>> string . ljust (a ,2)
' eee '
>>> string . ljust (a ,20)
' eee '
>>> string . ljust (a ,20 , ' * ' )
' eee ***************** '
Il y a les fonctions semblables

string.ljust() et string.center(). Ces fonctions n'crivent

rien, elles renvoient juste une nouvelle chane de caractres. Si la chane de caractres d'entre
est trop longue, elles ne la tronquent pas, mais la renvoient sans changement ; cela gchera
votre prsentation de colonne mais c'est habituellement mieux que l'alternative, qui serait de
tricher au sujet d'une valeur. (Si vous voulez vraiment la troncature vous pouvez toujours
ajouter une opration de dcoupage, comme
Il y a une autre fonction,

string.ljust(x, n)[0 :n].)

string.zfill(), qui complte une chane de caractres numrique

du ct gauche avec des zros. Elle sait grer les signes positifs et ngatifs :

>>>
>>>
>>>
>>>

import string
string . zfill (12 , 5)
string . zfill ( -3.14 , 7)
string . zfill (3.14159265359 , 5)

L'utilisation de l'oprateur % ressemble ceci :

>>> import math


>>> print ' La v a l e u r de P I e s t a p p r o x i m a t i v e m e n t %5.3 f . ' % math . pi
La valeur de PI est approximativement 3.142.
S'il y a plus d'un descripteur de format dans la chane de caractres, vous devez passer un
tuple comme oprande de droite, comme dans cet exemple :

>>> table = { ' S j o e r d ' : 4127 , ' J a c k ' : 4098 , ' Dcab ' : 8637678}
>>> for nom , telephone in table . items ():
... print '%10s ==> %10d ' % ( nom , telephone )
...
La plupart des formats fonctionnent exactement comme en C et exigent que vous passiez le
type appropri.
3.2.3. Lire et crire des chiers.

open() renvoie un objet de type


open(nomfichier, mode).

chier, et est utilise plus

gnralement avec deux arguments :

>>> f = open ( ' / tmp / f i c h i e r t r a v a i l ' , w )


>>> print f
UPPA

18

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Le premier argument est une chane de caractres contenant le nom du chier. Le deuxime
argument est une autre chane de caractres contenant quelques caractres dcrivant la manire

mode vaut
B r quand le chier doit tre seulement lu,
B w pour seulement crit (un chier dj existant avec le mme nom sera eac),
B et a ouvre le chier en ajout ; les donnes crites dans le chier seront automatiquement

d'utiliser le chier.

ajoutes la n.

B r+

ouvre le chier pour la lecture et lcriture.

L'argument mode est facultatif ;

sera pris par dfaut s'il est omis.

3.2.4. Mthodes des objets chiers. On supposera qu'un objet chier appel
(1) Pour lire le contenu d'un chier, appeler

f a dj t cr.

f.read(taille), qui lit une certaine quantit


taille est omis

de donnes et les retourne en tant que chane de caractres. Quand


ou ngatif, le contenu entier du chier est lu et retourn

>>> f.read()
(2)

f.readline()

lit une seule ligne partir du chier ; un caractre de n de ligne (\n)

est laiss l'extrmit de la chane de caractres lue

>>> f . readline ()
Ceci est la premire ligne du fichier .\ n
>>> f . readline ()
Deuxime ligne du fichier \ n
>>> f . readline ()
(3)

f.readlines() renvoie une liste contenant toutes

les lignes de donnes dans le chier.

La liste retourne est entirement faite de lignes compltes.

>>> f . readlines ()
[ Ceci est la premire ligne du fichier .\n , Deuxime ligne du fichier \n]
(4) Une approche alternative est de boucler sur l'objet chier.

>>> for line in f:


...
print line ,
Ceci est la premire ligne du fichier .
Deuxime ligne du fichier
(5)

f.write(chaine)

crit le contenu de chaine dans le chier, en retournant

None.

>>> f.write(Voici un testn)


Pour crire quelque chose d'autre qu'une chane il est ncessaire de commencer par le
convertir en chane :

>>> value = ( the answer , 42)


>>> s = str ( value )
>>> f. write ( s)
UPPA

19

Laboratoire de Mathmatiques Appliques

Janvier 2010
(6)

Python

f.tell()

Pierre Puiseux

renvoie un nombre entier donnant la position actuelle, mesure en octets

depuis le dbut du chier. Pour changer la position, employez


(7)

f.seek(decalage,point_depart).

decalage
un point de rfrence ; le point de rfrence est choisi par l'argument point_depart.
Une valeur de 0 pour point_depart fait dmarrer au dbut du chier, 1 utilise la
position courante du chier, et 2 utilise la n de chier comme point de rfrence.
point_depart peut tre omis et prend alors 0 pour valeur par dfaut comme point de
La position est calcule en ajoutant

rfrence.

>>>
>>>
>>>
>>>
5
>>>
>>>
d
(8) Appeler

f= open (/ tmp / fichiertravail , r +)


f. write (0123456789 abcdef )
f. seek (5) # Saute jusquau 6 me octet dans le fichier
f. read (1)
f. seek ( -3 , 2) # Saute jusquau 3 me octet avant la fin
f. read (1)

f.close()

pour le fermer.

>>> f. close ()
>>> f. read ()
Les objets chier ont quelques mthodes supplmentaires, telles que

isatty() et truncate()

qui sont moins frquemment utilises ; consultez la Library Reference pour un guide complet
des objets chier.

3.2.5. Le module

pickle.

Pour lire et crire les nombres : la mthode

chane de caractres, qui devra tre convertie avec

int(),float()...

read()

renvoie une

Pour sauvegarder des types de donnes complexes (listes, dictionnaires, ...) : le module
standard appel

pickle convertit en chane de caractres presque n'importe quel objet Python :

ce processus s'appelle pickling .


Reconstruire l'objet partir de sa reprsentation en chane de caractres s'appelle unpick-

ling .

>>> f = open ( ' p i k . t x t ' , 'w ' )


>>> x =[1 ,2 ,3 , ' h e l l o ' ,1j]
>>> pickle . dump (x , f)
Pour  unpickler l'objet, si f est un objet chier ouvert en lecture :

>>> x = pickle.load(f)
UPPA

20

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

3.3. ... les listes. Le type de donnes liste possde dautres mthodes. Voici toutes les mthodes des objets listes :

append(x) : quivalent a.insert(len(a), x)


extend(L) : rallonge la liste en ajoutant la n tous les lments de la liste donne ;
quivaut a[len(a):] = L.
insert(i,x) : insre un lment une position donne. Le premier argument est l'indice
de l'lment avant lequel il faut insrer, donc a.insert(0, x) insre au dbut de la liste, et
a.insert(len(a), x) est quivalent a.append(x).
remove(x) : enlve le premier lment de la liste dont la valeur est x. Il y a erreur si cet
lment n'existe pas.

pop([i])

: enlve l'lment prsent la position donne dans la liste, et le renvoie. Si

aucun indice n'est spci,

a.pop()

renvoie le dernier lment de la liste. L'lment est aussi

supprim de la liste.

index(x)

: retourne l'indice dans la liste du premier lment dont la valeur est

x.

Il y a

erreur si cet lment n'existe pas.

count(x) : renvoie le nombre de fois que x apparat dans la liste.


sort() : trie les lments l'intrieur de la liste.
reverse() : renverse l'ordre des lments l'intrieur de la liste.

Example. Un exemple qui utilise toutes les mthodes des listes :

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

a = [66.6 , 333 , 333 , 1, 1234.5]


print a. count (333) , a . count (66.6) , a. count (x )
a . insert (2 , -1)
a . append (333)
a . index (333)
a . remove (333)
a . pop (1)
a . reverse ()
a . sort ()

UPPA

21

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

3.3.1. Utiliser les listes comme des piles. Les mthodes des listes rendent trs facile lutilisation
d'une liste comme une pile, o le dernier lment ajout est le premier lment rcupr
(LIFO,  last-in, rst-out ). Pour ajouter un lment au sommet de la pile, utilisez la mthode

append(). Pour rcuprer un lment du sommet de la pile, utilisez pop() sans indice explicite.
Example.

>>>
>>>
>>>
>>>
>>>
>>>
>>>

pile = [3 , 4, 5]
pile . append (6)
pile . append (7)
pile . pop ()
pile . pop ()
pile . pop ()
pile

3.3.2. Utiliser les listes comme des les. Vous pouvez aussi utiliser facilement une liste comme
une le, o le premier lment ajout est le premier lment retir (FIFO,  rst-in, rst-out ).
Pour ajouter un lment la n de la le, utiliser

devant de la le, utilisezpop(0) avec 0 pour indice.

append().

Pour rcuprer un lment du

Example.

>>>
>>>
>>>
>>>
>>>
>>>

file = [ " E r i c " , " John " , " M i c h a e l " ]


file . append ( " T e r r y " ) # Terry arrive
file . append ( " Graham " ) # Graham arrive
file . pop (0)
file . pop (0)
file

3.3.3. List Comprehensions. Les list comprehensions fournissent une faon concise de crer
des listes.

>>> fruitfrais = [ ' b a n a n e ' , ' m y r t i l l e ' , ' f r u i t de l a p a s s i o n ' ]


>>> [ projectile . strip () for projectile in fruitfrais ]
>>>
>>>
>>>
>>>

vec , vec1 =
[3* x for x
[3* x for x
[ v [0]* v [1]

3.3.4. l'instruction

del.

[2 , 4 , 6] ,[8 ,9 ,12]
in vec ]
in vec if x > 3]
for v in zip ( vec , vec1 )]

Il y a un moyen d'enlever un lment d'une liste en ayant son indice

au lieu de sa valeur : l'instruction

del.

Cela peut aussi tre utilis pour enlever des tranches

dans une liste (ce que l'on a fait prcdemment par remplacement de la tranche par une liste
vide). Par exemple :

>>> a =[ -1 , 1, 66.6 , 333 , 333 , 1234.5]


>>> del a [0]
>>> del a [2:4]
UPPA

22

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

del peut aussi tre utilis pour supprimer des variables compltes :

>>> del a
3.4. ... les tuples et squences. Un tuple consiste en un ensemble de valeurs spares par
des virgules, par exemple :

>>> t = 12345 , 54321 , ' s a l u t ! '


>>> t [0]
>>> t
les tuples peuvent tre imbriqus :

>>> u = t , (1 , 2, 3 , 4 , 5)
>>> u
Les tuples sont toujours entre parenthses.
l'instruction
ing) : les valeurs

t = 12345, 54321, 'salut !' est un exemple d'emballage en tuple (tuple pack12345, 54321 et ' salut ! ' sont emballes ensemble dans un tuple. l'opration

inverse ( dballage de tuple -tuple unpacking-)) est aussi possible :

>>> x, y, z = t
3.5. ... les ensembles. Python comporte galement un type de donnes pour reprsenter
des ensembles. Un set est une collection (non range) sans lments dupliqus. Les emplois
basiques sont le test d'appartenance et l'limination des entre dupliques. Les objets ensembles supportent les oprations mathmatiques comme l'union, l'intersection, la dirence et la
dirence symtrique. Voici une dmonstration succincte :

>>>
>>>
>>>
>>>
>>>
>>>
>>>

a
b
a
a
a
a
a

= set ( ' a b r a c a d a b r a ' )


= set ( ' a l a c a z a m ' )
|
&
^

b
b
b
b

3.6. ... les dictionnaires. Un autre type de donnes intgr Python est le dictionnaire. Les
dictionnaires sont indexs par des cls, qui peuvent tre de n'importe quel type non-modiable.
Les chanes et les nombres peuvent toujours tre des cls.
Il est prfrable de considrer les dictionnaires comme des ensembles non ordonns de couples (cl : valeur), avec la contrainte que les cls soient uniques ( l'intrieur d'un mme
dictionnaire).
Un couple d'accolades cre un dictionnaire vide :

{}.

Placer une liste de couples cl : valeur spars par des virgules l'intrieur des accolades
ajoute les couples initiaux (cl : valeur) au dictionnaire ; c'est aussi de cette faon que les
dictionnaires sont achs. Les oprations principales sur un dictionnaire sont :

B
B

le stockage d'une valeur l'aide d'une certaine cl et


l'extraction de la valeur en donnant la cl.

UPPA

23

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Il est aussi possible de dtruire des couples (cl : valeur) avec

La mthode

del.

keys() d'un objet de type dictionnaire retourne une liste de toutes les cls utilises

dans le dictionnaire, dans un ordre quelconque (si vous voulez qu'elle soit trie, appliquez juste
la mthode

sort() la liste des cls). Pour savoir si une cl particulire est dans le dictionnaire,
has_key() du dictionnaire.

utilisez la mthode

Voici un petit exemple utilisant un dictionnaire :

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

tel = { ' j a c k ' : 4098 , ' s a p e ' : 4139}


tel [ ' g u i d o ' ] = 4127
tel
tel [ ' j a c k ' ]
del tel [ ' s a p e ' ]
tel [ ' i r v ' ] = 4127
tel
tel . keys ()
tel . values ()
tel . items ()
tel . has_key ( ' g u i d o ' )
tel . pop [ ' g u i d o ' ]
for nom , num in tel . iteritems () : print nom , num

Le constructeur

dict()

construit des dictionnaires directement partir de listes de paires

cl-valeur ranges comme des n-uplets. Lorsque les paires forment un motif, les list list comprehensions peuvent spcier de manire compacte la liste de cls-valeurs.

>>> dict ([( ' s a p e ' , 4139) , ( ' g u i d o ' , 4127) , ( ' j a c k ' , 4098)])
>>> dict ([( x , x **2) for x in (2 , 4, 6)]) # use a list comprehension
Plus loin dans ce tutoriel nous tudierons les  expressions gnrateurs qui sont l'outil idal
pour fournir des paires cl-valeur au constructeur

dict().

Lorsque les cls sont de simples

chanes il est parfois plus simple de spcier les paires en utilisant des arguments mot-cl :

>>> dict ( sape =4139 , guido =4127 , jack =4098)

3.7. ... les techniques de boucles.

Lorsqu'on boucle sur un dictionnaire, les cls et les valeurs correspondantes peuvent tre
obtenues en mme temps en utilisant la mthode

iteritems()

>>> knights = { ' g a l l a h a d ' : ' t h e p u r e ' , ' r o b i n ' : ' t h e b r a v e ' }
>>> for k , v in knights . iteritems () : print k , v
gallahad the pure
robin the brave
B

Lorsqu'on boucle sur une squence, l'indice donnant la position et la valeur correspondante peuvent tre obtenus en mme temps en utilisant la fonction

UPPA

24

enumerate().

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

>>> for i , v in enumerate ([ ' t i c ' , ' t a c ' , ' t o e ' ]): print i , v
est prfrable :

>>> a = [ ' t i c ' , ' t a c ' , ' t o e ' ]


>>> for i in range ( len ( a )) : print i ,a[ i]
B

Pour boucler sur deux squences, ou plus, en mme temps, les lments peuvent tre
apparis avec la fonction

>>>
>>>
>>>
...
...
B

zip().

questions = [ ' name ' , ' q u e s t ' , ' f a v o r i t e c o l o r ' ]


answers = [ ' l a n c e l o t ' , ' t h e h o l y g r a i l ' , ' b l u e ' ]
for q , a in zip ( questions , answers ):
print What is your % s? It is %s . % (q , a)

Pour boucler l'envers sur une squence, spciez d'abord la squence l'endroit, ensuite
appelez la fonction

reversed().

>>> for i in reversed ( xrange (1 ,10 ,2)): print i


B

Pour boucler sur une squence comme si elle tait trie, utilisez la fonction

sorted() qui

retourne une liste nouvelle trie tout en laissant la source inchange.

>>> basket = [ apple , orange , apple , pear , orange , banana ]


>>> for f in sorted ( set ( basket )): print f
3.8. ... les conditions. Les conditions utilises dans les instructions

while

et

if

peuvent

contenir d'autres oprateurs en dehors des comparaisons.


Les oprateurs de comparaison
une squence.
Les oprateurs

>>>
>>>
>>>
>>>
>>>
>>>

is

et

is not

in

et

not

in vrient si une valeur apparat (ou non) dans

vrient si deux objets sont rellement le mme objet

a =[1 ,2 ,3]
b= a
a is b
1 in a
b= a [:]
b is a

Tous les oprateurs de comparaison ont la mme priorit, qui est plus faible que celle de tous les
oprateurs numriques. Les comparaisons peuvent tre enchanes. Par exemple,
teste si

est strictement infrieur

et de plus si

est gal

c.

a < b == c

and et or ont une priorit infrieure celle des oprateurs de comparaison ;


et entre eux, not a la plus haute priorit, et or la plus faible, de sorte que
A and not B or C (A and (not B)) or C.
Les oprateurs and et or sont dits court-circuit : leurs arguments sont valus de gauche
Les oprateurs

droite, et l'valuation s'arrte ds que le rsultat est trouv.

UPPA

25

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Exemple, si

Pierre Puiseux

A et C sont vrais mais que B est faux, A and B and C n'value pas l'expression

C. Il est possible d'aecter le rsultat d'une comparaison ou une autre expression Boolenne
une variable. Par exemple,

>>> chaine1 , chaine2 , chaine3 = , ' T r o n d h e i m ' , ' Hammer Dance '
>>> non_null = chaine1 or chaine2 or chaine3
>>> non_null
Notez qu'en Python, au contraire du C, les aectations ne peuvent pas tre eectues l'intrieur des expressions. Les programmeurs C ronchonneront peut-tre, mais cela vite une
classe de problmes qu'on rencontre dans les programmes C : crire
alors qu'il fallait

==.

dans une expression

Une instruction commode :

>>> a = 1 if condition else 2


aecte

si la condition est vraie,

sinon

3.9. ... les modules. Un module peut contenir des instructions excutables aussi bien que
des dnitions de fonction.
Chaque module a sa propre table de symboles prive.
Vous pouvez accder aux variables globales d'un module avec la mme notation que celle
employe pour se rfrer ses fonctions,

nommodule.nomelem.

Les noms du module import

sont placs dans la table globale de symboles du module importateur.


Exercise 6. crire la fonction bonacci dans un chier

>>>
>>>
>>>
>>>

bo.py

et testez le instructions

from fibo import fib , fib2


fib (500)
import fibo
fibo . fib (20)

Il y a une variante pour importer tous les noms qu'un module dnit :

>>> from fibo import *


>>> fib (500)
Cela importe tous les noms except ceux qui commencent par un tiret-bas (_).
3.9.1. Le chemin de recherche du module. Quand un module nomm
terprteur recherche un chier nomm

B
B
B

spam.py

spam

dans le rpertoire courant, et puis

est import, l'in-

PYTHONPATH.
UNIX, c'est habituelle-

dans la liste de rpertoires indique par la variable denvironnement


dans un chemin d'accs par dfaut, dpendant de l'installation ; sur
ment

/usr/local/lib/python.

En fait, les modules sont recherchs dans la liste de rpertoires donne par la variable

sys.path

.
Exercise 7. Consultez la liste des rpertoires dans lesquels l'interprteur recherche les mod-

ules. Combien y a-t-il de rpertoires distincts ?

UPPA

26

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

3.9.2. Fichiers  compils de Python. Pour acclrer le temps de lancement, si un chier appel

spam.pyc existe dans le rpertoire o spam.py se trouve, il est suppos contenir une version du
module spam dj compile  en byte-code . L'heure de modication de la version de spam.py
employe pour crer spam.pyc est enregistre dans spam.pyc, et le chier est ignor si ceux-ci
ne s'accordent pas.

spam.py est compil avec succs, une tentative est faite pour crire la
spam.pyc.
Le contenu du chier spam.pyc est indpendant de la plate-forme, ainsi un rpertoire de
module de Python peut tre partag par des machines d'architectures direntes.
Toutes les fois que

version compile sur

3.9.3. Modules standard. Python est livr avec une bibliothque de modules standard, dcrite
dans un document spar, Python Library Reference ( Library Reference ci-aprs).
3.10. ... les fonctions builtins.

la fonction

dir()

renvoit une liste des noms qu'un module dnit.

>>> import fibo


>>> dir(fibo)
I

Sans arguments,

>>>
>>>
>>>
>>>
I

dir()

numre les noms que vous avez dnis :

a = [1 , 2, 3, 4, 5]
import fibo , sys
fib = fibo . fib
dir ()

Notez qu'elle numre tous les types de noms : les variables, les modules, les fonc-

dir() n'numre pas les noms des fonctions et des variables intgres. Si
vous en voulez une liste, elles sont dnies dans le module standard __builtin__ :
tions, etc.

>>> import __builtin__


>>> dir ( __builtin__ )
B
B
B
B
B
B
B

la fonction

range(min,max) : renvoie une liste de d'entier


type(objet) : renvoie le type d'une variable

compris en min et max

La fonction

len(obj)

: renvoie la taille d'un objet

labs(x) : valeur absolue ou module pour un complexe

quit() :
locals() : retourne
exec(string)

un dictionnaire rprsentant la liste des symboles locaux.

Permet d'excuter une instruction Python sous forme de chane de caractres. Par
exemple :

>>>
>>>
>>>
>>>
[1 ,
UPPA

pi = 3.14
todo = ' L = [ 1 , 3 , p i ] '
exec ( todo )
L
3, 3.1400000000000001]
27

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

B assert(condition)
Pour dclencher une exception si la condition est fausse

>>> import os
>>> filename = ' t o t o . t x t '
>>> assert ( os . path . isfile ( filename ))
donne le mme rsultat que

*>>> if not os.path.isfile(filename) : raise AssertionError


Exercise 8. Depuis une session Python,

B
B
B
B

dterminer le type de l'objet


Aecter la variable
que vaut

L[42] ?

__builtins__

une liste des cls de

Trouver l'aide sur la fonction

__builtins__

sum

3.11. ... les paquetages. Les paquetages sont un moyen de structurer l'espace des noms de
modules

Python

en utilisant  les noms de modules points .

Par exemple, le nom de module


nomm

A.

A.B

dsigne un sous-module nomm

dans un module

3.12. ...Les exceptions. Lorsqu'un erreur d'excution survient, une exception est leve. Le
programme stoppe, et Python ache la pile d'appels, et l'exception.
Il est possible d'crire des programmes qui prennent en charge des exceptions spciques.
Regardez l'exemple suivant, qui interroge l'utilisateur jusqu' ce qu'un entier valide ait t
saisi, mais lui permet d'interrompre le programme en utilisant

Control-C

ou une autre com-

binaison de touches reconnue par le systme d'exploitation (il faut savoir qu'une interruption
produite par l'utilisateur est signale en levant l'exception

KeyboardInterrupt).

while 1:
try :
x = int ( raw_input (u " V e u i l l e z e n t r e r un nombre : " ))
break
except ValueError :
print u " A e ! Ce n ' t a i t p a s un nombre v a l i d e . E s s a y e z e n c o r e . . . "
Fonctionnement :
La clause

try

try et except est excute.


except est ignore, et l'excution du try est

: les instructions entre les mots-cls

S'il ne se produit pas d'exception, la clause


termine.

spond l'exception donne aprs le mot-cl


l'excution reprend aprs l'instruction

try est ignor. Puis si son type correexcept, la clause except est excute, puis

Si une exception se produit, le reste de la clause

try.

Si une exception se produit qui ne correspond pas l'exception donne dans la clause

except,

L'instruction

elle est renvoye aux instructions

raise

try

extrieures.

vous permet de lever vous mme une exception.

Par exemple :

UPPA

28

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

def get_age ():


age = input ( ' P l e a s e e n t e r y o u r a g e : ' )
if age < 0:
raise ValueError , '%s i s n o t a v a l i d a g e ' % age
return age
L'instruction

raise

prend deux arguments : le type de l'exception et une chane de caractre

qui dcrit l'exception.

ValueError

est une exception standard.

La liste complte des exceptions :

>>> help('exceptions ' )


Les plus courantes :

B
B
B
B
B

Accder une cl non-existante d'un dictionnaire dclenche une exception

KeyError

Chercher une valeur non-existante dans une liste dclenche une exceptionValueError.

AttributeError.
NameError.
une exception TypeError.

Appeler une mthode non-existante dclenche une exception

Rfrencer une variable non-existante dclenche une exception


Mlanger les types de donnes sans conversion dclenche

Exercise 9. Testez les instructions suivantes, quel est le nom de l'exception ?

une division par zro :

>>> 2/0
un indice hors tableau :

>>> a=[]
>>> a[2]
assigner une valeur un item dans un tuple :

>>> tuple=(1,2,3,4)
>>> tuple[3]=45
3.13. Exercices.
Exercise 10. crire une expression qui vaut

True

si l'entier n est pair et

False

dans le cas

contraire.

Exercise 11. Transformer la chane de caractre

3.14

en un ottant.

a= ' 1.0 3.14 7 8.4 0.0 ' . Ecrire une instruction unique
float() et split(), qui construit la liste de rels [1.0, 3.14, 7.0, 8.4, 0.0]

Exercise 12. Soit la chane de caractres

utilisant les fonctions et mthode


partir de

a.

Exercise 13. Soit la chane de caractres

C=" (1.0, 2.0) (3, 4)n". Trouver une suite d'instrucx=1+2j et y=3+4j. On pourra par

tions permettant d'en extraire les deux nombres complexes


exemple :

UPPA

29

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

(1) Nettoyer

(2) Remplacer

'n'

de son

', '

par

(mthode

strip()) C= ' (1.0, 2.0) (3, 4)

' , ' C= ' (1.0,2.0) (3,4) '

(3) Scinder (=split()) la chane en deux


(4) Supprimer

'('

et

Pierre Puiseux

')'

C=[' (1.0,2.0) ' , ' (3,4) ' ]

de chaque terme

(5) Instancier les complexes

1+2j

et

3+4j

C=[' 1.0,2.0 ' , ' 3,4 ' ]

partir des deux sous chanes

C[0]

et

C[1]

Exercise 14. Lecture-criture de chiers

B
B

lire le contenu du chier


droite, dans le chier

humour.txt,

crire son contenu l'cran en majuscule.

demander l'utilisateur un nom de chier, le lire et recopier son contenu, avec fer

HUMOUR.txt.

Crer une liste de votre choix, picklez-la dans

liste.pic, unpicklez-la dans une variable zoe

Exercise 15. Que fait la squence d'instructions suivante :

>>> def echo ( msg ): print msg


>>> x= echo
>>> x( " c a marche " )

Exercise 16. Ecrire un script

rilex.py

qui calcule la richesse lexicale d'un texte contenu dans

un chier dont le nom est pass en argument. La richesse lexicale d'un texte est dnie comme
le quotient entre le nombre de mots dirents et le nombre total de mots du texte. Dans cet
exercice, on dnit la notion de "mot" comme toute squence de taille suprieure ou gale
quatre, forme exclusivement de caractres alphabtiques (on ne distinguera pas les majuscules
des minuscules). Pour l'implmentation, on utilisera la structure native de dictionnaire fournie
par le langage Python.

Exercise 17.

s= ' 1;2; 3; 4; 5' .


l=[1,2,3,4,5]

(1) Lors de la lecture d'un chier, le programme lit la chane de caractres


Quelle instruction unique permet d'en faire la liste d'entiers

s= ' 1;2; 3; 4; 5;; '


avec s= ' 1;2; 3; 4; 5;; '

(2) idem, avec


(3) Idem,

et on ne garde dans l que les entiers positifs.

(4) Ecrire un script qui cre un dictionnaire,


un chier

octave.

d,

dont les cls et les lments sont lus sur

Les cls sont les noms des variables et les lments sont les valeurs

de ces variables. On testera les instructions programmes sur le chier

UPPA

30

vars.oct.

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Exercise 18. On donne une liste de d'articles et la liste des prix correspondants. crire une

instruction qui imprime la liste des (prix : article). Par exemple

>>> articles = [ ' m o u s q u e t o n ' , ' r e v e r s o ' , ' c r o c h e t ' , ' b a u d r i e r ' , ' c h a u s s
>>> prix =[5 ,25 ,5 ,80 ,120 ,2]
produira l'achage

mousqueton : 5
reverso : 25
crochet : 5
baudrier : 80
chausson : 120
magnesie : 2

Exercise 19.

Quel est le contenu du module

matplotlib ?

Dans quel rpertoire se trouve ce module ?

Exercise 20. En utilisant le mcanisme des exceptions, crire une fonction

qui renvoit

UPPA

True

si le chier existe,

False

isFile(fichier)

sinon

31

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Fig. 4.1. Le bureau d'un dveloppeur Python

4. programmation

Pour programmer en Python, nous pouvons utiliser l'environnement de programmation le


plus rudimentaire qui soit : la ligne de commande et un diteur de texte.
Il existe des environnements plus labors, comme

spe.

Au besoin nous utiliserons

idle,

idle, eric, eclipse-PyDev, pype, pyragua,

le plus rustique mais le plus standard de ces environ-

nements.

4.1.1. Mise en route. Dans un terminal :

crer un rpertoire et s'y dplacer :

ouvrir un

ouvrir un nouvel onglet et lancer Python

ouvrir

$ mkdir python-chapitre3 & cd Python-chapitre3


editeur de texte et crer un chier test.py
$ gedit tests.py &

$ python
refox et la doc

Python

4.1.2. Excuter un script ou une fonction Python. Voir (1.3)

UPPA

32

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

hanoi(n, depuis, vers, par) qui implmente


voir http://www.mah-jongg.ch/towerofhanoi/ ou

Exercise 21. Ecrire une fonction rcursive

l'algorithme clbre des tours de Hano.

http://fr.wikipedia.org/

4.1.3. Dboguer un programme. Pour dboguer un programme, on le lance depuis le dbogueur

Python

: ce dbogueur est un module Python nomm

coutume, taper ? ou

help

pdb

qu'il sut d'importer. Comme de

pour connatre les commandes disponibles

>>> import pdb


>>> pdb . run ( " t e s t s . py " )
Les commandes de dbogage les plus courantes :

b(reak) 32 : mettre un point d'arrt ligne 32


n(ext) : instruction suivante, excuter les fonctions sans y entrer
s(tep) : avancer d'un pas, entrer dans les fonctions
p(rint) a : crire la valeur de la variable a
c(ontinue) : continuer jusqu'au prochain point d'arrt
l(ist) : lister le source autour de la ligne courante
est galement possible d'utiliser winpdb, ou encore d'invoquer pdb, directement
B
B
B
B
B
B

Il

depuis le

shell

$ pdb toto.py ses arguments


$ winpdb toto.py ses arguments
Exercise 22. Utiliser un debogueur pour trouver les deux (au moins !) bugs dans le pro-

gramme

oct2dic_bug.py

4.2. Fonctions

Python,

dtails.

4.2.1. premier exemple. Dans un chier

fibo.py,

nous pouvons crer une fonction qui crit

la srie de Fibonacci jusqu' une limite quelconque :

# !/ usr / bin / python


# -*- coding : utf -8 -*def fib (n ):
" " " A f f i c h e une s u i t e de F i b o n a c c i j u s q u n . " " "
a , b = 0, 1
while b < n:
print b ,
a , b = b , a+b
if __name__ == "__main__" :
fib (500)
Le mot-cl

def

dbute la dnition d'une fonction. Il doit tre suivi par le nom de la fonction

et une liste entre parenthses de paramtres formels.


Les instructions qui forment le corps de la fonction commencent sur la ligne suivante,

indente par une tabulation.


La premire instruction devrait tre la chane de documentation de la fonction, ou docstring .
Il y a des outils qui utilisent les docstrings pour gnrer automatiquement de la documentation
papier, ou pour permettre l'utilisateur de naviguer interactivement dans le code.

UPPA

33

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

L'excution d'une fonction gnre une nouvelle table de symboles, utilise pour les variables
locales de la fonction.
On ne peut pas aecter directement une valeur aux variables globales l'intrieur d'une
fonction ( moins de les dclarer avec une instruction

global),

bien qu'on puisse y faire

rfrence.
Les vrais paramtres (arguments) d'un appel de fonction sont introduits dans la table de
symboles locale de la fonction appele quand elle est appele ; ainsi, les arguments sont passs
en utilisant un passage par valeur.
Un fonction est un objet Python comme un autre. Il est possible de renommer une fonction :

>>> from fibo import fib


>>> fib
< function object at 10042 ed0 >
>>> f = fib
>>> f (100)
1 1 2 3 5 8 13 21 34 55 89
La procdure

fib malgr les apparences, retourne une valeur, bien quelle soit plutt dcevante.
None (c'est un nom intgr).

Cette valeur est appele

>>> print fib (0)


None
Ecrire une fonction qui retourne une liste des nombres de la suite de Fibonacci, au lieu de les
imprimer, est trs simple :

def fib2 ( n ):
" " " R e t o u r n e une l i s t c o n t e n a n t
l a s r i e de F i b o n a c c i j u s q u n " " "
resultat = []
a , b = 0, 1
while b < n:
resultat . append (b) # voir ci - dessous
a , b = b , a+b
return resultat
if __name__ == '__main__ ' :
fib2 (100)
Cet exemple dmontre quelques nouvelles caractristiques de Python :

return a termine une fonction


return renvoie None.
B l'instruction result.append(b) appelle une

l'instruction

en renvoyant la valeur

mthode de l'objet

a.

Sans argument,

result.

En program-

mation objet, une mthode est une fonction qui appartient un objet et est nomme

obj.nommethode

UPPA

34

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Vous pouvez dnir vos propres types d'objets et mthodes, en utilisant des classes, cf
plus bas. La mthode
type

Pierre Puiseux

list ;

append()

montre prcdemment, est dnie pour les objets de

elle ajoute un nouvel lment la n de la liste.

L'instruction

def

cre un objet de type fonction, et l'aecte son nom.

Exercise 23. Crer une fonction qui prend en argument deux listes et qui renvoit l'intersection

des deux listes. Testez-la.


4.2.2. Chanes de documentation ( Docstrings). Il existe des conventions mergentes propos
des docstrings.

La premire ligne devrait toujours tre un rsum concis des objectifs de l'objet, devrait
toujours commencer par une lettre majuscule et nir par une virgule.

S'il y a d'autres lignes dans la chane de documentation, la deuxime ligne devrait tre
vide, sparant visuellement le rsum du reste de la description.

Les lignes suivantes devraient constituer un ou plusieurs paragraphes dcrivant les conventions d'appel des objets, ses eets de bord, etc.

Voici un exemple de docstring multi-ligne :

def ma_fonction ():


" " "Ne f a i t r i e n , m a i s l e d o c u m e n t e .

Non , v r a i m e n t , e l l e ne f a i t r i e n .
"""
pass
if __name__ == '__main__ '
print ma_fonction . __doc__

UPPA

35

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Les docstrings sont galement utilises par la fonction

help

comme le montre l'exemple

suivant.

>>> def carre (x ):


...
" " " R e t o u r n e l e c a r r e de s o n a r g u m e n t . " " "
...
return x* x
...
>>> help ( carre )
Help on function carre :
carre (x )
Retourne le carre de son argument .
4.2.3. Rgles de porte. Chaque fonction dnit son propre espace de noms. Une variable
dclare dans une fonction est inaccessible en dehors de la fonction. Elle appartient l'espace
de noms de la fonction.
Example.

Variable

>>>
...
...
>>>
>>>
>>>
1
B

non globale

def f ():
x =12
x =1
f ()
x

Variable

>>>
...
...
...
>>>
>>>
>>>
12

globale

def f ():
global x
x =12
x =0
f ()
x

4.2.4. Passage d'arguments .

Les arguments sont passs aux fonctions par aectation, ce qui signie que les arguments
sont simplement aects des noms locaux ( la fonction).

Pratiquement, ce mode de passage par aectation a les consquences suivantes :

Les arguments non modiables miment le comportement du passage par valeur de


C, mais ne sont pas recopis (gain de temps)

Les arguments modiables se comportent comme des arguments passs par adresse
en C, et ne sont bien sr pas recopis non plus.

UPPA

36

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Attention aux eets de bord : l'aectation (comme le passage d'argument) cre une
rfrence sur la valeur aecte (sur l'argument) et non pas une copie profonde.

UPPA

37

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Example 24. Tester les instructions :

>>> def modif (x ):


...
x [0]+=10
...
>>> a =[1 ,2 ,3]
>>> modif (a );
>>> print a
>>> def fidom (x ):
...
x =0
>>> b =1
>>> fidom (b );
print b
B

Il est possible de dnir des fonctions nombre d'arguments variable. Il y a plusieurs


faons de faire, qui peuvent tre combines.

4.2.5. Valeurs d'argument par dfaut. La technique la plus utile consiste spcier une valeur

par dfaut pour un ou plusieurs arguments. Cela cre une fonction qui peut tre appele avec
moins d'arguments qu'il n'en a t dni.

def interrogatoire ( nom , prenom = ' ' , presume = ' c o u p a b l e ' ):


print u " B o n j o u r , m o n s i e u r " ,nom , prenom
print u " Vous t e s p r s u m " , presume
Cette fonction peut tre appele soit comme ceci :

>>> interrogatoire('Puiseux')
ou comme ceci :

>>> interrogatoire('Puissant','', ' innocent ' )


4.2.6. Arguments mot-cl. Les fonctions peuvent aussi tre appeles en utilisant des arguments mots-cls de la forme

motcle = valeur.

Par exemple, pour la fonction prcdente :

>>> interrogatoire(prenom='Pierre', presume='innocent', nom='Puiseux')


4.3. Les modules

os.
B os.walk

os, os.path.

4.3.1.

parcours d'une arborescence. Par exemple :

>>> import os
>>> for root , dirs , files in os . walk ( ' . ' ) :
...
print " L i s t e d e s f i c h i e r s du r e p e r t o i r e : %s => %s " \
%( root , files )
B os.system(cmd)

excution de la commande shell

cmd (string)

>>> os.system('mkdir toto')


os.path
UPPA

38

Laboratoire de Mathmatiques Appliques

Janvier 2010

B
B
B
B
B
B
B
B

B
B
B
B
B
B
B
B

Python

Pierre Puiseux

abspath(chemin) : os.path.abspath('devel/toto.cxx' ) le chemin absolu de ' devel /toto . cxx '


basename(chemin) : os.path.basename('devel/toto.cxx' ) toto.cxx
curdir le rpertoire courant
dirname(chemin) os.path.dirname('devel/toto.cxx' ) devel
exists(chemin) renvoit vrai ou faux suivant que le chemin existe ou non
expanduser(chemin) expansion du ~ en /home/mon_repertoire
sep = '/' en unix, '\' en window$
Caractristiques (date, taille, .. d'un chier ou rpertoire) :

I getatime(fichier)
I getsize(fichier)
isabs(chemin) le chemin est-il absolu ?
isdir(chemin) est-ce un rpertoire existant ?
isfile(chemin) un chier ?
islink(chemin) un lien ?
ismount(chemin) le chemin est-il un point de montage ?
join os.path.join('devel','toto.cxx ' ) devel/toto.cxx
split os.path.split('devel/toto.cxx')( ' devel ' , ' toto . cxx ' )
splitext os.path.splitext('devel/toto.cxx')( ' devel /toto ' , ' . cxx ' )

Exercise 25. utilisation de

os.path

(1) Trouver, l'aide du module

os.path,

l'adresse absolue de votre rpertoire utilisateur.

(2) Lister rcursivement l'adresse absolue de tous les chiers .py et .txt qui s'y trouvent.
(3)

# !/ usr / bin / python


# -*- coding : utf -8 -*if __name__ == "__main__" :
import os . path , os
root = os . path . expanduser ( ' ~/ d e v e l / V e r s i o n 2 / Concha / ' )
print root # , os . path . isdir ( root )
for r ,d , F in os . walk ( root ) :
for f in F :
if os . path . splitext (f )[1] in [ ' . py ' , ' . t x t ' ] :
print os . path . basename (f )

optparse. Pour crire un script Python utilisant le mcanisme des options


optparse est bien adapt. On trouvera la documentation du module dans la

4.4. Le module

Unix, le module
section

14.3

de la documentation des librairies Python.

Par exemple si dans un script

tests.py,

on trouve les instructions :

parser = OptionParser ( " V o i c i comment u t i l i s e r l a commande x x x " )


parser . add_option ( "o " , " o u t p u t " ,
dest = " f i l e o u t n a m e " ,
help = u "nom du f i c h i e r s o r t i e " )
( opts , args ) = parser . parse_args ()
UPPA

39

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Fig. 4.2. Pilotage d'une application

opts est le dictionnaire opts={'leoutname ' :None} parmi les options disponibles
tests.py, l'option -o (option longue --output) sera utilise pour prciser
le nom du chier d'entre, qui sera aect dans le script l'attribut parser.fileoutname, la
chane de caractres help=" ... " est utilise pour documenter le script lors d'un appel
alors la variable

pour l'excution de

$ toto.py -h
Exercise 26. Excutez le script

$
$
$
$
$

options.py
options.py
options.py
options.py
options.py

options.py

avec direntes options

-h
--out=filout -c -v filin
-o filout -c filin
-w
--out=filout

dduisez-en les rgles de formation des options dans un script de ce type.

Notez la dirence entre options avec valeurs (-o) et options sans valeur (-h,

4.5.

Python

-v)

pour piloter une application.

Exercise 27. Python pour piloter une application (voir (4.2))

On dispose des composants suivants :


(1) le simulateur (simulateur.py) programme Python
(2) les ltres (filtre.py), module Python, qui transforment les rsultats du simulateur
au format idoine pour la visualisation (vtk par exemple)
(3)

UPPA

paraview,

pour la visualisation, un programme non Python

40

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Ouvrir dans un diteur le script

Python nomm

pilote.py,

Pierre Puiseux

pylote_incomplet.py.

partir de celui-ci, crire un script

utilisant le mcanisme des options, que l'on appelera ainsi :

$ python pilote.py -v session


B

l'argument

I
I
I
B

est obligatoire, il indique le rpertoire de la session, qui contient :

userdata.m ncessaire au fonctionnement du simulateur.py,

les donnes et
les rsultats aprs simulation

L'option

UPPA

session

le chier de donnes

-v

est facultative, si elle est prsente, le viewer

41

paraview

est lanc.

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

4.6. Les portes et les espaces de noms en

Pierre Puiseux

Python

. D'abord quelques dnitions.

(1) Un espace de noms (name space) est une relation entre des noms et des objets. Par
exemple
(a) l'ensemble des noms intgrs (les fonctions telles que

abs(),

et les noms d'excep-

tion intgrs) ;
(b) les noms globaux dans un module ;
(c) les noms locaux au cours d'un appel de fonction.
il n'y a absolument aucune relation entre les noms contenus dans les dirents espaces de noms
par exemple, deux modules dirents peuvent dnir tous les deux une fonction
 maximise sans confusion possible  les utilisateurs des modules doivent prxer par
le nom du module l'utilisation.

L'espace de noms appel

__builtin__

qui contient les noms intgrs est cr au

lancement de l'interprteur Python, et n'est jamais eac.

L'espace de noms global pour un module est cr quand la dnition du module


est charge.

Les instructions excutes l'invocation de l'interprteur font partie d'un module


appel

__main__,

elles ont donc leur propre espace de noms global.

L'espace de noms local une fonction est cr quand celle-ci est appele et il est
eac quand la fonction se termine

(2) Une porte (scope ) est une rgion textuelle d'un programme Python dans laquelle un
espace de noms est directement accessible.
A n'importe quel moment de l'excution, exactement trois portes imbriques sont
utilises (exactement trois espaces de noms sont accessibles directement) :
(a) la porte immdiate, qui est explore en premier, contient les noms locaux,
(b) la porte intermdiaire, explore ensuite, contient les noms globaux du module
courant, et
(c) la porte extrieure (explore en dernier) correspond l'espace de noms contenant
les noms intgrs.
Si un nom est dclar

global

alors les rfrences et aectations le concernant sont

directement adresses la porte qui contient les noms globaux du module.

UPPA

42

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

5. Les classes en

Le mcanisme de classe en

Python

python

permet d'introduire les classes avec un minimum de

syntaxe et smantique nouvelles.


Les caractristiques les plus importantes des classes sont pleinement prsentes :

B
B
B
B
B
B

le mcanisme d'hritage permet la multiplicit des classes de base,


une classe drive peut surcharger n'importe quelle mthode de sa ou ses classes de base,
une mthode peut appeler une mthode de sa classe de base avec le mme nom.
Les objets peuvent contenir un nombre arbitraire de donnes prives.
tous les membres d'une classe (dont les donnes membres) sont publics,
toutes les fonctions membres sont virtuelles. Il n'y a pas de constructeurs ou de destructeurs particuliers.

il n'y a pas de raccourcis pour faire rfrence aux membres d'un objet partir de ses

mthodes : une mthode est dclare avec un premier argument explicite (self le plus
souvent) qui reprsente l'objet, qui est fourni implicitement l'appel.

les classes sont elles-mmes des objets, mais dans un sens plus large : en Python, tous
les types de donnes sont des objets. Cela fournit la smantique pour l'importation et le
renommage.

les types intgrs ne peuvent pas tre utiliss comme classes de base pour des extensions
par l'utilisateur.

la plupart des oprateurs intgrs qui ont une syntaxe particulire (oprateurs arithmtiques, indiage, etc.) peuvent tre rednis pour des instances de classe.

UPPA

43

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

5.1. Une premire approche des classes. Les classes introduisent un peu de syntaxe
nouvelle et quelques points de smantique supplmentaires.
Syntaxe de la dnition de classe. La forme la plus simple de dnition de classe ressemble
ceci :

class NomClasse:
<instruction-1>
.
.
.
<instruction-N>
5.1.1. Une classe

5
6
7
8
9
10
11
12

Complexe

: dclaration.

class Complexe :
" " " Une c l a s s e c o m p l e x e s o m m a i r e " " "
def __init__ ( self , re =0.0 , im =0.0):
self . _x , self . _y = re , im
def arg ( self ):
return atan2 ( self ._x , self . _y )

16

if __name__ == "__main__" :
z0 = Complexe (1 ,2)
print z0 . _x , z0 . _y
print z0 . arg ()

(1)

class

13
14
15

est un mot cl,

Complexe

le nom de la classe. Cette ligne alerte l'interprteur :

class, une nouvelle classe (et non pas un objet


Complexe hrite de la classe
object, c'est dire que tous les attributs de la classe object peuvent tre utiliss par

je veux crer un objet Python de type


de type

Complexe

qui, lui, sera cr plus loin). La classe

notre nouvelle classe.


(2) un docstring pour expliquer le fonctionnement
(3) la premire mthode est un constructeur (mthode spciale) :

__init__

ses trois ar-

guments sont
(a)

self

: dsigne l'objet non encore instanci, de type

mthode. Autrement dit,


(b)

re

self

est un

Il y a cration de deux attributs_x et

Complexe,

self,

lorsque un

qui appelera cette

qui n'existe pas encore.

etim sont les parties relle et imaginaire, (par dfaut

mme temps que


(4)

Complexe,

0.0

et

_y, dansself. Ces attributs


Complexe sera instanci.

0.0)

prendront corps en

arg() est une mthode qui calcule l'argument. L'argument self


Complexe z lorsque sera excute l'instruction z.arg()

prendra la valeur

De manire analogue, au moment de la dnition d'une fonction (par exemple def f(x) : return x*x)
aucune variable, mais prendra corps seulement lorsque la fonction sera appele par exemple

x ne dsigne
a=3;f(a).
UPPA

44

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Complexe

5.1.2.

Pierre Puiseux

: instanciation. l'instruction :

z0 = Complexe (1 ,2)
dclenche les actions suivantes :

appel

Complexe.__init__(1,2) , = z0
z0.

est instanci. Les attributs

z0._x, z0._y

deviennent eectif, l'intrieur de


5.1.3.

Complexe :

utilisation.

print z0 . _x , z0 . _y
print z0 . arg ()
B z0._x et z0._y valent 1 et 2. Il serait commode d'avoir un instruction print z0
B z0.arg()<==>Complexe.arg(z0) dans la mthode Complexe.arg(self), self vaut z0
Plus gnralement si uneMethode(a) est une mthode de la classe MaClasse, et si X est un
objet de type MaClasse, alors
X.uneMethode(a) MaClasse.uneMethode(X,a)
Exercise 28. Ecrire la mthode

abs()

de la classe

Complexe

5.2. Mthodes spciales. Les mthodes spciales commencent et nissent par __ (deux
underscores '_'). Elles sont hrites de la classe

object.

object quelle sont ces mthodes.


z=z1+z2 pour z1 et z2 de type Complexe, il sut
Complexe.__add__(self, z) dans la classe Complexe en sachant

On trouve dans la documentation Python de la classe


Par exemple, si l'on veut pouvoir crire
de surcharger la mthode
que

z=z1+z2 z=z1.__add__(z2)
Les principales mthodes que l'on peut surcharger pour une classe donne sont :
Mthode de la classe surcharger

utilisation

object.__add__(self, other)
self+other
object.__sub__(self, other)
self-other
object.__mul__(self, other)
self+other
object.__and__(self, other)
self and other
object.__or__(self, other)
self or other
object.__len__(self)
len(self)
object.__getitem__(i)
x=self[i]
object.__setitem__(i)
self[i]=y
object.__call__(self[, args...])
self(args)
object.__str__()
print self
object.__repr__()
self
__str__() dans la classe Complexe
self. Testez ensuite les instructions

Exercise 29. implmentez une mthode

ache de manire agrable le Complexe

, an qu'elle

>>> z0 = Complexe (1 ,2)


>>> print z0

UPPA

45

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Exercise 30. Mthodes spciales

Implmenter une mthode

__add__()

et une mthode

__mul__()

. Testez l'instruction

print z0+z1, z1*z0


5.3. Hritage simple, multiple. L'instruction :

class Complexe(object):
signie que la classe
Donc

Complexe

Complexe

EST est un

hrite de la classe

object

object

(qui est une classe Python de base).

de Python.

Grce cet hritage, tous les attributs et les mthodes de la classe


utiliss et/ou surchargs par les instances de la classe

Complexe.

object

peuvent tre

5.3.1. Hritage ou pas ? On utilise un hritage lorsque l'hritier EST un parent, comme dans
une liation de famille ordinaire. Le ls Dupond est un Dupont.
La bonne question se poser pour dcider si B doit hriter de A est :
B is A ou bien B has A ?

B
B

Si la rponse est B is A, alors B doit hriter de A,


Si la rponse est B has A, alors B doit avoir un attribut A.

Complexe , ni mme un centre. Un cercle POSSDE


Complexe), une classe Cercle n'hritera pas de Complexe, mais possdera
Complexe, qu'on appellera probablement _centre.

Par exemple : un cercle n'EST pas un


un centre (donc un
un attribut

Par contre un carr EST un polygne. Un triangle aussi


5.3.2. Sans hritage : la classe

Cercle

s'crira :

class Cercle ( object ) :


def __init__ ( self , centre , rayon ) :
self . _centre = centre # attribut
self . _rayon = rayon
def perimetre ( self ) : pass
def aire ( self ) : pass
5.3.3. Avec hritage : en supposant que l'on dispose d'une classe

Polygone,

comme celle-ci,

class Polygone ( object ):


def __init__ ( self , liste_de_points ) :
self . _points = liste_de_points
def isClosed ( self ) :
return self . _points [0] == self . _points [ -1]
def close ( self ) :
if not self . isClosed () :
self . _points . append ( self . _points [0])
def longueur ( self ):
p= self . _points # alias
return sum ([ abs (z1 - z0 ) for (z0 , z1 ) in zip (p [: -1] , p [1:]))
def __str__ ( self ) : return "%s " % self . _points
def __getitem__ ( self ,i ) : return self . _points [i]
UPPA

46

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

on pourra dnir une classe

Triangle

Pierre Puiseux

comme ceci :

class Triangle ( Polygone ):


def __init__ ( self , a , b , c) :
Polygone . __init__ ( self ,[a ,b , c ])
def __str__ ( self ):
return " T r i a n g l e : " + Polygone . __str__ ( self )
def hauteur ( self ): # blabla , spcifique Triangle
def isRectangle ( self ) : # etc ...
et l'utiliser ainsi :

t= Triangle ( complex (1 ,0) , complex (0 ,1) , complex (1 ,1))


t. longueur () # mthode de Polygone
t. isClosed () # mthode de Polygone
t [1]
t. hauteur ()
# mthode spcifique Triangle
etc...
5.3.4. Surcharge. Dans cet exemple, la mthode spciale
de

Polygone.__str__

Triangle.__str__

surcharge celle

Exercise 31. Ecrire la classe

Triangle qui hrite de Polygone (dans le mme chier polygone.py)


aire() qui calcule l'aire

et tester ses dirents composants. Ecrire en particulier une mthode


du triangle.

5.3.5. Hritage multiple. Python supporte aussi une forme limite d'hritage multiple. Une
dnition de classe avec plusieurs classes de base ressemble :

class NomClasseDerivee(Base1, Base2, Base3):


<instruction-1>
.
.
.
<instruction-N>
La seule rgle permettant d'expliquer la smantique de l'hritage multiple est la rgle de
rsolution utilise pour les rfrences aux attributs. La rsolution se fait en profondeur d'abord,
de gauche droite. Donc, si un attribut n'est pas trouv dans

NomClasseDerivee , il est cherch


Base1, et seulement s'il n'y est

dansBase1, puis (rcursivement) dans les classes de base de


pas trouv, il est recherch dans

Base2,

et ainsi de suite.

L'utilisation banalise de l'hritage multiple est un cauchemar de maintenance.


5.4. Quelques remarques. Les donnes attributs crasent les mthodes de mme nom ;

= utiliser

une convention qui minimise les chances de conit.

Autrement dit, les classes ne sont pas utilisables pour implmenter des types abstraits purs.
Par convention, le premier argument d'une mthode est souvent appel

self.

Les mthodes peuvent appeler d'autres mthodes en utilisant les attributs mthodes de
l'argument

UPPA

self

47

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

class Sac :
def vider ( self ):
self . donnees = []
def ajouter ( self , x ):
self . donnees . append (x )
def ajouterdoublon ( self , x ):
self . ajouter (x)
self . ajouter (x)
Les mthodes peuvent faire rfrence des noms globaux de la mme faon que les fonctions
ordinaires. La porte globale associe une mthode est celle du module qui contient la
dnition de la classe. (La classe elle-mme ne sert jamais de porte globale !)
5.5. Objets en rapport avec les classes.
5.5.1. Objets classes. Les objets classe admettent deux sortes d'oprations : la rfrenciation
des attributs et l'instanciation.

Les rfrences aux attributs (attribute references ) utilisent la syntaxe standard utilise
pour toutes les rfrences d'attribut en Python :

obj.nom.

Par exemple, si la dnition de classe ressemble :

class MaClasse :
u " " " Une c l a s s e s i m p l e p o u r e x e m p l e " " "
i = 12345
def f( self ):
return u " B o n j o u r t o u t l ' monde "
alors

MaClasse.i

et

MaClasse.f

sont des rfrences d'attribut valides.

Et on peut leur aecter une valeur :

MaClasse.i = 12

et

MaClasse.f = g

sont des aec-

tations valides.

__doc__

est un attribut valide, en lecture exclusive, qui renvoie la docstring correspondant

la classe.

L'instantiation de classe utilise la notation d'appel de fonction. Faites comme si l'objet


classe tait une fonction sans paramtres qui renvoie une instance nouvelle de la classe.
Par exemple, (avec la classe prcdente) :

x = MaClasse()
cre une nouvelle instance de la classe et aecte cet objet la variable locale
Une classe peut dnir une mthode spciale nomme

__init__(),

x.

comme ceci :

def __init__ ( self ):


self . donnee = []
Dans ce cas, l'instanciation de la classe appelle automatiquement
Bien-sr, la mthode

__init__()

__init__().

peut avoir des arguments pour orir plus de souplesse.

Par exemple,

UPPA

48

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

class Complexe :
def __init__ ( self , partiereelle , partieimaginaire ):
self . r = partiereelle
self . i = partieimaginaire
z = Complexe (3.0 , -4.5)
print z.r , z .i
5.5.2. Objets instances. Que peut-on faire avec les objets instances ? Les seules oprations
acceptes par des objets instance sont des rfrences leurs attributs. Il y a deux sortes de
noms d'attributs valides.
(1) J'appellerai la premire donnes attributs (data attributes ). Ils correspondent aux

donnes membres (data members ) en C++. Les donnes attributs n'ont pas besoin
d'tre dclares ; comme les variables locales, elles apparaissent lorsqu'on leur aecte
une valeur pour la premire fois. Par exemple, si

MaClasse cre
16, sans laisser de trace :

est l'instance de

prcdemment, le morceau de code suivant achera la valeur

x. compteur = 1
while x. compteur < 10:
x. compteur = x. compteur * 2
print x. compteur
del x. compteur
(2) La seconde sorte de rfrence d'attribut accepte par les objets instance sont les mth-

odes (methods ). Une mthode est une fonction qui  appartient un objet.
5.5.3. Objets mthodes. D'habitude, une mthode est appele de faon directe :

x.f()
Dans notre exemple, cela renverrait la chane

"Bonjour tout l 'monde".

L'objet

x.f

est un

objet mthode, il peut tre rang quelque part et tre appel plus tard, par exemple :

xf = x. f
while 1:
print xf ()
continuera acher

"Bonjour tout l 'monde"

jusqu' la n des temps.

La particularit des mthodes est que l'objet est pass comme premier argument la fonction.
Dans notre exemple, l'appel

x.f()

est l'quivalent exact de

MaClasse.f(x)

5.6. Variables prives. Il y a un support limit pour des identicateurs privs dans une
classe. Tout identicateur de la forme

__spam

(au moins deux tirets-bas au dbut, au plus

un tiret-bas la n) est maintenant textuellement remplac par

nomclasse
UPPA

_nomclasse__spam

, o

est le nom de classe courant, duquel les tirets-bas de dbut on t enlevs.

49

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

5.6.1. Itrateurs. Vous avez probablement remarqu que la plupart des conteneurs peuvent

tre parcourus en utilisant une instructionfor :

for element in [1 , 2, 3]:


print element
for element in (1 , 2, 3):
print element
for key in { ' one ' :1 , ' two ' :2}:
print key
for char in " 123 " :
print char
for line in open ( " m y f i l e . t x t " ):
print line
Ce style d'accs est clair, concis et pratique. L'utilisation d'itrateurs imprgne Python et
l'unie.
En coulisse,

B
B

l'instruction

for

appelle

iter()

sur l'objet conteneur.

Cette fonction renvoie un objet itrateur dnissant une mthode


lments dans le conteneur, un la fois.

Lorsqu'il n'y a plus d'lments,


boucle

for

iter()

lve une exception

next()

qui accde les

StopIteration

qui dit la

de se terminer.

Example 32. itrateur :

>>> s = ' a b c '


>>> it = iter (s)
>>> it
< iterator object at 0 x00A1DB50 >
>>> it . next ()
'a '
>>> it . next ()
'b '
>>> it . next ()
'c '
>>> it . next ()
Traceback ( most recent call last ):
File "< p y s h e l l #6>" , line 1, in - toplevel
it . next ()
StopIteration
__iter__()
next(). Si la classe dnit next() , alors __iter__()

Pour ajouter un comportement d'itrateur vos classes, dnissez une mthode


qui renvoie un objet ayant une mthode
peut se limiter renvoyer

self

Example 33. Itrateur

UPPA

50

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

class Reverse :
""" I t e r a t o r f o r l o o p i n g over a sequence backwards """
def __init__ ( self , data ):
self . data = data
self . index = len ( data )
def __iter__ ( self ):
return self
def next ( self ):
if self . index == 0:
raise StopIteration
self . index = self . index - 1
return self . data [ self . index ]
>>> for char in Reverse ( ' spam ' ):
... print char
...
m
a
p
s
5.6.2. Gnrateurs.
5.6.3. Expressions gnrateurs.
5.7.

property.

Une

property

est un attribut de la classe, gre par un getter et un setter.

Example 34. basique

class Complexe ( object ):


u""" Dmonstration p r o p e r t y """
def __init__ ( self , x , y ):
self . _x = x
self . _y = y
def getPrettyPrint ( self ):
return "(% f , % f i ) " % ( self ._x , self . _y )
pp = property ( getPrettyPrint )
>>> z = Complexe (1 ,2)
>>> print z. pp
(1.000000 , 2.000000 i )
>>> print z. getPrettyPrint ()
(1.000000 , 2.000000 i )
B

Pour l'utilisateur, la notion de

property est transparente. Elle permet de dnir, comme

en C++ des getters et des setters, avec une vrication de type si ncessaire, mais avec
une syntaxe lgre pour l'utilisateur.

UPPA

51

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Complexe z() ; z.SetRe(14.5); cout<<z.GetRe(); //En C++


z=Complexe() ; z.x=14.5 ; print z.x #En Python, x est une property
B

Au niveau de la programmation, cela demande au programmeur un eort initial.

property est :
property(fget=None, fset=None, fdel=None, doc=None)
fget est la mthode getter de l'attribut
fset le setter
fdel est le destructeur de l'attribut
doc est une chane de caractres contenant la documentation de

La signature de

B
B
B
B

Example 35. Pour une classe

Complexe

l'attribut

de base : dnissons un getter, un setter, une doc

pour accder la partie relle :

class Complexe ( object ):


u""" Dmonstration p r o p e r t y """
def __init__ ( self , x , y ):
self . _x = x
self . _y = y
def _getx ( self ) : return self . _x
def _setx ( self , value ) : self . _x = float ( value )
x = property ( fget = _getx ,
fset = _setx ,
doc = u " P a r t i e r e l l e e n t i r e " )
Excution dans une session Python :

>>> z = Complexe (1 ,2)


>>> z .x = 5
>>> print z.x , z . _y
5.0 2
>>> z .x = " 7 . 2 "
>>> print z.x , z . _y
7.2 2
>>> z .x = " ah "
>>> print z.x , z . _y
ah 2

UPPA

52

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

5.8. Dcorateurs. Un dcorateur python est une fonction qui prend en paramtre une autre
fonction, pour la modier, lui ajouter des fonctionnalits, la substituer ou simplement excuter
un travail avant ou aprs l'avoir appell.
Un dcorateur est caractris par le mot cl

plac au dessus de la fonction cibl.

Example 36. Dcorateur

>>> def mon_decorateur (f ):


...
def _mon_decorateur ():
...
print " d e c o r a t o r s t u f f "
...
f ()
...
print " o t h e r s t u f f "
...
return
...
return _mon_decorateur
...
>>> @ mon_decorateur
... def decorate ():
...
print " f o n c t i o n s t u f f "
...
>>> decorate ()
decorator stuff
fonction stuff
other stuff
Comme vous pouvez le remarquer sur l'exemple, ds qu'on applique un dcorateur sur une
fonction c'est le dcorateur qui prend le contrle, autrement dit, il peut carrment ignorer la
function

decorate().

5.9. Manipulation dynamique des attributs.

>>> class A( object ):


...
pass
...
>>> a= A ()
>>> setattr (a , ' u n _ a t t r i b u t ' ,3.14)
>>> hasattr (a , ' u n _ a t t r i b u t ' )
True
>>> a. un_attribut
3.1400000000000001
>>> delattr (a , ' u n _ a t t r i b u t ' )
>>> hasattr (a , ' u n _ a t t r i b u t ' )
False
B setattr(objet, nom, valeur) pour ajouter l'attribut nom objet, avec la valeur valeur
B delattr(objet, nom) pour supprimer l'attribut nom objet
B hasattr(objet, nom) renvoit True ou False suivant que objet possde ou non un
attribut nom.
UPPA

53

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

5.10. Exercices.

Tableau qui hrite de


__init__(self, l) permet de

Exercise 37. Ecrire une classe

dont la fonction

la classe

vrier que l'argument

dont tous les lments sont d'un type numrique :

list,

int, long, float

ou

l est une
complex

liste

qui permet d'crire les instructions :

>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>

a= Tableau ([1 ,2 ,3])


a. norm ()
a. norm (1)
len (a )
b= Tableau ([2 ,3 ,4])
a+ b
a* b # produit scalaire
a (3) = 12
a [3] = 12

Exercise 38. Implmenter une classe

Complexe

, qui hrite de la classe

object

, et qui

permette d'crire les instructions :

>>> z0 = Complexe (1 ,2) # __init__


>>> z0
# dfinir __repr__
1+2 I
>>> print z0
# dfinir __str__
1+2 I
>>> print z0 . _x
1
>>> print z0 . arg ()
1.40564764938
>>> z1 = Complexe (2 ,3)
>>> print z1 . module ()
3.60555127546
>>> print z1 + z0
# __add__
14+5 I

Exercise 39. Utiliser la notion de

property pour eectuer une vrication


Complexe de la manire suivante :

sur le type et

modier le comportement de la classe

>>> z0 = Complexe (1 ,2)


>>> z0 .x = " 1 2 . 0 "
Traceback ( most recent call last ):
File " . / p r o p . py " , line 40 , in < module >
z0 . x = " 12 "
UPPA

54

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

File " . / p r o p . py " , line 29 , in _setx


raise TypeError , " C om pl ex e . x : %s non s u p p o r t e " %( type ( value ))
TypeError : Complexe .x : < type ' s t r ' > non supporte

Exercise 40. Dcorateur pour vrication de type. Prvoir le comportement des instructions

suivantes :

def ArgEntier (f) :


def _ArgEntier ( arg ):
if not isinstance ( arg , int ) :
raise TypeError ( "%s : %s n ' e s t p a s de t y p e e n t i e r " \
% ( arg , type ( arg )))
else : return f( arg )
return _ArgEntier
@ Entier
def h( x) :
return x* x
print h (1)
print h (1.2)

Exercise 41. Dcorateurs : soit la fonction

def f(x) : return x*x


(1) Ajouter un dcorateur la fonction
et lve une exception

TypeError

f,

qui verie que l'argument

est de type

float

si a n'est pas le cas.

(2) Ajouter un dcorateur la fonction

f,

qui lve une exception adapte si le nombre

d'arguments est dirent de 1

Exercise 42. Soit la fonction

quer le

def g(x) : print x.

Ecrire un dcorateur

Majuscule,

appli-

de sorte que :

>>> g(' hello ' )


produise le rsultat

HELLO

UPPA

55

Laboratoire de Mathmatiques Appliques

Janvier 2010

Python

Pierre Puiseux

Rfrences

[LA] Mark Lutz, David Ascher, Introduction Python, ed O'Reilly, Janvier 2000, ISBN 2-84177-089-3
[HPL] Hans
Petter
Langtangen,
Python
Scripting
for
Computational
Science.
Simula
Research
Laboratory
and
Department
of
Informatics
University
of
Oslo.

/home/puiseux/enseignement/CoursOutilsInformatiques/Python_scripting_for_computational_science.04.pdf

[MP] Mark Pilgrim, dive into Python (Plongez au coeur de Python) http ://diveintopython.org/, traduction franaise : Xavier Defrang, Jean-Pierre Gay, Alexandre Drahon.
/home/puiseux/doc/python/frdiveintopython.pdf

[VR] Guido van Rossum, Tutoriel Python, Release 2.0.1. /home/puiseux/doc/python/tut-fr.pdf


[GS] Grard Swinnen, Apprendre programmer avec Python, http ://www.librecours.org/documents/5/577.pdf
[1] Jerey Elkner, Allen B. Downey and Chris Meyers, http ://openbookproject.net//thinkCSpy

UPPA

56

Laboratoire de Mathmatiques Appliques

Index
court-circuit

, 25

docstring, 33
None, 34

packing, 23
unpacking, 23

57

Vous aimerez peut-être aussi