Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Remerciements
Grand merci Hlne Cordeau pour ses illustrations ; les aventures de Pythoon en-
chantent les ttes de paragraphe.
Merci Tarek Ziad pour les emprunts ses publications, en particulier nous remercions
les ditions Eyrolles pour leur aimable autorisation de publier le dialogue de la page
et les ditions Dunod pour leur aimable autorisation de publier les exemples des pages ,
et .
Merci Ccile Trevian pour son aide la traduction du Zen de Python .
Merci Stphane Gimenez pour sa relecture en profondeur et Xavier Olive pour les
emprunts son papier Introduction lcriture chinoise .
Merci ric Berthomier et Christophe Massuti pour leur construction du livre sous
Debian et la remonte des correctifs ncessaires.
Merci Jean-Pierre Guiet, typographe mrite, pour ses corrections pointues.
Une pense spciale pour Stphane Barthod : son enseignement didactique auprs des
tudiants et son engagement envers ses collgues ne seront pas oublis.
Enn il faudrait saluer tous les auteurs butins sur Internet
En se partageant le savoir ne se divise pas,
il se multiplie
Sommaire
Introduction
La calculatrice Python
Contrle du ux dinstructions
Conteneurs standard
Modules et paages
La POO graphique
Teniques avances
A Interlude
E Exercices corrigs
Bibliographie et Webographie
Memento Python
Index
Glossaire
Numro de version ?
Suivant lexemple de Donald Knuth, linventeur du logiciel de composition TEX, le numro de la ie ver-
sion de ce document, au lieu dtre . ou .. , est la ie dcimale dun nombre clbre .
Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence :
Creative Commons BY-NC-SA-.
La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence
creativecommons.org/licenses/by/3.0/fr/
. Cest une grave dcision, mrement rchie : Un langage qui bouge peu permet une industrie qui bouge beaucoup
(Bertrand Meyer).
. Le moteur est le programme qui permet de composer ce texte. Il est associ au format XLATEX, ensemble de macros
simpliant lcriture.
. Permetpdautomatiser la composition.
1+ 5
. = 2 , le nombre dor.
C
Introduction
. Langages
.. Des langages de dirents niveaux
Chaque processeur possde un langage propre, directement excutable : le langage machine. Il est
form de et de et nest pas portable, cest le seul que lordinateur puisse utiliser ;
le langage dassemblage est un codage alphanumrique du langage machine. Il est plus lisible que
le langage machine, mais nest toujours pas portable. On le traduit en langage machine par un
assembleur ;
les langages de haut niveau. Souvent normaliss, ils permeent le portage dune machine lautre.
Ils sont traduits en langage machine par un compilateur ou un interprteur.
--
. Production des programmes Introduction
Des centaines de langages ont t crs, mais lindustrie nen utilise quune minorit.
.
source compilateur objet excuteur rsultat
F . Chane de compilation
Dans la technique de linterprtation chaque ligne du source analys est traduite au fur et mesure en
instructions directement excutes. Aucun programme objet nest gnr. Cee technique est trs souple
mais les codes gnrs sont peu performants : linterprteur doit tre utilis chaque nouvelle excution
.
source interprteur rsultat
F . Chane dinterprtation
.
source compilateur bytecode interprteur rsultat
Pour excuter un programme, Python charge le chier source .py en mmoire vive, en fait lanalyse
(lexicale, syntaxique et smantique), produit le bytecode et enn lexcute.
An de ne pas refaire inutilement toute la phase danalyse et de production, Python sauvegarde le
bytecode produit (dans un chier .pyo ou .pyc) et recharge simplement le chier bytecode sil est plus
rcent que le chier source dont il est issu.
En pratique, il nest pas ncessaire de compiler explicitement un module, Python gre ce mcanisme
de faon transparente.
--
Introduction . Algorithme et programme
. Algorithme et programme
.. Dnitions
Dnition
b Algorithme : ensemble des tapes permeant daeindre un but en rptant un nombre ni de fois
un nombre ni dinstructions.
Donc un algorithme se termine en un temps ni.
Dnition
b Programme : un programme est la traduction dun algorithme en un langage compilable ou interpr-
table par un ordinateur.
Il est souvent crit en plusieurs parties dont une qui pilote les autres : le programme principal.
#~~~~~~~~~~~~~~~~~~~~~
# Voici un commentaire
#~~~~~~~~~~~~~~~~~~~~~
9 + 2 # en voici un autre
. Implmentations de Python
Remarque
3 Une implmentation signie une mise en uvre .
CPython : Classic Python, cod en C, implmentation portable sur dirents systmes
Jython : cibl pour la JVM (utilise le bytecode de JAVA)
IronPython : Python.NET, crit en C#, utilise le MSIL (MicroSo Intermediate Language)
Staless Python : limine lutilisation de la pile du langage C (permet de rcurser tant que lon
veut)
Pypy : projet de recherche europen dun interprteur Python crit en Python
--
C
La calculatrice Python
Attention
j Les identicateurs sont sensibles la casse et ne doivent pas tre un mot rserv de Python (voir
le Les mots rservs de Python ci-dessous ).
.. Style de nommage
Il est important dutiliser une politique cohrente de nommage des identicateurs. Voici le style utilis
dans ce document :
nom_de_ma_variable pour les variables ;
NOM_DE_MA_CONSTANTE pour les constantes ;
maFonction, maMethode pour les fonctions et les mthodes ;
MaClasse pour les classes ;
UneExceptionError pour les exceptions ;
nom_de_module pour les modules et pour tous les autres identicateurs.
Exemples :
NB_ITEMS = 12 # UPPER_CASE
class MaClasse : pass # TitleCase
def maFonction() : pass # camelCase
mon_id = 5 # lower_case
Pour ne pas prter confusion, viter dutiliser les caractres l (minuscule), O et I (majuscules) seuls.
Enn, on vitera dutiliser les notations suivantes :
_xxx # usage interne
__xxx # attribut de classe
__xxx__ # nom spcial rserv
. Notion dexpression
Dnition
b Une expression est une portion de code que linterprteur Python peut valuer pour obtenir une
valeur.
Les expressions peuvent tre simples ou complexes. Elles sont formes dune combinaison de liraux
reprsentant directement des valeurs, didenticateurs et doprateurs.
--
. Les types de donnes entiers La calculatrice Python
.. Le type int
Le type int nest limit en taille que par la mmoire de la machine .
Les entiers liraux sont dcimaux par dfaut, mais on peut aussi utiliser les bases suivantes :
Oprations arithmtiques
>>> 20 + 3
23
>>> 20 - 3
17
>>> 20 * 3
60
>>> 20 ** 3
8000
>>> 20 / 3
6.666666666666667
>>> 20 // 3 # division entire
6
>>> 20 % 3 # modulo (reste de la division entire)
2
>>> abs(3 - 20) # valeur absolue
17
Bases usuelles
Un entier crit en base (par exemple 179) peut tre reprsent en binaire, octal et hexadcimal en
utilisant les syntaxes suivantes :
. Dans la plupart des autres langages les entiers sont cods sur un nombre xe de bits et ont un domaine de dnition limit
auquel il convient de faire aention.
--
La calculatrice Python . Les types de donnes entiers
.. Le type bool
>>> 2 > 8
False
>>> 2 <= 8 < 15
True
--
. Les types de donnes ottants La calculatrice Python
a not(a)
Oprateur unaire not False True
True False
a b a or b a and b
False False False False
Oprateurs binaires or et and False True True False
True False True False
True True True True
Attention
j Pour tre sr davoir un rsultat boolen avec une expression reposant sur des valeurs transtypes,
appliquez bool() sur lexpression.
.. Le type float
Un float est not avec un point dcimal (jamais avec une virgule) ou en notation exponentielle
avec un e symbolisant le puissance suivi des chires de lexposant. Par exemple :
2.718
.02
-1.6e-19
6.023e23
.. Le type complex
Les complexes sont crits en notation cartsienne forme de deux oants.
La partie imaginaire est suxe par j :
>>> print(1j)
1j
>>> print((2+3j) + (4-7j))
(6-4j)
>>> print((9+5j).real)
9.0
>>> print((9+5j).imag)
5.0
--
La calculatrice Python . Variables et aectation
. Variables et aectation
.. Les variables
Ds que lon possde des types de donnes, on a besoin des variables pour stocker les donnes.
En ralit, Python nore pas directement la notion de variable, mais plutt celle de rfrence dobjet.
Tant que lobjet nest pas modiable (comme les entiers, les oants, les chanes, etc.), il ny a pas de di-
rence notable entre les deux notions. On verra que la situation change dans le cas des objets modiables
Dnition
b Une variable est un identicateur associ une valeur. En Python, cest une rfrence dobjet.
.. Laectation
Dnition
b On aecte une variable par une valeur en utilisant le signe = (qui na rien voir avec lgalit en
math !). Dans une aectation, le membre de gauche reoit le membre de droite ce qui ncessite dvaluer
la valeur correspondant au membre de droite avant de laecter au membre de gauche.
import math
a = 2
b = 7.2 * math.log(math.e / 45.12) - 2*math.pi
c = b ** a
Remarque
3 Pour ne pas confondre aectation et galit, loral, au lieu de dire a gal , dites a reoit .
La valeur dune variable, comme son nom lindique, peut voluer au cours du temps. La valeur ant-
rieure est perdue :
>>> a = 3 * 7
>>> a
21
>>> b = 2 * 2
>>> b
4
>>> a = b + 5
>>> a
9
Le membre de droite dune aectation tant valu avant de raliser laectation elle-mme, la variable
aecte peut se trouver en partie droite et cest sa valeur avant laectation qui est utilise dans le calcul :
Le membre de droite dune aectation tant valu avant de raliser laectation elle-mme, la variable
aecte peut se trouver en partie droite et cest cee valeur, avant aectation, qui est utilise pour le calcul :
>>> a = 2
>>> a = a + 1 # incrmentation
>>> a
3
>>> a = a - 1 # dcrmentation
- -
. Les anes de caractres La calculatrice Python
>>> a
2
>>> c = True
>>> s = (c = True) and True
File <stdin>, line 1
s = (c = True) and True
^
SyntaxError: invalid syntax
La comparaison a une valeur (de type bool) utilisable dans une expression mais na pas deet :
>>> c = a
>>> s = (c == a) and True
>>> s
True
- -
La calculatrice Python . Les anes de caractres
x = a x a x a
y = b y b y b
z = .c z c z =. y z c
x = d x a
y b
. z
F . Laectation illustre.
Trois syntaxes de chane sont disponibles. Remarquez que lon peut aussi utiliser le la place de , ce
qui permet dinclure une notation dans lautre :
Troisime forme
multi-lignes
trs utile pour
la documentation
.. Oprations
Longueur :
>>> s = abcde
>>> len(s)
5
Concatnation :
- -
. Les anes de caractres La calculatrice Python
>>> s1 = abc
>>> s2 = defg
>>> s3 = s1 + s2
>>> s3
abcdefg
Rptition :
>>> s4 = Fi!
>>> s5 = s4 * 3
>>> s5
Fi! Fi! Fi!
.. Fonctions vs mthodes
On peut agir sur une chane en utilisant des fonction (notion procdurale) communes tous les types
squences ou conteneurs, ou bien des mthodes (notion objet) spciques aux chanes.
Exemple dutilisation de la fonction len() :
>>> abracadabra.upper()
ABRACADABRA
isupper() et islower() : retournent True si la chane ne contient respectivement que des majuscu-
les/minuscules :
>>> s.isupper()
False
istitle() : retourne True si seule la premire lere de chaque mot de la chane est en majuscule :
>>> s.istitle()
False
>>> s.isalpha()
True
>>> s.isdigit()
False
- -
La calculatrice Python . Les anes de caractres
>>> s.startswith(cH)
True
>>> s.endswith(aSSe)
False
>>> s.lower()
chaise basse
>>> s.upper()
CHAISE BASSE
>>> s.capitalize()
Chaise basse
>>> s.swapcase()
ChaISE BASsE
>>> s.center(20, -)
----cHAise basSe----
>>> s.rjust(20, @)
@@@@@@@@cHAise basSe
zfill(width) : complte ch gauche avec des 0 jusqu une longueur maximale de width :
>>> s.zfill(20)
00000000cHAise basSe
>>> s.strip(ce)
HAise basS
find(sub[, start[, stop]]) : renvoie lindex de la chane sub dans la sous-chane start stop,
sinon renvoie -. rfind() eectue le mme travail en commenant par la n. index() et rindex()
font de mme mais produisent une erreur (exception) si la chane nest pas trouve :
>>> s.find(se b)
4
replace(old, new[, count]) : remplace count instances (toutes par dfaut) de old par new :
split(seps[, maxsplit]) : dcoupe la chane en maxsplit morceaux (tous par dfaut). rsplit()
eectue la mme chose en commenant par la n et striplines() eectue ce travail avec les ca-
ractres de n de ligne :
>>> s.split()
[cHAise, basSe]
join(seq) : concatne les chanes du conteneur seq en intercalant entre chaque lment la chane
sur laquelle la mthode est applique :
- -
. Les anes de caractres La calculatrice Python
.. Indexation simple
Pour indexer une chane, on utilise loprateur [ ] dans lequel lindex, un entier sign qui commence
0 indique la position dun caractre :
s = Rayons X
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7]
.
R a y o n s X
.. Extraction de sous-anes
Dnition
b Extraction de sous-chanes. Loprateur [ ] avec ou index spars par le caractre
dextraire des sous-chanes (ou tranches) dune chane.
: permet
s = Rayons X
s[1:4] s[-3:]
.
R a y o n s X
s[:3] s[3:]
F . Extraction de sous-chanes
Par exemple :
- -
La calculatrice Python . Les donnes binaires
Une donne binaire contient une suite de zro ou plusieurs octets, cest--dire dentiers non signs sur
bits (compris dans lintervalle []). Ces types la C sont bien adapts pour stocker de grandes
quantits de donnes. De plus Python fournit des moyens de manipulation ecaces de ces types.
Les deux types sont assez semblables au type str et possdent la plupart de ses mthodes. Le type
modiable bytearray possde des mthodes communes au type list.
. Les entres-sorties
Lutilisateur a besoin dinteragir avec le programme (+ Fig. .). En mode console (on abordera les
interfaces graphiques ultrieurement), on doit pouvoir saisir ou entrer des informations, ce qui est gnra-
lement fait depuis une lecture au clavier. Inversement, on doit pouvoir acher ou sortir des informations,
ce qui correspond gnralement une criture sur lcran.
F . Les entres-sorties.
.. Les entres
Il sagit de raliser une saisie au clavier : la fonction standard input() interrompt le programme, ache
une ventuelle invite lcran et aend que lutilisateur entre une donne au clavier (ache lcran)
et la valide par Entre .
La fonction input() eectue toujours une saisie en mode texte (la valeur retourne est une chane) dont
on peut ensuite changer le type (on dit aussi transtyper ou cast en anglais) :
On rappelle que Python est un langage dynamique (les variables peuvent changer le type au gr des
aectations) mais galement fortement typ (contrle de la cohrence des types) :
- -
. Les entres-sorties La calculatrice Python
.. Les sorties
En mode calculatrice , Python lit-value-ache (+ Fig. ., p. ), mais la fonction print() reste
indispensable aux achages dans les scripts. Elle se charge dacher la reprsentation textuelle des in-
formations qui lui sont donnes en paramtre, en plaant un blanc sparateur entre deux informations, et
en faisant un retour la ligne la n de lachage (le sparateur et la n de ligne peuvent tre modis) :
>>> a, b = 2, 5
>>> print(a, b)
2 5
>>> print(Somme :, a + b)
Somme : 7
>>>> print(a - b, est la diffrence)
-3 est la diffrence
>>> print(Le produit de, a, par, b, vaut :, a * b)
Le produit de 2 par 5 vaut : 10
>>> print(On a <, 2**32, a*b, > cas !, sep=~~~)
On a <~~~4294967296~~~10~~~> cas !
>>> # pour afficher autre chose quun espace en fin de ligne :
>>> print(a, end=@)
2@>>> print()
>>>
Squence Signication
\saut_ligne saut de ligne ignor (en n de ligne)
\\ ache un antislash
\ apostrophe
\ guillemet
\a sonnerie (bip)
\b retour arrire
\f saut de page
\n saut de ligne
\r retour en dbut de ligne
\t tabulation horizontale
\v tabulation verticale
\N{nom} caractre sous forme de code Unicode nomm
\uhhhh caractre sous forme de code Unicode bits
\Uhhhhhhhh caractre sous forme de code Unicode bits
\ooo caractre sous forme de code octal
\xhh caractre sous forme de code hexadcimal
- -
La calculatrice Python . Les entres-sorties
- -
C
. Instructions composes
Pour identier les instructions composes, Python utilise la notion dindentation signicative. Cee
syntaxe, lgre et visuelle, met en lumire un bloc dinstructions et permet damliorer grandement la
prsentation et donc la lisibilit des programmes sources.
Syntaxe
. Une instruction compose se compose :
dune ligne den-tte termine par deux-points ;
dun bloc dinstructions indent par rapport la ligne den-tte. On utilise habituellement quatre
espaces par indentation et on ne mlange pas les tabulations et les espaces.
Attention
j Toutes les instructions au mme niveau dindentation appartiennent au mme bloc.
Exemple :
#Exemplesdinstructioncomposesimple
#(lesespacessontindiqusparuncaractrespcifique) :
ph=6.0
ifph<7.0:
print(Cestunacide.)
ifph>7.0:
print(Cestunebase.)
Contrle du ux dinstructions . Choisir
#Exempledinstructioncomposeimbrique :
n=3
ifn<=0:
print(nestngatifounul)
else :
print(nestpositif)
ifn>2:
print(nestsuprieur2)
. Choisir
>>> x = 5
>>> if x < 0:
... print(x est ngatif)
... elif x % 2 != 0:
... print(x est positif et impair)
... print (ce qui est bien aussi !)
... else:
... print(x nest pas ngatif et est pair)
...
x est positif et impair
ce qui est bien aussi !
>>> x = 8
>>> estPair = (x % 2 == 0)
>>> estPair
True
>>> if estPair: # mieux que if estPair == True:
... print(La condition est vraie)
...
La condition est vraie
>>> x = 4
>>> y = 3
>>> if x < y: # criture classique
... plus_petit = x
... else:
... plus_petit = y
...
>>> print(Plus petit : , plus_petit)
Plus petit : 3
>>> plus_petit = x if x < y else y # utilisation de loprateur ternaire
>>> print(Plus petit : , plus_petit)
Plus petit : 3
Remarque
3 Loprateur ternaire est une expression qui fournit une valeur que lon peut utiliser dans une aectation
ou un calcul.
- -
. Boucles Contrle du ux dinstructions
. Boucles
.. Rpter : while
Rpter une portion de code tant quune expression boolenne est vraie :
Utilisation classique : la saisie ltre dune valeur numrique (on doit prciser le type car on se rappelle
que input() saisit une chane) :
n = int(input(Entrez un entier [1 .. 10] : ))
while not(1 <= n <= 10) :
n = int(input(Entrez un entier [1 .. 10], S.V.P. : ))
.. Parcourir : for
Parcourir un itrable :
>>> for lettre in ciao:
... print(lettre)
...
c
i
a
o
>>> for x in [2, a, 3.14]:
... print(x)
...
2
a
3.14
>>> for i in range(5):
... print(i)
...
0
1
- -
Contrle du ux dinstructions . Ruptures de squences
2
3
4
>>> nb_voyelles = 0
>>> for lettre in Python est un langage tres sympa:
... if lettre in aeiouy:
... nb_voyelles = nb_voyelles + 1
...
>>> nb_voyelles
10
. Ruptures de squences
.. interrompre une boucle : break
Sort immdiatement de la boucle for ou while en cours contenant linstruction :
while - else
Les boucles while et for peuvent possder une clause else qui ne sexcute que si la boucle se termine
normalement, cest--dire sans interruption :
x = y // 2
while x > 1:
if y % x == 0:
print(x, a pour facteur, y)
break # voici linterruption !
x -= 1
else :
print(y, est premier.)
- -
. Ruptures de squences Contrle du ux dinstructions
for - else
Toutes les exceptions leves par Python appartiennent un ensemble dexceptions nomm Exception.
Cee famille ore une vingtaine dexceptions standard . Normalement, toutes les exceptions doivent donc
tre types (munies dun nom de type dexception) pour viter des erreurs silencieuses.
. Citons quelques exemplaires : AritmeticError, ZeroDivisionError, IndexError, KeyError, AttributeError, IOError,
ImportError, NameError, SyntaxError, TypeError
- -
Contrle du ux dinstructions . Ruptures de squences
try:
... # squence normale dexcution
except <exception_1> as e1:
... # traitement de lexception 1
except <exception_2> as e2:
... # traitement de lexception 2
...
else:
... # clause excute en labsence derreur
finally:
... # clause toujours excute
Linstruction raise permet de lever volontairement une exception. On peut trouver linstruction tout
endroit du code, pas seulement dans un bloc try :
x = 2
if not(0 <= x <= 1) :
raise ValueError(x nest pas dans [0 .. 1])
Remarque
3 raise, sans valeur, dans un bloc except, permet de ne pas bloquer une exception et de la propager. On
peut lutiliser pour redclancher une erreur dun bloc except non typ.
- -
C
Conteneurs standard
. Squences
Dnition
b Une squence est un conteneur ordonn dlments indexs par des entiers indiquant leur position
dans le conteneur.
. Listes
.. Dnition, syntaxe et exemples
Dnition
b Une liste est une collection ordonne et modiable dlments ventuellement htrognes.
Syntaxe
. lments spars par des virgules, et entours de crochets.
>>> truc = []
>>> machin = [0.0] * 3
>>> truc
[]
>>> machin
[0.0, 0.0, 0.0]
>>>
>>> liste_1 = list(range(4))
>>> liste_1
[0, 1, 2, 3]
>>> liste_2 = list(range(4, 8))
>>> liste_2
[4, 5, 6, 7]
>>> liste_3 = list(range(2, 9, 2))
>>> liste_3
[2, 4, 6, 8]
>>>
>>> 2 in liste_1, 8 in liste_2, 6 in liste_3
(True, False, True)
.. Mthodes
elques mthodes de modication des listes :
- -
. Tuples Conteneurs standard
.. Squences de squences
Les squences, comme du reste les autres conteneurs, peuvent tre imbriqus.
Par exemple :
4
5
a
b
c
d
. Tuples
Dnition
b Un tuple est une collection ordonne et non modiable dlments ventuellement htrognes.
Syntaxe
. lments spars par des virgules, et entours de parenthses.
- -
Conteneurs standard . Retour sur les rfrences
phrase[4] = casse
Si on veut pouvoir eectuer des modications spares, il faut aecter lautre variable par une copie
distincte de lobjet, soit en crant une tranche complte des squences dans les cas simples, soit en utilisant
le module copy dans les cas les plus gnraux (autres conteneurs). Dans les rares occasions o lon veut
aussi que chaque lment et aribut de lobjet soit copi sparment et de faon rcursive, on emploie la
fonction copy.deepcopy() :
- -
. Tableaux associatifs Conteneurs standard
[1, 2, 3, 4, 6]
>>> a
[1, 2, 3, 4]
>>> d1 = {a : [1, 2], b : [3, 4]}
>>> d2 = {c : (1, 2, 3), c : (4, 5, 6)}
>>> liste_de_dicos = [d1, d2]
>>> nouvelle_liste_de_dicos = copy.deepcopy(liste_de_dicos) # copie profonde (ou rcursive)
>>> nouvelle_liste_de_dicos
[{a: [1, 2], b: [3, 4]}, {c: (4, 5, 6)}]
. 2
a += a 7+2
a =. 7 a 7 9
Assignation augmente dun objet modiable (cas dune liste : + Fig. .). On a reprsent ltape
de la cration de la liste intermdiaire.
. 9]
m = [5, m [0] [1] . 1]
m += [6, m += [0] [1]
5 9 6 1
. 1]
m += [6, m [0] [1] [2] [3]
5 0 6 1
. Tableaux associatifs
Dnition
b Un tableau associatif est un type de donnes permeant de stocker des couples (cle : valeur), avec
un accs trs rapide la valeur partir de la cl, la cl ne pouvant tre prsente quune seule fois dans le
tableau.
Il possde les caractristiques suivantes :
loprateur dappartenance dune cl (in)
la fonction taille (len()) donnant le nombre de couples stocks ;
il est itrable (on peut le parcourir) mais nest pas ordonn.
- -
Conteneurs standard . Ensembles (set)
.. Dictionnaires (dict)
Syntaxe
. Collection de couples cle : valeur entoure daccolades.
Les dictionnaires constituent un type composite mais ils nappartiennent pas aux squences.
Les dictionnaires sont modiables mais non-ordonns : les couples enregistrs noccupent pas un ordre
immuable, leur emplacement est gr par un algorithme spcique (algorithme de hash). Le caractre
non-ordonn des dictionnaire est le prix payer pour leur rapidit !
Une cl pourra tre alphabtique, numrique en fait tout type hachable (donc liste et dictionnaire
exclus). Les valeurs pourront tre de tout type sans exclusion.
Exemples de cration
Mthodes
elques mthodes applicables aux dictionnaires :
. Ensembles (set)
Dnition
b Un ensemble est une collection itrable non ordonne dlments hachables uniques.
- -
. Fiiers textuels Conteneurs standard
>>> X = set(spam)
>>> Y = set(pass)
>>> X
{s, p, m, a}
>>> Y # pas de duplication : quun seul s
{s, p, a}
>>> p in X
True
>>> m in Y
False
>>> X - Y # ensemble des lments de X qui ne sont pas dans Y
{m}
>>> Y - X # ensemble des lments de Y qui ne sont pas dans X
set()
>>> X ^ Y # ensemble des lments qui sont soit dans X soit dans Y
{m}
>>> X | Y # union
{s, p, m, a}
>>> X & Y # intersection
{s, p, a}
X Y
m s
. p
a
p
. Fiiers textuels
.. Introduction
On rappelle que lordinateur nexcute que les programmes prsents dans sa mmoire volatile (la
RAM). Pour conserver durablement des informations, il faut utiliser une mmoire permanente comme
par exemple le disque dur, la cl USB, le DVD, sur lesquels le systme dexploitation organise les don-
nes sous la forme de chiers.
Comme la plupart des langages, Python utilise classiquement la notion de chier.
Nous limiterons nos exemples aux chiers textuels (lisibles par un diteur), mais signalons que les
chiers stocks en codage binaire sont plus compacts et plus rapides grer (utiles pour les grands volumes
de donnes).
. Remarquez que lon prcise lencoding. Ceci sera justi ultrieurement (cf. annexe C p. )
- -
Conteneurs standard . Itrer sur les conteneurs
Python utilise les chiers en mode texte par dfaut (mode t). Pour les chiers binaires, il faut prciser
le mode b.
Le paramtre optionnel encoding assure les conversions entre les types byte (cest--dire des tableaux
doctets), format de stockage des chiers sur le disque, et le type str (qui, en Python , signie toujours
Unicode), manipul lors des lectures et critures. Il est prudent de toujours lutiliser.
Les encodages les plus frquents sont utf8 (cest lencodage privilgier en Python ), latin1,
ascii
Tant que le chier nest pas ferm , son contenu nest pas garanti sur le disque.
Une seule mthode de fermeture :
f1.close()
criture squentielle
Le chier sur disque est considr comme une squence de caractres qui sont ajouts la suite, au
fur et mesure que lon crit dans le chier.
Mthodes dcriture :
f = open(truc.txt, w, encoding=utf8)
s = toto\n
f.write(s) # crit la chane s dans f
l = [a, b, c]
f.writelines(l) # crit les chanes de la liste l dans f
f.close()
f2 = open(truc2.txt, w, encoding=utf8)
print(abcd, file=f2) # utilisation de loption file
f2.close()
Lecture squentielle
En lecture, la squence de caractres qui constitue le chier est parcourue en commenant au dbut
du chier et en avanant au fur et mesure des lectures.
Mthodes de lecture dun chier en entier :
- -
. Aage format Conteneurs standard
Obtenir une squence trie lments uniques (la squence initiale est inchange) :
. Aage format
La mthode format() permet de contrler nement la cration de chanes formates. On lutilisera
pour un achage via print(), pour un enregistrement via f.write(), ou dans dautres cas.
Remplacements simples :
a, b = 5, 3
print(The story of {c} and {d}.format(c=a+b, d=a-b)) # The story of 8 and 2
- -
Conteneurs standard . Aage format
import math
import sys
Formatages numriques :
n = 100
pi = 3.1415926535897931
k = -54
print({ :+d} { :+d}.format(n, k)) # +100 -54 (on force laffichage du signe)
Formatages divers :
. str() est un achage orient utilisateur alors que repr() est une reprsentation lirale.
- -
C
Les fonctions sont les lments structurants de base de tout langage pro-
cdural.
Elles orent dirents avantages :
vitent la rptition : on peut factoriser une portion de code qui se r-
pte lors de lexcution en squence dun script ;
Mettent en relief les donnes et les rsultats : entres et sorties de la fonc-
tion ;
Permettent la rutilisation : mcanisme de limport ;
Dcomposent une te complexe en tes plus simples : conception de
lapplication.
Ces avantages sont illustrs sur la gure . qui utilise entre autres la no-
tion dimport, mcanisme trs simple qui permet de rutiliser des chiers de
fonctions, souvent appels modules ou bibliothques.
. Dnition et syntaxe
Dnition
b Une fonction est un ensemble dinstructions regroupes sous un nom et sexcutant la demande.
On doit dnir une fonction chaque fois quun bloc dinstructions se trouve plusieurs reprises dans
le code ; il sagit dune factorisation de code .
Syntaxe
. La dnition dune fonction se compose :
du mot cl def suivi de lidenticateur de la fonction, de parenthses entourant les paramtres
de la fonction spars par des virgules, et du caractre deux points qui termine toujours une
instruction compose ;
dune chane de documentation (ou docstring) indente comme le corps de la fonction ;
du bloc dinstructions indent par rapport la ligne de dnition, et qui constitue le corps de la
fonction.
Le bloc dinstructions est obligatoire. Sil est vide, on emploie linstruction pass.
La documentation, bien que facultative, est fortement conseille.
def afficheAddMul(a, b) :
Calcule et affiche :
- la somme de a et b,
- le produit de a et b.
Fonctions et espaces de noms . Dnition et syntaxe
B A
APPEL/RETOUR
C C
B
D D
APPEL/RETOUR
B E
E.
(a) vite la duplication de code
# util.py
def proportion(chaine, motif):
Frquence de <motif> dans <chaine>.
n = len(chaine)
k = chaine.count(motif)
return k/n
.
(b) Met en relief entres et sorties
import util
...
p1 = util.proportion(une_chaine, le)
...
p2 = util.proportion(une_autre_chaine, des)
...
.
(c) Linstruction import permet la rutilisation
problme
initial
complexe
sous- sous-
sous-problme
.
complexe problme 1 problme 2
sous- sous-
problme 3 problme 4
- -
. Passage des arguments Fonctions et espaces de noms
somme = a + b
produit = a * b
print(La somme de, a, et, b, est, somme, et le produit, produit)
affectation
x = 7
y = k
z = 1.618
# exemple dappel :
table(7, 2, 8)
# 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49 8 x 7 = 56
def cube(x) :
Retourne le cube de largument.
return x**3
def volumeSphere(r) :
. Une fonction vaut quelque chose, une procdure fait quelque chose.
- -
Fonctions et espaces de noms . Passage des arguments
def surfaceVolumeSphere(r) :
surf = 4.0 * math.pi * r**2
vol = surf * r/3
return surf, vol
# programme principal
rayon = float(input(Rayon : ))
s, v = surfaceVolumeSphere(rayon)
print(Sphre de surface { :g} et de volume { :g}.format(s, v))
Attention
j On utilise de prfrence des valeurs par dfaut non modiables (int, float, str, bool, tuple) car la
modication dun paramtre par un premier appel est visible les fois suivantes.
Si on a besoin dune valeur par dfaut qui soit modiable (list, dict), on utilise la valeur prdnie
None et on fait un test dans la fonction avant modication :
def maFonction(liste=None) :
if liste is None :
liste = [1, 3]
- -
. Espaces de noms Fonctions et espaces de noms
def somme(*args) :
Renvoie la somme du tuple <args>.
resultat = 0
for nombre in args :
resultat += nombre
return resultat
# Exemples dappel :
print(somme(23)) # 23
print(somme(23, 42, 13)) # 78
Attention
j Si la fonction possde plusieurs arguments, le tuple est en dernire position.
Rciproquement il est aussi possible de passer un tuple (en fait une squence) lappel qui sera d-
compress en une liste de paramtres dune fonction classique .
def somme(a, b, c) :
return a+b+c
# Exemple dappel :
elements = (2, 4, 6)
print(somme(*elements)) # 12
def unDict(**kwargs) :
return kwargs
# Exemples dappels
## par des paramtres nomms :
print(unDict(a=23, b=42)) # {a : 23, b : 42}
## en fournissant un dictionnaire :
mots = {d : 85, e : 14, f :9}
print(unDict(**mots)) # {e : 14, d : 85, f : 9}
Attention
j Si la fonction possde plusieurs arguments, le dictionnaire est en toute dernire position (aprs un
ventuel tuple).
. Espaces de noms
Un espace de noms est une notion permeant de lever une ambigut sur des termes qui pourraient
tre homonymes sans cela. Il est matrialis par un prxe identiant de manire unique la signication
dun terme. Au sein dun mme espace de noms, il ny a pas dhomonymes :
- -
Fonctions et espaces de noms . Espaces de noms
2.718
>>> print(math.pi) # une valeur de lespace de noms math
3.141592653589793
Interne
Noms prdfinis : open, len,...
Global
Noms affects la base dun module
Noms dclars global dans
une fonction ou un module
Local
Noms affects dans
une fonction ou un module
F . Rgle LGI
Exemples de porte
Par dfaut, tout identicateur utilis dans le corps dune fonction est local celle-ci. Si une fonction a
besoin de modier certains identicateurs globaux, la premire instruction de cee fonction doit tre :
global <identificateurs>
Par exemple :
# x et fonc sont affects dans le module => globaux
x = 99
print(fonc(1)) # 102
print(x) # 101
x = 99
print(fonc(1)) # 100
print(x) # 99
- -
. Espaces de noms Fonctions et espaces de noms
x = 99
print(fonc(1)) # 4
print(x) # 99
- -
C
Modules et packages
. Modules
Dnition
b Module : chier script Python permeant de dnir des lements de programme rutilisables. Ce
mcanisme permet dlaborer ecacement des bibliothques de fonctions ou de classes.
linstruction from <nom_module> import nom1, nom2donne accs directement une slection choi-
sie de noms dnis dans le module.
Dans les deux cas, le module et ses dnitions existent dans leur espace mmoire propre, et on duplique
simplement dans le module courant les noms que lon a choisi, comme si on avait fait les aectations :
Remarque
3 Il est conseill dimporter dans lordre :
les modules de la bibliothque standard ;
les modules des bibliothques tierces ;
Les modules personnels.
Attention
j Pour tout ce qui est fonction et classe, ainsi que pour les constantes (variables globales dnies
et aecte une fois pour toute une valeur), limport direct du nom ne pose pas de problme.
Par contre, pour les variables globales que lon dsire pouvoir modier, il est prconis de passer
systmatiquement par lespace de nom du module an de sassurer de lexistence de cee variable en un
unique exemplaire ayant la mme valeur dans tout le programme.
.. Exemples
Notion d auto-test
Le module principal est celui qui est donn en argument sur la ligne de commande ou qui est lanc en
premier lors de lexcution dun script. Son nom est contenu dans la variable globale __name__. Sa valeur
dpend du contexte de lexcution.
Soit le module :
# je_me_nomme.py
print(Je me nomme :, __name__)
Premier contexte excution sur la ligne de commande (ou dans un EDI), on obtient la valeur de la variable
prdnie __main__ :
$ python3 je_me_nomme.py
Je me nomme : __main__
Second contexte import de ce module (ce nest donc plus le module principal ), on obtient lidenticateur
du module :
Grce un test, on peut donc facilement savoir si le code est excut en tant que script principal :
on crit un script de fonctions ou de classes (souvent appel bibliothque) et on termine le chier
par un test, l auto-test , pour vrier que lon est dans le module principal. On en prote pour
vrier tous les lments de la bibliothque ;
quand on importe le script, le test inclus est faux et on se borne utiliser la bibliothque.
- -
. Batteries included Modules et paages
# cube.py
def cube(x) :
retourne le cube de <x>.
return x**3
# auto-test ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if __name__ == __main__ : # vrai car module principal
if cube(9) == 729:
print(OK !)
else :
print(KO !)
Utilisation de ce module dans un autre (par exemple celui qui contient le programme principal) :
import cube
cube de 1 = 1
cube de 2 = 8
cube de 3 = 27
Autre exemple :
def ok(message) :
Retourne True si on saisie <Entre>, <O>, <o>, <Y> ou <y>,
False dans tous les autres cas.
s = input(message + (O/n) ? )
return True if s == or s[0] in OoYy else False
# auto-test ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if __name__ == __main__ :
while True :
if ok(Encore) :
print(Je continue)
else :
print(Je marrte)
break
Encore (O/n) ?
Je continue
Encore (O/n) ? o
Je continue
Encore (O/n) ? n
Je marrte
. Batteries included
On dit souvent que Python est livr piles comprises (baeries included) tant sa bibliothque stan-
dard, riche de plus de packages et modules, rpond aux problmes courants les plus varis.
Ce survol prsente quelques fonctionnalits utiles.
- -
Modules et paages . Batteries included
Le module struct permet de convertir des nombres, boolens et des chanes en leur reprsentation
binaire an de communiquer avec des bibliothques de bas-niveau (souvent en C).
Le module difflib permet la comparaison de squences et fournit des sorties au format standard
di ou en HTML.
Enn on ne saurait oublier le module re qui ore Python la puissance des expressions rgulires .
# 1. cration du parser
parser = argparse.ArgumentParser(description=Process some integers)
# processing
print(args.accumulate(args.integers))
$ python argparse.py -h
usage: argparse.py [-h] [--sum] N [N ...]
positional arguments:
N an integer for the accumulator
optional arguments:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
- -
. Batteries included Modules et paages
positional arguments:
N an integer for the accumulator
optional arguments:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
$ python argparse.py 1 2 3 4 5 6 7 8 9
9
vendredi_precedent = datetime.date.today()
un_jour = datetime.timedelta(days=1)
while vendredi_precedent.weekday() != calendar.FRIDAY :
vendredi_precedent -= un_jour
print(vendredi_precedent.strftime(%A, %d-%b-%Y))
# Friday, 09-Oct-2009
import heapq
import random
heap = []
for i in range(10) :
heapq.heappush(heap, random.randint(2, 9))
print(heap) # [2, 3, 5, 4, 6, 6, 7, 8, 7, 8]
linstar des structures C, Python propose dsormais, via le module collections, la notion de type
tuple nomm (il est bien sr possible davoir des tuples nomms embots) :
import collections
# description du type :
Point = collections.namedtuple(Point, x y z)
# on instancie un point :
point = Point(1.2, 2.3, 3.4)
# on laffiche :
print(point : [{}, {}, {}]
.format(point.x, point.y, point.z)) # point : [1.2, 2.3, 3.4]
s = [(y, 1), (b, 2), (y, 3), (b, 4), (r, 1)]
d = defaultdict(list)
- -
Modules et paages . Python scientique
for k, v in s :
d[k].append(v)
print(d.items())
# dict_items([(y, [1, 3]), (r, [1]), (b, [2, 4])])
s = mississippi
d = defaultdict(int)
for k in s :
d[k] += 1
print(d.items())
# dict_items([(i, 4), (p, 2), (s, 4), (m, 1)])
. Python scientique
Dans les annes , Travis Oliphant et dautres commencrent laborer des outils ecaces de trai-
tement des donnes numriques : Numeric, Numarray, et enn NumPy. SciPy, bibliothque dalgorithmes
scientiques, a galement t cre partir de NumPy. Au dbut des annes , John Hunter cre mat-
plotlib un module de tracer de graphiques D. la mme poque Fernando Perez cre IPython en vue
damliorer lintractivit et la productivit en Python.
En moins de ans aprs sa cration, les outils essentiels pour faire de Python un langage scientique
performant tait en place.
- -
. Python scientique Modules et paages
print(Fraction(7e-6)) # 7/1000000
d.getcontext().prec = 6
print(d.Decimal(1) / d.Decimal(7)) # 0.142857
d.getcontext().prec = 18
print(d.Decimal(1) / d.Decimal(7)) # 0.142857142857142857
En plus des bibliothques math et cmath dj vues, la bibliothque random propose plusieurs fonctions
de nombres alatoires.
.. Linterprteur IPython
Remarque
3 On peut dire que IPython est devenu de facto linterprteur standard du Python scientique.
En mars , ce projet a valu le Prix du dveloppement logiciel libre par la Free Soware Foundation
son crateur Fernando Perez. Depuis dbut et pour deux ans, la fondation Alfred P. Sloan subven-
tionne le dveloppement de IPython.
IPython (actuellement en version .X) est disponible en trois dclinaisons (+ Fig. . et .) :
La version notebook mrite une mention spciale : Chaque cellule du notebook peut tre du code, des
gures, du texte enrichi (y compris des formules mathmatiques), des vidos, etc.
La gure . prsente un exemple de trac interactif.
Objectifs
Daprs ses concepteurs, les objectifs dIPython sont les suivants :
Fournir un interprteur Python plus puissant que celui par dfaut. IPython propose de nombreuses
caractristiques comme lintrospection dobjet, laccs au shell systme ainsi que ses propres com-
mandes permeant une grande interaction avec lutilisateur.
Proposer un interprteur embarquable et prt lemploi pour vos programmes Python. IPython
seorce dtre un environnement ecace la fois pour le dveloppement de code Python et pour
la rsolution des problmes lis lutilisation dobjets Python.
Orir un ensemble de librairies pouvant tre utilis comme environnement pour dautres systmes
utilisant Python comme langage sous-jacent (particulirement pour les environnements scienti-
ques comme matlab, mapple ou mathematica).
Permere le test interactif des librairies graphiques gres comme Tkinter, wxPython, PyGTK alors
que IDLE ne le permet quavec des applications Tkinter.
- -
Modules et paages . Python scientique
F . ipython notebook
elques caractristiques
- -
. Python scientique Modules et paages
.. La bibliothque NumPy
Introduction
Le module numpy est la bote outils indispensable pour faire du calcul scientique avec Python .
Pour modliser les vecteurs, matrices et, plus gnralement, les tableaux n dimensions, numpy fournit
le type ndarray.
On note des dirences majeures avec les listes (resp. les listes de listes) qui pourraient elles aussi nous
servir reprsenter des vecteurs (resp. des matrices) :
Les tableaux numpy sont homognes, cest--dire constitus dlments du mme type.
On trouvera donc des tableaux dentiers, des tableaux de oants, des tableaux de chanes de ca-
ractres, etc.
La taille des tableaux numpy est xe la cration. On ne peut donc augmenter ou diminuer la taille
dun tableau comme on le ferrait pour une liste ( moins de crer un tout nouveau tableau, bien
sr).
Ces contraintes sont en fait des avantages :
Le format dun tableau numpy et la taille des objets qui le composent tant x, lempreinte du tableau
en mmoire est invariable et laccs ses lments se fait en temps constant.
Les oprations sur les tableaux sont optimises en fonction du type des lments, et sont beaucoup
plus rapide quelles ne le seraient sur des listes quivalentes.
Exemples
Dans ce premier exemple, on dnit un tableau a dentiers puis on le multiplie globalement, cest--
dire sans utiliser de boucle, par le scalaire 2.5. On dnit de mme le tableau d qui est aect en une seule
instruction a + b.
In [4]: b = a * 2.5
In [7]: d = b + c
Lexemple suivant dnit un tableau positions de 10 000 000 lignes et colonnes, formant des posi-
tions alatoires. Les vecteurs colonnes x et y sont extraits du tableau position. On ache le tableau et le
vecteur x avec chires aprs le point dcimal. On calcule (bien sr globalement) le vecteur des distances
euclidiennes un point particulier (x 0 , y 0 ) et on ache lindice du tableau de la distance minimale ce
point.
In [4]: %precision 3
Out[4]: %.3f
In [5]: positions
- -
Modules et paages . Python scientique
Out[5]:
array([[ 0.861, 0.373],
[ 0.627, 0.935],
[ 0.224, 0.058],
...,
[ 0.628, 0.66 ],
[ 0.546, 0.416],
[ 0.396, 0.625]])
In [6]: x
Out[6]: array([ 0.861, 0.627, 0.224, ..., 0.628, 0.546, 0.396])
In [9]: distances.argmin()
Out[9]: 4006531
Ce type de traitement trs ecace et lgant est typique des logiciels analogues comme .
.. La bibliothque matplotlib
Cee bibliothque permet toutes sortes de reprsentations de graphes D (et quelques unes en D) :
import numpy as np
import matplotlib.pyplot as plt
plt.plot(x, y)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
. Notons que sa syntaxe de base a t pense pour ne pas dpayser lutilisateur de la bibliothque graphique de .
- -
. Python scientique Modules et paages
def f(a, b, c, d) :
x = np.linspace(-10, 10, 20)
y = a*(x**3) + b*(x**2) + c*x + d
title = $f(x) = (%s)x^3 + (%s)x^2 + (%s)x + (%s)$ % (a, b, c, d)
plt_arrays(x, y, title=title)
f(0.25, 2, 4, 3)
.. La bibliothque SymPy
Introduction
SymPy est une bibliothque en pur Python spcialise dans le calcul formel linstar de Mapple ou
Mathematica . Elle permet de faire du calcul arithmtique formel basique, de lalgbre, des mathmatiques
direntielles, de la physique, de la mcanique
Il est facile de se familiariser avec SymPy en lexprimentant directement sur Internet .
Exemples
Si linterprteur IPython est dj install, une alternative intressante est fournie par le script isympy.
Voici quelques exemples des trs nombreuses possibilits oertes par cee bibliothque :
In [2]: P.expand()
Out[2]:
3 2
x - 6x + 11x - 6
In [3]: P.factor()
Out[3]: (x - 3)(x - 2)(x - 1)
- -
Modules et paages . Bibliothques tierces
In [5]: roots
Out[5]: [1, 2, 3]
In [6]: sin(pi/6)
Out[6]: 1/2
In [7]: cos(pi/6)
Out[7]:
___
3
2
In [8]: tan(pi/6)
Out[8]:
___
3
3
In [10]: trigsimp(e)
Out[10]: 2
In [11]: z = 4 + 3*I
In [12]: Abs(z)
Out[12]: 5
In [13]: arg(z)
Out[13]: atan(3/4)
In [15]: diff(f, x)
Out[15]:
2
x cos(x) + 2xsin(x)
. Bibliothques tierces
.. Une grande diversit
Outre les nombreux modules intgrs la distribution standard de Python, on trouve des bibliothques
dans tous les domaines :
scientique ;
bases de donnes ;
tests fonctionnels et contrle de qualit ;
D ;
- -
. Paages Modules et paages
>>> vitesse
10.327377878756584 [m/s]
>>> vitesse.asUnit(mile/h)
23.1017437978 [mile/h]
>>> acceleration = vitesse/temps
>>> acceleration
1.0665473385063085 [m/s2]
. Paages
Outre le module, un deuxime niveau dorganisation permet de structurer le code : les chiers Python
peuvent tre organiss en une arborescence de rpertoires appele paquet, en anglais package.
Dnition
b Un package est un module contenant dautres modules. Les modules dun package peuvent tre des
sous-packages, ce qui donne une structure arborescente.
Pour tre reconnu comme un package valide, chaque rpertoire du paquet doit possder un chier
__init__ qui peut soit tre vide soit contenir du code dinitialisation.
- -
C
. Terminologie
Le vocabulaire de base de la POO
Une classe est quivalente un nouveau type de donnes. On connat dj par exemple les classes list
ou str et les nombreuses mthodes permeant de les manipuler, par exemple :
[3, 5, 1].sort()
casse.upper()
Un objet ou une instance est un exemplaire particulier dune classe. Par exemple [3, 5, 1] est une
instance de la classe list et casse est une instance de la classe str.
Les objets ont gnralement deux sortes daributs : les donnes nommes simplement aributs et les
fonctions applicables appeles mthodes.
Par exemple un objet de la classe complex possde :
deux aributs : imag et real ;
plusieurs mthodes, comme conjugate(), abs()
La plupart des classes encapsulent la fois les donnes et les mthodes applicables aux objets. Par
exemple un objet str contient une chane de caractres Unicode (les donnes) et de nombreuses mthodes.
On peut dnir un objet comme une capsule contenant des aributs et des mthodes :
objet = attributs + mthodes
La Programmation Oriente Objet . Classes et instanciation dobjets
F . Diagrammes de classe.
Dans cet exemple, C est le nom de la classe (qui commence conventionnellement par une majuscule),
et x est un aribut de classe, local C.
class C :
Documentation de la classe C.
x = 23 # attibut de classe
y = un string
z = [1, x, 3, y]
- -
. Classes et instanciation dobjets La Programmation Oriente Objet
Remarque
3 En Python (car cest un langage dynamique comme Ruby, contrairement C++ ou Java) il est possible
dajouter de nouveaux aributs dinstance (ici le a.y = 44) ou mme de nouveaux aributs de classe (ici
C.z = 6).
Dnition
b Une variable dnie au niveau dune classe (comme x dans la classe C) est appel aribut de classe et
est partage par tous les objets instances de cee classe.
Une variable dnie au niveau dun objet (comme y dans lobjet a) est appele aribut dinstance et
est lie uniquement lobjet pour lequel elle est dnie.
>>> v = 5
>>> class C:
... x = v + 3 # utilisation dune variable globale dans la dfinition de classe
... y = x + 1 # recherche dans lespace de noms de la classe lors de la dfinition
...
>>> a = C()
>>> a.x # utilisation sans modification de la variable de classe en passant par lobjet
8
>>> a.x = 2 # cration dune variable dinstance pour lobjet a
- -
La Programmation Oriente Objet . Mthodes
>>> a.x
2
>>> C.x # la variable de classe nest pas modifie
8
>>> C.x = -1 # on peut modifier la variable de classe en passant par lespace de noms de la classe
>>> C.x
-1
chaque cration dune classe C, Python lui associe un dictionnaire (de nom C.__dict__) contenant
un ensemble dinformations. Lexemple suivant ache le dictionnaire li la classe C :
In [1]: class C:
...: Une classe simple.
...: x = 2
...: y = 5
...:
In [2]: C.__dict__
Out[2]: mappingproxy({x: 2, __module__: __main__, __weakref__: <attribute __weakref__ of C objects>, __dict__: <attribute __
In [4]: C.__dict__[__doc__]
Out[4]: Une classe simple.
In [5]: C.__dict__[y]
Out[5]: 5
In [6]: a = C()
In [7]: a.__class__
Out[7]: __main__.C
Notons galement linstruction dir() qui fournit tous les noms dnis dans lespace de noms, mthodes
et variables membres compris.
. Mthodes
Syntaxe
. Une mthode scrit comme une fonction du corps de la classe avec un premier paramtre self obli-
gatoire, o self reprsente lobjet sur lequel la mthode sera applique.
Autrement dit self est la rfrence dinstance.
- -
. Mthodes spciales La Programmation Oriente Objet
28
42
. Mthodes spciales
Beaucoup de classes orent des caractristiques supplmentaires comme par exemple la concatna-
tion des chanes en utilisant simplement loprateur +. Ceci est obtenu grce aux mthodes spciales. Par
exemple loprateur + est utilisable car la classe des chanes a redni la mthode spciale __add__().
Syntaxe
. Ces mthodes portent des noms pr-dnis, prcds et suivis de deux caractres de soulignement.
Elles servent :
initialiser lobjet instanci ;
modier son achage ;
surcharger ses oprateurs ;
.. Linitialisateur
Lors de linstanciation dun objet, la structure de base de lobjet est cre en mmoire, et la mthode
__init__ est automatiquement appele pour initialiser lobjet. Cest typiquement dans cee mthode sp-
ciale que sont crs les aributs dinstance avec leur valeur initiale.
>>> class C:
... def __init__(self, n):
... self.x = n # initialisation de lattribut dinstance x
...
>>> une_instance = C(42) # paramtre obligatoire, affect n
>>> une_instance.x
42
Cest une procdure automatiquement invoque lors de linstanciation : elle ne retourne aucune valeur.
x = 7 + 9 # addition entire
s = ab + cd # concatnation
- -
La Programmation Oriente Objet . Hritage et polymorphisme
.. Exemple de surarge
Dans lexemple suivant nous surchargeons loprateur daddition pour le type Vecteur2D.
Nous surchargeons galement la mthode spciale __str__ utilise pour lachage par print().
. Hritage et polymorphisme
Un avantage dcisif de la POO est quune classe Python peut toujours tre spcialise en une classe
lle qui hrite alors de tous les aributs (donnes et mthodes) de sa super classe. Comme tous les at-
tributs peuvent tre rednis, une mthode de la classe lle et de la classe mre peut possder le mme
nom mais eectuer des traitements dirents (surcharge) et lobjet sadaptera dynamiquement, ds lins-
tanciation. En proposant dutiliser un mme nom de mthode pour plusieurs types dobjets dirents, le
polymorphisme permet une programmation beaucoup plus gnrique. Le dveloppeur na pas savoir,
lorsquil programme une mthode, le type prcis de lobjet sur lequel la mthode va sappliquer. Il lui sut
de savoir que cet objet implmentera la mthode.
.. Hritage et polymorphisme
Dnition
b Lhritage est le mcanisme qui permet de se servir dune classe prexistante pour en crer une nou-
velle qui possdera des fonctionnalits supplmentaires ou direntes.
Le polymorphisme par drivation est la facult pour deux mthodes (ou plus) portant le mme nom mais
appartenant des classes hrites distinctes deectuer un travail dirent. Cee proprit est acquise par
la technique de la surcharge.
. Rappelons quil existe deux faons dacher un rsultat : repr() et str(). La premire est pour la machine , la seconde
pour lutilisateur .
- -
. Notion de conception oriente objet La Programmation Oriente Objet
Bien sr, ces deux conceptions peuvent cohabiter, et cest souvent le cas !
.. Association
Dnition
b Une association reprsente un lien unissant les instances de classe. Elle repose sur la relation a-un
ou utilise-un .
Limplmentation Python utilise est gnralement lintgration dautres objets dans le constructeur
de la classe conteneur :
class Point :
def __init__(self, x, y) :
self.px, self.py = x, y
class Segment :
Classe conteneur utilisant la classe Point.
def __init__(self, x1, y1, x2, y2) :
self.orig = Point(x1, y1)
self.extrem = Point(x2, y2)
def __str__(self) :
return (Segment : [({ :g}, { :g}), ({ :g}, { :g})]
.format(self.orig.px, self.orig.py,
self.extrem.px, self.extrem.py))
Agrgation
Dnition
b Une agrgation est une association non symtrique entre deux classes (lagrgat et le composant).
- -
La Programmation Oriente Objet . Notion de conception oriente objet
Composition
Dnition
b Une composition est un type particulier dagrgation dans laquelle la vie des composants est lie
celle de lagrgat.
.. Drivation
Dnition
b La drivation dcrit la cration de sous-classes par spcialisation. Elle repose sur la relation est-un .
Dans lexemple suivant, un Carre est-un Rectangle particulier pour lequel on appelle linitialisateur
de la classe mre avec les paramtres longueur=cote et largeur=cote :
- -
. Un exemple complet La Programmation Oriente Objet
. Un exemple complet
Le script suivant propose un modle simpli datome et dion.
La variable de classe table liste les premiers lments du tableau de Mendeleev.
class Atome :
atomes simplifis (les 10 premiers lments).
def affiche(self) :
print()
print(Nom de llment :, Atome.table[self.np][0])
print(%s protons, %s lectrons, %s neutrons % (self.np, self.ne, self.nn))
. adapt de [], p. .
- -
La Programmation Oriente Objet . Un exemple complet
- -
C
La POO graphique
Trs utilise dans les systmes dexploitation et dans les applications, les
interfaces graphiques sont programmables en Python.
Parmi les direntes bibliothques graphiques utilisables dans Python
(GTK+, wxPython, Qt), la bibliothque tkinter, issue du langage tcl/Tk est
installe de base dans toutes les distributions Python. tkinter facilite la
construction dinterfaces graphiques simples.
Aprs avoir import la bibliothque, la dmarche consiste crer, congu-
rer et positionner les lments graphiques (widgets) utiliss, coder les fonc-
tions/mthodes associes aux widgets, puis dentrer dans une boucle charge
de rcuprer et traiter les dirents vnements pouvant se produire au ni-
veau de linterface graphique : interactions de lutilisateur, besoins de mises
jour graphiques, etc.
. La bibliothque tkinter
.. Prsentation
Cest une bibliothque assez simple qui provient de lextension graphique, Tk, du langage Tcl . Cee
extension a largement essaim hors de Tcl/Tk et on peut lutiliser en Perl, Python, Ruby, etc. Dans le cas
de Python, lextension a t renomme tkinter.
Paralllement Tk, des extensions ont t dveloppes dont certaines sont utilises en Python. Par
exemple le module standard Tix met une quarantaine de widgets la disposition du dveloppeur.
De son ct, le langage Tcl/Tk a largement volu. La version . actuelle ore une bibliothque ap-
pele Ttk qui permet d habiller les widgets avec dirents thmes ou styles. Ce module est galement
disponible partir de Python ...
Initialisation Initialisation
...
Fonctionnalits clavier vnements messages Fonctionnalits
Boucle
centrales du souris centrales du
rseau dvnements
programme programme
...
.
Terminaison .
Terminaison
import tkinter
- -
. Trois exemples La POO graphique
PhotoImage sert placer des images (GIF et PPM/PGM) sur des widgets
BitmapImage sert placer des bitmaps (X bitmap data) sur des widgets
Menu menu droulant associ un Menubutton
Menubutton bouton ouvrant un menu doptions
Scrollbar ascenseur
Listbox liste slection pour des textes
Text dition de texte simple ou multi-lignes
Canvas zone de dessins graphiques ou de photos
OptionMenu liste droulante
ScrolledText widget Text avec ascenseur
PanedWindow interface onglets
LabelFrame contenant pour organiser dautres widgets, avec un cadre et un titre
Spinbox un widget de slection multiple
. Trois exemples
.. Une calculette
Cee application implmente une calculee simple mais complte (+ Fig. .).
def evaluer(event) :
chaine.configure(text = => + str(eval(entree.get())))
fenetre.mainloop()
. Adapt de [], p. .
- -
La POO graphique . Trois exemples
La fonction evaluer() est excute chaque fois que lutilisateur appuie sur la touche Entre aprs
avoir entr une expression mathmatique. Cee fonction utilise la mthode configure() du widget chaine
pour modier son aribut text. Pour cela, evaluer() exploite les caractristiques de la fonction intgre
eval() qui analyse et value son argument, une chane dexpression mathmatique. Par exemple :
>>> eval((25 + 8) / 3)
11.0
Le programme principal se compose de linstanciation dune fentre Tk() contenant un widget chaine
de type Label() et un widget entree de type Entry(). Nous associons lvnement <Return> au widget
entree de faon quun appui de la touche Entre dclenche la fonction evaluer(). Enn, aprs avoir
positionn les deux widget laide de la mthode pack(), on active la boucle dvnement mainloop().
Notion de callba
Nous avons vu que la programmation dinterface graphique passe par une boucle principale charge
de traiter les dirents vnements qui se produisent.
Cee boucle est gnralement gre directement par la bibliothque dinterface graphique utilise, il
faut donc pouvoir spcier cee bibliothque quelles fonctions doivent tre appeles dans quels cas.
Ces fonctions sont nommes des callbacks ou rappels car elles sont appeles directement par la
bibliothque dinterface graphique lorsque des vnements spciques se produisent.
Conception graphique
La conception graphique va nous aider choisir les bons widgets.
En premier lieu, il est prudent de commencer par une conception manuelle ! En eet rien ne vaut un
papier, un crayon et une gomme pour se faire une ide de laspect que lon veut obtenir.
Dans notre cas on peut concevoir trois zones :
. une zone suprieure, ddie lachage ;
. une zone mdiane est une liste alphabtique ordonne ;
. une zone infrieure est forme de boutons de gestion de la liste ci-dessus.
Chacune de ces zones est code par une instance de Frame(), positionne lune sous lautre grce au
packer,et toutes trois incluses dans une instance de Tk() (cf. conception + Fig. .).
# Bob Cordeau
# tkPhone_IHM.py
- -
. Trois exemples La POO graphique
Label Entry
Button
. .
(a) Conception gnrale (b) Dtails des Frame
F . tkPhone.
import tkinter as tk
from os.path import isfile
# class
class Allo_IHM :
IHM de lapplication rpertoire tlphonique.
def __init__(self, fic) :
Initialisateur/lanceur de la fentre de base
self.phoneList = []
self.fic = fic
if isfile(self.fic) :
with open(self.fic) as f :
for line in f :
self.phoneList.append(line[:-1].split(*))
else :
with open(self.fic, w, encoding=utf8) :
pass
self.phoneList.sort()
self.root = tk.Tk()
self.root.title(Allo !)
self.root.config(relief=tk.RAISED, bd=3)
self.makeWidgets()
self.nameEnt.focus()
self.root.mainloop()
def makeWidgets(self) :
Configure et positionne les widgets
# frame saisie (en haut avec bouton deffacement)
frameH = tk.Frame(self.root, relief=tk.GROOVE, bd=2)
frameH.pack()
- -
La POO graphique . Trois exemples
self.scroll = tk.Scrollbar(frameM)
self.select = tk.Listbox(frameM, yscrollcommand=self.scroll.set, height=6)
self.scroll.config(command=self.select.yview)
self.scroll.pack(side=tk.RIGHT, fill=tk.Y, pady=5)
self.select.pack(side=tk.LEFT, fill=tk.BOTH, expand=1, pady=5)
## remplissage de la Listbox
for i in self.phoneList :
self.select.insert(tk.END, i[0])
self.select.bind(<Double-Button-1>, lambda event : self.afficher(event))
def ajouter(self) :
pass
def supprimer(self) :
pass
def clear(self) :
pass
# auto-test -------------------------------------------------------------------
if __name__ == __main__ :
# instancie lIHM, callbacks inactifs
app = Allo_IHM(./phones.txt)
Le code de lapplication
On va maintenant utiliser le module de la faon suivante :
On importe la classe Allo_IHM depuis le module prcdent ;
on cre une classe Allo qui en drive ;
son initialisateur appelle linitialisateur de la classe de base pour hriter de toutes ses caractris-
tiques ;
il reste surcharger les callbacks.
Enn, le script instancie lapplication :
# Bob Cordeau
# tkPhone.py
# import ----------------------------------------------------------------------
from tkPhone_IHM import Allo_IHM
- -
. Trois exemples La POO graphique
class Allo(Allo_IHM) :
Repertoire tlphonique.
def ajouter(self) :
# maj de la liste
ajout = [, ]
ajout[0] = self.nameEnt.get()
ajout[1] = self.phoneEnt.get()
if (ajout[0] == ) or (ajout[1] == ) :
return
self.phoneList.append(ajout)
self.phoneList.sort()
# maj de la listebox
self.select.delete(0, end)
for i in self.phoneList :
self.select.insert(end, i[0])
self.clear()
self.nameEnt.focus()
# maj du fichier
f = open(self.fic, a)
f.write(%s*%s\n % (ajout[0], ajout[1]))
f.close()
def supprimer(self) :
self.clear()
# maj de la liste
retrait = [, ]
retrait[0], retrait[1] = self.phoneList[int(self.select.curselection()[0])]
self.phoneList.remove(retrait)
# maj de la listebox
self.select.delete(0, end)
for i in self.phoneList :
self.select.insert(end, i[0])
# maj du fichier
f = open(self.fic, w)
for i in self.phoneList :
f.write(%s*%s\n % (i[0], i[1]))
f.close()
def clear(self) :
self.nameEnt.delete(0, end)
self.phoneEnt.delete(0, end)
- -
La POO graphique . Trois exemples
tkinter .
F . IDLE.
- -
C
. Teniques procdurales
.. Le pouvoir de lintrospection
Cest un des atouts de Python. On entend par introspection la possibilit dobtenir des informations sur
les objets manipuls par le langage.
La fonction help()
On peut tout dabord utiliser la fonction prdnie help().
Cee fonction est auto-documente :
>>> help()
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.4/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type quit.
help> quit
You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type help(object). Executing help(string)
has the same effect as typing a particular string at the help> prompt.
Teniques avances . Teniques procdurales
Linterprteur IPython
propose une aide encore plus ecace grce son mcanisme dautocompltion
contextuel (touche TAB ) :
In [1]: seq = []
In [2]: seq.
seq.append seq.copy seq.extend seq.insert seq.remove seq.sort
seq.clear seq.count seq.index seq.pop seq.reverse
In [2]: seq.sort?
Type: builtin_function_or_method
String form: <built-in method sort of list object at 0xb5e0c1ac>
Docstring: L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
La fonction utilitaire printInfo() ltre les mthodes disponibles de son argument ne commenant pas
par _ et ache les docstrings associes sous une forme plus lisible que help() :
def printInfo(object) :
Filtre les mthodes disponibles de <object>.
methods = [method for method in dir(object)
if callable(getattr(object, method)) and not method.startswith(_)]
>>> li = [1, 2, 3]
>>>
>>> type(li)
<class list>
>>>
>>> dir(li)
[__add__, __class__, __contains__, __delattr__, __delitem__, __doc__, __eq__, __format__,
__ge__, __getattribute__, __getitem__, __gt__, __hash__, __iadd__, __imul__, __init__,
__iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,
__repr__, __reversed__, __rmul__, __setattr__, __setitem__, __sizeof__, __str__, __subclasshook__,
append, count, extend, index, insert, pop, remove, reverse, sort]
>>>
>>> id(li)
3074801164
- -
. Teniques procdurales Teniques avances
Le module sys
Ce module fournit nombre dinformations gnrales, entre autres :
# au lieu de ce code :
try :
fh = open(filename)
for line in fh :
process(line)
finally :
fh.close()
animaux = []
nombre_de_felins = 0
def gererChat() :
global nombre_de_felins
print(Miaou)
animaux.append(flin)
nombre_de_felins += 1
def gererChien() :
print(Ouah)
animaux.append(canid)
def gererOurs() :
print(Attention au *OUILLE* !)
animaux.append(plantigrade)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- -
Teniques avances . Teniques procdurales
dico = {
chat : gererChat,
chien : gererChien,
ours : gererOurs
}
nf = nombre_de_felins
print(nous avons rencontr {} flin(s).format(nf))
print(Les animaux rencontrs sont : {}.format(, .join(animaux), end= )
Miaou
Attention au *OUILLE* !
Miaou
Ouah
nous avons rencontr 2 flin(s)
Les animaux rencontrs sont : flin, plantigrade, flin, canid
Plus prcisment, une fonction rcursive doit respecter les trois proprits suivantes :
. une fonction rcursive contient un cas de base ;
. une fonction rcursive doit modier son tat pour se ramener au cas de base ;
. une fonction rcursive doit sappeler elle-mme.
Par exemple, trier un tableau de N lments par ordre croissant cest extraire le plus petit lment puis
trier le tableau restant N 1 lments.
Un algorithme classique trs utile est la mthode de Horner qui permet dvaluer ecacement un
polynme de degr n en une valeur donne x 0 , en remarquant que cee rcriture ne contient plus que n
multiplications :
p(x 0 ) = (( ((a n x 0 + a n1 )x 0 + a n2 )x 0 + )x 0 + a 1 )x 0 + a 0
Voici une implmentation rcursive de lalgorithme de Horner dans laquelle le polynme p est repr-
sent par la liste de ses coecients [a0 , , an ] :
Les fonction rcursives sont souvent utilises pour traiter les structures arborescentes comme les r-
pertoires dans les systmes de chiers des disques durs.
Voici lexemple dune fonction qui ache rcursivement les chiers dun rpertoire fourni en para-
mtre :
def listeFichiersPython(repertoire) :
Affiche rcursivement les fichiers Python partir de <repertoire>.
- -
. Teniques procdurales Teniques avances
noms = listdir(repertoire)
for nom in noms :
if nom in (., ..) :
continue
nom_complet = join(repertoire, nom)
if isdir(nom_complet) :
listeFichiersPython(nom_complet)
elif nom.endswith(.py) or nom.endswith(.pyw) :
print(Fichier Python :, nom_complet)
listeFichiersPython(/home/bob/Tmp)
Dans cee dnition, on commence par constituer dans la variable noms la liste des chiers et rper-
toires du rpertoire donn en paramtre. Puis, dans une boucle for, tant que llment examin est un
rpertoire, on r-appelle la fonction sur lui pour descendre dans larborescence de chiers tant que la
condition terminale (if nom in (., ..):) est fausse.
Le rsultat produit est :
La rcursivit terminale
Dnition
b On dit quune fonction f est rcursive terminale, si tout appel rcursif est de la forme return f().
On parle alors dappel terminal.
Python permet la rcursivit mais noptimise pas automatique les appels terminaux. Il est donc pos-
sible daeindre la limite arbitraire xe appels.
On peut pallier cet inconvnient de deux faons. Nous allons illustrer cee stratgie sur un exemple
canonique, la factorielle.
La premire criture est celle qui dcoule directement de la dnition de la fonction :
def factorielle(n) :
Version rcursive non terminale.
if n == 0:
return 1
else :
return n * factorielle(n-1)
On remarque immdiatement (return n * factorielle(n-1)) quil sagit dune fonction rcursive non
terminale. Or une fonction rcursive terminale est en thorie plus ecace (mais souvent moins facile
crire) que son quivalent non terminale : il ny a quune phase de descente et pas de phase de remonte.
La mthode classique pour transformer cee fonction en un appel rcursif terminal est dajouter un
argument dappel jouant le rle daccumulateur. Do le code :
La seconde stratgie est dessayer de transformer lcriture rcursive de la fonction par une criture
itrative. La thorie de la calculabilit montre quune telle transformation est toujours possible partir
dune fonction rcursive terminale, ce quon appelle lopration de drcursivation. Do le code :
. voire incontournable si on en croit la loi de Murphy
- -
Teniques avances . Teniques procdurales
Dnition
b Une liste en comprhension est quivalente une boucle for qui construirait la mme liste en utilisant
la mthode append().
- -
. Teniques procdurales Teniques avances
Autre exemple :
Dnition
b Un gnrateur est une fonction qui mmorise son tat au moment de retourner une valeur.
La transmission dune valeur seectue en utilisant le mot cl yield.
Les gnrateurs fournissent un moyen de gnrer des excutions paresseuses, ce qui signie quelles ne
calculent que les valeurs rellement demandes. Ceci peut savrer beaucoup plus ecace (en termes de
mmoire) que le calcul, par exemple, dune norme liste en une seule fois.
Techniquement, un gnrateur fonctionne en deux temps. Dabord, au lieu de retourner une valeur
avec le mot cl return, la fonction qui doit servir de gnrateur produit une valeur et se met en pause ds
quelle rencontre le mot cl yield.
Ensuite, lutilisation du gnrateur, le corps de la fonction est excut lors des appels explicites la
mthode next() ou implicites dans une boucle for.
Voici un exemple de gnrateur qui fournit un compteur dentiers (initialis 0) infrieurs ou gaux
largument du gnrateur :
- -
Teniques avances . Teniques procdurales
def counter(maximum) :
gnre des entiers infrieurs ou gaux <maximum>.
i = 0
while True :
yield i
if i == maximum : # arrt de gnrateur
return
i = i + 1
Ce qui produit :
0 1 2 3 4 5
Syntaxe
. Une expression gnratrice possde une syntaxe presque identique celle des listes en comprhen-
sion ; la dirence est quune expression gnratrice est entoure de parenthses.
Utilisation
Les expressions gnratrices (souvent appele genexp ) sont aux gnrateurs ce que les listes en
comprhension sont aux fonctions. Bien quil soit transparent, le mcanisme du yield vu ci-dessus est
encore en action.
Par exemple lexpression suivante gnre la cration dun million de valeurs en mmoire avant de
commencer la boucle :
Alors que dans lexpression suivante, la boucle commence immdiatement et ne gnre les valeurs
quau fur et mesure des demandes :
Voici un autre exemple : une genexp de recherche dun motif dans un chier, analogue un grep
simpli :
- -
. Teniques procdurales Teniques avances
.. Les dcorateurs
Les dcorateurs permeent dencapsuler un appel et donc deectuer des pr- ou des post-traitements
lors de lappel dune fonction, dune mthode ou dune classe.
Syntaxe
. Soit deco() un dcorateur. Pour dcorer une fonction on crit :
def deco() :
...
@deco
def fonction(arg1, arg2, ...) :
pass
def f1() :
...
def f2() :
- -
Teniques avances . Teniques objets
...
def f3() :
...
def unDecorateur(f) :
cptr = 0
def _interne(*args, **kwargs) :
nonlocal cptr
cptr = cptr + 1
print(Fonction decore :, f.__name__, . Appel numro :, cptr)
return f(*args, **kwargs)
return _interne
@unDecorateur
def uneFonction(a, b) :
return a + b
def autreFonction(a, b) :
return a + b
print(uneFonction(3, 4))
print(autreFonction(6, 7))
. Teniques objets
Comme nous lavons vu lors du chapitre prcdent, Python est un langage compltement objet. Tous
les types de base ou drivs sont en ralit des types abstraits de donnes implments sous forme de
classe.
.. Les Functors
En Python un objet fonction ou functor est une rfrence tout objet appelable : fonction, fonction
anonyme lambda , mthode, classe. La fonction prdnie callable() permet de tester cee proprit :
. callable en anglais.
. Cee notion sera dveloppe ultrieurement [cf. p. ]
- -
. Teniques objets Teniques avances
Il est possible de transformer les instances dune classe en functor si la mthode spciale __call__()
est dnie dans la la classe :
>>> class A:
... def __init__(self):
... self.historique = []
... def __call__(self, a, b):
... self.historique.append((a, b))
... return a + b
...
>>> a = A()
>>> a(1, 2)
3
>>> a(3, 4)
7
>>> a(5, 6)
11
>>> a.historique
[(1, 2), (3, 4), (5, 6)]
.. Les accesseurs
Le problme de lencapsulation
Dans le paradigme objet, ltat dun objet est priv, les autres objets nont pas le droit de le consulter
ou de le modier.
Classiquement, on distingue les visibilits suivantes :
publique ;
protge ;
prive.
La solution property
Le principe de lencapsulation est mis en uvre par la notion de proprit.
Dnition
b Une proprit (property) est un aribut dinstance possdant des fonctionnalits spciales.
- -
Teniques avances . Teniques objets
# !/usr/bin/python3
#-*- coding : utf-8 -*-
# fichier : property.py
class C :
def __init__(self) :
self._ma_propriete = None
def getx(self) :
getter.
return self._x
def delx(self) :
deleter.
del self._x
# auto-test =========================================================
if __name__ == __main__ :
test = C()
test.x = 10 # setter
print(test.x) # getter
print(C.x.__doc__) # documentation
10
Je suis la proprit x.
La seconde, prfrer car plus simple, utilise la syntaxe des dcorateurs. On remarque que la chane
de documentation de la property est ici la docstring de la dnition de la proprit x :
# !/usr/bin/python3
#-*- coding : utf-8 -*-
# fichier : property2.py
class C :
def __init__(self) :
self._x = None
@property
def x(self) :
Je suis la proprit x.
return self._x
@x.setter
def x(self, value) :
self._x = value
@x.deleter
def x(self) :
del self._x
# auto-test =========================================================
if __name__ == __main__ :
test = C()
test.x = 10 # setter
print(test.x) # getter
print(C.x.__doc__) # documentation
- -
. Teniques objets Teniques avances
10
Je suis la proprit x.
class Point :
@property
def distance_origine(self) :
return math.hypot(self.x, self.y)
def __str__(self) :
return ({0.x !s}, {0.y !s}).format(self)
De nouveau, les mthodes renvoyant un simple oant seront utilises comme des aributs grce
property :
class Cercle(Point) :
def __init__(self, rayon, x=0, y=0) :
super().__init__(x, y)
self.rayon = rayon
@property
def aire(self) : return math.pi * (self.rayon ** 2)
@property
- -
Teniques avances . Teniques objets
@property
def distance_bord_origine(self) :
return abs(self.distance_origine - self.rayon)
Voici la syntaxe permeant dutiliser la mthode rayon comme un aribut en lecture-criture. Remar-
quez que la mthode rayon() retourne laribut protg : __rayon qui sera modi par le seer (la mthode
modicatrice) :
@property
def rayon(self) :
return self.__rayon
@rayon.setter
def rayon(self, rayon) :
assert rayon > 0, rayon strictement positif
self.__rayon = rayon
def __str__(self) :
return ({0.__class__.__name__}({0.rayon !s}, {0.x !s},
{0.y !s}).format(self))
if __name__ == __main__ :
c1 = Cercle(2, 3, 4)
print(c1, c1.aire, c1.circonference)
# Cercle(2, 3, 4) 12.5663706144 12.5663706144
print(c1.distance_bord_origine, c1.rayon) # 3.0 2
c1.rayon = 1 # modification du rayon
print(c1.distance_bord_origine, c1.rayon) # 4.0 1
- -
. Teniques objets Teniques avances
Quaaaaaaaack!
Heeeeeeelp!
Menfin ?
Un autre exemple :
Dans le dernier cas, on voit quil y a un problme quand on reoit un type inaendu : le programme
sarrte en erreur lexcution. Cest bien l la dirence avec les langages typage statique o toute
erreur de type est dcele ds la compilation.
Python est un langage trs souple : la nature des donnes est dynamiquement dcouverte lexcution,
ce qui ore plusieurs avantages :
on peut utiliser le duck typing : le code est court et clair ;
le langage est trs facile apprendre.
Mais, on la vu, des dsagrments persistent Les annotations ont t penses pour corriger ce point.
Syntaxe
.
# annotation simple et par dfaut des paramtres :
def foo1(a : <expression>, b : <expression>=5) :
...
Les annotations permeent de fournir des informations supplmentaires. Or, cest important, ces in-
formations optionnelles nauront aucun impact sur lexcution du code, mais des outils tierces parties
pourront les utiliser pour par exemple :
faire de la vrication de type : on outrepasse alors le duck typing pour xer un type prcis,
optimis pour un usage particulier ;
fournir une aide aux diteurs de codes ;
orir un complment la documentation des docstrings ;
Voici un exemple dannotation :
- -
Teniques avances . Teniques fonctionnelles
. Teniques fonctionnelles
.. Directive lambda
Issue de langages fonctionnels (comme Lisp), la directive lambda permet de dnir un objet fonction
anonyme dont le bloc dinstructions est limit une expression dont lvaluation fournit la valeur de retour
de la fonction.
Syntaxe
. lambda [parameters] : expression
Par exemple cee fonction retourne s si son argument est dirent de , une chane vide sinon :
La fonction map() :
map() applique une fonction chaque lment dune squence et retourne un itrateur :
La fonction filter() :
filter() construit et renvoie un itrateur sur une liste qui contient tous les lments de la squence
initiale rpondant au critre : function(element) == True :
. cf. Wikipedia
- -
. Teniques fonctionnelles Teniques avances
La fonction reduce() peut tre remplace par une des fonctions suivantes : all(), any(), max(), min()
ou sum().
Elles sont aussi utiles pour fournir des modles partiels de widgets, qui ont souvent de nombreux
paramtres. Dans lexemple suivant, on rednit la classe Button en xant certains de ses aributs (qui
peuvent toujours tre surchargs) :
root = tk.Tk()
# instanciation partielle de classe :
MonBouton = partial(tk.Button, root, fg=blue, bg=yellow)
MonBouton(text=Bouton 1).pack()
MonBouton(text=Bouton 2).pack()
MonBouton(text=QUITTER, bg=orange, fg=black,
command=root.quit).pack(fill=tk.X, expand=True)
root.title(PFA !)
root.mainloop()
- -
Teniques avances . La persistance et la srialisation
. La persistance et la srialisation
Dnition
b La persistence consiste sauvegarder des donnes an quelles survivent larrt de lapplication.
On peut distinguer deux tapes :
la srialisation et la dsrialisation ;
le stockage et laccs.
La srialisation est le processus de conversion dun ensemble dobjets en un ux doctets.
La dsrialisation est le processus inverse qui recre les donnes dorigine.
Le stoage utilise soit des chiers, soit des bases de donnes.
Lintrt du module pickle est sa simplicit. Par contre, ce nest pas un format utilis dans dautres
langages, il nest utile que tant que lon reste dans le monde Python.
On peut utiliser une chane pour srialiser, mais lusage le plus commun est dutiliser un chier ouvert
en mode binaire (contrairement au mode texte que lon a dj vu cf. . p. ), avec le mode wb. Par
exemple pour un dictionnaire :
import pickle
Le module json
Le module json permet dencoder et de dcoder des informations au format json . Cest un format
dchange trs utile, implment dans un grand nombre de langages, plus lisible que XML mais moins
puissant.
On utilise la mme syntaxe quavec pickle, savoir dumps() et loads() pour une chane, dump() et
load() pour un chier, mais cee fois, un chier textuel :
import json
# dcodage
with open(json_tst) as f :
print(json.load(f))
- -
. Les tests Teniques avances
import sqlite3
Le chier tel_bd produit peut tre visualis par le programme SQLite database browser (+ Fig. .).
. Les tests
Ds lors quun programme dpasse le stade du petit script, le problme des erreurs et donc des tests
se pose invitablement .
Dnition
b Un test consiste appeler la fonctionnalit spcie dans la documentation, avec un scnario qui
correspond un cas dutilisation, et vrier que cee fonctionnalit se comporte comme prvu.
- -
Teniques avances . Les tests
.. Module unittest
Le module standard unittest fournit loutil PyUnit, outil que lon retrouve dans dautres langages : JU-
nit (Java), NUnit (.Net), JSUnit (Javascript), tous drivs dun outil initialement dvelopp pour le langage
SmallTalk : SUnit.
Par convention, chaque module est associ un module de tests unitaires, plac dans un rpertoire
tests du paquet. Par exemple, un module nomm calculs.py aura un module de tests nomm tests/-
test_calculs.py.
PyUnit propose une classe de base, TestCase. Chaque mthode implmente dans une classe drive
de TestCase, et prxe de test_, sera considre comme un test unitaire :
Module de calculs.
# fonctions
def moyenne(*args) :
Renvoie la moyenne.
length = len(args)
sum = 0
for arg in args :
sum += arg
return sum/length
def division(a, b) :
Renvoie la division.
return a/b
# import ----------------------------------------------------------------------
import sys
import unittest
from os.path import abspath, dirname
# on enrichie le path pour ajouter le rpertoire absolu du source tester :
sys.path.insert(0, dirname(dirname((abspath(__file__)))))
from calculs import moyenne, division
def test_moyenne(self) :
self.assertEquals(moyenne(1, 2, 3), 2)
self.assertEquals(moyenne(2, 4, 6), 4)
def test_division(self) :
self.assertEquals(division(10, 5), 2)
self.assertRaises(ZeroDivisionError, division, 10, 0)
def test_suite() :
tests = [unittest.makeSuite(CalculTest)]
return unittest.TestSuite(tests)
# auto-test ===================================================================
if __name__ == __main__ :
unittest.main()
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
- -
. La documentation des sources Teniques avances
.. Le format reST
Le format reStructuredText, communment appel reST est un systme de balises utilis pour formater
des textes.
la dirence de LATEX ou dHTML il enrichit le document de manire non intrusive , cest--dire
que les chiers restent directement lisibles.
docutils
Le projet docutils, qui inclut linterprteur reST, fournit un jeu dutilitaires :
rst2html gnre un rendu html avec une feuille de style css intgre ;
rst2latex cre un chier LATEX quivalent ;
rst2s5 construit une prsentation au format s, qui permet de crer des prsentations interactives en
HTML.
Sphinx
Sphinx est un logiciel libre de type gnrateur de documentation. Il sappuie sur des chiers au format
reStructuredText, quil convertit en HTML, PDF, man, et autres formats.
De nombreux projets utilisent Sphinx pour leur documentation ocielle, cf. http://sphinx-doc.org/
examples.html
rstpdf
Par ailleurs, le programme rst2pdf gnre directement une documentation au format PDF.
Voici un exemple simple de chier texte au format reST.
On remarque entre autres que :
la principale balise est la ligne blane qui spare les direntes structures du texte ;
la structuration se fait en soulignant les titres des sections de dirents niveaux avec des caractres
de ponctuation (= - _ : , etc.). chaque fois quil rencontre un texte ainsi soulign, linterprteur
associe le caractre utilis un niveau de section ;
un titre est gnralement soulign et surlign avec le mme caractre, comme dans lexemple sui-
vant :
======================
Fichier au format reST
======================
Section 1
=========
On est dans la section 1.
Sous-section
~~~~~~~~~~~~
. cf. [], p.
- -
Teniques avances . La documentation des sources
Sous-sous-section
.................
Ceci est une sous-sous-section.
.. et ceci un commentaire
Section 2
=========
La section 2 est beaucoup plus **intressante** que la section 1.
Section 3
=========
La section 2 est un peu vantarde : la section 1 est *trs bien*.
Lutilitaire rst2pdf, appliqu ce chier, produit le chier de mme nom (+ Fig. .) mais avec lex-
tension .pdf.
.. Le module doctest
Le principe du literate programming (ou programmation liraire) de Donald Knuth consiste mler
dans le source le code et la documentation du programme.
Ce principe t repris en Python pour documenter les API via les chanes de documentation (docstring).
Des programmes comme Epydoc peuvent alors les extraire des modules pour composer une documentation
spare.
Il est possible daller plus loin et dinclure dans les chanes de documentation des exemples dutilisa-
tion, crits sous la forme de session interactive.
- -
. La documentation des sources Teniques avances
import doctest
def somme(a, b) :
Renvoie a + b.
>>> somme(2, 2)
4
>>> somme(2, 4)
6
return a+b
if __name__ == __main__ :
print({ :-^40}.format( Mode silencieux ))
doctest.testmod()
print(Si tout va bien, on a rien vu !)
# fonctions
def accentEtrange(texte) :
Ajoute un accent trange un texte.
Exemple :
>>> texte = Est-ce que tu as regard la tl hier soir ? Il y avait un thma sur les ramasseurs descargots en
Laponie, ils en bavent...
- -
Teniques avances . La documentation des sources
>>> accentEtrange(texte)
Est-ceu queu tu as rRreugarRrd la tl hieurRr soirRr ? Il y avait un thma surRr leus rRramasseuurRrs d
euscarRrgots eun Laponieu, ils eun baveunt...
def _test() :
import doctest
doctest.testmod(verbose=True)
if __name__ == __main__ :
_test()
Exemple : test_documentation2.py
Fichier de documentation :
Le module accent
====================
. cf. [], p. .
- -
. La documentation des sources Teniques avances
Les r sont tripls et les e pauls par des u. Cette technique permet
de se passer de systmes de traductions complexes pour faire fonctionner
les logiciels dans certaines rgions.
Source du module :
import doctest
doctest.testfile(test_documentation2.txt, verbose=True)
- -
A A
Interlude
Le Zen de Python
Prre
la beaut la laideur,
lexplicite limplicite,
le simple au complexe,
le complexe au compliqu,
le droul limbriqu,
lar au compact.
Prends en compte la lisibilit.
Les cas particuliers ne le sont jamais assez pour violer les rgles.
Mais, la puret, privilgie laspect pratique.
Ne passe pas les erreurs sous silence,
Ou billonne-les explicitement.
Face lambigut, deviner ne te laisse pas aller.
Sache quil ne devrait avoir quune et une seule faon de procder.
Mme si, de prime abord, elle nest pas vidente, moins dtre Nerlandais.
Mieux vaut maintenant que jamais.
Cependant jamais est souvent mieux quimmdiatement.
Si limplmentation sexplique dicilement, cest une mauvaise ide.
Si limplmentation sexplique aisment, cest peut-tre une bonne ide.
Les espaces de noms, sacre bonne ide ! Faisons plus de trucs comme a !
Le Graal de Python !
Arthur
Lancelot ! Lancelot ! Lancelot !
[mgaphone de police]
Lancelooooooooot !
Lancelot
Bloody hell, mais que se passe-t-il donc, mon Roi ?
Arthur
Bevedere, explique-lui !
Bevedere
Nous devons te parler dun nouveau langage de programmation : Python
Lancelot
Nouveau ? Cela fait bien dix ans quil existe, et je ne vois pas en quoi cela va nous aider rcuprer le
Saint-Graal !
Bevedere
Saint-Graal, Saint-Graal
[soupir]
Tu ne peux pas penser des activits plus saines que cee qute stupide de temps en temps ?
Arthur
[sort une massue et assomme Bevedere avec]
Son explication tait mal partie de toute manire.
Gardes franais
Est-ce que ces messieurs les Anglais peuvent aller sentretuer plus loin ?
Ne voyez-vous pas que nous sommes concentrs sur notre jeu en ligne ?
Arthur
Ce tunnel sous la Manche, quelle hrsie !
[racle sa gorge]
Lancelot, assieds-toi, et coute-moi. (et ferme ce laptop, bloody hell !)
Lancelot
[rabat lcran de son laptop]
. cf. [], p. .
- -
Interlude
Arthur
La qute a chang. Tu dois maintenant apprendre le langage Python, et dcouvrir pourquoi il est de
plus en plus pris par mes sujets.
Lancelot
Mais
Arthur
Il ny a pas de mais !
[menace Lancelot avec sa massue]
Je suis ton Roi. dot slash.
Prends ce livre, et au travail !
Gardes franais
Oui, au travail, et en silence !
- -
A B
Prrequis
Au fur et mesure que lon acquire de lexprience, on dcouvre et on apprend utiliser les biblio-
thques de modules et paquets qui fournissent des types de donnes et des services avancs, vitant davoir
re-crer, coder et dboguer une partie de la solution.
Rutiliser
La premire chose faire est de vrier quil nexiste pas dj une solution (mme partielle) au pro-
blme que lon pourrait reprendre in extenso ou dont on pourrait sinspirer. On peut chercher dans les
nombreux modules standard installs avec le langage, dans les dpts institutionnels de modules tiers (le
Python Package Index par exemple), ou encore utiliser les moteurs de recherche sur lInternet. Si on ne
trouve pas de solution existante dans notre langage prfr, on peut trouver une solution dans un autre
langage, quil ny aura plus qu adapter.
Lanalyse qui permet de crer un algorithme et la programmation ensuite, sont deux phases qui n-
cessitent de la pratique avant de devenir videntes ou faciles .
Rir un algorithme
Pour dmarrer, il faut partir dlments rels, mais sur un chantillon du problme comportant peu de
donnes, un cas que lon est capable de traiter la main .
Il est fortement conseill de dmarrer sur papier ou sur un tableau (le papier ayant lavantage de laisser
plus facilement des traces des direntes tapes).
On identie tout dabord quelles sont les donnes que lon a traiter en entre et quelles sont les
donnes que lon saend trouver en sortie. Pour chaque donne, on essaie de prciser quel est son
domaine, quelles sont ses limites, quelles contraintes la lient aux autres donnes.
Rsoudre la main
On commence par une rsolution du problme, en ralisant les transformations et calculs sur notre
chantillon de problme, en fonctionnant par tapes.
chaque tape, on note:
quelles sont les tapes pertinentes, sur quels critres elles ont t choisies ;
quelles sont les squences doprations que lon a rpt.
Lorsque lon tombe sur des tapes complexes, on dcoupe en sous-tapes, ventuellement en les trai-
tant sparment comme un algorithme de rsolution dun sous-problme. Le but est darriver un niveau
de dtails susamment simple; soit quil sagisse doprations trs basiques (opration sur un texte, ex-
pression de calcul numrique), soit que lon pense/sache quil existe dj un outil pour traiter ce sous-
problme (calcul de sinus pour un angle, opration de tri sur une squence de donnes).
. http://pypi.python.org/
Passer du problme au programme
Lors de ce dcoupage, il faut viter de considrer des oprations comme implicites ou videntes ,
il faut prciser do proviennent les informations et ce que lon fait des rsultats. Par exemple on ne
considre pas un lment mais le nom trait est llment suivant de la squence de noms ou
encore le nom trait est le xelment de la squence de noms .
Normalement, au cours de ces oprations, on a commenc nommer les donnes et les tapes au fur
et mesure quon en a eu besoins.
Formaliser
Une fois quon a un brouillon des tapes, il faut commencer mere en forme et identier les
constructions algorithmiques connues et les donnes manipules:
Boucles (sur quelles informations, condition darrt).
Tests (quelle condition).
Informations en entre, quel est leur type, quelles sont les contraintes pour quelles soient valides
et utilisables, do viennent-elles:
dj prsentes en mmoire,
demandes lutilisateur,
lues dans des chiers ou rcupres ailleurs (sur lInternet par exemple).
Calculs et expressions:
quel genre de donnes sont ncessaires, y-a-t-il des lments constants connatre, des rsultats
intermdiaires rutiliser,
on peut identier ici les contrles intermdiaires possibles sur les valeurs qui puissent permere
de vrier que lalgorithme se droule bien.
Stockage des rsultats intermdiaires.
Rsultat nal quel moment la-t-on, quen fait-on:
retourn dans le cadre dune fonction,
ach lutilisateur,
sauvegard dans un chier.
Factoriser
Le but est didentier les squences dtapes qui se rptent en dirents endroits, squences qui seront
de bons candidats pour devenir des fonctions ou des classes. Ceci peut tre fait en mme temps que lon
formalise.
- -
A C
Position du problme
Nous avons vu que lordinateur code toutes les informations quil manipule en binaire. Pour coder les
nombres entiers un changement de base sut, pour les oants, on utilise une norme (IEEE ), mais la
situation est plus complexe pour reprsenter les caractres.
Tous les caractres que lon peut crire laide dun ordinateur sont reprsents en mmoire par des
nombres. On parle dencodage. Le a minuscule par exemple est reprsent, ou encod, par le nombre .
Pour pouvoir acher ou imprimer un caractre lisible, leurs dessins, appels glyphes, sont stocks dans
des catalogues appels polices de caractres. Les logiciels informatiques parcourent ces catalogues pour
rechercher le glyphe qui correspond un nombre. Suivant la police de caractre, on peut ainsi acher
dirents aspects du mme a ().
Les premiers caractres comprennent les caractres de lalphabet latin (non altrs ), les majus-
cules et les minuscules, les chires arabes, et quelques signes de ponctuation, cest la fameuse table ASCII
(+ Fig. C.). Chaque pays a ensuite complt ce jeu initial suivant les besoins de sa propre langue, crant
ainsi son propre systme dencodage.
Cee mthode a un fcheux inconvnient : le caractre franais peut alors tre reprsent par le
mme nombre que le caractre scandinave dans les deux encodages, ce qui rend impossible lcriture
dun texte bilingue avec ces deux caractres !
Pour crire un document en plusieurs langues, le standard nomm Unicode a t dvelopp et main-
tenu par un consortium . Il permet dunier une grande table de correspondance internationale, sans
chevauchement entre les caractres. Les catalogues de police se chargent ensuite de fournir des glyphes
correspondants.
F C. Table ASCII.
. Cest--dire sans signe diacritique, par exemple les accents, le trma, la cdille
. American Standard Code for Information Interchange
. Le Consortium Unicode.
Jeux de caractres et encodage
Lencodage UTF-
Comme il sagit de direncier plusieurs centaines de milliers de caractres (on compte plus de
langues dans le monde) il nest videmment pas possible de les encoder sur un seul octet.
En fait, la norme Unicode ne xe aucune rgle concernant le nombre doctets ou de bits rserver
pour lencodage, mais spcie seulement la valeur numrique de lidentiant associ chaque caractre
(+ Fig. C.).
Comme la plupart des textes produits en occident utilisent essentiellement la table ASCII qui corres-
pond justement la partie basse de la table Unicode, lencodage le plus conomique est lUTF- :
pour les codes (cas les plus frquents), lUTF- utilise loctet de la table ASCII ;
pour les caractres spciaux (codes ), quasiment tous nos signes diacritiques, lUTF-
utilise octets ;
pour les caractres spciaux encore moins courants (codes ), lUTF- utilise octets ;
enn pour les autres (cas rares), lUTF- en utilise .
Voici trois exemples de caractres spciaux cods en notation hexadcimale et spars par le caractre
dchappement de la tabulation :
ou :
# -*- coding : latin1 -*-
. Retour chap. , p.
. Notons que utf8 et latin1 sont des alias de utf-8 et latin-1.
- -
A D
Introduction
Ds les dbuts de linformatique, les concepteurs des systmes dexploitation eurent lide dutiliser
des mtacaractres permeant de reprsenter des modles gnraux. Par exemple, dans un shell Linux ou
dans une fentre de commande Windows, le symbole * remplace une srie de leres, ainsi *.png indique
tout nom de chier contenant lextension png. Python ore en standard les modules glob et fnmatch pour
utiliser la notations des mtacaractres.
Depuis ces temps historiques, les informaticiens ont voulu gnraliser ces notations. On distingue
classiquement trois stades dans lvolution des expressions rgulires :
les expressions rgulires de base (BRE, Basic Regular Expressions) ;
les expressions rgulires tendues (ERE, Extended Regular Expressions) ;
les expressions rgulires avances (ARE, Advanced Regular Expressions).
Trois stades auxquels il convient dajouter le support de lencodage Unicode.
Dans de nombreux outils et langages (dont Python), la syntaxe tendue comprend aussi une srie de
squences dchappement :
Squences dchappement
\ symbole dchappement
\e squence de contrle escape
\f saut de page
\n n de ligne
\r retour-chariot
\t tabulation horizontale
\v tabulation verticale
\d classe des nombres entiers
\s classe des caractres despacement
\w classe des caractres alphanumriques
\b dlimiteurs de dbut ou de n de mot
\D ngation de la classe \d
\S ngation de la classe \s
\W ngation de la classe \w
\B ngation de la classe \b
- -
Les expressions rgulires
import re
Pythonismes
Le module re utilise la notation objet. Les motifs et les correspondances de recherche seront des objets
de la classe re auxquels on pourra appliquer des mthodes.
on crira :
>>> import re
>>> case = re.compile(r[a-z]+)
>>> ignore_case = re.compile(r(?i)[a-z]+)
>>>
>>> print(case.search(Bastille).group())
astille
>>>
>>> print(ignore_case.search(Bastille).group())
Bastille
Exemples
On propose plusieurs exemples dextraction de dates historiques telles que 14 juillet 1789.
- -
Les expressions rgulires
Extraction simple
Cee chane peut tre dcrite par le motif \d\d? \w+ \d{4} que lon peut expliciter ainsi : un ou
deux entiers dcimaux suivi dun blanc suivi dune chane dau moins un caractre suivi dun blanc suivi
de quatre entiers dcimaux .
Dtaillons le script :
import re
print(corresp.group())
Aprs avoir import le module re, la variable motif_date reoit la forme compile de lexpression
rgulire correspondant une date historique. Puis on applique ce motif compil la mthode search()
qui retourne la premire position du motif dans la chane et laecte la variable corresp. Enn on ache
la correspondance complte (en ne donnant pas dargument group().
Son excution produit :
14 juillet 1789
import re
print(corresp.group() :, corresp.group())
print(corresp.group(1) :, corresp.group(1))
print(corresp.group(2) :, corresp.group(2))
print(corresp.group(3) :, corresp.group(3))
print(corresp.group(1,3) :, corresp.group(1,3))
print(corresp.groups() :, corresp.groups())
import re
print(corresp.groupdict())
print(corresp.group(jour))
print(corresp.group(mois))
- -
Les expressions rgulires
Ce qui donne :
>>> import re
>>> nbr = re.compile(r\d+)
>>> print(nbr.findall(Bastille le 14 juillet 1789))
[14, 1789]
>>> import re
>>> nbr = re.compile(r\d+)
>>>
>>> print(Une coupure chaque occurrence :, nbr.split(Bastille le 14 juillet 1789))
Une coupure chaque occurrence : [Bastille le , juillet , ]
>>> print(Une seule coupure :, nbr.split(Bastille le 14 juillet 1789, 1))
Une seule coupure : [Bastille le , juillet 1789]
import re
def int2hexa(match) :
return hex(int(match.group()))
anniv = re.compile(r1789)
print(Premier anniversaire :, anniv.sub(1790, Bastille le 14 juillet 1789))
nbr = re.compile(r\d+)
print(En hexa :, nbr.sub(int2hexa, Bastille le 14 juillet 1789))
Ce qui ache :
Squences de substitution
& contient toute la chane recherche par un motif
\n contient la sous-expression capture par la ne paire de parenthses
du motif de recherche (1 n 9)
- -
A E
Exercices corrigs
. crire un programme qui, partir de la saisie dun rayon et dune hauteur, calcule le volume dun
cne droit.
. Une boucle while : entrez un prix HT (entrez pour terminer) et achez sa valeur TTC.
. Une autre boucle while : calculez la somme dune suite de nombres positifs ou nuls. Comptez com-
bien il y avait de donnes et combien taient suprieures .
Entrer un nombre infrieur ou gal indique la n de la suite.
. Lutilisateur donne un entier positif n et le programme ache PAIR sil est divisible par , IMPAIR
sinon.
. Lutilisateur donne un entier positif et le programme annonce combien de fois de suite cet entier
est divisible par .
. Lutilisateur donne un entier suprieur et le programme ache, sil y en a, tous ses diviseurs @
propres sans rptition ainsi que leur nombre. Sil ny en a pas, il indique quil est premier. Par
exemple :
. crire un programme qui approxime par dfaut la valeur de la constante mathmatique e, pour n
assez grand , en utilisant la formule :
n 1
e
i =0 i !
Pour cela, dnissez la fonction factorielle et, dans votre programme principal, saisissez lordre n
et achez lapproximation correspondante de e.
. Un gardien de phare va aux toilees cinq fois par jour or les WC sont au rez-de-chausse
crire une procdure (donc sans return) hauteurParcourue qui reoit deux paramtres, le nombre
de marches du phare et la hauteur de chaque marche (en cm), et qui ache :
On noubliera pas :
quune semaine comporte jours ;
quune fois en bas, le gardien doit remonter ;
que le rsultat est exprimer en m.
. Mais pas trop pour viter le dpassement de capacit : OverowError : long int too large to convert to oat.
Exercices corrigs
. Un permis de chasse points remplace dsormais le permis de chasse traditionnel. Chaque chasseur
possde au dpart un capital de points. Sil tue une poule il perd point, points pour un chien,
points pour une vache et points pour un ami. Le permis cote euros.
crire une fonction amende qui reoit le nombre de victimes du chasseur et qui renvoie la somme
due.
Utilisez cee fonction dans un programme principal qui saisit le nombre de victimes et qui ache
la somme que le chasseur doit dbourser.
. Je suis ligot sur les rails en gare dArras. crire un programme qui ache un tableau me permeant
de connatre lheure laquelle je serai dchiquet par le train parti de la gare du Nord h (il y a
km entre la gare du Nord et Arras).
Le tableau prdira les direntes heures possibles pour toutes les vitesses de km/h km/h,
par pas de km/h, les rsultats tant arrondis la minute infrieure.
crire une procdure tchacatchac qui reoit la vitesse du train et qui ache lheure du drame ;
crire le programme principal qui ache le tableau demand.
@ . Un programme principal saisit une chane dADN valide et une squence dADN valide ( valide
signie quelles ne sont pas vides et sont formes exclusivement dune combinaison arbitraire de
a, t, g ou c).
crire une fonction valide qui renvoie vrai si la saisie est valide, faux sinon.
crire une fonction saisie qui eectue une saisie valide et renvoie la valeur saisie sous forme dune
chane de caractres.
crire une fonction proportion qui reoit deux arguments, la chane et la squence et qui retourne
la proportion de squence dans la chane (cest--dire son nombre doccurrences).
Le programme principal appelle la fonction saisie pour la chane et pour la squence et ache le
rsultat.
Exemple dachage :
chane : attgcaatggtggtacatg
squence : ca
Il y a 10.53 % de ca dans votre chane.
. Il sagit dcrire, dune part, un programme principal et, dautre part, une fonction utilise dans le
programme principal.
La fonction listAleaInt(n, a, b) retourne une liste de n entiers alatoires dans [a .. b] en utilisant
la fonction randint(a, b ) du module random.
Dans le programme principal :
construire la liste en appelant la fonction listAleaInt() ;
calculer lindex de la case qui contient le minimum ;
changez le premier lment du tableau avec son minimum.
. Comme prcdemment, il sagit dcrire, dune part, un programme principal et, dautre part, une
fonction utilise dans le programme principal.
La fonction listAleaFloat(n) retourne une liste de n oants alatoires en utilisant la fonction
random() du module random.
Dans le programme principal :
Saisir un entier n dans lintervalle : [2 .. 100] ;
construire la liste en appelant la fonction listAleaFloat() ;
acher lamplitude du tabeau (cart entre sa plus grande et sa plus petite valeur) ;
acher la moyenne du tableau.
. Saisir un entier entre et (pourquoi cee limitation ?). Lacher en nombre romain.
- -
Exercices corrigs
. Un tableau contient n entiers (2 < n < 100) alatoires tous compris entre et . Vrier quils
sont tous dirents.
. Proposer une autre version plus simple du problme prcdent en comparant les longueurs des ta-
bleaux avant et aprs traitement ; le traitement consiste utiliser une structure de donnes conte-
nant des lments uniques.
. Gnralisation des deux questions prcdentes. Lutilisateur saisit deux entres, dune part le @@
nombre de ds, nbd (que lon limitera pratiquement ) et, dautre part la somme, s , comprise
entre nbd et 6.nbd . Le programme calcule et ache le nombre de faons de faire s avec les nbd
ds.
# !/usr/bin/env python
# -*- coding : utf8 -*-
Module de vrification.
#==============================================================================
# fichier : verif.py
#
# auteur : Bob Cordeau
#==============================================================================
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from sys import exit
# Auto-test ===================================================================
if __name__==__main__ :
- -
Exercices corrigs
pi = 3.142
print(\npi = {}.format(pi))
verif(pi, 3.14, 1e-2, comment= 1e-2 :) # Ok
verif(pi, 3.14, 1e-3, comment= 1e-3 :) # Erreur
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from math import pi
volume = (pi*rayon*rayon*hauteur)/3.0
print(Volume du cne =, volume, m3)
F
# -*- coding : utf8 -*-
Calcul dun prix TTC.
print(Au revoir !)
F
# -*- coding : utf8 -*-
Somme dentiers et nombre dentiers suprieur 100.
print(\nSomme :, somme)
print(nombreTotal, valeur(s) en tout, dont, nombreGrands,
suprieure(s) 100)
F
- -
Exercices corrigs
if n%2 == 0:
print(n, est pair.)
else :
print(n, est impair.)
F
# -*- coding : utf8 -*-
Nombre de fois quun entier est divisible par 2.
cpt = 0
while n%2 == 0:
n /= 2
cpt += 1
F
# -*- coding : utf8 -*-
Diviseurs propres dun entier.
if not cpt :
print(aucun ! Il est premier.)
else :
print((soit, cpt, diviseurs propres))
F
# -*- coding : utf8 -*-
Approximation de e.
- -
Exercices corrigs
print(Approximation de e : { :.3f}.format(exp))
F
# -*- coding : utf8 -*-
Gardien de phare.
hauteurParcourue(nbMarches, hauteurMarche)
F
# -*- coding : utf8 -*-
Permis de chasse.
F
# -*- coding : utf8 -*-
Histoire de train.
- -
Exercices corrigs
F
# -*- coding : utf8 -*-
Proportion dune squence dans une chane dADN.
def proportion(a, s) :
Retourne la proportion de la squence <s> dans la chane <a>.
return 100*a.count(s)/len(a)
def saisie(ch) :
s = input({ :s} : .format(ch))
while not valide(s) :
print({ :s} ne peut contenir que les chanons a, t, g et c
et ne doit pas tre vide.format(ch))
s = input({ :s} : .format(ch))
return s