Você está na página 1de 159

Bob Cordeau & Laurent Pointal

Une introduction Python 3


version 1.618c

iii

Remerciements

Grand merci Hlne Cordeau pour ses illustrations ; les aventures de Pythoon enchantent 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

Fonctions et espaces de noms

Modules et paages

La Programmation Oriente Objet

La POO graphique

Teniques avances

A Interlude

B Passer du problme au programme

C Jeux de caractres et encodage

D Les expressions rgulires

E Exercices corrigs

Bibliographie et Webographie

Memento Python

Abrg dense Python

Index

Glossaire

Table des matires

Avant-propos

qui sadresse ce cours ?


Utilis lorigine par les tudiants de Mesures Physiques de lIUT dOrsay, ce cours sadresse plus
gnralement toute personne dsireuse dapprendre Python en tant que premier langage de programmation.
Ce cours se veut essentiellement pratique. Dune part en fournissant de trs nombreux exemples et
une vingtaine dexercices corrigs, et dautre part en proposant plusieurs moyens de naviguer dans le
document : un sommaire en dbut et une table des matires dtaille en n, un index et un glossaire, tous
deux munis dhyperliens.

Cette introduction reposent sur quelques partis pris


Le choix du langage Python version , version qui abolit la compatibilit descendante avec la srie
des versions .x dans le but dliminer les faiblesses originelles du langage.
Le choix de logiciels libres ou gratuits :
des interprteurs ou diteurs spcialiss comme IPython, spyder ou Wingware ;
des outils open source de production de documents : le moteur XTEX , le script latexmk , lditeur TeXworks et le logiciel de cration de diagrammes Dia.
Enn sur labondance des ressources et de la documentation sur le Web !

Numro de version ?
Suivant lexemple de Donald Knuth, linventeur du logiciel de composition TEX, le numro de la ie version de ce document, au lieu dtre . ou .. , est la ie dcimale dun nombre clbre .

Pour joindre les auteurs


k
k

pycours@kordeo.eu
laurent.pointal@limsi.fr

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.

Introduction

Ce premier chapitre introduit les grandes caractristiques du langage Python, le replace dans lhistoire des langages informatiques, donne les particularits de production des programmes, dnit la notion si importante dalgorithme et conclut sur les divers implmentations disponibles.

. Principales caractristiques du langage Python


Historique
: Guido van Rossum travaille aux Pays-Bas sur le projet AMOEBA, un systme dexploitation distribu. Il conoit Python partir du langage ABC et publie la version .. sur un forum
Usenet
: sortie de Numerical Python, anctre de numpy
: naissance de la PSF (Python Soware Fundation)
Les versions se succdent Un grand choix de modules est disponible, des colloques annuels
sont organiss, Python est enseign dans plusieurs universits et est utilis en entreprise
: premire sortie de IPython
Fin : sorties simultanes de Python . et de Python .
: versions en cours des branches et : v.. et v..
Langage Open Source
Licence Open Source CNRI, compatible GPL, mais sans la restriction copyle. Donc Python est
libre et gratuit mme pour les usages commerciaux
GvR (Guido van Rossum) est le BDFL (dictateur bnvole vie !)
Importante communaut de dveloppeurs
Nombreux outils standard disponibles : Baeries included
Travail interactif
Nombreux interprteurs interactifs disponibles (notamment IPython)
Importantes documentations en ligne
Dveloppement rapide et incrmentiel
Tests et dbogage outills
Analyse interactive de donnes
Langage interprt rapide
Interprtation du bytecode compil
De nombreux modules sont disponibles partir de bibliothques optimises (souvent crites en
C ou C++)
Simplicit du langage (cf. annexe A p. ) :
Syntaxe claire et cohrente
Indentation signicative
. au CWI : Centrum voor Wiskunde en Informatica.

Introduction

. Matriel et logiciel

Gestion automatique de la mmoire (garbage collector)


Typage dynamique fort : pas de dclaration
Orientation objet
Modle objet puissant mais pas obligatoire
Structuration multichier aise des applications : facilite les modications et les extensions
Les classes, les fonctions et les mthodes sont des objets dits de premire classe. Ces objets sont
traits comme tous les autres (on peut les aecter, les passer en paramtre)
Ouverture au monde
Interfaable avec C/C++/FORTRAN
Langage de script de plusieurs applications importantes
Excellente portabilit
Disponibilit de bibliothques
Plusieurs milliers de packages sont disponibles dans tous les domaines
Points forts de Python :
langage de trs haut niveau ;
sa lisibilit ;
langage algorithmique excutable .

Environnements matriel et logiciel

..

Lordinateur

On peut schmatiser la dnition de lordinateur de la faon suivante :


Dnition
Ordinateur : automate dterministe composants lectroniques.

Lordinateur comprend entre autres :


un microprocesseur avec une UC (Unit de Contrle), une UAL (Unit Arithmtique et Logique),
une horloge, une mmoire cache rapide ;
de la mmoire volatile (dite vive ou RAM), contenant les instructions et les donnes ncessaires
lexcution des programmes. La RAM est forme de cellules binaires (bits) organises en mots de
bits (octets) ;
des priphriques : entres/sorties, mmoires permanentes (dites mortes : disque dur, cl USB, CDROM), rseau

..

Deux sortes de programmes

On distingue, pour faire rapide :


Le systme dexploitation : ensemble des programmes qui grent les ressources matrielles et logicielles. Il propose une aide au dialogue entre lutilisateur et lordinateur : linterface textuelle
(interprteur de commande) ou graphique (gestionnaire de fentres). Il est souvent multitche et
parfois multiutilisateur ;
les programmes applicatifs sont ddis des tches particulires. Ils sont forms dune srie de
commandes contenues dans un programme source qui est transform pour tre excut par lordinateur.

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

.. Trs bref historique des langages

Annes (approches exprimentales) : FORTRAN, LISP, COBOL, ALGOL


Annes (langages universels) : PL/, Simula, Smalltalk, Basic
Annes (gnie logiciel) : C, PASCAL, ADA, MODULA-
Annes (programmation objet) : C++, LabView, Eiel, Perl, VisualBasic
Annes (langages interprts objet) : Java, tcl/Tk, Ruby, Python
Annes (langages commerciaux propritaires) : C#, VB.NET

Des centaines de langages ont t crs, mais lindustrie nen utilise quune minorit.

. Production des programmes


.. Deux teniques de production des programmes
La compilation est la traduction du source en langage objet. Elle comprend au moins quatre phases
(trois phases danalyse lexicale, syntaxique et smantique et une phase de production de code objet).
Pour gnrer le langage machine il faut encore une phase particulire : ldition de liens. La compilation
est contraignante mais ore au nal une grande vitesse dexcution.

.
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

.. Tenique de production de Python


Technique mixte : linterprtation du bytecode compil. Bon compromis entre la facilit de dveloppement et la rapidit dexcution ;
le bytecode (forme intermdiaire) est portable sur tout ordinateur muni de la machine virtuelle
Python.

.
source

compilateur

bytecode

interprteur

rsultat

F . Interprtation du bytecode compil


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

Construction des programmes

Le gnie logiciel tudie les mthodes de construction des programmes. Plusieurs modles sont envisageables, entre autres :
la mthodologie procdurale. On emploie lanalyse descendante (division des problmes) et remontante (rutilisation dun maximum de sous-algorithmes). On seorce ainsi de dcomposer un problme complexe en sous-programmes plus simples. Ce modle structure dabord les actions ;
la mthodologie objet. Centre sur les donnes, elle est considre plus stable dans le temps et
meilleure dans sa conception. On conoit des fabriques (classes) qui servent produire des composants (objets) qui contiennent des donnes (aributs) et des actions (mthodes). Les classes drivent
(hritage et polymorphisme) de classes de base dans une construction hirarchique.
Python ore les deux techniques.

Algorithme et programme

..

Dnitions

Dnition
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
Programme : un programme est la traduction dun algorithme en un langage compilable ou interprtable par un ordinateur.
Il est souvent crit en plusieurs parties dont une qui pilote les autres : le programme principal.

..

Prsentation des programmes

Un programme source est destin ltre humain. Pour en faciliter la lecture, il doit tre judicieusement
prsent et comment.
La signication de parties non triviales (et uniquement celles-ci) doit tre explique par un commentaire. En Python, un commentaire commence par le caractre # et stend jusqu la n de la ligne :
#~~~~~~~~~~~~~~~~~~~~~
# 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

--

La calculatrice Python

Comme tout langage, Python permet de manipuler des donnes grce un


vocabulaire de mots rservs et grce des types de donnes approximation
des ensembles de dnition utiliss en mathmatique.
Ce chapitre prsente les rgles de construction des identicateurs, les types
de donnes simples (les conteneurs seront examins au chapitre ) ainsi que
les types chane de caractres.
Enn, last but not least, ce chapitre stend sur les notions non triviales de
variable, de rfrence dobjet et daectation.

. Les modes dexcution


.. Les deux modes dexcution dun code Python
Soit on enregistre un ensemble dinstructions Python dans un chier grce un diteur (on parle
alors dun script Python) que lon excute par une commande ou par une touche du menu de lditeur ;
soit on utilise linterprteur Python embarqu qui excute la boucle dvaluation (+ Fig. .).
>>> 5 + 3
8

Achage dune invite. Lutilisateur tape une expression.


. du rsultat.
valuation et achage

>>>

Rachage de linvite.

F . La boucle dvaluation de linterprteur Python

. Identicateurs et mots cls


.. Identicateurs
Comme tout langage, Python utilise des identicateurs pour nommer ses objets.
Dnition
Un identicateur Python est une suite non vide de caractres, de longueur quelconque, forme dun
caractre de dbut et de zro ou plusieurs caractres de continuation.

Sachant que :
le caractre de dbut peut tre nimporte quelle lere Unicode (cf. annexe C p. ), y compris le
caractre soulign (_) ;
un caractre de continuation est un caractre de dbut ou un chire.

La calculatrice Python

. Notion dexpression

Attention
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

..

Les mots rservs de Python

La version . de Python compte mots cls :


and

del

from

None

True

as

elif

global

nonlocal

try
while

assert

else

if

not

break

except

import

or

with

class

False

in

pass

yield

continue

finally

is

raise

def

for

lambda

return

Notion dexpression

Dnition
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.

>>> id1 = 15.3


>>> id2 = id1 - 13
>>> if id2 > 0:
...

id3 = 7

... else:
...

id3 = -4

Les types de donnes entiers

Dnition
Le type dun objet Python dtermine de quelle sorte dobjet il sagit.

Python ore deux types entiers standard : int et bool.


. Voir les dtails dans la PEP : Style Guide for Python , Guido van Rossum et Barry Warsaw

--

. 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 :

>>> 2013

# dcimal (base 10)

2013
>>> 0b11111011101

# binaire (base 2)

2013
>>> 0o3735

# octal (base 8)

2013
>>> 0x7dd

# hexadecimal (base 16)

2013

Oprations arithmtiques
Les principales oprations :

>>> 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

Bien remarquer le rle des deux oprateurs de division :


/ : produit une division oante, mme entre deux entiers ;
// : produit une division entire.

Bases usuelles
Un entier crit en base (par exemple 179) peut tre reprsent en binaire, octal et hexadcimal en
utilisant les syntaxes suivantes :

>>> 0b10110011 # binaire


179
>>> bin(179)
0b10110011
>>> 0o263

# octal

179
>>> oct(179)
0o263
>>> 0xB3

# hexadcimal

179
>>> hex(179)
0xb3

. 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

Les bases arithmtiques


Dnition
En arithmtique, une base n dsigne la valeur dont les puissances successives interviennent dans lcriture des nombres, ces puissances dnissant lordre de grandeur de chacune des positions occupes par les chires composant tout nombre.
Par exemple : 57n = (5 n 1 ) + (7 n 0 )

Certaines bases sont couramment employes :

la base (systme binaire), en lectronique numrique et informatique ;


la base (systme octal), en informatique ;
la base (systme hexadcimal), frquente en informatique ;
la base (systme sexagsimal), dans la mesure du temps et des angles.

Les angements de base


Un nombre dans une base n donne scrit sous la forme daddition des puissances successives de cee base.
Exemples
5716 = (5 161 ) + (7 160 ) = 8710
578 = (5 81 ) + (7 80 ) = 4710

..

Le type bool

Principales caractristiques du type bool :


Deux valeurs possibles : False, True.
Oprateurs de comparaison entre deux valeurs comparables, produisant un rsultat de type bool :
==, !=, >, >=, < et <= :

>>> 2 > 8
False
>>> 2 <= 8 < 15
True

Oprateurs logiques : not, or et and.


En observant les tables de vrit des oprateurs and et or, on remarque que :
ds quun premier membre a la valeur False, lexpression False and expression2 vaudra False.
On na donc pas besoin dvaluer expression2 ;
de mme ds quun premier membre a la valeur True, lexpression True or expression2 vaudra
True.
Cee optimisation est appele principe du shortcut ou valuation au plus court :

>>> (3 == 3) or (9 > 24)


True
>>> (9 > 24) and (3 == 3)
False

. Nomm daprs George Boole, logicien et mathmaticien britannique du esicle.

--

. Les types de donnes ottants

La calculatrice Python

Les oprateurs boolens de base


En Python les valeurs des variables boolennes sont notes
oprateurs sont nots respectivement not, and et or.
a

Oprateur unaire not

et

True.

Les

not(a)

False

True

True

False

Oprateurs binaires or et and

False

a or b

a and b

False

False

False

False

False

True

True

False

True

False

True

False

True

True

True

True

Attention
Pour tre sr davoir un rsultat boolen avec une expression reposant sur des valeurs transtypes,
appliquez bool() sur lexpression.

. Les types de donnes ottants


Remarque
3 La notion mathmatique de rel est une notion idale. Ce graal est impossible aeindre en informatique. On utilise une reprsentation interne (normalise) permeant de dplacer la virgule grce une
valeur dexposant variable. On nommera ces nombres des oants.

.. 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

Les oants supportent les mmes oprations que les entiers.


Ils ont une prcision nie limite.
Limport du module math autorise toutes les oprations mathmatiques usuelles. Par exemple :
>>> import math
>>> print(math.sin(math.pi/4))
0.7071067811865475
>>>> print(math.degrees(math.pi))
180.0
>>>> print(math.factorial(9))
362880
>>> print(math.log(1024, 2))
10.0

.. 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
>>> print((abs(3+4j)))

. Variables et aectation
# module

5.0

Un module mathmatique spcique (cmath) leur est rserv :


>>> import cmath
>>> print(cmath.phase(-1 + 0j))
3.141592653589793
>>> print(cmath.polar(3 + 4j))
(5.0, 0.9272952180016122)
>>> print(cmath.rect(1., cmath.pi/4))
(0.7071067811865476+0.7071067811865475j)

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 dirence notable entre les deux notions. On verra que la situation change dans le cas des objets modiables
Dnition
Une variable est un identicateur associ une valeur. En Python, cest une rfrence dobjet.

..

Laectation

Dnition
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 antrieure 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

.. Aecter nest pas comparer !


Laectation a un eet (elle modie ltat interne du programme en cours dexcution) mais na pas de
valeur (on ne peut pas lutiliser dans une expression) :
>>> 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

.. Les variantes de laectation


Outre laectation simple, on peut aussi utiliser les formes suivantes :
>>> v = 4

# affectation simple

>>> v += 2

# affectation augmente. Idem v = v + 2 si v est dj rfrenc

>>> v
6
>>> c = d = 8

# d reoit 8 puis c reoit d (c et d sont des alias)

>>> c, d
(8, 8)
>>> e, f = 2.7, 5.1

# affectation parallle dun tuple

>>> (e, f)
(2.7, 5.1)
>>> g, h = [G, H]

# affectation parallle dune liste

>>> [g, h]
[G, H]
>>> a = 3
>>> a, b = a + 2, a * 2

# toutes les expressions sont values avant la premire affectation

>>> a, b
(5, 6)

.. Reprsentation graphiques des aectations


Dans les schmas de la gure ., les cercles reprsentent les identicateurs alors que les rectangles
reprsentent les donnes.
Les aectations relient les identicateurs aux donnes : si une donne en mmoire nest plus relie, le
ramasse-miees (garbage collector) de Python la supprime automatiquement (car son nombre de rfrences
tombe zro) :

. Les anes de caractres


.. Prsentation
Dnition
Les chanes de caractres : le type de donnes non modiable str reprsente une squence de caractres Unicode.
Non modiable signie quune donne, une fois cre en mmoire, ne pourra plus tre change ; toute
transformation rsultera en la cration dune nouvelle valeur distincte.

- -

La calculatrice Python

. Les anes de caractres

x = a

y = b

z = .c

z =. y

(a) Trois aectations

(b) La donne c est supprime


lorsque z rfrence y
d

x = d

(c) La donne a est supprime lorsque


rfrence la nouvelle donne d

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 :
>>> syntaxe1 = Premire forme avec un retour la ligne \n
>>> print(syntaxe1)
Premire forme avec un retour la ligne
>>> syntaxe2 = rDeuxime forme. Chane brute\n sans retour la ligne
>>> print(syntaxe2)
Deuxime forme. Chane brute\n sans retour la ligne
>>> syntaxe3 =
Troisime forme
multi-lignes
trs utile pour
la documentation

>>> print(syntaxe3)
Troisime forme
multi-lignes
trs utile pour
la documentation
>>> guillemets = Leau vive
>>> guillemets
Leau vive
>>> apostrophes

= Il a dit gre !

>>> apostrophes
Il a dit gre !

..

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() :
>>> lng = len(abc)
>>> lng
3

Exemple dutilisation de la mthode


utilisent la notation pointe :

upper().

Remarquez la dirence de syntaxe : les mthodes

>>> abracadabra.upper()
ABRACADABRA

.. Mthodes de test de ltat dune ane


Les mthodes suivantes sont valeur boolenne, cest--dire quelles retournent la valeur

True

ou

False.

Remarque
3 La notation entre crochets [xxx] indique un lment optionnel que lon peut donc omere lors de
lutilisation de la mthode.
La chane s = cHAise basSe nous servira de test pour toutes les mthodes de cee section.

isupper() et islower() : retournent True si la chane ne contient respectivement que des majuscules/minuscules :
>>> s.isupper()
False

istitle()

: retourne True si seule la premire lere de chaque mot de la chane est en majuscule :

>>> s.istitle()
False

isalnum(), isalpha(), isdigit()

et isspace() : retournent True si la chane ne contient respectivement que des caractres alphanumriques, alphabtiques, numriques ou des espaces :
>>> s.isalpha()
True
>>> s.isdigit()
False

et endswith(suffix[, start[, stop]]) : testent si la souschane dnie par start et stop commence respectivement par prefix ou nit par suffix :
startswith(prefix[, start[, stop]])

- -

La calculatrice Python

. Les anes de caractres

>>> s.startswith(cH)
True
>>> s.endswith(aSSe)
False

..

Mthodes retournant une nouvelle ane


lower(), upper(), capitalize() et swapcase() : retournent respectivement une chane en minuscule,

en majuscule, en minuscule commenant par une majuscule, ou en casse inverse :


>>> s.lower()
chaise basse
>>> s.upper()
CHAISE BASSE
>>> s.capitalize()
Chaise basse
>>> s.swapcase()
ChaISE BASsE

: remplace les tabulations par tabsize espaces ( par dfaut).


et
rjust(width[, fillchar]) : retournent respectivement une chane centre, justie gauche ou
droite, complte par le caractre fillchar (ou par lespace par dfaut) :
expandtabs([tabsize])

center(width[, fillchar]), ljust(width[, fillchar])

>>> 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

strip([chars]), lstrip([chars]) et rstrip([chars]) : suppriment toutes les combinaisons de chars


(ou lespace par dfaut) respectivement au dbut et en n, au dbut, ou en n dune chane :
>>> 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 :

>>> s.replace(HA, ha)


chaise basSe

: 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 caractres de n de ligne :

split(seps[, maxsplit])

>>> s.split()
[cHAise, basSe]

: concatne les chanes du conteneur seq en intercalant entre chaque lment la chane
sur laquelle la mthode est applique :

join(seq)

- -

. Les anes de caractres

La calculatrice Python

>>> **.join([cHAise, basSe])


cHAise**basSe

.. Indexation simple
Pour indexer une chane, on utilise loprateur [ ] dans lequel lindex, un entier sign qui commence
0 indique la position dun caractre :
>>> s = Rayon X

# len(s) ==> 7

>>> s[0]
R
>>> s[2]
y
>>> s[-1]
X
>>> s[-3]
n

s = Rayons X
s[0]

s[1]

s[2]

s[3]

s[4]

s[5]

.
R

s[-8]

s[-7]

s[-6]

s[-5]

s[-4]

s[-3]

s[6]

s[7]

s[-2]

s[-1]

F . Lindexation dune chane

.. Extraction de sous-anes
Dnition
Extraction de sous-chanes. Loprateur [ ] avec ou index spars par le caractre
dextraire des sous-chanes (ou tranches) dune chane.

s = Rayons X
s[1:4]

.
R

s[-3:]

s[:3]

s[3:]

F . Extraction de sous-chanes
Par exemple :
>>> s = Rayon X
>>> s[1:4]

# len(s) ==> 7

# de lindex 1 compris 4 non compris

ayo
>>> s[-2:]

# de lindex -2 compris la fin

X
>>> s[:3]

# du dbut lindex 3 non compris

Ray
>>> s[3:]

# de lindex 3 compris la fin

on X
>>> s[::2]

# du dbut la fin, de 2 en 2

RynX
>>> s[::-1]

# de la fin au dbut (retournement)

X noyaR

- -

permet

La calculatrice Python

. Les donnes binaires

Les donnes binaires

Les types binaires


Python propose deux types de donnes binaires : bytes (non modiable) et bytearray (modiable).
>>> mot = Animal
>>> type(mot)
<class str>
>>>
>>> b_mot = bAnimal
>>> type(b_mot)
<class bytes>
>>>
>>> bmot = bytearray(b_mot)
>>> type(bmot)
<class bytearray>

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 gnralement fait depuis une lecture au clavier. Inversement, on doit pouvoir acher ou sortir des informations,
ce qui correspond gnralement une criture sur lcran.

(a) Entre

(b) Sortie

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) :
>>> f1 = input(Entrez un flottant : )
Entrez un flottant : 12.345
>>> type(f1)
<class str>
>>> f2 = float(input(Entrez un autre flottant : ))
Entrez un autre flottant : 12.345
>>> type(f2)
<class float>

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

>>> i = input(Entrez un entier : )


Entrez un entier : 3
>>> i
3
>>> iplus = int(input(Entrez un entier : )) + 1
Entrez un entier : 3
>>> iplus
4
>>> ibug = input(Entrez un entier : ) + 1
Entrez un entier : 3
Traceback (most recent call last):
File <stdin>, line 1, in <module>
TypeError: Cant convert int object to str implicitly

.. 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 informations 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()
>>>

.. Les squences dappement


lintrieur dune chane, le caractre antislash (\) permet de donner une signication spciale
certaines squences de caractres :
Squence
\saut_ligne
\\
\
\
\a
\b
\f
\n
\r
\t
\v
\N{nom}
\uhhhh
\Uhhhhhhhh
\ooo
\xhh

Signication
saut de ligne ignor (en n de ligne)
ache un antislash
apostrophe
guillemet
sonnerie (bip)
retour arrire
saut de page
saut de ligne
retour en dbut de ligne
tabulation horizontale
tabulation verticale
caractre sous forme de code Unicode nomm
caractre sous forme de code Unicode bits
caractre sous forme de code Unicode bits
caractre sous forme de code octal
caractre sous forme de code hexadcimal

- -

La calculatrice Python
>>> print(\N{pound sign}

. Les entres-sorties
\u00A3

\U000000A3)

>>> print(d \144 \x64)


d d d
>>> print(rd \144 \x64)

# la notation r... dsactive la signification spciale du caractre \

d \144 \x64

- -

Contrle du flux dinstructions

Un script Python est form dune suite dinstructions excutes en squence a de haut en bas.
Chaque ligne dinstructions est forme dune ou plusieurs lignes physiques
qui peuvent tre continues par un antislash \ ou un caractre ouvrant [({
pas encore ferm.
Cee excution en squence peut tre modie pour choisir ou rpter des
portions de code en utilisant des instructions composes .
a. On peut mere plusieurs instructions sur la mme ligne en les sparant avec un
; mais, par soucis de lisibilit, cest dconseill.

. 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
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

..

Choisir : if

- [elif] - [else]

Contrler une alternative :


>>> 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 !

Test dune valeur boolenne :


>>> x = 8
>>> estPair = (x % 2 == 0)
>>> estPair
True
>>> if estPair:
...

# mieux que if estPair == True:

print(La condition est vraie)

...
La condition est vraie

..

Syntaxe compacte dune alternative

Pour trouver, par exemple, le minimum de deux nombres, on peut utiliser loprateur ternaire :

>>> x = 4
>>> y = 3
>>> if x < y:
...

# criture classique

plus_petit = x

... else:
...

plus_petit = y

...
>>> print(Plus petit : , plus_petit)
Plus petit :

>>> plus_petit = x if x < y else y

# utilisation de loprateur ternaire

>>> print(Plus petit : , plus_petit)


Plus petit :

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
Notions de conteneur et ditrable
De faon gnrale, nous parlerons de conteneur pour dsigner un type
de donnes permeant de stocker un ensemble dautres donnes, en
ayant ou non, suivant les types, une notion dordre entre ces donnes.
Nous parlerons aussi ditrable pour dsigner un conteneur que lon
peut parcourir lment par lment.
Pour parcourir ces conteneurs, nous nous servirons parfois de linstruction range() qui fournit un moyen commode pour gnrer une liste
de valeurs.
Par exemple :
>>> uneListe = list(range(6))
>>> uneListe
[0, 1, 2, 3, 4, 5]

Ces notions seront tudies plus en dtail au chapitre , p. .


Python propose deux sortes de boucles.

.. Rpter : while
Rpter une portion de code tant quune expression boolenne est vraie :
>>> x, cpt = 257, 0
>>> sauve = x
>>> while x > 1:
...

x = x // 2

# division avec troncature

...

cpt = cpt + 1

# incrmentation

...
>>> print(Approximation de log2 de, sauve, :, cpt)
Approximation de log2 de 257 : 8

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 :


>>> for x in range(1, 11):
...

if x == 5:

...

break

...

print(x, end= )

...
1 2 3 4
>>> print(Boucle interrompue pour x =, x)
Boucle interrompue pour x = 5

..

Court-circuiter une boucle : continue

Passe immdiatement litration suivante de la boucle for ou while en cours contenant linstruction ;
reprend la ligne de len-tte de la boucle :
>>> for x in range(1, 11):
...

if x == 5:

...

continue

...

print(x, end= )

...
1 2 3 4 6 7 8 9 10
>>> # la boucle a saut la valeur 5

..

Utilisation avance des boucles

La syntaxe complte des boucles autorise des utilisations plus rares.


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 :
y = int(input(Entrez un entier positif

: ))

while not(y > 0) :


y = int(input(Entrez un entier positif, S.V.P.

: ))

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

Un exemple avec le parcours dune liste :


>>> entiers = [2, 11, 8, 7, 5]
>>> cible = int(input(Entrez un entier : ))
Entrez un entier : 7
>>> for entier in entiers:
...

if cible == entier:

...

print(cible, est dans la squence, entiers)

...

break

# voici linterruption !

... else:
...

print(cible, nest pas dans la squence, entiers)

...
7 est dans la squence [2, 11, 8, 7, 5]
>>> cible = int(input(Entrez un entier : ))
Entrez un entier : 6
>>>
>>> for entier in entiers:
...

if cible == entier:

...

print(cible, est dans la squence, entiers)

...

break

# voici linterruption !

... else:
...

print(cible, est absent de la squence, entiers)

...
6 est absent de la squence [2, 11, 8, 7, 5]

.. Traitement des erreurs : les exceptions


An de rendre les applications plus robustes, il est ncessaire de grer les erreurs dexcution des
parties sensibles du code.
Lorsquune erreur se produit, elle traverse toutes les couches de code comme une bulle dair remonte
la surface de leau. Si elle aeint la surface sans tre intercepte par le mcanisme des exceptions, le programme sarrte et lerreur est ache. Le traceback (message complet derreur ach) prcise lensemble
des couches traverses.
Dnition
Grer une exception permet dintercepter une erreur pour viter un arrt du programme.

Une exceptions spare dun ct la squence dinstructions excuter lorsque tout se passe bien et,
dun autre ct, une ou plusieurs squences dinstructions excuter en cas derreur.
Lorsquune erreur survient, un objet exception est pass au mcanisme de propagation des exceptions,
et lexcution est transfre la squence de traitement ad hoc.
Le mcanisme seectue donc en deux phases :
la leve dexception lors de la dtection derreur ;
le traitement appropri.
Syntaxe
La squence normale dinstructions est place dans un bloc try.
Si une erreur est dtecte (leve dexception), elle est traite dans le bloc except appropri (le gestionnaire
dexception).

from math import sin


for x in range(-4, 5) : # -4, -3, -2, -1, 0, 1, 2, 3, 4
try :
print({ :.3f}.format(sin(x)/x), end= )
except ZeroDivisionError : # toujours fournir un type dexception
print(1.0, end= ) # gre lexception en 0
# -0.189 0.047 0.455 0.841 1.0 0.841 0.455 0.047 -0.189

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

Syntaxe complte dune exception :


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.

- -

Conteneurs standard

Le chapitre a prsent les types de donnes simples, mais Python ore


beaucoup plus : les conteneurs.
De faon gnrale, un conteneur est un objet composite destin contenir
dautres objets. Ce chapitre dtaille les squences, les tableaux associatifs, les
ensembles et les chiers textuels.

. Squences
Dnition
Une squence est un conteneur ordonn dlments indexs par des entiers indiquant leur position
dans le conteneur.

Python dispose de trois types prdnis de squences :


les chanes (vues prcdemment) ;
les listes ;
les tuples .

. Listes
.. Dnition, syntaxe et exemples
Dnition
Une liste est une collection ordonne et modiable dlments ventuellement htrognes.

Syntaxe
lments spars par des virgules, et entours de crochets.

. tuple nest pas vraiment un anglicisme, mais plutt un nologisme informatique.

Conteneurs standard

. Listes

Exemples simples de listes :


couleurs = [trfle, carreau, coeur, pique]
print(couleurs) # [trfle, carreau, coeur, pique]
couleurs[1] = 14
print(couleurs) # [trfle, 14, coeur, pique]
list1 = [a, b]
list2 = [4, 2.718]
list3 = [list1, list2] # liste de listes
print(list3) # [[a, b], [4, 2.718]]

..

Initialisations et tests dappartenance

Utilisation de la rptition, de litrateur dentiers range() et de loprateur dappartenance (in) :


>>> 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 :


>>> nombres = [17, 38, 10, 25, 72]
>>> nombres.sort()
>>> nombres
[10, 17, 25, 38, 72]
>>> nombres.append(12)
>>> nombres.reverse()
>>> nombres
[12, 72, 38, 25, 17, 10]
>>> nombres.remove(38)
>>> nombres
[12, 72, 25, 17, 10]
>>> nombres.index(17)
3
>>> nombres[0] = 11
>>> nombres[1:3] = [14, 17, 2]
>>> nombres
[11, 14, 17, 2, 17, 10]
>>> nombres.pop()
10
>>> nombres
[11, 14, 17, 2, 17]
>>> nombres.count(17)
2
>>> nombres.extend([1, 2, 3])
>>> nombres
[11, 14, 17, 2, 17, 1, 2, 3]

- -

. Tuples

Conteneurs standard

.. Manipulation des tranes (ou sous-anes)


Syntaxe
Si on veut supprimer, remplacer ou insrer plusieurs lments dune liste, il faut indiquer une tranche
(cf. .., p. ) dans le membre de gauche dune aectation et fournir une liste dans le membre de droite.

>>> mots = [jambon, sel, miel, confiture, beurre]


>>> mots[2:4] = []

# effacement par affectation dune liste vide

>>> mots
[jambon, sel, beurre]
>>> mots[1:3] = [salade]
>>> mots
[jambon, salade]
>>> mots[1:] = [mayonnaise, poulet, tomate]
>>> mots
[jambon, mayonnaise, poulet, tomate]
>>> mots[2:2] = [miel]

# insertion en 3 position

>>> mots
[jambon, mayonnaise, miel, poulet, tomate]

.. Squences de squences
Les squences, comme du reste les autres conteneurs, peuvent tre imbriqus.
Par exemple :
>>> liste_1 = [1, 2, 3]
>>> listes = [liste_1, [4, 5], abcd]
>>>
>>> for liste in listes:
...
...
...

for elem in liste:


print(elem)
print()

...
1
2
3
4
5
a
b
c
d

. Tuples
Dnition
Un tuple est une collection ordonne et non modiable dlments ventuellement htrognes.

Syntaxe
lments spars par des virgules, et entours de parenthses.

>>> mon_tuple = (a, 2, [1, 3])

Lindexage des tuples sutilisent comme celui des listes ;


le parcours des tuples est plus rapide que celui des listes ;
ils sont utiles pour dnir des constantes.
Attention
Comme les chanes de caractres, les tuples ne sont pas modiables !

>>> mon_tuple.append(4) # attention ne pas modifier un tuple !


Traceback (most recent call last) :
File <stdin>, line 1, in <module>
AttributeError : tuple object has no attribute append

- -

Conteneurs standard

. Retour sur les rfrences

Les oprations des objets de type squentiel


Les types prdnis de squences Python (chane, liste et tuple) ont en commun les oprations rsumes dans le tableau suivant o s et t dsignent deux
squences du mme type et i, j et k des entiers :
lopration
x in s
x not in s
s + t
s * n, n * s
s[i]
s[i:j]
s[i:j:k]
len(s)
max(s), min(s)
s.index(i)
s.count(i)

son eet
True si s contient x, False sinon
True si s ne contient pas x, False sinon
concatnation de s et t
n copies (supercielles) concatnes de s
ie lment de s ( partir de )
tranche de s de i (inclus) j (exclu)
tranche de s de i j avec un pas de k
longueur de s
plus grand, plus petit lment de s
indice de la re occurrence de i dans s
nombre doccurrences de i dans s

Retour sur les rfrences

Nous avons dj vu que lopration daectation, apparemment innocente, est une relle dicult de
Python.
i = 1
msg = Quoi de neuf ?
e = 2.718

Dans lexemple ci-dessus, les aectations ralisent plusieurs oprations :


cration en mmoire dun objet du type appropri (membre de droite) ;
stockage de la donne dans lobjet cr ;
cration dun nom de variable (membre de gauche) ;
association de ce nom de variable avec lobjet contenant la valeur.
Une consquence de ce mcanisme est que, si un objet modiable est aect plusieurs variables, tout
changement de lobjet via une variable sera visible sur tous les autres :
fable = [Je, plie, mais, ne, romps, point]
phrase = fable
phrase[4] = casse
print(fable) # [Je, plie, mais, ne, casse, point]

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() :
>>> import copy
>>> a = [1, 2, 3]
>>> b = a

# une rfrence

>>> b.append(4)
>>> a
[1, 2, 3, 4]
>>> c = a[:]

# une copie simple

>>> c.append(5)
>>> c
[1, 2, 3, 4, 5]
>>> d = copy.copy(a)

# une copie de surface

>>> d.append(6)
>>> d

- -

. 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)}]

.. Complment graphique sur lassignation


Assignation augmente dun objet non modiable (cas dun entier : + Fig. .). On a reprsent
ltape de laddition intermdiaire.
. 2
a +=
a =. 7

7+2

(a) Assignation dun entier

(b) Assignation augmente

F . Assignation augmente dun objet non modiable.


Assignation augmente dun objet modiable (cas dune liste : + Fig. .). On a reprsent ltape
de la cration de la liste intermdiaire.
. 9]
m = [5,

[0]

[1]

. 1]
m += [6,

(a) Assignation dune liste.

+=

[0]

[1]

(b) Cration intermdiaire en mmoire

. 1]
m += [6,

[0]

[1]

[2]

[3]

(c) Assignation augmente

F . Assignation augmente dun objet modiable.

. Tableaux associatifs
Dnition
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.

Python propose le type standard dict.


- -

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
>>> d1 = {}

# dictionnaire vide. Autre notation : d1 = dict()

>>> d1[nom] = 3
>>> d1[taille] = 176
>>> d1
{nom: 3, taille: 176}
>>>
>>> d2 = {nom: 3, taille: 176}

# dfinition en extension

>>> d2
{nom: 3, taille: 176}
>>>
>>> d3 = {x: x**2 for x in (2, 4, 6)}

# dfinition en comprhension

>>> d3
{2: 4, 4: 16, 6: 36}
>>>
>>> d4 = dict(nom=3, taille=176)

# utilisation de paramtres nomms

>>> d4
{taille: 176, nom: 3}
>>>
>>> d5 = dict([(nom, 3), (taille, 176)])

# utilisation dune liste de couples cls/valeurs

>>> d5
{nom: 3, taille: 176}

Mthodes
elques mthodes applicables aux dictionnaires :
>>> tel = {jack: 4098, sape: 4139}
>>> tel[guido] = 4127
>>> tel
{sape: 4139, jack: 4098, guido: 4127}
>>> tel[jack]
4098
>>> del tel[sape]
>>> tel[irv] = 4127
>>> tel
{jack: 4098, irv: 4127, guido: 4127}
>>>
>>> tel.keys()
[jack, irv, guido]
>>> sorted(tel.keys())
[guido, irv, jack]
>>> sorted(tel.values())
[4098, 4127, 4127]
>>> guido in tel, jack not in tel
(True, False)

Ensembles (set)

Dnition
Un ensemble est une collection itrable non ordonne dlments hachables uniques.

- -

. Fiiers textuels

Conteneurs standard

Donc un set est la transposition informatique de la notion densemble mathmatique.


En Python, il existe deux types densemble, les ensembles modiables : set et les ensembles non modiables : frozenset. On retrouve ici les mmes dirences quentre les listes et les tuples.
>>> 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}

Y
m

s
.

p
F . Oprations sur les ensembles.

. 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 donnes 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).

.. Gestion des iers


Ouverture et fermeture des iers
Principaux modes douverture des chiers textuels :
f1 = open(monFichier_1, r, encoding=utf8) # r mode lecture
f2 = open(monFichier_2, w, encoding=utf8) # w mode criture
f3 = open(monFichier_3, a, encoding=utf8) # a mode ajout

. 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 :
>>> f = open(truc.txt, r, encoding=utf8)
>>> s = f.read()

# lit tout le fichier --> chane

>>> f.close()
>>> f = open(truc.txt, r, encoding=utf8)
>>> s = f.readlines()

# lit tout le fichier --> liste de chanes

>>> f.close()

Mthodes de lecture dun chier partiel :


>>> f = open(truc.txt, r, encoding=utf8)
>>> s = f.read(3)

# lit au plus n octets --> chane

>>> s = f.readline()

# lit la ligne suivante --> chane

>>> f.close()
>>>
>>> # Affichage des lignes dun fichier une une
>>> f = open(truc.txt, encoding=utf8)

# mode r par dfaut

>>> for ligne in f:


...

print(ligne)

...
>>> f.close()

Itrer sur les conteneurs

Les techniques suivantes sont classiques et trs utiles.


Obtenir cls et valeurs en bouclant sur un dictionnaire :
. ou bien ush par un appel la mthode flush().

- -

. Aage format

Conteneurs standard

knights = {Gallahad : the pure, Robin : the brave}


for k, v in knights.items() :
print(k, v)
# Gallahad the pure
# Robin the brave

Obtenir indice et lment en bouclant sur une liste :


>>> for i, v in enumerate([tic, tac, toe]):
...

print(i, ->, v)

...
0 -> tic
1 -> tac
2 -> toe

Boucler sur deux squences (ou plus) apparies :


>>> questions = [name, quest, favorite color]
>>> answers = [Lancelot, the Holy Grail, blue]
>>> for question, answer in zip(questions, answers):
...

print(What is your, question, ? It is, answer)

...
What is your name ? It is Lancelot
What is your quest ? It is the Holy Grail
What is your favorite color ? It is blue

Obtenir une squence inverse (la squence initiale est inchange) :


for i in reversed(range(1, 10, 2)) :
print(i, end= ) # 9 7 5 3 1

Obtenir une squence trie lments uniques (la squence initiale est inchange) :
basket = [apple, orange, apple, pear, orange, banana]
for f in sorted(set(basket)) :
print(f, end= ) # apple banana orange pear

. 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 :
print({} {} {}.format(zro, un, deux)) # zro un deux
# formatage dune chane pour usages ultrieurs
chain = {2} {0} {1}.format(zro, un, deux)
print(chain) # affichage

: deux zro un

with open(test.txt, w, encoding=utf8) as f :


f.write(chain) # enregistrement dans un fichier
print(Je mappelle {}.format(Bob)) # Je mappelle Bob
print(Je mappelle {{{}}}.format(Bob)) # Je mappelle {Bob}
print({}.format(-*10)) # ----------

Remplacements avec champs nomms :


a, b = 5, 3
print(The story of {c} and {d}.format(c=a+b, d=a-b)) # The story of 8 and 2

Formatages laide de liste :


stock = [papier, enveloppe, chemise, encre, buvard]
print(Nous avons de l{0[3]} et du {0[0]} en stock\n.format(stock)) # Nous avons de lencre et du papier en stock

- -

Conteneurs standard

. Aage format

Formatages laide de dictionnaire :


print(My name is {0[name]}.format(dict(name=Fred))) # My name is Fred
d = dict(poids = 12000, animal = lphant)
print(L{0[animal]} pse {0[poids]} kg\n.format(d)) # Llphant pse 12000 kg

Remplacement avec aributs nomms :


import math
import sys
print(math.pi = {.pi}, epsilon = {.float_info.epsilon}.format(math, sys))
# math.pi = 3.14159265359, epsilon = 2.22044604925e-16

Conversions textuelles, str() et repr() :


>>> print({0!s}

{0!r}.format(texte\n))

texte
texte\n

Formatages numriques :
s = int

:{0:d} ; hex : {0:x} ; oct : {0:o} ; bin : {0:b}.format(42)

print(s) # int
s = int

:42; hex : 2a ; oct : 52; bin : 101010

:{0:d} ; hex : {0:#x} ; oct : {0:#o} ; bin : {0:#b}.format(42)

print(s) # int

:42; hex : 0x2a ; oct : 0o52 ; bin : 0b101010

n = 100
pi = 3.1415926535897931
k = -54
print({ :.4e}.format(pi)) # 3.1416e+00
print({ :g}.format(pi)) # 3.14159
print({ :.2%}.format(n/(47*pi))) # 67.73%
msg = Rsultat sur { :d} chantillons

: { :.2f}.format(n, pi)

print(msg) # Rsultat sur 100 chantillons

: 3.14

msg = {0.real} et {0.imag} sont les composantes du complexe {0}.format(3-5j)


print(msg) # 3.0 et -5.0 sont les composantes du complexe (3-5j)
print({ :+d} { :+d}.format(n, k)) # +100 -54 (on force laffichage du signe)
print({ :,}.format(1234567890.123)) # 1,234,567,890.12

Formatages divers :
>>> s = The sword of truth
>>> print([{}].format(s))
[The sword of truth]
>>> print([{:25}].format(s))
[The sword of truth

>>> print([{:>25}].format(s))
[

The sword of truth]

>>> print([{:^25}].format(s))
[

The sword of truth

>>> print([{:-^25}].format(s))
[---The sword of truth----]
>>> print([{:.<25}].format(s))
[The sword of truth.......]
>>> lng = 12
>>> print([{}].format(s[:lng]))
[The sword of]
>>> m = 123456789
>>> print({:0=12}.format(m))
000123456789

str()

est un achage orient utilisateur alors que repr() est une reprsentation lirale.

- -

Fonctions et espaces de noms

Les fonctions sont les lments structurants de base de tout langage procdural.
Elles orent dirents avantages :
vitent la rptition : on peut factoriser une portion de code qui se rpte lors de lexcution en squence dun script ;
Mettent en relief les donnes et les rsultats : entres et sorties de la fonction ;
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 notion dimport, mcanisme trs simple qui permet de rutiliser des chiers de
fonctions, souvent appels modules ou bibliothques.

. Dnition et syntaxe
Dnition
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

A
A

APPEL/RETOUR

C
B

D
APPEL/RETOUR

B
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-problme

sous-

sous-

complexe

problme 1

problme 2

sous-

sous-

problme 3

problme 4

(d) Amliore la conception

F . Les avantages de lutilisation des fonctions.

- -

. 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)

. Passage des arguments


.. Mcanisme gnral
Remarque
3 Passage par aectation : chaque paramtre de la dnition de la fonction correspond, dans lordre,
un argument de lappel. La correspondance se fait par aectation des arguments aux paramtres.

dfinition

def maFonction(x, y, z):


a = z / x
b = 2 + y
return a, b
affectation
x = 7
y = k
z = 1.618

appel

c, d = maFonction(7, k, 1.618)

.
F . Passage par aectation des arguments dappel aux paramtres de dnition.

.. Un ou plusieurs paramtres, pas de retour


Exemple sans linstruction return, ce quon appelle souvent une procdure . Dans ce cas la fonction
renvoie implicitement la valeur None :
def table(base, debut, fin) :
Affiche la table de multiplication des <base> de <debut> <fin>.
n = debut
while n <= fin :
print(n, x, base, =, n * base)
n += 1
# 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
# autre exemple du mme appel, mais en nommant les paramtres ;
table(base=7, debut=2, fin=8)

.. Un ou plusieurs paramtres, un ou plusieurs retours


Exemple avec utilisation dun return unique :
from math import pi
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

Retourne le volume dune sphre de rayon <r> ;


return 4.0 * pi * cube(r) / 3.0
# Saisie du rayon et affichage du volume
rayon = float(input(Rayon

: ))

print(Volume de la sphre =, volumeSphere(rayon))

Exemple avec utilisation dun return multiple :


import math
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))

..

Passage dune fonction en paramtre

Puisque en Python une variable peut rfrencer une fonction, on peut transmere une fonction comme
paramtre :
>>> def f(x):
...

return 2*x+1

...
>>> def g(x):
...

return x//2

...
>>> def h(fonc, x):
...

return fonc(x)

...
>>> h(f, 3)
7
>>> h(g, 4)
2

..

Paramtres avec valeur par dfaut

Il est possible de spcier, lors de la dclaration, des valeurs par dfaut utiliser pour les arguments.
Cela permet, lors de lappel, de ne pas avoir spcier les paramtres correspondants.
Il est galement possible, en combinant les valeurs par dfaut et le nommage des paramtres, de nindiquer lappel que les paramtres dont on dsire modier la valeur de largument. Il est par contre
ncessaire de regrouper tous les paramtres optionnels la n de la liste des paramtres.
>>> def accueil(nom, prenom, depart=MP, semestre=S2):
...

print(prenom, nom, Dpartement, depart, semestre, semestre)

...
>>> accueil(Student, Joe)
Joe Student Dpartement MP semestre S2
>>> accueil(Student, Eve, Info)
Eve Student Dpartement Info semestre S2
>>> accueil(Student, Steph, semestre=S3)
Steph Student Dpartement MP semestre S3

Attention
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

.. Nombre darguments arbitraire : passage dun tuple de valeurs


Le passage dun nombre arbitraire darguments est permis en utilisant la notation dun argument nal
Les paramtres surnumraires sont alors transmis sous la forme dun tuple aect cet argument
(que lon appelle gnralement args).
*nom.

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
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 dcompress 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

.. Nombre darguments arbitraire : passage dun dictionnaire


De la mme faon, il est possible dautoriser le passage dun nombre arbitraire darguments nomms en
plus de ceux prvus lors de la dnition en utilisant la notation dun argument nal **nom. Les paramtres
surnumraires nomms sont alors transmis sous la forme dun dictionnaire aect cet argument (que
lon appelle gnralement kwargs pour keyword args).
Rciproquement il est aussi possible de passer un dictionnaire lappel dune fonction, qui sera dcompress et associ aux paramtres nomms de la fonction.
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
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 :
>>> import math
>>> pi = 2.718
>>> print(pi)

# une valeur de lespace de nom local

- -

Fonctions et espaces de noms

. Espaces de noms

2.718
>>> print(math.pi)

# une valeur de lespace de noms math

3.141592653589793

..

Porte des objets

On distingue :
La porte globale : celle du module ou du chier script en cours. Un dictionnaire gre les objets globaux :
linstruction globals() fournit un dictionnaire contenant les couples nom:valeur ;
La porte locale : les objets internes aux fonctions sont locaux. Les objets globaux ne sont pas modiables
dans les portes locales. Linstruction locals() fournit un dictionnaire contenant les couples nom:valeur.

..

Rsolution des noms : rgle LGI

La recherche des noms est dabord locale (L), puis globale (G), enn interne (I) (+ Fig. .) :
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
def fonc(y) : # y et z sont affects dans fonc => locaux
global x # permet de modifier x ligne suivante
x = x + 2
z = x + y
return z
x = 99
print(fonc(1)) # 102
print(x) # 101

# x et fonc sont affects dans le module => globaux


def fonc(y) : # y et z sont affects dans fonc => locaux
# dans fonc

: porte locale

z = x + y
return z
x = 99
print(fonc(1)) # 100
print(x) # 99

- -

. Espaces de noms

Fonctions et espaces de noms

# x et fonc sont affects dans le module => globaux


def fonc(y) : # y, x et z sont affects dans fonc => locaux
x = 3 # ce nouvel x est local et masque le x global
z = x + y
return z
x = 99
print(fonc(1)) # 4
print(x) # 99

- -

Modules et packages

Un programme Python est gnralement compos de plusieurs chiers


sources, appels modules.
Sils sont correctement cods les modules doivent tre indpendants les
uns des autres pour tre rutiliss la demande dans dautres programmes.
Ce chapitre explique comment coder des modules et comment les importer
dans un autre.
Nous verrons galement la notion de package qui permet de grouper plusieurs modules.

. Modules
Dnition
Module : chier script Python permeant de dnir des lements de programme rutilisables. Ce
mcanisme permet dlaborer ecacement des bibliothques de fonctions ou de classes.

Avantages des modules :


rutilisation du code ;
la documentation et les tests peuvent tre intgrs au module ;
ralisation de services ou de donnes partags ;
partition de lespace de noms du systme.
Remarque
3 Lorsquon parle du module, on omet lextention : le module machin est dans le chier machin.py.

.. Import
Linstruction import charge et excute le module indiqu sil nest pas dj charg. Lensemble des
dnitions contenues dans ce module deviennent alors disponibles : variables globales, fonctions, classes.
Suivant la syntaxe utilise, on accde aux dnitions du module de direntes faons :
linstruction import <nom_module> donne accs lensemble des dnitions du module import en
utilisant le nom du module comme espace de nom.

Modules et paages

. Modules

>>> import tkinter


>>> print(Version de tkinter :, tkinter.TkVersion)
Version de tkinter : 8.5

linstruction from <nom_module> import


sie de noms dnis dans le module.

nom1, nom2donne accs directement une slection choi-

>>> from math import pi, sin


>>> print(Valeur de Pi :, pi, sinus(pi/4) :, sin(pi/4))
Valeur de Pi : 3.14159265359 sinus(pi/4) : 0.707106781187

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 :
>>> sin = math.sin
>>> pi = math.pi

Remarque
3 Il est conseill dimporter dans lordre :
les modules de la bibliothque standard ;
les modules des bibliothques tierces ;
Les modules personnels.
Attention
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 :
>>> import je_me_nomme
Je me nomme : je_me_nomme

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
# programme principal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for i in range(1, 4) :
print(cube de, i, =, cube_m.cube(i))

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 standard, riche de plus de packages et modules, rpond aux problmes courants les plus varis.
Ce survol prsente quelques fonctionnalits utiles.
La gestion des anes
ter

Le module string fournit des constantes comme ascii_lowercase, digitsainsi que la classe Formatqui peut tre spcialise en sous-classes de formateurs de chanes.

Le module textwrap est utilis pour formater un texte : longueur de chaque ligne, contrle de lindentation.
- -

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 .
La gestion de la ligne de commande
Pour grer la ligne de commande, Python propose linstruction sys.argv. Elle fournit simplement une
liste contenant les arguments de la ligne de commande : argv[1], argv[2]sachant que argv[0] est le
nom du script lui-mme.
Par ailleurs, Python propose un module de parsing , le module argparse.
Cest un module objet qui sutilise en trois tapes :
. cration dun objet parser ;
. ajout des arguments prvus en utilisant la mthode add_argument(). Chaque argument peut dclencher une action particulire spcie dans la mthode ;
. analyse de la ligne de commande par la mthode parse_args().
Enn, selon les paramtres dtects par lanalyse, on eectue les actions adaptes.
Dans lexemple suivant, extrait de la documentation ocielle du module, on se propose de donner en
argument la ligne de commande une liste dentiers. Par dfaut le programme retourne le plus grand entier
de la liste, mais sil dtecte largument sum, il retourne la somme des entiers de la liste. De plus, lanc avec
loption -h ou help, le module argparse fournit automatiquement une documentation du programme :
# -*- coding : utf8 -*import argparse
# 1. cration du parser
parser = argparse.ArgumentParser(description=Process some integers)
# 2. ajout des arguments
parser.add_argument(integers, metavar=N, type=int, nargs=+,
help=an integer for the accumulator)
parser.add_argument(--sum, dest=accumulate, action=store_const,
const=sum, default=max,
help=sum the integers (default : find the max)
# 3. parsing de la ligne de commande
args = parser.parse_args()
# processing
print(args.accumulate(args.integers))

Voici les sorties correspondant aux dirents cas de la ligne de commande :


$ python argparse.py -h
usage: argparse.py [-h] [--sum] N [N ...]
Process some integers.
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 --help


usage: argparse.py [-h] [--sum] N [N ...]
Process some integers.

. Cest tout un monde


. analyse grammaticale de la ligne de commande.

- -

. 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
$ python argparse.py 1 2 3 4 5 6 7 8 9 --sum
45

La gestion du temps et des dates


Les modules calendar, time et datetime fournissent les fonctions courantes de gestion du temps et des
dures :
import calendar, datetime, time
moon_apollo11 = datetime.datetime(1969, 7, 20, 20, 17, 40)
print(moon_apollo11)
print(time.asctime(time.gmtime(0)))
# Thu Jan 01 00:00:00 1970 (epoch UNIX)
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

Algorithmes et types de donnes collection


Le module bisect fournit des fonctions de recherche de squences tries. Le module array propose un
type semblable la liste, mais plus rapide car de contenu homogne.
Le module heapq gre des tas dans lesquels llment dindex est toujours le plus petit :
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]

Le type defaultdict permet des utilisations avances :


from collections import defaultdict
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)])

Et tant dautres domaines


Beaucoup dautres sujets pourraient tre explors :

accs au systme ;
utilitaires chiers ;
programmation rseau ;
persistance ;
les chiers XML ;
la compression ;

Python scientique

Dans les annes , Travis Oliphant et dautres commencrent laborer des outils ecaces de traitement 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 matplotlib 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.

..

Bibliothques mathmatiques et types numriques

On rappelle que Python possde la bibliothque math :


>>> import math
>>> math.pi / math.e
1.1557273497909217
>>> math.exp(1e-5) - 1
1.0000050000069649e-05
>>> math.log(10)
2.302585092994046
>>> math.log(1024, 2)
10.0
>>> math.cos(math.pi/4)
0.7071067811865476
>>> math.atan(4.1/9.02)
0.4266274931268761
>>> math.hypot(3, 4)
5.0
>>> math.degrees(1)
57.29577951308232

Par ailleurs, Python propose en standard les modules fraction et decimal :


from fractions import Fraction
import decimal as d
print(Fraction(16, -10)) # -8/5
print(Fraction(123)) # 123
print(Fraction( -3/7 )) # -3/7
print(Fraction(-.125)) # -1/8

- -

. 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 subventionne le dveloppement de IPython.
IPython (actuellement en version .X) est disponible en trois dclinaisons (+ Fig. . et .) :
ipython

linterprteur de base ;

sa version amliore dans une fentre graphique de la bibliothque graphique Qt,


agrmente dun menu ;

ipython qtconsole

sa dernire variante qui ore une interface simple mais trs puissante dans le navigateur par dfaut.

ipython notebook

(a)

(b)

ipython

ipython qtconsole

F . IPython en mode console texte ou graphique.


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 commandes 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 scientiques 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
IPython est auto-document.
Coloration syntaxique.
Les docstrings des objets Python sont disponibles en accolant un ? au nom de lobjet ou
pour une aide plus dtaille.
Numrote les entres et les sorties.
Organise les sorties : messages derreur ou retour la ligne entre chaque lment dune liste si on
lache.

Auto-compltion avec la touche TAB :
Lauto-compltion trouve les variables qui ont t dclares.
Elle trouve les mots cls et les fonctions locales.
La compltion des mthodes sur les variables tiennent compte du type actuel de cee dernire.
Par contre la compltion ne tient pas compte du contexte.
Historique persistant (mme si on quie linterprteur, on peut retrouver les dernires commandes
par lhistorique) :
Recherche dans lhistorique avec les ches du clavier.
Isole dans lhistorique les entres multilignes.
On peut appeler les entres et sorties prcdentes.
Contient des raccourcis et des alias. On peut en acher la liste en tapant la commande lsmagic.
Permet dexcuter des commandes systme en les prxant par un point dexclamation. Par exemple !ls
sous Linux ou OSX, ou !dir sous une fentre de commande Windows.
- -

. 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 caractres, 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 [1]: import numpy as np
In [2]: a = np.array([1, 2, 3, 4])
In [3]: a

# a est un tableau dentiers

Out[3]: array([1, 2, 3, 4])


In [4]: b = a * 2.5
In [5]: b

# b est bien devenu un tableau de flottants

Out[5]: array([

2.5,

5. ,

7.5,

10. ])

In [6]: c = np.array([5, 6, 7, 8])


In [7]: d = b + c
In [8]: d

# transtypage en flottants

Out[8]: array([

7.5,

11. ,

14.5,

18. ])

Lexemple suivant dnit un tableau positions de 10 000 000 lignes et colonnes, formant des positions 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 [1]: import numpy as np
In [2]: positions = np.random.rand(10000000, 2)
In [3]: x, y = positions[:, 0], positions[:, 1]
In [4]: %precision 3
Out[4]: %.3f
In [5]: positions

. Cee introduction est reprise de lexcellente prsentation de Jean-Michel Ferrard [cf. p. ].

- -

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 [7]: x0, y0 = 0.5, 0.5


In [8]: distances = (x - x0)**2 + (y - y0)**2
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
x = np.linspace(-10, 10, 200)
y = np.sin(np.pi * x)/(np.pi * x)
plt.plot(x, y)
plt.show()

(a) Un trac simple

(b) Un trac dcor

F . Trac dun sinus cardinal.


Ce second exemple amliore le trac. Il utilise le style objet de matplotlib :
import numpy as np
import matplotlib.pyplot as plt
def plt_arrays(x, y, title=, color=red, linestyle=dashed, linewidth=2) :
Dfinition des caractristiques et affichage dun trac y(x).
fig = plt.figure()
axes = fig.add_subplot(111)
axes.plot(x, y, color=color, linestyle=linestyle, linewidth=linewidth)
axes.set_title(title)
axes.grid()
plt.show()

. 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 .

F . Exprimenter SymPy avec live sympy

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 [1]: P = (x-1) * (x-2) * (x-3)
In [2]: P.expand()
Out[2]:
3
x

2
- 6x

+ 11x - 6

In [3]: P.factor()
Out[3]: (x - 3)(x - 2)(x - 1)
In [4]: roots = solve(P, x)

. On parle aussi de CAS (Computer Algebra System).


. http://live.sympy.org

- -

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 [9]: e = 2*sin(x)**2 + 2*cos(x)**2
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 [14]: f = x**2 * sin(x)
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 ;

Le site pypi.python.org/pypi recense des milliers de modules et de packages !

..

Un exemple : la bibliothque Unum

Cee bibliothque permet de calculer en tenant compte des units du systme SI (Systme International dunits).
Voici un exemple de session interactive :
>>> from unum.units import *
>>> distance = 100*m
>>> temps = 9.683*s
>>> vitesse = distance / temps

. e python package index

- -

. 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
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
qui peut soit tre vide soit contenir du code dinitialisation.

__init__

- -

La Programmation Oriente Objet

La Programmation Oriente Objet :


la POO permet de mieux modliser la ralit en concevant des modles
dobjets, les classes.
Ces classes permeent de construire des objets interactifs entre eux
et avec le monde extrieur.
Les objets sont crs indpendamment les uns des autres, grce
lencapsulation, mcanisme qui permet dembarquer leurs proprits.
Les classes permeent dviter au maximum lemploi des variables
globales.
Enn les classes orent un moyen conomique et puissant de
construire de nouveaux objets partir dobjets prexistants.

. 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,
instance de la classe list et casse est une instance de la classe str.

5, 1]

est une

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

Notations UML de base

Remarque
3 LUML (Unied Modeling Language) est un langage graphique trs rpandu de conception des systmes
dinformation.
UML propose une grande varit de diagrammes (classes, objets, tats, activits, etc.). En premire
approche, le diagramme de classes est le plus utile pour concevoir les classes et leurs relations.

(a) Une classe et une note

(b) Un hritage

F . Diagrammes de classe.

Classes et instanciation dobjets

..

Linstruction class

Cee instruction permet dintroduire la dnition dune nouvelle classe (cest--dire dun nouveau
type de donnes).
Syntaxe

. class est une instruction compose. Elle comprend un en-tte (avec docstring) + corps indent :
>>> class C:
...

Documentation de la clesse C.

...

x = 23

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.

..

Linstanciation et ses attributs

Les classes sont des fabriques dobjets : on construit dabord lusine avant de produire des objets !
On instancie un objet (cest--dire quon le produit partir de lusine) en appelant le nom de sa
classe comme sil sagissait dune fonction :
class C :
Documentation de la classe C.
x = 23 # attibut de classe
y = un string
z = [1, x, 3, y]

# a est un objet de la classe C (ou une instance)


a = C()
# Affichage des attributs de linstance a
print(a.x)
print(a.y)
print(a.z)

- -

. 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
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.

.. Retour sur les espaces de noms


On a dj vu les espaces de noms locaux (lors de lappel dune fonction), globaux (lis aux modules)
et internes (fonctions standard), ainsi que la rgle Local Global Interne (cf. section ., p. ) qui dnit
dans quel ordre ces espaces sont parcourus pour rsoudre un nom.
Les classes ainsi que les objets instances dnissent de nouveaux espaces de noms, et il y a l aussi des
rgles pour rsoudre les noms :
les classes peuvent utiliser les variables dnies au niveau principal mais elles ne peuvent pas les
modier ;
les instances peuvent utiliser les variables dnies au niveau de la classe mais elles ne peuvent pas
les modier (pour cela elles sont obliges de passer par lespace de noms de la classe, par exemple
C.x = 3).
Exemple de masquage daribut :
class C :
Documentation de la classe C.
x = 23 # attibut de classe
a = C() # a est un objet de la classe C (ou une instance)
a.x # 23

: affiche la valeur de lattribut de linstance a

a.x = 12 # modifie son attribut dinstance (attention...)


a.x # 12
C.x # 23 mais lattribut de classe est inchang
C.z = 6 # z
a.y = 44 # y

: nouvel attribut de classe


: nouvel attribut de linstance a

b = C() # b est un autre objet de la classe C (une autre instance)


b.x # 23

: b connat bien son attribut de classe, mais...

b.y # ... b na pas dattribut y !

Retraage (dernier appel le plus rcent)

Fichier /home/ipy/Phi/3-corps/ch07/src/7_025.py, ligne 14, dans 0


builtins.AttributeError : C object has no attribute y

Reere des noms


Noms non qualis (exemple dimension) laectation cre ou change le nom dans la porte locale
courante. Ils sont cherchs suivant la rgle LGI.
Noms qualis (exemple dimension.hauteur) laectation cre ou modie laribut dans lespace
de noms de lobjet. Un aribut est cherch dans lobjet, puis dans toutes les classes dont lobjet
dpend (mais pas dans les modules).
>>> 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

. Les espaces de noms sont implments par des dictionnaires.

- -

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 [3]: for key in C.__dict__.keys():
...:

print(key)

...:
x
__module__
__weakref__
__dict__
y
__doc__
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
In [8]: a.__doc__

# notation compacte

Out[8]: Une classe simple.


In [9]: a.y

# notation compacte

Out[9]: 5

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 obligatoire, o self reprsente lobjet sur lequel la mthode sera applique.
Autrement dit self est la rfrence dinstance.

>>> class C:
...

x = 23

...

y = x + 5

...

def affiche(self):

# x et y : attributs de classe

# mthode affiche()

...

self.z = 42

# attribut dinstance

...

print(C.y)

# dans une mthode, on qualifie un attribut de classe,

...

print(self.z)

# mais pas un attribut dinstance

...
>>> obj = C()
>>> obj.affiche()

- -

. Mthodes spciales

La Programmation Oriente Objet

28
42

. Mthodes spciales
Beaucoup de classes orent des caractristiques supplmentaires comme par exemple la concatnation 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
automatiquement appele pour initialiser lobjet. Cest typiquement dans cee mthode spciale que sont crs les aributs dinstance avec leur valeur initiale.
__init__ est

>>> 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.

.. Surarge des oprateurs


La surcharge permet un oprateur de possder un sens dirent suivant le type de ses oprandes.
Par exemple, loprateur + permet :
x = 7 + 9 # addition entire
s = ab + cd # concatnation

Python possde des mthodes de surcharge pour :


tous les types (__call__, __str__, ) ;
les nombres (__add__, __div__, ) ;
les squences (__len__, __iter__, ).
Soient deux instances, obj et obj, les mthodes spciales suivantes permeent deectuer les oprations arithmtiques courantes :
Nom
oppos
addition
soustraction
multiplication
division
division entire

Mthode spciale
__neg__

Utilisation
-obj1

__add__

obj1 + obj2

__sub__

obj1 - obj2

__mul__

obj1 * obj2

__div__

obj1 / obj2

__floordiv__

obj1 // obj2

Voir lAbrg dense, les mthodes spciales [cf. p. ]


. Pour plus de dtails, consulter la documentation de rfrence du langage Python (e Python language reference) section ,
Data model, sous-section ., Special method names.

- -

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().
>>> class Vecteur2D:
...
...
...
...
...
...
...

def __init__(self, x0, y0):


self.x = x0
self.y = y0
def __add__(self, second):

# addition vectorielle

return Vecteur2D(self.x + second.x, self.y + second.y)


def __str__(self):

# affichage dun Vecteur2D

return Vecteur({:g}, {:g}).format(self.x, self.y)

...
>>> v1 = Vecteur2D(1.2, 2.3)
>>> v2 = Vecteur2D(3.4, 4.5)
>>>
>>> print(v1 + v2)
Vecteur(4.6, 6.8)

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 attributs 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 linstanciation. 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
Lhritage est le mcanisme qui permet de se servir dune classe prexistante pour en crer une nouvelle 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.

..

Exemple dhritage et de polymorphisme

Dans lexemple suivant, la classe QuadrupedeDebout hrite de la classe mre Quadrupede, et la mthode
est polymorphe :

piedsAuContactDuSol()

>>> class Quadrupede:


...
...

def piedsAuContactDuSol(self):
return 4

...
>>> class QuadrupedeDebout(Quadrupede):
...
...

def piedsAuContactDuSol(self):
return 2

...
>>> chat = Quadrupede()
>>> chat.piedsAuContactDuSol()
4
>>> homme = QuadrupedeDebout()
>>> homme.piedsAuContactDuSol()
2

. Rappelons quil existe deux faons dacher un rsultat :


pour lutilisateur .

repr()

- -

et

str().

La premire est pour la machine , la seconde

. Notion de conception oriente objet

La Programmation Oriente Objet

. Notion de conception oriente objet


Suivant les relations que lon va tablir entre les objets de notre application, on peut concevoir nos
classes de deux faons possibles en utilisant lassociation ou la drivation.
Bien sr, ces deux conceptions peuvent cohabiter, et cest souvent le cas !

.. Association
Dnition
Une association reprsente un lien unissant les instances de classe. Elle repose sur la relation a-un
ou utilise-un .

F . Une association peut tre tiquete et avoir des multiplicits.


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))
s = Segment(1.0, 2.0, 3.0, 4.0)
print(s) # Segment

: [(1, 2), (3, 4)]

Agrgation
Dnition
Une agrgation est une association non symtrique entre deux classes (lagrgat et le composant).

F . Une voiture est un tout qui contient un moteur.

- -

La Programmation Oriente Objet

. Notion de conception oriente objet

Composition
Dnition
Une composition est un type particulier dagrgation dans laquelle la vie des composants est lie
celle de lagrgat.

F . On peut mler les deux types dassociation.


La disparition de lagrgat Commune entraine le disparition des composants Services et Conseil_Municipal
alors que Village nen dpend pas.

..

Drivation

Dnition
La drivation dcrit la cration de sous-classes par spcialisation. Elle repose sur la relation est-un .

On utilise dans ce cas le mcanisme de lhritage.


Limplmentation Python utilise est gnralement lappel linitialisateur de la classe parente dans
linitialisateur de la classe drive (utilisation de la fonction super()).
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 :

>>> class Rectangle:


...

def __init__(self, longueur=30, largeur=15):

...

self.L, self.l = longueur, largeur

...
...

self.nom = rectangle
def __str__(self):

...

return nom : {}.format(self.nom)

...
>>> class Carre(Rectangle):

# hritage simple

...

Sous-classe spcialise de la super-classe Rectangle.

...

def __init__(self, cote=20):

...

# appel au constructeur de la super-classe de Carre :

...

super().__init__(cote, cote)

...

self.nom = carr # surcharge dattribut

...
>>> r = Rectangle()
>>> c = Carre()
>>> print(r)
nom : rectangle
>>> print(c)
nom : carr

- -

. 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.

F . Un Ion est-un Atome.

class Atome :
atomes simplifis (les 10 premiers lments).
table = [None, (hydrogene, 0), (helium, 2), (lithium, 4),
(beryllium, 5), (bore, 6), (carbone, 6), (azote, 7),
(oxygene, 8), (fluor, 10), (neon, 10)]
def __init__(self, nat) :
le numro atomique dtermine les nombres de protons, dlectrons et de neutrons
self.np, self.ne = nat, nat # nat = numro atomique
self.nn = Atome.table[nat][1]
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))


class Ion(Atome) : # Ion hrite dAtome
Les ions sont des atomes qui ont gagn ou perdu des lectrons
def __init__(self, nat, charge) :
le numro atomique et la charge lectrique dterminent lion
super().__init__(nat)
self.ne = self.ne - charge # surcharge
self.charge = charge
def affiche(self) : # surcharge
Atome.affiche(self)
print(Particule lectrise. Charge =, self.charge)
# Programme principal =========================================================
a1 = Atome(5)
a2 = Ion(3, 1)
a3 = Ion(8, -2)
a1.affiche()
a2.affiche()
a3.affiche()

Nom de llment

: bore

5 protons, 5 lectrons, 6 neutrons


Nom de llment

: lithium

. adapt de [], p. .

- -

La Programmation Oriente Objet

. Un exemple complet

3 protons, 2 lectrons, 4 neutrons


Particule lectrise. Charge = 1
Nom de llment

: oxygene

8 protons, 10 lectrons, 8 neutrons


Particule lectrise. Charge = -2

- -

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, congurer et positionner les lments graphiques (widgets) utiliss, coder les fonctions/mthodes associes aux widgets, puis dentrer dans une boucle charge
de rcuprer et traiter les dirents vnements pouvant se produire au niveau de linterface graphique : interactions de lutilisateur, besoins de mises
jour graphiques, etc.

. Programmes pilots par des vnements


En programmation graphique objet, on remplace le droulement squentiel du script par une boucle
dvnements (+ Fig. .)

. 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 appele Ttk qui permet d habiller les widgets avec dirents thmes ou styles. Ce module est galement
disponible partir de Python ...
. Langage dvelopp en par John K. Ousterhout de lUniversit de Berkeley.

La POO graphique

. La bibliothque tkinter

Initialisation

Initialisation

...
Fonctionnalits

clavier

centrales du

souris

programme

rseau

messages

vnements

Boucle

Fonctionnalits

dvnements

centrales du
programme

...

.
Terminaison

.
Terminaison

(a) Programmation squentielle

(b) Programmation pilote par une boucle dvnements

F . Deux styles de programmation.


Un exemple tkinter simple (+ Fig. .)
import tkinter
# cration dun widget affichant un simple message textuel
widget = tkinter.Label(None, text=Bonjour monde graphique !)
widget.pack() # positionnement du label
widget.mainloop() # lancement de la boucle dvnements

F . Un exemple simple : lachage dun Label

..

Les widgets de tkinter

Dnition
On appelle widget (mot valise, contraction de window et gadget) les composants graphiques de base
dune bibliothque.

Liste des principaux widgets de tkinter :


Tk fentre de plus haut niveau
Frame contenant pour organiser dautres widgets
Label zone de message
Button bouton daction avec texte ou image
Message zone dachage multi-lignes
Entry zone de saisie
Chebutton bouton deux tats
Radiobutton bouton deux tats exclusifs par groupe de boutons
Scale glissire plusieurs positions
- -

. 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

.. Le positionnement des widgets


tkinter

possde trois gestionnaires de positionnement :

Le paer : dimensionne et place chaque widget dans un widget conteneur selon lespace requis par
chacun deux.
Le gridder : dimensionne et positionne chaque widget dans les cellules dun tableau dun widget conteneur.
Le placer : dimensionne et place chaque widget dans un widget conteneur selon lespace explicitement
demand. Cest un placement absolu (usage peu frquent).

. Trois exemples
.. Une calculette
Cee application implmente une calculee simple mais complte (+ Fig. .).
from tkinter import *
from math import *
def evaluer(event) :
chaine.configure(text = => + str(eval(entree.get())))
# Programme principal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fenetre = Tk()
entree = Entry(fenetre)
entree.bind(<Return>, evaluer)
chaine = Label(fenetre)
entree.pack()
chaine.pack()
fenetre.mainloop()

(a) , le nombre dor

(b) Nombre de secondes en


un an

F . Une calculee graphique minimale.


. 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().

..

tkPhone,

un exemple sans menu

On se propose de crer un script de gestion dun carnet tlphonique. Laspect de lapplication est
illustr + Fig. .
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
et toutes trois incluses dans une instance de Tk() (cf. conception + Fig. .).

packer,

Le code de linterface graphique


Mthodologie : on se propose de sparer le codage de linterface graphique de celui des callbacks. Pour
cela on propose dutiliser lhritage entre une classe parente charge de grer laspect graphique et une
classe enfant charge de grer laspect fonctionnel de lapplication contenu dans les callbacks. Comme
nous lavons vu prcdemment (cf. . p. ), cest un cas de polymorphisme de drivation.
Voici donc dans un premier temps le code de linterface graphique. Linitialisateur cre laribut phoune liste quil remplit avec le contenu du chier contenant les donnes (si le chier nexiste pas il
est cr), cre la fentre de base root et appelle la mthode makeWidgets().
Cee mthode, suit la conception graphique expose ci-dessus et remplit chacun des trois frames.
Les callbacks sont vides (instruction pass minimale).
neList,

Comme tout bon module, un auto-test permet de vrier le bon fonctionnement (ici le bon aspect) de
linterface :
# -*- coding : utf-8 -*# Bob Cordeau
# tkPhone_IHM.py

- -

. Trois exemples

La POO graphique

frameH

Label

Entry

Label

Entry
Button

frameM

Listbox

frameB

Button

Scrollbar

Button

Button

.
(a) Conception gnrale

(b) Dtails des Frame

(c) Linterface graphique.

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()
tk.Label(frameH, text=Nom

:).grid(row=0, column=0, sticky=tk.W)

self.nameEnt = tk.Entry(frameH)
self.nameEnt.grid(row=0, column=1, sticky=tk.W, padx=5, pady=10)

- -

La POO graphique

tk.Label(frameH, text=Tel

. Trois exemples

:).grid(row=1, column=0, sticky=tk.W)

self.phoneEnt = tk.Entry(frameH)
self.phoneEnt.grid(row=1, column=1, sticky=tk.W, padx=5, pady=2)
b = tk.Button(frameH, text=Effacer , command=self.clear)
b.grid(row=2, column=0, columnspan=2, pady=3)
# frame liste (au milieu)
frameM = tk.Frame(self.root)
frameM.pack()
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))
# frame boutons (en bas)
frameB = tk.Frame(self.root, relief=tk.GROOVE, bd=3)
frameB.pack(pady=3)
b1 = tk.Button(frameB, text=Ajouter , command=self.ajouter)
b2 = tk.Button(frameB, text=Supprimer, command=self.supprimer)
b3 = tk.Button(frameB, text=Afficher , command=self.afficher)
b1.pack(side=tk.LEFT, pady=2)
b2.pack(side=tk.LEFT, pady=2)
b3.pack(side=tk.LEFT, pady=2)
def ajouter(self) :
pass
def supprimer(self) :
pass
def afficher(self, event=None) :
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 caractristiques ;
il reste surcharger les callbacks.
Enn, le script instancie lapplication :
# -*- coding : utf-8 -*# Bob Cordeau
# tkPhone.py
# import ---------------------------------------------------------------------from tkPhone_IHM import Allo_IHM
# dfinition de classe --------------------------------------------------------

- -

. Trois exemples

La POO graphique

class Allo(Allo_IHM) :
Repertoire tlphonique.
def __init__(self, fic=phones.txt) :
Constructeur de lIHM.
super().__init__(fic)

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 afficher(self, event=None) :


self.clear()
name, phone = self.phoneList[int(self.select.curselection()[0])]
self.nameEnt.insert(0, name)
self.phoneEnt.insert(0, phone)

def clear(self) :
self.nameEnt.delete(0, end)
self.phoneEnt.delete(0, end)

# programme principal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


app = Allo() # instancie lapplication

..

IDLE,

un exemple avec menu

Gnralement les distributions Python comportent lapplication IDLE, linterprteur/diteur crit en


Python par Guido van Rossum . Cee application se prsente sous laspect dune interface graphique
complte (+ Fig. .), avec menu.
Cest un source Python dont le code est librement disponible et constitue lui seul un cours complet
. Dans certaines distributions GNU/Linux, IDLE est un package particulier.
. Mais il est trop volumineux pour tre reproduit dans ces notes

- -

La POO graphique

. Trois exemples

tkinter .

(a) Linterprteur dIDLE

(b) Lditeur dIDLE

F . IDLE.

. Signalons IDLEX une extension IDLE : http://idlex.sourceforge.net/.

- -

elques techniques avances de programmation

Ce chapitre prsente quelques exemples de techniques avances dans les


trois paradigmes que supporte Python, les programmations procdurale, objet et fonctionnelle.

. 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()
Welcome to Python 3.4 help utility!
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.


To get a list of available modules, keywords, symbols, or topics, type
modules, keywords, symbols, or topics.

Each module also comes

with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as spam, type modules spam.
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.clear

seq.count

seq.index

seq.pop

seq.reverse

seq.sort

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(_)]
for method in methods :
print(getattr(object, method).__doc__)

Par exemple, lappel printInfo([]) ache la documentation :


L.append(object) -- append object to end
L.count(value) -> integer -- return number of occurrences of value
L.extend(iterable) -- extend list by appending elements from the iterable
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
L.insert(index, object) -- insert object before index
L.pop([index]) -> item -- remove and return item at index (default last).
Raises IndexError if list is empty or index is out of range.
L.remove(value) -- remove first occurrence of value.
Raises ValueError if the value is not present.
L.reverse() -- reverse *IN PLACE*
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

Les fonctions type(), dir() et id()


Ces fonctions fournissent respectivement le type, tous les noms dnis dans lespace de noms et la
localisation mmoire (unique) dun objet :
>>> 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

Les fonctions locals() et globals()


Comme nos lavons dj vu [cf. p. ], ces fonctions retournent respectivement le dictionnaire des
noms locaux (globaux) au moment de leur appel.
- -

. Teniques procdurales

Teniques avances

Le module sys
Ce module fournit nombre dinformations gnrales, entre autres :
>>> import sys
>>>
>>> sys.executable
/usr/bin/python3
>>>
>>> sys.platform
linux2
>>>
>>> sys.version
3.2.3 (default, Oct 19 2012, 20:13:42) \n[GCC 4.6.3]
>>>
>>> sys.argv
[]
>>>
>>> sys.path

[, /usr/lib/python3.2, /usr/lib/python3.2/plat-linux2, /usr/lib/python3.2/lib-dynload, /usr/local/lib/python3.2/dist-packages, /usr/l


>>>
>>> sys.modules
{reprlib: <module reprlib from /usr/lib/python3.2/reprlib.py>, heapq: <module heapq from /usr/lib/python3.2/heapq.py>,
sre_compile: <module sre_compile from /usr/lib/python3.2/sre_compile.py>,
...

.. Gestionnaire de contexte (ou bloc gard)


Cee syntaxe simplie le code en assurant que certaines oprations sont excutes avant et aprs un
bloc dinstructions donn. Illustrons ce mcanisme sur un exemple classique ou il importe de fermer le
chier utilis :
# au lieu de ce code

try :
fh = open(filename)
for line in fh :
process(line)
finally :
fh.close()

# il est plus simple dcrire

with open(filename) as fh :
for line in fh :
process(line)

.. Utiliser un dictionnaire pour lancer des fonctions ou des mthodes


Lide est dexcuter direntes parties de code en fonction de la valeur dune variable de contrle. On
peut se servir de cee technique pour implmenter un menu textuel :
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
ours

: gererChien,
: gererOurs

}
betes = [chat, ours, chat, chien] # une liste danimaux rencontrs
for bete in betes :
dico[bete]() # appel de la fonction correspondante
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

..

Les fonctions rcursives

Dnition
Une fonction rcursive comporte un appel elle-mme.

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 reprsent par la liste de ses coecients [a0 , , an ] :
>>> def horner(p, x):
...
...

if len(p) == 1:
return p[0]

...

p[-2] += x * p[-1]

...

return horner(p[:-1], x)

...
>>> horner([5, 0, 2, 1], 2)

# x**3 + 2*x**2 + 5, en x = 2

21

Les fonction rcursives sont souvent utilises pour traiter les structures arborescentes comme les rpertoires dans les systmes de chiers des disques durs.
Voici lexemple dune fonction qui ache rcursivement les chiers dun rpertoire fourni en paramtre :
#-*- coding : utf8 -*from os import listdir
from os.path import isdir, join
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 rpertoires 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 :
Fichier Python : /home/bob/Tmp/parfait_chanceux.py
Fichier Python : /home/bob/Tmp/recursif.py
Fichier Python : /home/bob/Tmp/parfait_chanceux_m.py
Fichier Python : /home/bob/Tmp/verif_m.py
Fichier Python : /home/bob/Tmp/Truc/Machin/tkPhone_IHM.py
Fichier Python : /home/bob/Tmp/Truc/Machin/tkPhone.py
Fichier Python : /home/bob/Tmp/Truc/calculate.py
Fichier Python : /home/bob/Tmp/Truc/tk_variable.py

La rcursivit terminale
Dnition
On dit quune fonction f est rcursive terminale, si tout appel rcursif est de la forme return
On parle alors dappel terminal.

f().

Python permet la rcursivit mais noptimise pas automatique les appels terminaux. Il est donc possible 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 :
def factorielleTerm(n, accu=1) :
Version rcursive terminale.
if n == 0:
return accu
else :
return factorielleTerm(n-1, n*accu)

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

def factorielleDerec(n, accu=1) :


Version drcursive.
while n > 0:
accu *= n
n -= 1
return accu

..

Les listes dnies en comprhension

Les listes dnies en comprhension , souvent appeles comprhension de listes , permeent de


gnrer ou de modier des collections de donnes par une criture lisible, simple et performante.
Cee construction syntaxique se rapproche de la notation utilise en mathmatiques :
{x 2 |x [2, 11[} [x**2 for x in range(2, 11)] [4, 9, 16, 25, 36, 49, 64, 81, 100]

Dnition
Une liste en comprhension est quivalente une boucle for qui construirait la mme liste en utilisant
la mthode append().

Les listes en comprhension sont utilisables sous trois formes.


Premire forme expression dune liste simple de valeurs :
result1 = [x+1 for x in une_seq]
# a le mme effet que

result2 = []
for x in une_seq :
result2.append(x+1)

Deuxime forme expression dune liste de valeurs avec ltrage :


result3 = [x+1 for x in une_seq if x > 23]
# a le mme effet que

result4 = []
for x in une_seq :
if x > 23:
result4.append(x+1)

Troisime forme expression dune combinaison de listes de valeurs :


result5 = [x+y for x in une_seq for y in une_autre]
# a le mme effet que

result6 = []
for x in une_seq :
for y in une_autre :
result6.append(x+y)

Exemples utilisations trs pythoniques :


valeurs_s = [12, 78, 671]
# conversion dune liste de chanes en liste dentier
valeurs_i = [int(i) for i in valeurs_s] # [12, 78, 671]
# calcul de la somme de la liste avec la fonction intgre sum
print(sum([int(i) for i in valeurs_s])) # 761
# a le mme effet que

s = 0
for i in valeurs_s :
s = s + int(i)
print(s) # 761
# Initialisation dune liste 2D
multi_liste = [[0]*2 for ligne in range(3)]
print(multi_liste) # [[0, 0], [0, 0], [0, 0]]

- -

. Teniques procdurales

Teniques avances

Autre exemple :
>>> C_deg = range(-20, 41, 5)
>>> F_deg = [(9.0/5)*c + 32 for c in C_deg]
>>> table = [C_deg, F_deg]
>>> for i in range(len(table[0])):
...

print(table[0][i], =>, table[1][i])

...
-20 => -4.0
-15 => 5.0
-10 => 14.0
-5 => 23.0
0 => 32.0
5 => 41.0
10 => 50.0
15 => 59.0
20 => 68.0
25 => 77.0
30 => 86.0
35 => 95.0
40 => 104.0

.. Les dictionnaires dnis en comprhension


Comme pour les listes, on peut dnir des dictionnaires en comprhension :
>>> {n : x**2 for n, x in enumerate(range(5))}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Notons lutilisation des accolades et du double point caractristiques de la syntaxe du dictionnaire.

.. Les ensembles dnis en comprhension


De mme, on peut dnir des ensembles en comprhension :
>>> {n for n in range(5)}
set([0, 1, 2, 3, 4])

Dans ce cas les accolades sont caractristiques de la syntaxe de lensemble.

.. Les gnrateurs et les expressions gnratrices


Les gnrateurs
Dnition
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
for val in counter(5) :
print(val, end= )

Ce qui produit :
0 1 2 3 4 5

Les expressions gnratrices


Syntaxe
Une expression gnratrice possde une syntaxe presque identique celle des listes en comprhension ; 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 :
for i in [x**2 for x in range(1000000)]:

Alors que dans lexpression suivante, la boucle commence immdiatement et ne gnre les valeurs
quau fur et mesure des demandes :
for i in (x**2 for x in range(1000000)) :

Voici un autre exemple : une genexp de recherche dun motif dans un chier, analogue un
simpli :
>>> with open(.bash_aliases) as f:
...

file = f.readlines()

...
>>> lines = (line.strip() for line in file if alias in line)
>>> for line in lines:
...

line

...
# some more aliases
alias ll=ls -alF
alias la=ls -A
alias l=ls -CF
alias c=clear
alias p=~/ShellScripts/a2ps_UTF8
alias ipq=ipython qtconsole &
alias nb=ipython notebook &
alias qt=ipython qtconsole &
alias kie=\find ~/Phi1/ -name *.tex | xargs grep\

. Clbre utilitaire de recherche dun motif dans le monde Unix.

- -

grep

. Teniques procdurales

Teniques avances

.. Les fonctions incluses


La syntaxe de dnition des fonctions en Python permet tout fait demboter leur dnition. Distinguons deux cas demploi :
Idiome de la fonction fabrique renvoyant une fermeture :
>>> def creer_plus(ajout):
...

Fonction fabrique.

...

def plus(increment):

...

Fonction fermeture : utilise des noms locaux creer_plus().

...
...

return increment + ajout


return plus

...
>>>
>>> p = creer_plus(23)
>>> q = creer_plus(42)
>>>
>>> print(p(100) =, p(100))
(p(100) =, 123)
>>> print(q(100) =, q(100))
(q(100) =, 142)

Fonction fabrique renvoyant une classe :


>>> class CasNormal:
...

def uneMethode(self):

...

print(normal)

...
>>> class CasSpecial:
...

def uneMethode(self):

...

print(spcial)

...
>>> def casQuiConvient(estNormal=True):
...

Fonction fabrique renvoyant une classe.

...

if estNormal:

...
...

return CasNormal()
else:

...

return CasSpecial()

...
>>>
>>> une_instance = casQuiConvient()
>>> une_instance.uneMethode()
normal
>>> une_instance = casQuiConvient(False)
>>> une_instance.uneMethode()
spcial

.. 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

Une fonction peut tre multi-dcore :


def f1() :
...
def f2() :

- -

Teniques avances

. Teniques objets

...
def f3() :
...
@f1 @f2 @f3
def g() :
pass

Voici un exemple simple :


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

# programme principal ===============================================


## utilisation dun dcorateur
print(uneFonction(1, 2))
## utilisation de la composition de fonction
autreFonction = unDecorateur(autreFonction)
print(autreFonction(1, 2))
print(uneFonction(3, 4))
print(autreFonction(6, 7))

Fonction decore

: uneFonction. Appel numro

: 1

3
Fonction decore

: autreFonction. Appel numro

: 1

3
Fonction decore

: uneFonction. Appel numro

: 2

7
Fonction decore

: autreFonction. Appel numro

: 2

13

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 :
>>> def maFonction():
...

print(Ceci est appelable)

...
>>> callable(maFonction)
True

. callable en anglais.
. Cee notion sera dveloppe ultrieurement [cf. p. ]

- -

. Teniques objets

Teniques avances

>>> chaine = Une chane


>>> callable(chaine)
False

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.

F . En Python, tous les aributs (donnes, mthodes) sont publics !


On peut nanmoins modier cet tat de fait.
Lorsquun nom est prx par un caractre soulign, il est conventionnellement rserv un usage
interne (priv). Mais Python noblige rien , cest au dveloppeur de respecter la convention !
On peut galement prxer un nom par deux caractres soulign , ce qui permet dviter les collisions
de noms dans le cas o un mme aribut serait dnit dans une sous-classe. Le renommage a comme eet
de bord de rendre laccs cet aribut plus dicile de lextrieur de la classe qui le dnit, mais cee
protection reste dclarative et nore pas une scurit absolue.
La solution property
Le principe de lencapsulation est mis en uvre par la notion de proprit.
Dnition
Une proprit (property) est un aribut dinstance possdant des fonctionnalits spciales.

Deux syntaxes implmentent cee solution.


La premire dnit explicitement la proprit x et ses quatre paramtres (dans lordre : mthode de
lecture, mthode de modication, mthode de suppression, chane de documentation) :
. Slogan des dveloppeurs Python : Were all consenting adults here (nous sommes entre adultes consentants).
. Le name mangling.

- -

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 setx(self, value) :
setter.
self._x = value
def delx(self) :
deleter.
del self._x
x = property(getx, setx, delx, Je suis la proprit 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.

Un autre exemple : la classe Cercle


Schma de conception : nous allons tout dabord dnir une classe Point que nous utiliserons comme
classe de base de la classe Cercle.

F . Conception UML de la classe Cercle.


Voici le code de la classe Point :
class Point :
def __init__(self, x=0, y=0) :
self.x, self.y = x, y
@property
def distance_origine(self) :
return math.hypot(self.x, self.y)
def __eq__(self, other) :
return self.x == other.x and self.y == other.y
def __str__(self) :
return ({0.x !s}, {0.y !s}).format(self)

Lutilisation de property permet un accs en lecture seule au rsultat de la mthode distance_origine()


considre alors comme un simple aribut (car on lutilise sans parenthse) :
p1, p2 = Point(), Point(3, 4)
print(p1 == p2) # False
print(p2, p2.distance_origine) # (3, 4) 5.0

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

def circonference(self) : return 2 * math.pi * self.rayon


@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. Remarquez 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

Exemple dutilisation des instances de Cercle :


def __eq__(self, other) :
return (self.rayon == other.rayon
and super().__eq__(other))
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

..

Le du typing et les annotations

Il existe un style de programmation trs pythonique appel duck typing :


Sil mare comme un canard et cancane comme un canard, alors cest un canard ! .
Cela signie que Python ne sintresse quau comportement des objets. Si des objets orent la mme
API (interface de programmation), lutilisateur peut employer les mmes mthodes :
>>> class Person:
...

def help(self):

...

print(Heeeeeeelp!)

...
>>> class Duck:
...

def help(self):

...

print(Quaaaaaaaack!)

...
>>> class SomethingElse:
...

pass

...
>>> def inTheForest(x):
...

x.help()

...
>>> donald = Duck()
>>> john = Person()
>>> who = SomethingElse()
>>>
>>> for thing in [donald, john, who]:
...

try:

...

inTheForest(thing)

...

except AttributeError:

...

print(Menfin ?)

...

- -

. Teniques objets

Teniques avances

Quaaaaaaaack!
Heeeeeeelp!
Menfin ?

Un autre exemple :
>>> def calcule(a, b, c):
...

return (a + b) * c

...
>>> x = calcule(1, 2, 3)
>>> y = calcule(Hey-, Ho! , 3)
>>> x
9
>>> y
Hey-Ho! Hey-Ho! Hey-Ho!
>>> z = calcule(a, b, c)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
File <stdin>, line 2, in calcule
TypeError: cant multiply sequence by non-int of type str

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) :


...
# annotations pour *args et **kwargs

def foo2(*args : <expression>, **kwargs : <expression>) :


...
# annotation du type de retour

def foo3() -> <expression> :


...

Les annotations permeent de fournir des informations supplmentaires. Or, cest important, ces informations 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 :
>>> def ma_fonction(param1: Une annotation, param2: 2 + 3, param3: Autre annotation=valeur_par_dfaut):
...

print(param1, param2, param3)

...
>>> ma_fonction(1, 2, 3)

# aucun changement du comportement

1 2 3
>>> ma_fonction(1, 2)
1 2 valeur_par_dfaut
>>> ma_fonction.__annotations__

# accs aux annotations

{param3: Autre annotation, param2: 5, param1: Une annotation}

- -

Teniques avances

Teniques fonctionnelles

..

Directive lambda

. Teniques fonctionnelles

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 :
>>> s = lambda x: if x == 1 else s
>>> s(3)
s
>>> s(1)

Autres exemples illustrant les dirences de syntaxe fonction/lambda :


>>> def f(x):
...

return x**2

...
>>> print(f(8))
64
>>>
>>> g = lambda x : x**2
>>> print(g(8))
64

..

Les fonctions map, filter et reduce

La programmation fonctionnelle est un paradigme de programmation qui considre le calcul en tant


quvaluation de fonctions mathmatiques. Elle souligne lapplication des fonctions, contrairement au
modle de programmation imprative qui met en avant les changements dtat . Elle repose sur trois
concepts : mapping, ltering et reducing qui sont implments en Python par trois fonctions : map(), filter() et reduce().
La fonction map() :
map()

applique une fonction chaque lment dune squence et retourne un itrateur :

>>> map(lambda x:x, range(10))


<map object at 0x7f3a80104f50>
>>> list(map(lambda x:x, range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

On remarque que map() peut tre remplace par un gnrateur en comprhension.


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 :
>>> list(filter(lambda x: x > 4, range(10)))
[5, 6, 7, 8, 9]

De mme filter() peut tre remplace par un gnrateur en comprhension.


La fonction reduce() :
reduce() est une fonction du module functools. Elle applique de faon cumulative une fonction de
deux arguments aux lments dune squence, de gauche droite, de faon rduire cee squence une
seule valeur quelle renvoie :

. cf. Wikipedia

- -

. Teniques fonctionnelles

Teniques avances

>>> def somme(x, y):


...

print x, +, y

...

return x + y

...
>>> reduce(somme, [1, 2, 3, 4])
1 + 2
3 + 3
6 + 4
10
>>> sum([1, 2, 3, 4])
10

La fonction reduce() peut tre remplace par une des fonctions suivantes : all(), any(), max(), min()
ou sum().

.. Les applications partielles de fonctions


Issue de la programmation fonctionnelle, une PFA (application partielle de fonction) de n paramtres
prend le premier argument comme paramtre xe et retourne un objet fonction (ou instance) utilisant les
n- arguments restants.
Les PFA sont utiles dans les fonctions de calcul comportant de nombreux paramtres. On peut en xer
certains et ne faire varier que ceux sur lesquels on veut agir :
>>> from functools import partial
>>> def f(m, c, d, u):
...

return 1000*m + 100*c + 10*d + u

...
>>> f(1, 2, 3, 4)
1234
>>> g = partial(f, 1, 2, 3)
>>> g(4)
1234
>>> h = partial(f, 1, 2)
>>> h(3, 4)
1234

F . PFA applique un widget


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) :
from functools import partial
import tkinter as tk
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()

Ce rsultat est illustr + Fig. ..


- -

Teniques avances

. La persistance et la srialisation

La persistance et la srialisation

Dnition
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.

Examinons des exemples simples.

..

Srialisation avec pickle et json

Le module pickle
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
favorite_color = {lion : jaune, fourmi : noire, camlon : variable}
# stocke ses donnes dans un fichier
pickle.dump(favorite_color, open(save.p, wb))
# retrouver ses donnes

: pickle recre un dictionnaire

dico = pickle.load(open(save.p, rb))


print(dico)

La lecture du chier save.p produit :


{fourmi: noire, lion: jaune, camlon: variable}

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
# encodage dans un fichier
with open(json_tst, w) as f :
json.dump([foo, {bar :(baz, None, 1.0, 2)}], f)
# dcodage
with open(json_tst) as f :
print(json.load(f))

La lecture du chier json_tst produit :


[foo, {bar: [baz, None, 1.0, 2]}]

. JavaScript Object Notation.

- -

. Les tests

Teniques avances

.. Stoage avec sqlite3


Le module sqlite3 est une bibliothque crite en C qui implmente une base de donnes relationnelle
lgre qui utilise des chiers (ou mme la mmoire).
Cee utilisation convient bien de petits volumes de donnes et permet de maqueer le passage des
bases de donnes plus importantes.
Exemple de stockage dune table :
import sqlite3
conn = sqlite3.connect(/home/bob/Tmp/tel_bd) # cration du connecteur
with conn as c : # cration du curseur
# cration de la table
c.execute(create table tel (nom text, prenom text, numero integer))
# insertion dune ligne de donnes
c.execute(insert into tel values (Barthod, Stphane, 86451))
c.execute(insert into tel values (Bourrely, Jean, 86617))
c.execute(insert into tel values (Brunel, Michal, 86619))
c.execute(insert into tel values (Canal, Bruno, 86604))
c.execute(insert into tel values (Cordeau, Bob, 86624))
c.execute(insert into tel values (Donath, Therse, 86600))
c.execute(insert into tel values (Marie, Florence, 86602))

Le chier tel_bd produit peut tre visualis par le programme SQLite database browser (+ Fig. .).

F . Visualisation dun chier de base de donnes sqlite

. Les tests
Ds lors quun programme dpasse le stade du petit script, le problme des erreurs et donc des tests
se pose invitablement .
Dnition
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.

.. Tests unitaires et tests fonctionnels


On distingue deux familles de test :
Tests unitaires : validations isoles du fonctionnement dune classe, dune mthode ou dune fonction.
Tests fonctionnels : prennent lapplication complte comme une bote noire et la manipulent comme
le ferait lutilisateur nal. Ces tests doivent passer par les mmes interfaces que celles fournies aux
utilisateurs, cest pourquoi ils sont spciques la nature de lapplication et plus dlicats mere
en uvre.
Dans cee introduction, nous nous limiterons une courte prsentation des tests unitaires.
. cf. la loi de Murphy.

- -

Teniques avances

..

. Les tests

Module unittest

Le module standard unittest fournit loutil PyUnit, outil que lon retrouve dans dautres langages : JUnit (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

Module de test du module de calculs.


# 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
# dfinition de classe et de fonction ----------------------------------------class CalculTest(unittest.TestCase) :
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()

Lexcution du test produit :


..
---------------------------------------------------------------------Ran 2 tests in 0.000s
OK

Pour eectuer une campagne de tests , il reste crer un script qui :


recherche tous les modules de test : leurs noms commencent par test_ et ils sont contenus dans un
rpertoire tests ;
rcupre la suite, renvoye par la fonction globale test_suite ;
cre une suite de suites et lance la campagne.
. cf. [], p. .

- -

. La documentation des sources

Teniques avances

. La documentation des sources


Durant la vie dun projet, on distingue plusieurs types de documentation :
les documents de spcication (ensemble explicite dexigences satisfaire) ;
les documents techniques aachs au code ;
les manuels dutilisation et autres documents de haut niveau.
Les documents techniques voluent au rythme du code et peuvent donc tre traits comme lui : ils
doivent pouvoir tre lus et manipuls avec un simple diteur de texte.
Il existe deux outils majeurs pour concevoir des documents pour les applications Python :
reStructuredText (ou reST) : un format enrichi ;
les doctests : compatibles avec le format reST. Ils permeent de combiner les textes applicatifs avec les
tests.

.. 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 suivant :
======================
Fichier au format reST
======================
Section 1
=========
On est dans la section 1.
Sous-section
~~~~~~~~~~~~

. cf. [], p.

- -

Teniques avances

. La documentation des sources

Ceci est une sous-section.


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*.
Une image au format png
~~~~~~~~~~~~~~~~~~~~~~~~~
.. figure:: helen.png
:scale: 30%

F . Exemple de sortie au format PDF.


Lutilitaire rst2pdf, appliqu ce chier, produit le chier de mme nom (+ Fig. .) mais avec lextension .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 dutilisation, crits sous la forme de session interactive.
- -

. La documentation des sources

Teniques avances

Examinons deux exemples.


Pour chacun, nous donnerons dune part le source muni de sa chane de documentation dans lequel le
module standard doctest permet dextraire puis de lancer ces sessions pour vrier quelles fonctionnent
et, dautre part un rsultat de lexcution.
Premier exemple : documentation1.py
# -*- coding : utf-8 -*Module dessai de doctest.
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 !)
print(\n{ :-^40}.format( Mode dtaill ))
doctest.testmod(verbose=True)

Lexcution de ce chier donne :


----------- Mode silencieux -----------Si tout va bien, on a rien vu !
----------- Mode dtaill -----------Trying:
somme(2, 2)
Expecting:
4
ok
Trying:
somme(2, 4)
Expecting:
6
ok
1 items had no tests:
__main__
1 items passed all tests:
2 tests in __main__.somme
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

Deuxime exemple : documentation2.py


# -*- coding : UTF-8 -*Module dessai de doctest.
# fonctions
def accentEtrange(texte) :
Ajoute un accent trange un texte.
Les r sont Tripls, les e suivi dun u
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...
Cette technique permet dinternationnaliser les applications
pour les rendre compatibles avec certaines rgions franaises.

texte = texte.replace(r, rRr)


print(texte.replace(e, eu))
def _test() :
import doctest
doctest.testmod(verbose=True)
if __name__ == __main__ :
_test()

Lexcution de ce chier donne :


Trying:
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...
Expecting nothing
ok
Trying:
accentEtrange(texte)
Expecting:
Est-ceu queu tu as rRreugarRrd la tl hieurRr soirRr ? Il y avait un thma surRr leus rRramasseuurRrs deuscarRrgots
eun Laponieu, ils eun baveunt...
ok
2 items had no tests:
__main__
__main__._test
1 items passed all tests:
2 tests in __main__.accentEtrange
2 tests in 3 items.
2 passed and 0 failed.
Test passed.

..

Le dveloppement dirig par la documentation

Comme on peut le voir, la documentation intgre prsente nanmoins un dfaut : quand la documentation augmente, on ne voit plus le code !
La solution est de dporter cee documentation : la fonction doctest.testfile() permet dindiquer le
nom du chier de documentation.
i plus est, on peut crire ce chier au format reST, ce qui permet de faire coup double. Dune part,
on dispose des tests intgrs la fonction (ou la mthode) et, dautre part, le mme chier fournit une
documentation jour.
Exemple : test_documentation2.py
Fichier de documentation :
Le module accent
====================
Test de la fonction accentEtrange
------------------------------------Ce module fournit une fonction accentEtrange.
On peut ainsi ajouter un accent un texte :
>>> from doctest2 import accentEtrange
>>> 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...
>>> accentEtrange(texte)
Est-ceu queu tu as rRreugarRrd la tl hieurRr soirRr ? Il y avait un thma surRr

. cf. [], p. .

- -

. La documentation des sources

Teniques avances

leus rRramasseuurRrs deuscarRrgots eun Laponieu, ils eun baveunt...


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)

Nous produisons la documentation HTML par la commande :


rst2html test_documentation2.txt test_documentation2.html

Elle est illustre + Fig. ..

F . Documentation au format html du script test_documentation2.py.

- -

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 !

. Tim Peters (PEP no ), traduction Ccile Trevian et Bob Cordeau.


Retour chap., p.

Interlude

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

Passer du problme au programme

Lorsquon a un problme rsoudre par un programme, la dicult est de


savoir :
. Par o commencer ?
. Comment concevoir lalgorithme ?

Prrequis
Au fur et mesure que lon acquire de lexprience, on dcouvre et on apprend utiliser les bibliothques 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 problme 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 ncessitent 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 traitant 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, expression de calcul numrique), soit que lon pense/sache quil existe dj un outil pour traiter ce sousproblme (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.

Passer de lide au programme


Le passage de lide puis de lalgorithme au code dans un programme, est relativement facile en Python
car celui-ci est trs proche dun langage dalgorithmique.

Les noms des choses que lon a manipul vont nous donner des variables.
Les tests vont se transformer en if condition:
Les boucles sur des squences dinformations vont se transformer en for variable in squence:
Les boucles avec expression de condition vont se transformer en while conditions:
Les squences dinstructions qui se rptent en dirents endroits vont se transformer en fonctions.
Le retour de rsultat dune squence (fonction) va se traduire en return variable.
Les conditions sur les donnes ncessaires pour un traitement vont identier des tests derreurs
et des leves dexception.

- -

A C

Jeux de caractres et encodage

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 majuscules 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 maintenu 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 correspond 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 .

F C. Extrait de la table Unicode.


Exemple de lencodage UTF- du caractre Unicode :
Symbole

Code dcimal

Code hexadcimal

Encodage UTF-

233

e9

C3 A9

Voici trois exemples de caractres spciaux cods en notation hexadcimale et spars par le caractre
dchappement de la tabulation :
>>> print(\u00e9 \t \u0110 \t \u0152)

Applications aux scripts Python


En Python , les chanes de caractres (le type str()) sont des chanes Unicode. Par ailleurs, puisque
les scripts Python que lon produit avec un diteur sont eux-mmes des textes, ils sont suceptibles dtre
encods suivant dirents formats. An que Python utilise le bon, il est important dindiquer lencodage
de caractres utilis. On le prcise obligatoirement en re ou e ligne des sources.
Les encodages les plus frquents sont :
# -*- coding : utf8 -*-

ou :
# -*- coding : latin1 -*-

. Retour chap. , p.
. Notons que utf8 et latin1 sont des alias de utf-8 et latin-1.

- -

A D

Les expressions rgulires

Les expressions rgulires a fournissent une notation gnrale trs puissante


permeant de dcrire abstraitement des lments textuels. Il sagit dun vaste
domaine dont nous ne proposons quune introduction.
a. Ici, ladjectif rgulier est employ au sens de qui obit des rgles.

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.
Python supporte toutes ces volutions.

Les expressions rgulires


Une expression rgulire se lit (et se construit) de gauche droite. Elle constitue ce quon appelle
traditionnellement un motif de recherche .

Les expressions rgulires de base


Elles utilisent six symboles qui, dans le contexte des expressions rgulires, acquirent les signications suivantes :
Le point . reprsente une seule instance de nimporte quel caractre sauf le caractre de n de ligne.
Ainsi lexpression t.c reprsente toutes les combinaisons de trois leres commenant par t et
nissant par c, comme tic, tac, tqc ou tc, alors que b.l.. pourrait reprsenter bulle, balai ou bler.
La paire de croets [ ] reprsente une occurrence quelconque des caractres quelle contient.
Par exemple [aeiouy] reprsente une voyelle, et Duran[dt] dsigne Durand ou Durant.
Entre les crochets, on peut noter un intervalle en utilisant le tiret. Ainsi, [0-9] reprsente les
chires de , et [a-zA-Z] reprsente une lere minuscule ou majuscule.
On peut de plus utiliser laccent circonexe en premire position dans les crochets pour indiquer
le contraire de . Par exemple [^a-z] reprsente autre chose quune lere minuscule, et [^]
nest ni une apostrophe ni un guillemet.
.
.
.
.

Appel aussi joker (ou wildcard en anglais).


En particulier le mathmaticien Stephen Kleene ().
Souvent abrge en regex.
En anglais search paern.

Les expressions rgulires


Lastrisque * est un quanticateur, il signie aucune ou plusieurs occurrences du caractre ou de llment qui le prcde immdiatement.
Lexpression ab* signie la lere a suivie de zro ou plusieurs leres b, par exemple ab, a ou abbb
et [A-Z]* correspond zro ou plusieurs leres majuscules.
laccent circonexe ^ est une ancre. Il indique que lexpression qui le suit se trouve en dbut de ligne.
Lexpression ^Depuis indique que lon recherche les lignes commenant par le mot Depuis.
le symbole dollar $ est aussi une ancre. Il indique que lexpression qui le prcde se trouve en n de
ligne.
Lexpression suivante :$ indique que lon recherche les lignes se terminant par suivante :
Lexpression ^Les expressions rgulires$ extrait les lignes ne contenant que la chane Les expressions rgulires, alors que ^$ extrait les lignes vides.
la contre-oblique \ permet dchapper la signication des mtacaractres.
Ainsi \. dsigne un vritable point, \* un astrisque, \^ un accent circonexe,
\\ une contre-oblique.

\$

un dollar et

Les expressions rgulires tendues


Elles ajoutent cinq symboles qui ont les signications suivantes :
La paire de parenthses ( ) est utilise la fois pour former des sous-motifs et pour dlimiter des sousexpressions, ce qui permera dextraire des parties dune chane de caractres.
Lexpression (to)* dsignera to, tototo, etc
Le signe plus + est un quanticateur comme *, mais il signie une ou plusieurs occurrences du caractre
ou de llment qui le prcde immdiatement.
Lexpression ab+ signie la lere a suivie dune ou plusieurs leres b.
Le point dinterrogation ? troisime quanticateur, il signie zro ou une instance de lexpression qui
le prcde.
Par exemple cran(s)? dsigne cran ou crans.
La paire daccolades { } prcise le nombre doccurrences permises pour le motif qui le prcde.
Par exemple [0-9]{2,5} aend entre deux et cinq nombres dcimaux.
Les variantes suivantes sont disponibles : [0-9]{2,} signie au minimum deux occurrences dentiers dcimaux et [0-9]{2} deux occurrences exactement.
La barre verticale | reprsente des choix multiples dans un sous-motif.
Lexpression Duran[dt] peut aussi scrire (Durand|Durant) . On pourrait utiliser lexpression
(lu|ma|me|je|ve|sa|di) dans lcriture dune date.
Dans de nombreux outils et langages (dont Python), la syntaxe tendue comprend aussi une srie de
squences dchappement :

\
\e
\f
\n
\r
\t
\v
\d
\s
\w
\b
\D
\S
\W
\B

Squences dchappement
symbole dchappement
squence de contrle escape
saut de page
n de ligne
retour-chariot
tabulation horizontale
tabulation verticale
classe des nombres entiers
classe des caractres despacement
classe des caractres alphanumriques
dlimiteurs de dbut ou de n de mot
ngation de la classe \d
ngation de la classe \s
ngation de la classe \w
ngation de la classe \b
- -

Les expressions rgulires

Les expressions rgulires avec Python


Le module re permet dutiliser les expressions rgulires dans les scripts Python. Les scripts devront
donc comporter la ligne :
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.
Utilisation des raw strings
La syntaxe des motifs comprend souvent le caractre contre-oblique qui doit tre lui-mme chapp
dans une chane de caractres, ce qui alourdit la notation. On peut viter cet inconvnient en utilisant des
chanes brutes . Par exemple au lieu de :
\\d\\d ? \\w+ \\d{4}

on crira :
r\d\d ? \w+ \d{4}

Les options de compilation


Grce un jeu doptions de compilation, il est possible de piloter le comportement des expressions
rgulires. On utilise pour cela la syntaxe (?...) avec les drapeaux suivants :
a correspondance ASCII (Unicode par dfaut) ;
i correspondance non sensible la casse ;
L les correspondances utilisent la locale, cest--dire les particularit du pays ;
m correspondance dans des chanes multilignes ;
s modie le comportement du mtacaractre point

qui reprsentera alors aussi le saut de ligne ;

u correspondance Unicode (par dfaut) ;


x mode verbeux.
Voici un exemple de recherche non sensible la casse :
>>> 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

Les motifs nominatifs


Python possde une syntaxe qui permet de nommer des parties de motif dlimites par des parenthses,
ce quon appelle un motif nominatif .
Syntaxe de cration dun motif nominatif : (?P<nom_du_motif>)
Syntaxe permeant de sy rfrer : (?P=nom_du_motif)
Syntaxe utiliser dans un motif de remplacement ou de substitution : \g<nom_du_motif>

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
motif_date = re.compile(r\d\d ? \w+ \d{4})
corresp = motif_date.search(Bastille le 14 juillet 1789)
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

Extraction des sous-groupes


On aurait pu aner lachage du rsultat en modiant lexpression rgulire de recherche de faon
pouvoir capturer les lments du motif :
import re
motif_date = re.compile(r(\d\d ?) (\w+) (\d{4}))
corresp = motif_date.search(Bastille le 14 juillet 1789)
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)
print(corresp.groups()

:, corresp.group(1,3))

:, corresp.groups())

Ce qui produit lexcution :


corresp.group() : 14 juillet 1789
corresp.group(1) : 14
corresp.group(2) : juillet
corresp.group(3) : 1789
corresp.group(1,3) : (14, 1789)
corresp.groups() : (14, juillet, 1789)

Extraction des sous-groupes nomms


Une autre possibilit est lemploi de la mthode groupdict() qui renvoie une liste comportant le nom
et valeur des sous-groupes trouvs (ce qui ncessite de nommer les sous-groupes).
import re
motif_date = re.compile(r(?P<jour>\d\d ?) (?P<mois>\w+) (\d{4}))
corresp = motif_date.search(Bastille le 14 juillet 1789)
print(corresp.groupdict())
print(corresp.group(jour))
print(corresp.group(mois))

- -

Les expressions rgulires


Ce qui donne :
{jour: 14, mois: juillet}
14
juillet

Extraction dune liste de sous-groupes


La mthode findall retourne une liste des occurrences trouves. Si par exemple on dsire extraire tous
les nombres dune chane, on peut crire :
>>> import re
>>> nbr = re.compile(r\d+)
>>> print(nbr.findall(Bastille le 14 juillet 1789))
[14, 1789]

Scinder une ane


La mthode split() permet de scinder une chane chaque occurrence du motif. Si on ajoute un
paramtre numrique n (non nul), la chane est scinde en au plus n lments :
>>> 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]

Substitution au sein dune ane


La mthode sub() eectue des substitutions dans une chane. Le remplacement peut tre une chane
ou une fonction. Comme on le sait, en Python, les chanes de caractres sont non modiables et donc les
substitutions produisent de nouvelles chanes.
Exemples de remplacement dune chane par une autre et des valeurs dcimales en leur quivalent
hexadcimal :
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 :
Premier anniversaire : Bastille le 14 juillet 1790
En hexa : Bastille le 0xe juillet 0x6fd

Les deux notations suivantes sont disponibles pour les substitutions :

&

\n

Squences de substitution
contient toute la chane recherche par un motif
contient la sous-expression capture par la ne paire de parenthses
du motif de recherche (1 n 9)

- -

A E

Exercices corrigs

noncs des exercices


Remarque
3 Les exercices suivants sont fournis titre dexemples et de modles.
Ils sont soit simples, soit moins simples (nots @ dans la marge) soit plus diciles (nots @@).
. 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 combien 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 :

Entrez un entier strictement positif : 12


Diviseurs propres sans rptition de 12 : 2 3 4 6 (soit 4 diviseurs propres)
Entrez un entier strictement positif : 13
Diviseurs propres sans rptition de 13 : aucun ! Il est premier

. crire un programme qui approxime par dfaut la valeur de la constante mathmatique e, pour n
assez grand , en utilisant la formule :
e

n 1

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 :

Pour x marches de y cm, il parcourt z.zz m par semaine.

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.
. Fonction renvoyant plusieurs valeurs sous forme dun tuple.
crire une fonction minMaxMoy() qui reoit une liste dentiers et qui renvoie le minimum, le maximum et la moyenne de cee liste. Le programme principal appellera cee fonction avec la liste :
[10, 18, 14, 20, 12, 16].
. Saisir un entier entre et (pourquoi cee limitation ?). Lacher en nombre romain.
- -

Exercices corrigs
@

. Amliorer le script prcdent en utilisant la fonction zip().


. 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 tableaux avant et aprs traitement ; le traitement consiste utiliser une structure de donnes contenant des lments uniques.
. Lutilisateur donne un entier n entre et , le programme donne le nombre de faons de faire n
en lanant deux ds.
. Mme problme que le prcdent mais avec n entre et et trois ds.
. 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.
. Mme problme que le prcdent mais cod rcursivement.

@@

. Nombres parfaits et nombres chanceux.


@
On appelle nombre premier tout entier naturel suprieur qui possde exactement deux diviseurs, lui-mme et lunit.
On appelle diviseur propre de n, un diviseur quelconque de n, n exclu.
Un entier naturel est dit parfait sil est gal la somme de tous ses diviseurs propres.
Un entier n tel que : (n + i + i 2 ) est premier pour tout i dans [0, n 2] est dit chanceux.
crire un module (parfait_chanceux_m.py) dnissant quatre fonctions : somDiv, estParfait, estPremier,
estChanceux et un auto-test :
la fonction somDiv retourne la somme des diviseurs propres de son argument ;
les trois autres fonctions vrient la proprit donne par leur dnition et retourne un boolen.
Si par exemple la fonction estPremier vrie que son argument est premier, elle retourne True,
sinon elle retourne False.
La partie de test doit comporter quatre appels la fonction verif permeant de tester somDiv(12),
estParfait(6), estPremier(31) et estChanceux(11).
# !/usr/bin/env python
# -*- coding : utf8 -*Module de vrification.
#==============================================================================
# fichier

: verif.py

#
# auteur

: Bob Cordeau

#==============================================================================

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from sys import exit

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def verif(entree, reference, precision=0, comment=) :
Vrifie que <entree> est gal <rfrence>, la prcision prs.
print({} [{}, {}].format(comment, entree, reference), end= )
if abs(entree - reference) <= precision :
print( *** ok)
else :
print( ### ko)

# Auto-test ===================================================================
if __name__==__main__ :

- -

Exercices corrigs
verif(abs(-6/2), 3, comment=\nTeste la fonction abs

: )

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

Puis crire le programme principal (parfait_chanceux.py) qui comporte :


linitialisation de deux listes : parfaits et chanceux ;
une boucle de parcours de lintervalle [2, 1000] incluant les tests ncessaires pour remplir ces
listes ;
enn lachage de ces listes.

Solutions des exercices


# -*- coding : utf8 -*Volume dun cne droit.

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from math import pi

# Programme principal =========================================================


rayon = float(input(Rayon du cne (m)

: ))

hauteur = float(input(Hauteur du cne (m)

: ))

volume = (pi*rayon*rayon*hauteur)/3.0
print(Volume du cne =, volume, m3)

F
# -*- coding : utf8 -*Calcul dun prix TTC.

# Programme principal =========================================================


prixHT = float(input(Prix HT (0 pour terminer) ? ))
while prixHT > 0:
print(Prix TTC

: { :.2f}\n.format(prixHT * 1.196))

prixHT = float(input(Prix HT (0 pour terminer) ? ))


print(Au revoir !)

F
# -*- coding : utf8 -*Somme dentiers et nombre dentiers suprieur 100.

# Programme principal =========================================================


somme, nombreTotal, nombreGrands = 0, 0, 0
x = int(input(x (0 pour terminer) ? ))
while x > 0:
somme += x
nombreTotal += 1
if x > 100:
nombreGrands += 1
x = int(input(x (0 pour terminer) ? ))
print(\nSomme

:, somme)

print(nombreTotal, valeur(s) en tout, dont, nombreGrands,


suprieure(s) 100)

F
- -

Exercices corrigs
# -*- coding : utf8 -*Parit.

# Programme principal =========================================================


n = int(input(Entrez un entier strictement positif

: ))

while n < 1:
n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p.

: ))

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.

# Programme principal =========================================================


n = int(input(Entrez un entier strictement positif

: ))

while n < 1:
n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p.

: ))

save = n
cpt = 0
while n%2 == 0:
n /= 2
cpt += 1
print(save, est, cpt, fois divisible par 2.)

F
# -*- coding : utf8 -*Diviseurs propres dun entier.

# Programme principal =========================================================


n = int(input(Entrez un entier strictement positif

: ))

while n < 1:
n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p.

: ))

i = 2 # plus petit diviseur possible de n


cpt = 0 # initialise le compteur de divisions
p = n/2 # calcul une fois dans la boucle
print(Diviseurs propres sans rptition de , n, :, end= )
while i <= p :
if n%i == 0:
cpt += 1
print(i, end= )
i += 1
if not cpt :
print(aucun ! Il est premier.)
else :
print((soit, cpt, diviseurs propres))

F
# -*- coding : utf8 -*Approximation de e.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def fact(n) :
r = 1
for i in range(1, n+1) :
r *= i
return r

- -

Exercices corrigs

# Programme principal =========================================================


n = int(input(n ? ))
exp = 0.0
for i in range(n) :
exp = exp + 1.0/fact(i)
print(Approximation de e

: { :.3f}.format(exp))

F
# -*- coding : utf8 -*Gardien de phare.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def hauteurParcourue(nb, h) :
print(Pour { :d} marches de { :d} cm, il parcourt { :.2f} m par semaine !
.format(nb, h, nb*h*2*5*7/100.0))

# Programme principal =========================================================


nbMarches = int(input(Combien de marches ? ))
hauteurMarche = int(input(Hauteur dune marche (cm) ? ))
hauteurParcourue(nbMarches, hauteurMarche)

F
# -*- coding : utf8 -*Permis de chasse.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def permisSup(p, c, v, a) :
pointsPerdus = p + 3*c + 5*v + 10*a
nbrePermis = pointsPerdus/100.0
return 200*nbrePermis

# Programme principal =========================================================


poules = int(input(Combien de poules ? ))
chiens = int(input(Combien de chiens ? ))
vaches = int(input(Combien de vaches ? ))
amis = int(input(Combien damis ? ))
payer = permisSup(poules, chiens, vaches, amis)
print(\nA payer

:, end= )

if payer == 0:
print(rien payer)
else :
print(payer, euros)

F
# -*- coding : utf8 -*Histoire de train.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def tchacatchac(v) :
Affiche lheure du drame.
heure = 9 + int(170/v)
minute = (60 * 170 / v) % 60
print(A { :>3} km/h, je me fais dchiqueter { :>2} h { :.2f} min.
.format(v, heure, minute))

# Programme principal =========================================================


i = 100
while i <= 300:
tchacatchac(i)
i += 10

- -

Exercices corrigs

F
# -*- coding : utf8 -*Proportion dune squence dans une chane dADN.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def valide(seq) :
Retourne vrai si la squence est valide, faux sinon.
ret = any(seq)
for c in seq :
ret = ret and c in atgc
return ret

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

# Programme principal =========================================================


adn = saisie(chane)
seq = saisie(squence)
print(Il y a { :.2f} % de { :s} dans votre chane.
.format(proportion(adn, seq), seq))

F
# -*- coding : utf8 -*Echanges.

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, randint

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def listAleaInt(n, a, b) :
Retourne une liste de <n> entiers alatoires dans [<a> .. <b>].
return [randint(a, b) for i in range(n)]

# Programme principal =========================================================


seed() # initialise le gnrateur de nombres alatoires
t = listAleaInt(100, 2, 125) # construction de la liste
iMin = t.index(min(t)) # calcule lindex du minimum de la liste
print(Avant change

:)

print(\tt[0] =, t[0], \tt[iMin] =, t[iMin])


t[0], t[iMin] = t[iMin], t[0] # change
print(Apres change

:)

print(\tt[0] =, t[0], \tt[iMin] =, t[iMin])

F
# -*- coding : utf8 -*Amplitude et moyenne dune liste de flottants.

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, random

- -

Exercices corrigs

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def listAleaFloat(n) :
Retourne une liste de <n> flottants alatoires
return [random() for i in range(n)]

# Programme principal =========================================================


n = int(input(Entrez un entier [2 .. 100]

: ))

while not(n >= 2 and n <= 100) :


n = int(input(Entrez un entier [2 .. 100], s.v.p.

: ))

seed() # initialise le gnrateur de nombres alatoires


t = listAleaFloat(n) # construction de la liste
print(Amplitude
print(Moyenne

: { :.2f}.format(max(t) - min(t)))
: { :.2f}.format(sum(t)/n))

F
# -*- coding : utf8 -*Min, max et moyenne dune liste dentiers.

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def minMaxMoy(liste) :
Renvoie le min, le max et la moyenne de la liste.
min, max, som = liste[0], liste[0], float(liste[0])
for i in liste[1:]:
if i < min :
min = i
if i > max :
max = i
som += i
return (min, max, som/len(liste))

# Programme principal =========================================================


lp = [10, 18, 14, 20, 12, 16]
print(liste =, lp)
l = minMaxMoy(lp)
print(min

: {0[0]}, max

: {0[1]}, moy

: {0[2]}.format(l))

F
# -*- coding : utf8 -*Nombres romains (version 1).

# Programme principal =========================================================


n = int(input(Entrez un entier [1 .. 4000[

: ))

while not(n >= 1 and n < 4000) :


n = int(input(Entrez un entier [1 .. 4000[, s.v.p.

: ))

s = # Chane rsultante
while n >= 1000:
s += M
n -= 1000
if n >= 900:
s += CM
n -= 900
if n >= 500:
s += D
n -= 500
if n >= 400:
s += CD
n -= 400

- -

Exercices corrigs
while n >= 100:
s += C
n -= 100
if n >= 90:
s += XC
n -= 90
if n >= 50:
s += L
n -= 50
if n >= 40:
s += XL
n -= 40
while n >= 10:
s += X
n -= 10
if n >= 9:
s += IX
n -= 9
if n >= 5:
s += V
n -= 5
if n >= 4:
s += IV
n -= 4
while n >= 1:
s += I
n -= 1
print(En romain

:, s)

F
# -*- coding : utf8 -*Nombres romains (version 2).

# globales ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CODE = zip(
[1000,900 ,500,400 ,100,90 ,50 ,40 ,10 ,9 ,5 ,4 ,1],
[M ,CM,D,CD,C,XC,L,XL,X,IX,V,IV,I]
)

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def decToRoman(num) :
res = []
for d, r in CODE :
while num >= d :
res.append(r)
num -= d
return .join(res)

# Programme principal =========================================================


for i in range(1, 4000) :
print(i, decToRoman(i))

F
# -*- coding : utf8 -*Liste dentiers diffrents.

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, randint

- -

Exercices corrigs

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def listAleaInt(n, a, b) :
Retourne une liste de <n> entiers alatoires entre <a> et <b>.
return [randint(a, b) for i in range(n)]

# Programme principal =========================================================


n = int(input(Entrez un entier [1 .. 100]

: ))

while not(n >= 1 and n <= 100) :


n = int(input(Entrez un entier [1 .. 100], s.v.p.

: ))

# construction de la liste
seed() # initialise le gnrateur de nombres alatoires
t = listAleaInt(n, 0, 500)
# Sont-ils diffrents ?
tousDiff = True
i = 0
while tousDiff and i < (n-1) :
j = i + 1
while tousDiff and j < n :
if t[i] == t[j]:
tousDiff = False
else :
j += 1
i += 1
if tousDiff :
print(\nTous les lments sont distincts.)
else :
print(\nAu moins une valeur est rpte.)
print(t)

F
# -*- coding : utf8 -*Liste dentiers diffrents (seconde version).

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, randint

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def listAleaInt(n, a, b) :
Retourne une liste de <n> entiers alatoires entre <a> et <b>.
return [randint(a, b) for i in range(n)]

# Programme principal =========================================================


n = int(input(Entrez un entier [1 .. 100]

: ))

while not(n >= 1 and n <= 100) :


n = int(input(Entrez un entier [1 .. 100], s.v.p.

: ))

seed() # initialise le gnrateur de nombres alatoires


avant = listAleaInt(n, 0, 500)
apres = list(set(avant))
if len(avant) == len(apres) :
print(\nTous les lments sont distincts.)
else :
print(\nAu moins une valeur est rpte.)
print(avant)

F
# -*- coding : utf8 -*Jeu de ds (1).

# Programme principal =========================================================

- -

Exercices corrigs
n = int(input(Entrez un entier [2 .. 12]

: ))

while not(n >= 2 and n <= 12) :


n = int(input(Entrez un entier [2 .. 12], s.v.p.

: ))

s = 0
for i in range(1, 7) :
for j in range(1, 7) :
if i+j == n :
s += 1
print(Il y a { :d} faon(s) de faire { :d} avec deux ds..format(s, n))

F
# -*- coding : utf8 -*Jeu de ds (2).

# Programme principal =========================================================


n = int(input(Entrez un entier [3 .. 18]

: ))

while not(n >= 3 and n <= 18) :


n = int(input(Entrez un entier [3 .. 18], s.v.p.

: ))

s = 0
for i in range(1, 7) :
for j in range(1, 7) :
for k in range(1, 7) :
if i+j+k == n :
s += 1
print(Il y a { :d} faon(s) de faire { :d} avec trois ds..format(s, n))

F
# -*- coding : utf8 -*Jeu de ds (3).

# Globale ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAX = 8

# Programme principal =========================================================


nbd = int(input(Nombre de ds [2 .. { :d}]

: .format(MAX)))

while not(nbd >= 2and nbd <= MAX) :


nbd = int(input(Nombre de ds [2 .. { :d}], s.v.p.
s = int(input(Entrez un entier [{ :d} .. { :d}]

: .format(MAX)))

: .format(nbd, 6*nbd)))

while not(s >= nbd and s <= 6*nbd) :


s = int(input(Entrez un entier [{ :d} .. { :d}], s.v.p.

: .format(nbd, 6*nbd)))

if s == nbd or s == 6*nbd :
cpt = 1 # 1 seule solution
else :
I = [1]*nbd # initialise une liste de <nbd> ds
cpt, j = 0, 0
while j < nbd :
som = sum([I[k] for k in range(nbd)])
if som == s :
cpt += 1 # compteur de bonnes solutions
if som == 6*nbd :
break
j = 0
if I[j] < 6:
I[j] += 1
else :
while I[j] == 6:
I[j] = 1
j += 1
I[j] += 1
print(Il y a { :d} faons de faire { :d} avec { :d} ds..format(cpt, s, nbd))

- -

Exercices corrigs

F
# -*- coding : utf8 -*Jeu de ds (rcursif).

# Globale ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAX = 8

# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


def calcul(d, n) :
Calcul rcursif du nombre de faons de faire <n> avec <d> ds.
resultat, debut = 0, 1
if (d == 1) or (n == d) or (n == 6*d) : # conditions terminales
return 1
else : # sinon appels rcursifs
if n > 6*(d-1) : # optimisation importante
debut = n - 6*(d-1)
for i in range(debut, 7) :
if n == i :
break
resultat += calcul(d-1, n-i)
return resultat

# Programme principal =========================================================


d = int(input(Nombre de ds [2 .. { :d}]

: .format(MAX)))

while not(d >= 2and d <= MAX) :


d = int(input(Nombre de ds [2 .. { :d}], s.v.p.
n = int(input(Entrez un entier [{ :d} .. { :d}]

: .format(MAX)))

: .format(d, 6*d)))

while not(n >= d and n <= 6*d) :


n = int(input(Entrez un entier [{ :d} .. { :d}], s.v.p.

.format(d, 6*d)))
print(Il y a { :d} faon(s) de faire { :d} avec { :d} ds.
.format(calcul(d, n), n, d))

F
# !/usr/bin/env python
# -*- coding : utf8 -*Module pour les nombres parfaits et chanceux.
#==============================================================================
# fichier

: parfait_chanceux_m.py

#
# auteur

: Bob Cordeau

#==============================================================================
# Dfinition de fonction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def somDiv(n) :
Retourne la somme des diviseurs propres de <n>.
som_div = 1
for div in range(2, (n//2)+1) :
if n % div == 0:
som_div += div
return som_div

def estParfait(n) :
Retourne True si <n> est parfait, False sinon.
return somDiv(n) == n

def estPremier(n) :
Retourne True si <n> est premier, False sinon.
return somDiv(n) == 1

def estChanceux(n) :

- -

Exercices corrigs
Retourne True si <n> est chanceux, False sinon.
est_chanceux = True
for i in range(0, n-1) :
est_chanceux = est_chanceux and estPremier(n + i + i*i)
return est_chanceux

# Auto-test ===================================================================
if __name__==__main__ :
from verif_m import verif
verif(somDiv(12), 16)
verif(estParfait(6), True)
verif(estPremier(31), True)
verif(estChanceux(11), True)

F
# !/usr/bin/env python
# -*- coding : utf8 -*Nombres chanceux et parfaits.
#==============================================================================
# fichier

: parfait_chanceux.py

#
# auteur

: Bob Cordeau

#==============================================================================

# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from parfait_chanceux_m import estParfait, estChanceux

# programme principal =========================================================


parfait, chanceux = [], []
for n in range(2, 1001) :
if estParfait(n) :
parfait.append(n)
if estChanceux(n) :
chanceux.append(n)
print(\nIl y a {} nombres parfaits dans [2, 1000]

: {}

.format(len(parfait), parfait))
print(\nIl y a {} nombres chanceux dans [2, 1000]

: {}

.format(len(chanceux), chanceux))

- -

Bibliographie et Webographie
[] S, Grard, Apprendre programmer avec Python , Eyrolles, .
[] S, Mark, Programming in Python , Addison-Wesley, e dition, .
[] M, Alex, Python en concentr, OReilly, .
[] M, Alex, M R, Anna, A, David, Python par lexemple, OReilly, .
[] L, Mark et B, Yves, Python prcis et concis, OReilly, e dition, .
[] Z, Tarek, Programmation Python. Conception et optimisation, Eyrolles, e dition, .
[] Z, Tarek, Python : Petit guide lusage du dveloppeur agile, Dunod, .
[] H, Doug, e Python Standard Library by Example, Addison-Wesley, .
[] L, Hans Peer, A Primer on Scientic Programming with Python, Springer, .
[] B, David M., Python. Essential Reference, Addison Wesley, e dition, .
[] Y, Je, Foundations of Agile Python Development, Apress, .
[] R Maeul, LATEX appliqu aux sciences humaines, Atramenta, .
[] C Cline et collectif, LATEX pour limpatient, H & K, e dition, .
[] C, David, Rgles typographiques et normes. Mise en pratique avec LATEX, Vuibert, .
[] R, Cyrille, Learning IPython for Interactive Computing and Data Visualization, Packt Publishing, .

Les sites gnraux :


www.python.org
pypi.python.org/pypi
code.google.com/p/pythonxy/wiki/Downloads
Interprteur et EDI spcialiss :
ipython.org
code.google.com/p/spyderlib
www.wingware.com/downloads/wingide-
www.scintilla.org/SciTEDownload.html
code.google.com/p/pyscripter
Les outils :
matplotlib.org
www.inkscape-fr.org
code.google.com/p/rstpdf
www.texniccenter.org
Lencodage :
sametmax.com/cours-et-tutos
Une petite rfrence NumPy :
mathprepa.fr/python-project-euler-mpsi
Le lien des liens :
perso.limsi.fr/pointal

2012-2013 - Laurent Pointal Mmento v1.2.2


Licence Creative Commons Paternit 2

Types de base

entier, flottant, boolen, chane

int
float
bool
str

783
0
-192
9.23 0.0
-1.7e-6
10-6
True False
"Un\nDeux" 'L\'me'
retour la ligne
multiligne

[1,5,9]
(1,5,9)

["x",11,8.9] ["mot"]
11,"y",7.4
("mot",)

[]
()

expression juste avec des virgules

non modifiable

str en tant que squence ordonne de caractres

sans ordre a priori, cl unique, accs par cl rapide; cls= types de base ou tuples

{"cl":"valeur"}
{}
couples cl/valeur {1:"un",3:"trois",2:"deux",3.14:""}
ensemble

set

tabulation

{"cl1","cl2"}

{1,9,3,0}

set()

type(expression) Conversions

int("15") on peut spcifier la base du nombre entier en 2nd paramtre


int(15.56) troncature de la partie dcimale (round(15.56) pour entier arrondi)
float("-11.24e8")
str(78.3) et pour avoir la reprsentation littrale
repr("Texte")

azAZ_ suivi de azAZ_09


accents possibles mais viter
mots cls du langage interdits
distinction casse min/MAJ

a toto x7 y_max BigOne


8y and

voir au verso le formatage de chanes, qui permet un contrle fin


utiliser des comparateurs (avec ==, !=, <, >, ), rsultat logique boolen
bool
utilise chaque lment de
list("abc")
['a','b','c']

Affectation de variables

la squence en paramtre

x = 1.2+8+sin(0)

dict([(3,"trois"),(1,"un")])

valeur ou expression de calcul


nom de variable (identificateur)

conteneur de plusieurs
valeurs (ici un tuple)
incrmentation
x-=2
dcrmentation
valeur constante non dfini

{1:'un',3:'trois'}

utilise chaque lment de


la squence en paramtre

set(["un","deux"])

y,z,r = 9.2,-7.6,"bad"

x+=3
x=None

list
tuple

Types Conteneurs

dictionnaire

"""X\tY\tZ
1\t2\t3"""

pour noms de variables,


Identificateurs
fonctions, modules, classes

noms de
variables

squences ordonnes, accs index rapide, valeurs rptables

dict

' chapp

non modifiable,
squence ordonne de caractres

Documentation officielle Python sur


http://docs.python.org/py3k

Mmento Bases Python 3

":".join(['toto','12','pswd'])
chane de jointure

"des mots

{'un','deux'}

'toto:12:pswd'

squence de chanes

espacs".split()

['des','mots','espacs']

"1,4,8,2".split(",")

['1','4','8','2']

chane de sparation
pour les listes, tuples, chanes de caractres, Indexation des squences

index ngatif
index positif

-6
0

-5
1

-3
3

-4
2

-2
4

len(lst)

-1
5

lst=[11, 67, "abc", 3.14, 42, 1968]


0
tranche ngative -6
tranche positive

1
-5

2
-4

3
-3

4
-2

5
-1

accs individuel aux lments par [index]

lst[1]67
lst[-2]42

lst[0]11 le premier
lst[-1]1968 le dernier

accs des sous-squences par [tranche dbut:tranche fin:pas]

lst[:-1][11,67,"abc",3.14,42]
lst[1:-1][67,"abc",3.14,42]
lst[::2][11,"abc",42]
lst[:][11,67,"abc",3.14,42,1968]

lst[1:3][67,"abc"]
lst[-3:-1][3.14,42]
lst[:3][11,67,"abc"]
lst[4:][42,1968]

Indication de tranche manquante partir du dbut / jusqu' la fin.


Sur les squences modifiables, utilisable pour suppression del lst[3:5] et modification par affectation lst[1:4]=['hop',9]

les deux en mme temps

a or b ou logique
l'un ou l'autre ou les deux
non logique
not a
True valeur constante vrai
False valeur constante faux
nombres flottants valeurs approches!

Blocs d'instructions
instruction parente:
bloc d'instructions 1

instruction parente:
bloc d'instructions 2

indentation!

Logique boolenne
Comparateurs: < > <= >= == !=
=
a and b et logique

instruction suivante aprs bloc 1


angles en radians

Maths

Oprateurs: + - * / // % **

from math import sin,pi

(1+5.3)*212.6
abs(-3.2)3.2
round(3.57,1)3.6

sin(pi/4)0.707
cos(2*pi/3)-0.4999
acos(0.5)1.0471
sqrt(81)9.0

log(e**2)2.0 etc. (cf doc)


ab
entire reste

bloc d'instructions excut Instruction conditionnelle


uniquement si une condition est vraie

if expression logique:
bloc d'instructions
combinable avec des sinon si, sinon si... et un seul sinon final,
exemple:

if x==42:
# bloc si expression logique x==42 vraie
print("vrit vraie")
elif x>0:
# bloc sinon si expression logique x>0 vraie
print("positivons")
elif bTermine:
# bloc sinon si variable boolenne bTermine vraie
print("ah, c'est fini")
else:
# bloc sinon des autres cas restants
print("a veut pas")

bloc d'instructions excut Instruction boucle conditionnelle


tant que la condition est vraie

s = 0
i = 1 initialisations avant la boucle

condition avec au moins une valeur variable (ici i)

while i <= 100:


# bloc excut tant que i 100
s = s + i**2
i = i + 1 faire varier la variable

for variable in squence:

Contrle de boucle
bloc d'instructions
break
sortie immdiate Parcours des valeurs de la squence
s = "Du texte" initialisations avant la boucle
continue
itration suivante cpt = 0

variable de boucle, valeur gre par l'instruction for

i=100

s= i

for c in s:
Comptage du nombre
if c == "e":
de e dans la chane.
cpt = cpt + 1
print("trouv",cpt,"'e'")

i=1

de condition!
print("somme:",s) rsultat de calcul aprs la boucle

boucle sur dict/set = boucle sur squence des cls


utilisation des tranches pour parcourir un sous-ensemble de la squence

attention aux boucles sans fin!

Affichage / Saisie

print("v=",3,"cm:",x,",",y+4)

Parcours des index de la squence


changement de l'lment la position
accs aux lments autour de la position (avant/aprs)

lst = [11,18,9,12,23,4,17]
perdu = []
for idx in range(len(lst)): Bornage des valeurs
suprieures 15,
val = lst[idx]
mmorisation des
if val> 15:
valeurs perdues.
perdu.append(val)
lst[idx] = 15
print("modif:",lst,"-modif:",perdu)

lments afficher: valeurs littrales, variables, expressions


Options de print:
sep=" " (sparateur d'lments, dfaut espace)
end="\n" (fin d'affichage, dfaut fin de ligne)
file=f (print vers fichier, dfaut sortie standard)

s = input("Directives:")
input retourne toujours une chane, la convertir vers le type
dsir (cf encadr Conversions au recto).

Parcours simultan index et valeur de la squence:

for idx,val in enumerate(lst):

Oprations sur conteneurs


len(c) nb d'lments
min(c) max(c) sum(c)
Note: Pour dictionnaires et ensembles,
ces oprations travaillent sur les cls.
sorted(c) copie trie
val in c boolen, oprateur in de test de prsence (not in d'absence)
enumerate(c) itrateur sur (index,valeur)
Spcifique aux conteneurs de squences (listes, tuples, chanes) :

reversed(c) itrateur invers c*5 duplication c+c2 concatnation


c.index(val) position
c.count(val) nb d'occurences
Oprations sur listes
ajout d'un lment la fin
lst.append(item)
ajout d'une squence d'lments la fin
lst.extend(seq)
insertion d'un lment une position
lst.insert(idx,val)
suppression d'un lment partir de sa valeur
lst.remove(val)
lst.pop(idx) suppression de l'lment une position et retour de la valeur
tri / inversion de la liste sur place
lst.sort() lst.reverse()
modification de la liste originale

Oprations sur dictionnaires


d[cl]=valeur
d.clear()
d[cl]valeur
del d[cl]
d.update(d2) mise jour/ajout
des couples
d.keys()
d.values() vues sur les cls,
d.items() valeurs, couples
d.pop(cl)

Oprations sur ensembles


Oprateurs:
| union (caractre barre verticale)
& intersection
- ^ diffrence/diff symtrique
< <= > >= relations d'inclusion

s.update(s2)
s.add(cl) s.remove(cl)
s.discard(cl)
Fichiers

stockage de donnes sur disque, et relecture

f = open("fic.txt","w",encoding="utf8")
variable
nom du fichier
fichier pour
sur le disque
les oprations (+chemin)

mode d'ouverture
'r' lecture (read)
'w' criture (write)
'a' ajout (append)

cf fonctions des modules os et os.path

en criture

encodage des
caractres pour les
fichiers textes:
utf8 ascii
latin1

chane vide si fin de fichier

en lecture

f.write("coucou") s = f.read(4)si nb de caractres


lecture ligne
pas prcis, lit tout
fichier texte lecture / criture
suivante
le fichier
de chanes uniquement, convertir
de/vers le type dsir
s = f.readline()
f.close() ne pas oublier de refermer le fichier aprs son utilisation!
Fermeture automatique Pythonesque : with open() as f:
trs courant: boucle itrative de lecture des lignes d'un fichier texte:

for ligne in f:
bloc de traitement de la ligne

trs utilis pour les Gnration


boucles itratives for par dfaut 0

de squences d'entiers
non compris

range([dbut,] fin [,pas])


range(5)
0 1 2 3 4
range(3,8)
3 4 5 6 7
range(2,12,3)
2 5 8 11
range retourne un gnrateur, faire une conversion
en liste pour voir les valeurs, par exemple:
print(list(range(4)))
nom de la fonction (identificateur) Dfinition de fonction
paramtres nomms

def nomfct(p_x,p_y,p_z):
"""documentation"""
# bloc instructions, calcul de res, etc.
valeur rsultat de l'appel.
return res

si pas de rsultat calcul


les paramtres et toutes les
retourner: return None
variables de ce bloc n'existent
que dans le bloc et pendant l'appel la fonction (boite noire)

r = nomfct(3,i+2,2*i)

Appel de fonction

un argument par paramtre


rcupration du rsultat retourn (si ncessaire)
directives de formatage

Formatage de chanes

valeurs formater

"modele{} {} {}".format(x,y,r)
"{slection:formatage!conversion}"

str

Slection :
"{:+2.3f}".format(45.7273)
2
'+45.727'
x
"{1:>10s}".format(8,"toto")
0.nom
'
toto'
4[cl]
"{!r}".format("L'ame")
0[2]
'"L\'ame"'
Formatage :
car-rempl. alignement signe larg.mini.prcision~larg.max type
Exemples

while expression logique:


bloc d'instructions

bloc d'instructions excut pour Instruction boucle itrative


chaque lment d'un conteneur ou d'un itrateur

<>^=
+ - espace
0 au dbut pour remplissage avec des 0
entiers: b binaire, c caractre, d dcimal (dfaut), o octal, x ou X hexa
flottant: e ou E exponentielle, f ou F point fixe, g ou G appropri (dfaut),
% pourcentage
chane: s
Conversion : s (texte lisible) ou r (reprsentation littrale)

20102012 - Laurent Pointal


Abrg v1.3.1
Licence Creative Commons Paternit 2
Symbolique de l'Abrg

instructions optionnelles, instruction


rptables, valeur immutable (non modifiable),
conteneur ordonn ( non ordonn),
constante, variable, type, fonction &
.mthode, paramtre, [,paramtre optionnel],
mot_cl, littral, module, fichier.

Introspection & Aide


help([objet ou "sujet"])
id(objet) dir([objet]) vars([objet])
locals() globals()
Accs Qualifis
Sparateur . entre un espace de noms et un nom

dans cet espace. Espaces de noms : objet, classe,


fonction, module, package. Exemples :
math.sin(math.pi)
f.__doc__

MaClasse.nbObjets()
rectangle.largeur()
Types de Base
non dfini :
None
Boolen : bool
True / False
bool(x) False si x nul ou vide
Entier : int
0
165
-57
binaire:0b101 octal:0o700 hexa:0xf3e
int(x[,base])
.bit_length()
Flottant : float 0.0
-13.2e-4
float(x)
.as_integer_ratio()
Complexe : complex
0j
-1.2e4+9.4j
complex(re[,img])
.real
.imag
.conjugate()
Chane : str ''
'toto'
"toto"
"""multiligne toto"""
str(x)
repr(x)
Identificateurs, Variables & Affectation
Identificateurs : [a-zA-Z_] suivi d'un ou
plusieurs [a-zA-Z0-9_], accents et caractres
alphabtiques non latins autoriss (mais viter).
nom = expression
nom1,nom2,nomN = squence

point.x

squence contenant N lments


nom1 = nom2 = nomX = expression
clatement squence: premier,*suite=squence
incrmentation : nom=nom+expression
affectation augmente : nom+=expression
(avec les autres oprateurs aussi)
suppression : del nom
Conventions Identificateurs

Dtails dans PEP 8 Style Guide for Python

UNE_CONSTANTE
majuscules
unevarlocale
minuscules sans _
une_var_globale
minuscules avec _
une_fonction
minuscules avec _
une_methode
minuscules avec _
UneClasse
titr
UneExceptionError titr avec Error la fin
unmodule
minuscules plutt sans _
unpackage
minuscules plutt sans _
viter l O I (l min, o maj, i maj) seuls.
_xxx
usage interne
__xxx
transform _Classe__xxx
__xxx__
nom spcial rserv
Oprations Logiques
a<b a<=b a>=b a>b a=ba==b aba!=b
not a a and b a or b (expr)
combinables : 12<x<=34
Maths
-a a+b a-b a*b a/b aba**b (expr)
division euclidienne a=b.q+r q=a//b et r=a%b
et q,r=divmod(a,b)
|x|abs(x) xy%zpow(x,y[,z]) round(x[,n])
fonctions/donnes suivantes dans le module math
e pi ceil(x) floor(x) trunc(x)
exexp(x) log(x) sqrt(x)
cos(x) sin(x) tan(x) acos(x) asin(x)
atan(x) atan2(x,y) hypot(x,y)
cosh(x) sinh(x)
fonctions suivantes dans le module random
seed([x]) random() randint(a,b)
randrange([db],fin[,pas]) uniform(a,b)
choice(seq) shuffle(x[,rnd]) sample(pop,k)

Abrg Dense Python 3.2


Manipulations de bits
a&b a|b a^b
Chane
chappements : \
\\ \
\' '
\" "
\n nouvelle ligne
\t tabulation
\N{nom} unicode nom
\xhh hh hexa
\0oo oo octal
\uhhhh et \Uhhhhhhhh unicode hexa hhhh
prfixe r, dsactivation du \ : r"\n" \n
Formatage : "{modle}".format(donnes)
"{} {}".format(3,2)
"{1} {0} {0}".format(3,9)
"{x} {y}".format(y=2,x=5)
"{0!r} {0!s}".format("texte\n")
"{0:b}{0:o}{0}{0:x}".format(100)
"{0:0.2f}{0:0.3g}{0:.1e}".format(1.45)

(sur les entiers) a<<b a>>b

Oprations
s*n (rptition)
s1+s2 (concatnation) *= +=
.split([sep[,n]]) .join(iterable)
.splitlines([keepend]) .partition(sep)
.replace(old,new[,n]) .find(s[, db[,fin]])
.count(s[, db[,fin]]) .index(s[, db[,fin]])
.isdigit() & Co .lower() .upper()
.strip([chars])
.startswith(s[,db[,fin]])
.endsswith(s[,start[,end]])
.encode([enc[, err]])
ord(c) chr(i)
Expression Conditionnelle

value comme une valeur.


expr1 if condition else expr2
Contrle de Flux

blocs d'instructions dlimits par lindentation


(idem fonctions, classes, mthodes).
Convention 4 espaces - rgler lditeur.
Alternative Si
if condition1:
# bloc excut si condition1 est vraie
elif condition2:
# bloc excut si condition2 est vraie

Abrg ncessairement incomplet pour tenir sur une feuille, voir sur
http://docs.python.org/py3k.

IndexError - KeyError - AttributeError


- IOError - ImportError - NameError SyntaxError - TypeError NotImplementedError

Contexte Gr
with garde() as v :

# Bloc excut dans un contexte gr


Dfinition et Appel de Fonction
def nomfct(x,y=4,*args,**kwargs):
# le bloc de la fonction ou dfaut pass
return ret_expression

x: paramtre simple
y: paramtre avec valeur par dfaut
args: paramtres variables par ordre (tuple)
kwargs: paramtres variables nomms (dict)
ret_expression: tuple retour de plusieurs valeurs
Appel
res = nomfct(expr,param=expr,*tuple,**dict)
Fonctions Anonymes
lambda x,y: expression
Squences & Indexation

pour tout conteneur ordonn accs direct.


ie lment : x[i]
Tranche (slice) : x[db:fin] x[db:fin:pas]
i, db, fin, pas entiers positifs ou ngatifs
db/fin manquant jusquau bout
x[i]
x
x[db:fin]

-6

-5

-4

-3

-2

-1

-6

-5

-4

-3

-2

-1

Modification (si squence modifiable)


x[i]=expressionx[db:fin]=itrable
del x[i]
del x[db:fin]
Conteneurs & Itrables

Un itrable fournit les valeurs lune aprs lautre.


Ex : conteneurs, vues sur dictionnaires, objets
itrables, fonctions gnrateurs
else:
Gnrateurs (calcul des valeurs lorsque ncessaire)
# bloc excut si toutes conditions fausses
range([db,]fin[,pas])
Boucle Parcours De Squence
( expr for var in iter if cond )
for var in itrable:
Oprations Gnriques
# bloc excut avec var valant tour tour
v in conteneur
v not in conteneur
# chacune des valeurs de itrable
len(conteneur) enumerate(iter[,db])
else:
iter(o[,sent]) all(iter) any(iter)
# excut aprs, sauf si sortie du for par break
filter(fct,iter) map(fct,iter,)
var plusieurs variables: for x,y,z in
max(iter) min(iter) sum(iter[,db])
var index,valeur: for i,v in enumerate() reversed(seq) sorted(iter[,k][,rev])
itrable : voir Conteneurs & Itrables
Sur squences : .count(x) .index(x[,i[,j]])
Boucle Tant Que
Chane : (squence de caractres)
while condition:
cf. types bytes, bytearray, memoryview pour
# bloc excut tant que condition est vraie
manipuler des octets (+notation b"octets").
else:
Liste : list
[]
[1,'toto',3.14]
# excut aprs, sauf si sortie du while par break
list(iterable) .append(x)
Rupture De Boucle : break
.extend(iterable) .insert(i,x) .pop([i])
Sortie immdiate de la boucle, sans passer par le bloc
.remove(x) .reverse() .sort()
else.
[ expr for var in iter if cond ]
Saut De Boucle : continue
Tuple : tuple () (9,'x',36) (1,)
Saut immdiat en dbut de bloc de la boucle pour
tuple(iterable)
9,'x',36
1,
excuter l'itration suivante.
Ensemble : set {1,'toto',42}
Traitement D'erreurs: Exceptions
set(iterable) : frozenset(iterable)
try:
.add(x) .remove(x) .discard(x)
# bloc excut dans les cas normaux
except exc as e:
# bloc excut si une erreur de type exc est
# dtecte
else:
# bloc excut en cas de sortie normale du try
finally:
# bloc excut dans tous les cas
exc pour n types : except (exc1,exc2,excn)
as e optionnel, rcupre lexception

.copy() .clear() .pop()


|, &, diff-, diff.sym^, <
|= &= -= ^=
Dictionnaire (tableau associatif, map) : dict
{}
{1:'one',2:'two'}
dict(iterable)
dict(a=2,b=4)
dict.fromkeys(seq[,val])
d[k]=expr
d[k]
del d[k]
.update(iter) .keys() .values()
.items() .pop(k[,def]) .popitem()
.get(k[,def]) .setdefault(k[,def])
dtecter des exceptions prcises (ex.
.clear() .copy()
ValueError) et non gnriques (ex. Exception).
items, keys, values vues itrables
Leve D'exception (situation d'erreur)
Entres/Sorties & Fichiers
raise exc([args])
print("x=",x[,y][,sep=][,end=][,file=])
raise propager l'exception
input("Age ? ") str
Quelques classes dexceptions : Exception ArithmeticError - ZeroDivisionError - transtypage explicite en int ou float si besoin.

# retourne chane suivant le format spcifi


Fichier : f=open(nom[,mode][,encoding=])
Mthodes spciales Comparaisons
mode : 'r' lecture (dfaut) 'w' criture 'a' ajout
'+' lecture criture 'b' mode binaire
Retournent True, False ou NotImplemented.
encoding : 'utf-8' 'latin1' 'ascii'
x<y def __lt__(self,y):
.write(s) .read([n]) .readline()
x<=y def __le__(self,y):
.flush() .close() .readlines()
x==y def __eq__(self,y):
Boucle sur lignes :for line in f :
x!=y def __ne__(self,y):
Contexte gr (close) : with open() as f:
x>y def __gt__(self,y):
dans le module os (voir aussi os.path):
x>=y def __ge__(self,y):
getcwd() chdir(chemin) listdir(chemin)
Mthodes spciales Oprations
Paramtres ligne de commande dans sys.argv
Retournent un nouvel objet de la classe, intgrant le
Modules & Packages
rsultat de lopration, ou NotImplemented si ne
Module : fichier script extension .py (et modules
peuvent travailler avec largument y donn.
compils en C). Fichier toto.py module
x self
toto.
x+y def __add__(self,y):
Package : rpertoire avec fichier __init__.py.
x-y def __sub__(self,y):
Contient des fichiers modules.
x*y def __mul__(self,y):
Recherchs dans le PYTHONPATH, voir liste sys.path.
x/y def __truediv__(self,y):
Modle De Module :
x//y def __floordiv__(self,y):
#!/usr/bin/python3
x%y def __mod__(self,y):
# -*- coding: utf-8 -*"""Documentation module - cf PEP257"""
divmod(x,y) def __divmod__(self,y):
# Fichier: monmodule.py
x**y def __pow__(self,y):
# Auteur: Joe Student
pow(x,y,z) def __pow__(self,y,z):
# Import d'autres modules, fonctions
import math
x<<y def __lshift__(self,y):
from random import seed,uniform
x>>y def __rshift__(self,y):
# Dfinitions constantes et globales
x&y def __and__(self,y):
MAXIMUM = 4
lstFichiers = []
x|y def __or__(self,y):
# Dfinitions fonctions et classes
x^y def __xor__(self,y):
def f(x):
-x def __neg__(self):
"""Documentation fonction"""

+x def __pos__(self):
class Convertisseur(object):
abs(x) def __abs__(self):
"""Documentation classe"""
~x def __invert__(self):
nb_conv = 0 # var de classe
def __init__(self,a,b):
Mthodes suivantes appeles ensuite avec y si x ne
"""Documentation init"""
supporte pas lopration dsire.
self.v_a = a # var dinstance
y self

def action(self,y):
x+y def __radd__(self,x):
"""Documentation mthode"""
x-y def __rsub__(self,x):

x*y def __rmul__(self,x):


# Auto-test du module
if __name__ == '__main__':
x/y def __rtruediv__(self,x):
if f(2) != 4: # problme
x//y def __rfloordiv__(self,x):

x%y def __rmod__(self,x):


Import De Modules / De Noms
divmod(x,y) def __rdivmod__(self,x):
import monmondule
x**y def __rpow__(self,x):
from monmodule import f,MAXIMUM
from monmodule import *
x<<y def __rlshift__(self,x):
from monmodule import f as fct
x>>y def __rrshift__(self,x):
Pour limiter leffet *, dfinir dans monmodule :
x&y def __rand__(self,x):
__all__ = [ "f", "MAXIMUM"]
x|y def __ror__(self,x):
Import via package :
x^y def __rxor__(self,x) :
from os.path import dirname
Dfinition de Classe

Mthodes spciales, noms rserves __xxxx__.


class NomClasse([claparent]):
# le bloc de la classe

variable_de_classe = expression
def __init__(self[,params]):

# le bloc de linitialiseur
self.variable_d_instance = expression
def __del__(self):
# le bloc du destructeur
@staticmethod
# @dcorateur
def fct([,params]):
# mthode statique (appelable sans objet)

Tests Dappartenance
isinstance(obj,classe)
isssubclass(sousclasse,parente)
Cration dObjets

Utilisation de la classe comme une fonction,


paramtres passs linitialiseur __init__.
obj = NomClasse(params)
Mthodes spciales Conversion
def __str__(self):
# retourne chane daffichage
def __repr__(self):
# retourne chane de reprsentation
def __bytes__(self):
# retourne objet chane doctets
def __bool__(self):
# retourne un boolen
def __format__(self,spcif_format):

Mthodes spciales Affectation augmente

Modifient lobjet self auquel elles sappliquent.


x self
x+=y def __iadd__(self,y):
x-=y def __isub__(self,y):
x*=y def __imul__(self,y):
x/=y def __itruediv__(self,y):
x//=y def __ifloordiv__(self,y):
x%=y def __imod__(self,y):
x**=y def __ipow__(self,y):
x<<=y def __ilshift__(self,y):
x>>=y def __irshift__(self,y):
x&=y def __iand__(self,y):
x|=y def __ior__(self,y):
x^=y def __ixor__(self,y):

Mthodes spciales Conversion numrique

Retournent la valeur convertie.


x self
complex(x) def __complex__(self):
int(x) def __int__(self):
float(x) def __float__(self):
round(x,n) def __round__(self,n):
def __index__(self):

# retourne un entier utilisable comme index


Mthodes spciales Accs aux attributs
Accs par obj.nom. Exception AttributeError

si attribut non trouv.


obj self
def __getattr__(self,nom):
# appel si nom non trouv en attribut existant,

def __getattribute__(self,nom):
# appel dans tous les cas daccs nom
def __setattr__(self,nom,valeur):
def __delattr__(self,nom):
def __dir__(self): # retourne une liste
Accesseurs

Property

class C(object):
def getx(self):
def setx(self,valeur):
def delx(self):
x = property(getx,setx,delx,"docx")
# Plus simple, accesseurs y, avec des dcorateurs
@property
def y(self): # lecture
"""docy"""
@y.setter
def y(self,valeur): # modification
@y.deleter
def y(self): # suppression

Protocole Descripteurs
o.x def __get__(self,o,classe_de_o):
o.x=v def __set__(self,o,v):
del o.x def __delete__(self,o):
Mthode spciale Appel de fonction

Utilisation dun objet comme une fonction (callable) :


o(params) def __call__(self[,params]):
Mthode spciale Hachage

Pour stockage efficace dans dict et set.


hash(o) def __hash__(self):
Dfinir None si objet non hachable.

Mthodes spciales Conteneur

o self
len(o) def __len__(self):
o[cl] def __getitem__(self,cl):
o[cl]=v def __setitem__(self,cl,v):
del o[cl] def __delitem__(self,cl):
for i in o: def __iter__(self):

# retourne un nouvel itrateur sur le conteneur


reversed(o) def __reversed__(self):
x in o def __contains__(self,x):
Pour la notation [db:fin:pas], un objet de type
slice est donn comme valeur de cl aux mthodes
conteneur.
Tranche: slice(db,fin,pas)
.start .stop .step .indices(longueur)
Mthodes spciales Itrateurs
def __iter__(self):# retourne self
def __next__(self):# retourne llment suivant

Si plus dlment, leve exception


StopIteration.

Mthodes spciales Contexte Gr

Utilises pour le with.


def __enter__(self):

# appele l'entre dans le contexte gr


# valeur utilise pour le as du contexte
def __exit__(self,etype,eval,tb):
# appele la sortie du contexte gr
Mthodes spciale Mtaclasses
__prepare__ = callable
def __new__(cls[,params]):
# allocation et retour dun nouvel objet cls
isinstance(o,cls)
def __instancecheck__(cls,o):
isssubclass(sousclasse,cls)
def __subclasscheck__(cls,sousclasse):
Gnrateurs
Calcul des valeurs lorsque ncessaire (ex.: range).

Fonction gnrateur, contient une instruction


yield. yield expression

yield from squence


variable = (yield expression) transmission de

valeurs au gnrateur.
Si plus de valeur, leve exception
StopIteration.
Contrle Fonction Gnrateur
gnrateur.__next__()
gnrateur.send(valeur)
gnrateur.throw(type[,valeur[,traceback]])
gnrateur.close()

Index
A
ADA,
aectation,
ALGOL,
algorithme, ,
alternative,
annotation,
argument,
passage par aectation,
ASCII,
auto-test,
B
Barthod, Stphane, iii
base, ,
binaire,
changement de,
hexadcimal,
octal,
Basic,
Berthomier, ric, iii
bibliothque,
mathmatique,
standard,
temps et dates,
bloc,
Boole, George,
boucle,
dvnement,
parcourir,
rpter,
bytecode, ,
C
C, ,
C++, ,
C#,
CD-ROM,
chane,
concatnation,
longueur,
rptition,
COBOL,
commentaire,
compilateur,
conception
association,
drivation,

graphique,
console,
conteneur, ,
Cordeau
Bob,
Hlne, iii
D
dictionnaire,
cl,
valeur,
division,
entire,
oante,
duck typing,
dcorateur,
drivation,
dsrialisation,
dveloppement
dirig par la documentation,
E
chappement,
Eiel,
ensemble,
exception,
expression,
gnratrice,
F
chier,
binaire,
criture squentielle,
lecture squentielle,
textuel,
fonction, ,
application partielle de,
directive lambda,
lter,
incluse,
map,
reduce,
rcursive,
formatage,
FORTRAN,
functor,

G
gestionnaire,
de contexte,
Gimenez, Stphane, iii
Guiet, Jean-Pierre, iii
gnrateur,
H
Horner, William George,
Hunter, John,
hritage,
I
identicateur,
implmentation,
CPython,
IronPython,
Jython,
Pypy,
Stackless Python,
indexation,
instruction,
compose,
interfaces graphiques,
interprteur,
introspection,
IPython, vii, ,
isympy,
itrable,
J
Java,
json,
K
Kleene, Stephen,
Knuth, Donald, vii,
L
LabView,
langage
dassemblage,
de haut niveau,
machine,
LISP,
liste,
literate programming,
M
Massuti, Christophe, iii
matplotlib,
Meyer, Bertrand, vii
MODULA-,
module,

import,
mot
rserv,
Murphy, ,
mthode,
mthodes,
mthodologie
objet,
procdurale,
N
numpy,
O
Oliphant, Travis,
Olive, Xavier, iii
oprateur,
de comparaison,
logique,
opration,
aritmtique,
ordinateur, ,
Ousterhout, K.,
P
package, ,
paquet,
paramtre
self,
PASCAL,
Perez, Fernando,
Perl,
persistence,
pickle,
PL/,
polymorphisme,
porte
globale,
locale,
Programmation Oriente Objet,
aribut,
classe,
encapsuler,
instance,
mthode,
mthode spciale,
objet,
polymorphisme,
POO,
surcharge,
programme,
proprit,
accesseur,
PSF,
Python, , ,
pythonique,

W
widget,
Wingware, vii

RAM,
reST,
Ruby,
rfrences,

X
S

saisie,
ltre,
script,
Simula,
Sloan, Alfred P.,
Smalltalk,
source,
Sphinx,
spyder, vii
surcharge,
sympy,
squence, ,
rupture de,
srialisation,
T
tableau,
associatif,
tcl/Tk,
test,
fonctionnel,
unitaire,
Tim, Peters,
tranche,
transtyper,
Trevian, Ccile, iii,
tuple,
type,
binaire,
bool,
complex,
oat,
int,
U
UAL,
UC,
Unicode,
USB,
V
van Rossum, Guido,
BDFL,
GvR,
variable,
VB.NET,
VisualBasic,

XML,
Z
zen,
Ziad, Tareck, iii

Glossaire

Lexique bilingue

>>>

Invite Python par dfaut dans un shell interactif. Souvent utilise dans les exemples de code extraits
de sessions de linterprteur Python.

Invite Python par dfaut dans un shell interactif, utilise lorsquil faut entrer le code dun bloc
indent ou lintrieur dune paire de parenthses, crochets ou accolades.
to
Un outil qui essaye de convertir le code Python .x en code Python .x en grant la plupart des
incompatibilits quil peut dtecter.
2to3 est disponible dans la bibliothque standard lib2to2 ; un point dentre autonome est Tool/scipts/2to3.
Voir to Automated Python to code translation.
abstract base class ABC (classe de base abstraite)
Complte le duck-typing en fournissant un moyen de dnir des interfaces alors que dautres techniques (comme hasattr()) sont plus lourdes. Python fournit de base plusieurs ABC pour les structures de donnes (module collections), les nombres (module numbers) et les ux (module io). Vous
pouvez crer votre propre ABC en utilisant le module abc.
argument (argument) [cf. p. ]
Valeur passe une fonction ou une mthode, aecte une variable nomme locale au corps de
la fonction. Une fonction ou une mthode peut avoir la fois des arguments par position et avec
des valeurs par dfaut. Ces arguments peuvent tre de multiplicit variable : * accepte ou fournit
plusieurs arguments par position dans une liste, tandis que ** joue le mme rle en utilisant les
valeurs par dfaut dans un dictionnaire.
On peut passer toute expression dans la liste darguments, et la valeur value est transmise la
variable locale.
attribute (aribut) [cf. p. ]
Valeur associe un objet rfrenc par un nom et une expression pointe. Par exemple, laribut
a dun objet o peut tre rfrenc o.a.
BDFL Benevolent Dictator For Life (Dictateur Bienveillant Vie) [cf. p. ]
Amical surnom de Guido van Rossum, le crateur de Python.
bytecode (bytecode ou langage intermdiaire) [cf. p. ]
Le code source Python est compil en bytecode, reprsentation interne dun programme Python
dans linterprteur. Le bytecode est galement rang dans des chiers .pyc et .pyo, ainsi lexcution
dun mme chier est plus rapide les fois ultrieures (la compilation du source en bytecode peut
tre vite). On dit que le bytecode tourne sur une maine virtuelle qui, essentiellement, se rduit
une collection dappels des routines correspondant chaque code du bytecode.
class (classe) [cf. p. ]
Modle permeant de crer ses propres objets. Les dnitions de classes contiennent normalement
des dnitions de mthodes qui oprent sur les instances de classes.
coercion (coercition ou transtypage) [cf. p. ]
Conversion implicite dune instance dun type dans un autre type dans une opration concernant
deux arguments de types compatibles. Par exemple, int(3.15) convertit le nombre oant 3.15 en
lentier 3, mais dans 3+4.5, chaque argument est dun type dirent (lun int et lautre float) et
tous deux doivent tre convertis dans le mme type avant dtre additionns, sinon une exception
TypeError sera lance. Sans coercition, tous les arguments, mme de types compatibles, doivent tre
normaliss la mme valeur par le programmeur, par exemple, float(3)+4.5 au lieu de simplement
3+4.5.

complex number (nombre complexe) [cf. p. ]


Une extension du systme familier des nombres rels dans laquelle tous les nombres sont exprims
comme la somme dune partie relle et une partie imaginaire. Les nombres imaginaires sont des
multiples rels de lunit imaginaire (la racine carre de -), souvent crite i par les mathmaticiens
et j par les ingnieurs. Python a un traitement incorpor des nombres complexes, qui sont crits
avec cee deuxime notation ; la partie imaginaire est crite avec un suxe j, par exemple 3+1j.
Pour avoir accs aux quivalents complexes des lments du module math utilisez le module cmath.
Lutilisation des nombres complexes est une possibilit mathmatique assez avance. Si vous ntes
pas certain den avoir besoin vous pouvez les ignorer sans risque.
context manager (gestionnaire de contexte) [cf. p. ]
Objet qui contrle lenvironnement indiqu par linstruction with et qui dnit les mthodes __enter__()
et __exit__(). Voir la PEP .
CPython (Python classique) [cf. p. ]
Implmentation canonique du langage de programmation Python. Le terme CPython est utilis
dans les cas o il est ncessaire de distinguer cee implmentation dautres comme Jython ou
IronPython.
decorator (dcorateur) [cf. p. ]
Fonction retournant une autre fonction habituellement applique comme une transformation utilisant la syntaxe @wrapper.
classmethod() et staticmethod() sont des exemples classiques de dcorateurs.
Les deux dnitions de fonctions suivantes sont smantiquement quivalentes :
def f(...) :
...
f = staticmethod(f)

@staticmethod
def f(...) :
...

Un concept identique existe pour les classes mais est moins utilis. Voir la documentation function
denition et class denition pour plus de dtails sur les dcorateurs.
descriptor (descripteur)
Tout objet qui dnit les mthodes __get__(), __set__() ou __delete__(). Lorsquun aribut dune
classe est un descripteur, un comportement spcique est dclench lors de la consultation de lattribut. Normalement, crire a.b consulte lobjet b dans le dictionnaire de la classe de a, mais si b
est un descripteur, la mthode __get__() est appele. Comprendre les descripteurs est fondamental
pour la comprhension profonde de Python, car ils sont la base de nombreuses caractristiques,
comme les fonctions, les mthodes, les proprits, les mthodes de classe, les mthodes statiques et
les rfrences aux super-classes.
Pour plus dinformations sur les mthodes des descripteurs, voir Implementing Descriptors.
dictionary (dictionnaire) [cf. p. ]
Une table associative, dans laquelle des cls arbitraires sont associes des valeurs. Lutilisation des
objets dict ressemble beaucoup celle des objets list, mais les cls peuvent tre nimporte quels
objets ayant une fonction __hash__(), non seulement des entiers. Ces tables sont appeles hash en
Perl.
docstring (chane de documentation) [cf. p. ]
Chane lirale apparaissant comme premire expression dune classe, dune fonction ou dun module. Bien quignore lexcution, elle est reconnue par le compilateur et incluse dans laribut
__doc__ de la classe, de la fonction ou du module qui la contient. Depuis quelle est disponible via
lintrospection, cest lendroit canonique pour documenter un objet.
du-typing (typage comme un canard ) [cf. p. ]
Style de programmation pythonique dans lequel on dtermine le type dun objet par inspection de
ses mthodes et aributs plutt que par des relations explicites des types ( sil ressemble un
canard et fait coin-coin comme un canard alors ce doit tre un canard ). En meant laccent sur des
interfaces plutt que sur des types spciques on amliore la exibilit du code en permeant la
substitution polymorphe. Le duck-typing vite les tests qui utilisent type() ou isinstance() (notez

cependant que le duck-typing doit tre complt par lemploi des classes de base abstraites). la
place, il emploie des tests comme hasattr() et le style de programmation EAFP.
EAFP (Easier to ask for forgiveness than permission, ou plus facile de demander pardon que la permission )
Ce style courant de programmation en Python consiste supposer lexistence des cls et des aributs ncessaires lexcution dun code et araper les exceptions qui se produisent lorsque de
telles hypothses se rvlent fausses. Cest un style propre et rapide, caractris par la prsence de
nombreuses instructions try et except. Cee technique contraste avec le style LBYL, courant dans
dautres langages comme le C.
expression (expression) [cf. p. ]
Fragment de syntaxe qui peut tre valu. Autrement dit, une expression est une accumulation
dlments dexpression comme des liraux, des noms, des accs aux aributs, des oprateurs
ou des appels des fonctions retournant une valeur. linverse de beaucoup dautres langages,
toutes les constructions de Python ne sont pas des expressions. Les instructions ne peuvent pas
tre utilises comme des expressions (par exemple if). Les aectations sont aussi des instructions,
pas des expressions.
extension module (module dextension)
Module crit en C ou en C++, utilisant lAPI C de Python, qui interagit avec le cur du langage et
avec le code de lutilisateur.
nder
Objet qui essaye de trouver le loader (chargeur) dun module. Il doit implmenter une mthode
nomme find_module(). Voir la PEP pour des dtails et importlib.abc.Finder pour une classe
de base abstraite.
oor division (division entire) [cf. p. ]
Division mathmatique qui laisse tomber le reste. Loprateur de division entire est //. Par exemple,
lexpression 11//4 est value 2, par opposition la division oante qui retourne 2.75.
function (fonction) [cf. p. ]
Suite dinstructions qui retourne une valeur lappelant. On peut lui passer zro ou plusieurs arguments qui peuvent tre utiliss dans le corps de la fonction. Voir aussi argument et method.
__future__
Un pseudo-module que les programmeurs peuvent utiliser pour permere les nouvelles fonctionnalits du langage qui ne sont pas compatibles avec linterprteur couramment employ.
En important __future__ et en valuant ses variables, vous pouvez voir quel moment une caractristique nouvelle a t ajoute au langage et quand est-elle devenue la fonctionnalit par dfaut :
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, alpha, 2), (3, 0, 0, alpha, 0), 8192)

garbage collection (gestion automatique de la mmoire)


Processus de libration de la mmoire quand elle nest plus utilise. Python excute cee gestion
en comptant les rfrences et en dtectant et en cassant les rfrences cycliques.
generator (fonction gnrateur) [cf. p. ]
Une fonction qui renvoie un itrateur. Elle ressemble une fonction normale, except que la valeur
de la fonction est rendue lappelant en utilisant une instruction yield au lieu dune instruction
return. Les fonctions gnrateurs contiennent souvent une ou plusieurs boucles for ou while qui
cdent des lments lappelant. Lexcution de la fonction est stoppe au niveau du mot-cl
yield, en renvoyant un rsultat, et elle est reprise lorsque llment suivant est requis par un appel
de la mthode next() de litrateur.
generator expression (expression gnrateur) [cf. p. ]
Une expression qui renvoie un gnrateur. Elle ressemble une expression normale suivie dune
expression for dnissant une variable de contrle, un intervalle et une expression if facultative.
Toute cee expression combine produit des valeurs pour une fonction englobante :

>>> sum(i*i for i in range(10)) # somme des carrs 0+1+4+ ... 81 = 285
285

GIL
cf. global interpreter lo.
global interpreter lo (verrou global de linterprteur)
Le verrou utilis par les threads Python pour assurer quun seul thread tourne dans la maine
virtuelle CPython un instant donn. Il simplie Python en garantissant que deux processus
ne peuvent pas accder en mme temps une mme mmoire. Bloquer linterprteur tout entier lui permet dtre multi-thread aux frais du paralllisme du systme environnant. Des eorts
ont t faits par le pass pour crer un interprteur free-threaded (o les donnes partages sont
verrouilles avec une granularit ne), mais les performances des programmes en souraient considrablement, y compris dans le cas des programmes mono-thread.
hashable (hachable)
Un objet est hachable sil a une valeur de hachage constante au cours de sa vie (il a besoin dune mthode __hash__()) et sil peut tre compar dautres objets (il a besoin dune mthode __eq__()).
Les objets hachables compars gaux doivent avoir la mme valeur de hachage.
L hachabilit rend un objet propre tre utilis en tant que cl dun dictionnaire ou membre
dun ensemble (set), car ces structures de donnes utilisent la valeur de hachage de faon interne.
Tous les objets de base Python non modiables (immutable) sont hachables, alors que certains
conteneurs comme les listes ou les dictionnaires sont modiables. Les objets instances des classes
dnies par lutilisateur sont hachables par dfaut ; ils sont tous ingaux (dirents) et leur valeur
de hachage est leur id().
IDLE [cf. p. ]
Un environnement de dveloppement intgr pour Python. IDLE est un diteur basique et un environnement dinterprtation ; il est donn avec la distribution standard de Python. Excellent pour
les dbutants, il peut aussi servir dexemple pas trop sophistiqu pour tous ceux qui doivent implmenter une application avec interface utilisateur graphique multi-plate-forme.
immutable (immuable) [cf. p. ]
Un objet avec une valeur xe. Par exemple, les nombres, les chanes, les tuples. De tels objets ne
peuvent pas tre altrs ; pour changer de valeur un nouvel objet doit tre cr. Les objets immuables
jouent un rle important aux endroits o une valeurs de hash constantes est requise, par exemple
pour les cls des dictionnaires.
importer [cf. p. ]
Objet qui la fois trouve et charge un module. Cest la fois un objet nder et un objet loader.
interactive (interactif) [cf. p. ]
Python possde un interprteur interactif, ce qui signie que vous pouvez essayer vos ides et voir
immdiatement les rsultats. Il sut de lancer python sans argument (ventuellement en le slectionnant dans un certain menu principal de votre ordinateur). Cest vraiment un moyen puissant
pour tester les ides nouvelles ou pour inspecter les modules et les paquetages (pensez help(x)).
interpreted (interprt) [cf. p. ]
Python est un langage interprt, par opposition aux langages compils, bien que cee distinction
puisse tre oue cause de la prsence du compilateur de bytecode. Cela signie que les chiers
source peuvent tre directement excuts sans avoir besoin de crer pralablement un chier binaire excut ensuite. Typiquement, les langages interprts ont un cycle de dveloppement et de
mise au point plus court que les langages compils mais leurs programmes sexcutent plus lentement. Voir aussi interactive.
iterable (itrable) [cf. p. ]
Un objet conteneur capable de renvoyer ses membres un par un. Des exemples diterable sont les
types squences (comme les list, les str, et les tuple) et quelques types qui ne sont pas des squences, comme les objets dict, les objets file et les objets de nimporte quelle classe que vous
dnissez avec une mthode __iter__() ou une mthode __getitem__(). Les iterables peuvent tre
utiliss dans les boucles for et dans beaucoup dautres endroits o une squence est requise (zip(),
map(), ). Lorsquun objet iterable est pass comme argument la fonction incorpore iter() il
renvoie un itrateur. Cet itrateur est un bon moyen pour eectuer un parcours dun ensemble
de valeurs. Lorsquon utilise des iterables, il nest gnralement pas ncesaire dappeler la fonction

iter() ni de manipuler directement les valeurs en question. Linstruction for fait cela automatiquement pour vous, en crant une variable temporaire sans nom pour grer litrateur pendant la
dure de litration. Voir aussi iterator, sequence, et generator.
iterator (itrateur)
Un objet reprsentant un ot de donnes. Des appels rpts la mthode __next__() de litrateur
(ou la fonction de base next()) renvoient des lments successifs du ot. Lorsquil ny a plus de
donnes disponibles dans le ot, une exception StopIteration est lance. ce moment-l, lobjet
itrateur est puis et tout appel ultrieur de la mthode next() ne fait que lancer encore une
exception StopIteration. Les itrateurs doivent avoir une mthode __iter__() qui renvoie lobjet
itrateur lui-mme. Ainsi un itrateur est itratif et peut tre utilis dans beaucoup dendroits o
les iterables sont accepts ; une exception notable est un code qui tenterait des itrations multiples.
Un objet conteneur (comme un objet list) produit un nouvel itrateur chaque fois quil est pass
la fonction iter() ou bien utilis dans une boucle for. Si on fait cela avec un itrateur on ne
rcuprera que le mme itrateur puis utilis dans le parcours prcdent, ce qui fera apparatre
le conteneur comme sil tait vide.
keyword argument (argument avec valeur par dfaut) [cf. p. ]
Argument prcd par variable_name= dans lappel. Le nom de la variable dsigne le nom local
dans la fonction auquel la valeur est aecte. ** est utilis pour accepter ou passer un dictionnaire
darguments avec ses valeurs. Voir argument.
lambda [cf. p. ]
Fonction anonyme en ligne ne comprenant quune unique expression value lappel. Syntaxe de
cration dune fonction lambda :
lambda[arguments]: expression

LBYL (Look before you leap ou regarder avant dy aller )


Ce style de code teste explicitement les pr-conditions avant deectuer un appel ou une recherche.
Ce style soppose lapproche EAFP et est caractris par la prsence de nombreuses instructions
if.
list (liste) [cf. p. ]
Squence Python de base. En dpit de son nom, elle ressemble plus au tableau dautres langages
qu une liste chane puisque laccs ses lments est en O(1).
list comprehension (liste en comprhension) [cf. p. ]
Une manire compacte deectuer un traitement sur un sous-ensemble dlments dune squence
en renvoyant une liste avec les rsultats. Par exemple :
result = [0x%02x % x for x in range(256) if x % 2 == 0]

engendre une liste de chanes contenant les critures hexadcimales des nombres pairs de lintervalle de 0 255. La clause if est facultative. Si elle est omise, tous les lments de lintervalle
range(256) seront traits.
loader (chargeur)
Objet qui charge un module. Il doit possder une mthode load_module(). un loader est typiquement
fournit par un nder. Voir la PEP pour les dtails et voir importlib.abc.Loader pour une classe
de base abstraite.
mapping (liste associative) [cf. p. ]
Un objet conteneur (comme dict) qui supporte les recherches par des cls arbitraires en utilisant
la mthode spciale __getitem__().
metaclass
La classe dune classe. La dnition dune classe cre un nom de classe, un dictionnaire et une liste
de classes de base. La mtaclasse est responsable de la cration de la classe partir de ces trois lments. Beaucoup de langages de programmation orients objets fournissent une implmentation
par dfaut. Une originalit de Python est quil est possible de crer des mtaclasses personnalises. Beaucoup dutilisateurs nauront jamais besoin de cela mais, lorsque le besoin apparat, les
mtaclasses fournissent des solutions puissantes et lgantes. Elles sont utilises pour enregistrer
les accs aux aributs, pour ajouter des threads scuriss, pour dtecter la cration dobjet, pour
implmenter des singletons et pour bien dautres tches.
Plus dinformations peuvent tre trouves dans Customizing class creation.

method (mthode) [cf. p. ]


Fonction dnie dans le corps dune classe. Appele comme un aribut dune instance de classe,
la mthode prend linstance dobjet en tant que premier argument (habituellement nomm self).
Voir function et nested scope.
mutable (modiable)
Les objets modiables peuvent changer leur valeur tout en conservant leur id(). Voir aussi immutable.
named tuple (tuple nomm) [cf. p. ]
Toute classe de pseudo-tuples dont les lments indexables sont galement accessibles par des attributs nomms (par exemple time.localtime() retourne un objet pseudo-tuple o lanne est accessible soit par un index comme t[0] soit par un aribut nomm comme t.tm_year.
Un tuple nomm peut tre un type de base comme time.struct_time ou il peut tre cr par
une dnition de classe ordinaire. Un tuple nomm peut aussi tre cr par la fonction fabrique
collections.nametuple(). Cee dernire approche fournit automatiquement des caractristiques
supplmentaires comme une reprsentation auto-documente, par exemple :
>>> Employee(name=jones, title=programmer)

namespace (espace de noms) [cf. p. ]


Lendroit o une variable est conserve. Les espaces de noms sont implments comme des dictionnaires. Il y a des espace de noms locaux, globaux et intgrs et galement imbriqus dans les objets.
Les espaces de noms contribuent la modularit en prvenant les conits de noms. Par exemple, les
fonctions __builtin__.open() et os.open() se distinguent par leurs espaces de noms. Les espaces
de noms contribuent aussi la lisibilit et la maintenablit en clariant quel module implmente
une fonction. Par exemple, en crivant random.seed() ou itertools.izip() on rend vident que ces
fonctions sont implmentes dans les modules random et itertools respectivement.
nested scope (porte imbrique) [cf. p. ]
La possibilit de faire rfrence une variable dune dnition englobante. Par exemple, une fonction dnie lintrieur dune autre fonction peut faire rfrence une variable de la fonction extrieure. Notez que le portes imbriques fonctionnent uniquement pour la rfrence aux variables et
non pour leur aectation, qui concerne toujours la porte imbrique. Les variables locales sont lues
et crites dans la porte la plus intrieure ; les variables globales sont lues et crites dans lespace
de noms global. Linstruction nonlocal permet dcrire dans la porte globale.
new-style class (style de classe nouveau)
Vieille dnomination pour le style de programmation de classe actuellement utilis. Dans les versions prcdentes de Python, seul le style de classe nouveau pouvait bncier des nouvelles caractristiques de Python, comme __slots__, les descripteurs, les proprits, __getattribute__(), les
mthodes de classe et les mthodes statiques.
object (objet) [cf. p. ]
Toute donne comprenant un tat (aribut ou valeur) et un comportement dni (mthodes). galement la classe de base ultime du new-style class.
positional argument (argument de position)
Arguments aects aux noms locaux internes une fonction ou une mthode, dtermins par
lordre donn dans lappel. La syntaxe * accepte plusieurs arguments de position ou fournit une
liste de plusieurs arguments une fonction. Voir argument.
property (proprit) [cf. p. ]
Aribut dinstance permeant dimplmenter les principes de lencapsulation.
Python
Surnom de la version de Python (forg il y a longtemps, quand la version tait un projet lointain).
Aussi abrg Pyk .
Pythonic (pythonique)
Ide ou fragment de code plus proche des idiomes du langage Python que des concepts frquemment
utiliss dans dautres langages. par exemple, un idiome frquent en Python est de boucler sur les
lments dun iterable en utilisant linstruction for. Beaucoup dautres langages nont pas ce type
de construction et donc les utilisateurs non familiers avec Python utilisent parfois un compteur
numrique :

for i in range(len(food)) :
print(food[i])

Au lieu dutiliser la mthode claire et pythonique :


for piece in food :
print(piece)

reference count (nombre de rfrences) [cf. p. ]


Nombre de rfrences dun objet. and le nombre de rfrences dun objet tombe zro, lobjet est
dsallou. Le comptage de rfrences nest gnralement pas visible dans le code Python, mais cest
un lment cl de limplmentation de CPython. Le module sys dnit la fonction getrefcount()
que les programmeurs peuvent appeler pour rcuprer le nombre de rfrences dun objet donn.
__slots__
Une dclaration lintrieur dune classe de style nouveau qui conomise la mmoire en prdclarant lespace pour les aributs et en liminant en consquence les dictionnaires dinstance.
Bien que populaire, cee technique est quelque peu dicile mere en place et doit tre rserve
aux rares cas o il y a un nombre important dinstances dans une application o la mmoire est
rduite.
sequence (squence) [cf. p. ]
Un iterable qui ore un accs ecace aux lments en utilisant des index entiers et les mthodes spciales __getitem__() et __len__(). Des types squences incorpors sont list, str, tuple et unicode.
Notez que le type dict comporte aussi les mthodes __getitem__() et __len__(), mais est considr
comme une table associative plutt que comme une squence car la recherche se fait laide de cls
arbitraires immuables au lieu dindex.
slice (tranche) [cf. p. ]
Objet contenant normalement une partie dune squence. Une tranche est cre par une notation indexe utilisant des : entre les index quand plusieurs sont donns, comme dans variable_name[1:3:5].
La notation crochet utilise les objets slice de faon interne.
special method (mthode spciale) [cf. p. ]
Mthode appele implicitement par Python pour excuter une certaine opration sur un type, par
exemple une addition. Ces mthodes ont des noms commenant et nissant par deux caractres
souligns. Les mthodes spciales sont documentes dans Special method names.
statement (instruction) [cf. p. ]
Une instruction est une partie dune suite, dun bloc de code. Une instruction est soit une expression soit une ou plusieurs constructions utilisant un mot cl comme if, while ou for.
triple-quoted string (chane multi-ligne) [cf. p. ]
Une chane dlimite par trois guillemets () ou trois apostrophes (). Bien quelles ne fournissent
pas de fonctionnalits direntes de celles des chanes simplement dlimites, elles sont utiles pour
nombre de raisons. Elles permeent dinclure des guillemets ou des apostrophes non protgs et
elles peuvent stendre sur plusieurs lignes sans utiliser de caractre de continuation, et sont donc
spcialement utiles pour rdiger des chanes de documentation.
type (type) [cf. p. ]
Le type dun objet Python dtermine de quelle sorte dobjet il sagit ; chaque objet possde un type.
Le type dun objet est accessible grce son aribut __class__ ou peut tre retourn par la fonction
type(obj).
view (vue)
Les objets retourns par dict.keys(), dict.values() et dict.items() sont appels des dictionary
views. ce sont des squences paresseuses qui laisseront voir les modications du dictionnaire
sous-jacent. Pour forcer le dictionary view tre une liste complte, utiliser list(dictview). Voir
Dictionary view objects.
virtual maine (machine virtuelle) [cf. p. ]
Ordinateur entirement dni par un programme. La machine virtuelle Python excute le bytecode
gnr par le compilateur.
. Lvaluation paresseuse est une technique de programmation o le programme nexcute pas de code avant que les rsultats
de ce code ne soient rellement ncessaires. Le terme paresseux (en anglais lazzy evaluation) tant connot ngativement en
franais on parle aussi dvaluation retarde .

Zen of Python [cf. p. ]


Une liste de principes mthodologiques et philosophiques utiles pour la comprhension et lutilisation du langage Python. Cee liste peut tre obtenue en tapant import this dans linterprteur
Python.

Table des matires

Introduction
. Principales caractristiques du langage Python . . . . . .
. Matriel et logiciel . . . . . . . . . . . . . . . . . . . . . . .
.. Lordinateur . . . . . . . . . . . . . . . . . . . . . .
.. Deux sortes de programmes . . . . . . . . . . . . .
. Langages . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Des langages de dirents niveaux . . . . . . . .
.. Trs bref historique des langages . . . . . . . . . .
. Production des programmes . . . . . . . . . . . . . . . . .
.. Deux techniques de production des programmes
.. Technique de production de Python . . . . . . . .
.. Construction des programmes . . . . . . . . . . .
. Algorithme et programme . . . . . . . . . . . . . . . . . . .
.. Dnitions . . . . . . . . . . . . . . . . . . . . . . .
.. Prsentation des programmes . . . . . . . . . . . .
. Implmentations de Python . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

La calculatrice Python
. Les modes dexcution . . . . . . . . . . . . . . . . . . . .
.. Les deux modes dexcution dun code Python
. Identicateurs et mots cls . . . . . . . . . . . . . . . . .
.. Identicateurs . . . . . . . . . . . . . . . . . . . .
.. Style de nommage . . . . . . . . . . . . . . . . . .
.. Les mots rservs de Python . . . . . . . . . .
. Notion dexpression . . . . . . . . . . . . . . . . . . . . .
. Les types de donnes entiers . . . . . . . . . . . . . . . .
.. Le type int . . . . . . . . . . . . . . . . . . . . . .
.. Le type bool . . . . . . . . . . . . . . . . . . . . .
. Les types de donnes oants . . . . . . . . . . . . . . .
.. Le type float . . . . . . . . . . . . . . . . . . . . .
.. Le type complex . . . . . . . . . . . . . . . . . . .
. Variables et aectation . . . . . . . . . . . . . . . . . . . .
.. Les variables . . . . . . . . . . . . . . . . . . . . .
.. Laectation . . . . . . . . . . . . . . . . . . . . .
.. Aecter nest pas comparer ! . . . . . . . . . . .
.. Les variantes de laectation . . . . . . . . . . .
.. Reprsentation graphiques des aectations . .
. Les chanes de caractres . . . . . . . . . . . . . . . . . .
.. Prsentation . . . . . . . . . . . . . . . . . . . . .
.. Oprations . . . . . . . . . . . . . . . . . . . . . .
.. Fonctions vs mthodes . . . . . . . . . . . . . . .
.. Mthodes de test de ltat dune chane . . . . .
.. Mthodes retournant une nouvelle chane . . .
.. Indexation simple . . . . . . . . . . . . . . . . . .
.. Extraction de sous-chanes . . . . . . . . . . . .
. Les donnes binaires . . . . . . . . . . . . . . . . . . . . .
. Les entres-sorties . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

..
..
..

Les entres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Les sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Les squences dchappement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Contrle du ux dinstructions
. Instructions composes . . . . . . . . . . . . . .
. Choisir . . . . . . . . . . . . . . . . . . . . . . . .
.. Choisir : if - [elif] - [else] . . . . .
.. Syntaxe compacte dune alternative . .
. Boucles . . . . . . . . . . . . . . . . . . . . . . . .
.. Rpter : while . . . . . . . . . . . . . . .
.. Parcourir : for . . . . . . . . . . . . . . .
. Ruptures de squences . . . . . . . . . . . . . . .
.. interrompre une boucle : break . . . . .
.. Court-circuiter une boucle : continue .
.. Utilisation avance des boucles . . . . .
.. Traitement des erreurs : les exceptions

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

Conteneurs standard
. Squences . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Dnition, syntaxe et exemples . . . . . . . . . .
.. Initialisations et tests dappartenance . . . . . . .
.. Mthodes . . . . . . . . . . . . . . . . . . . . . . . .
.. Manipulation des tranches (ou sous-chanes)
.. Squences de squences . . . . . . . . . . . . . . .
. Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. Retour sur les rfrences . . . . . . . . . . . . . . . . . . .
.. Complment graphique sur lassignation . . . . .
. Tableaux associatifs . . . . . . . . . . . . . . . . . . . . . .
.. Dictionnaires (dict) . . . . . . . . . . . . . . . . . .
. Ensembles (set) . . . . . . . . . . . . . . . . . . . . . . . . .
. Fichiers textuels . . . . . . . . . . . . . . . . . . . . . . . . .
.. Introduction . . . . . . . . . . . . . . . . . . . . . .
.. Gestion des chiers . . . . . . . . . . . . . . . . . .
. Itrer sur les conteneurs . . . . . . . . . . . . . . . . . . . .
. Achage format . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Fonctions et espaces de noms


. Dnition et syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. Passage des arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Mcanisme gnral . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Un ou plusieurs paramtres, pas de retour . . . . . . . . . . . . .
.. Un ou plusieurs paramtres, un ou plusieurs retours . . . . . . .
.. Passage dune fonction en paramtre . . . . . . . . . . . . . . . .
.. Paramtres avec valeur par dfaut . . . . . . . . . . . . . . . . . .
.. Nombre darguments arbitraire : passage dun tuple de valeurs
.. Nombre darguments arbitraire : passage dun dictionnaire . . .
. Espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Porte des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Rsolution des noms : rgle LGI . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

Modules et paages
. Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Import . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Exemples . . . . . . . . . . . . . . . . . . . . . . . . .
. Baeries included . . . . . . . . . . . . . . . . . . . . . . . . .
. Python scientique . . . . . . . . . . . . . . . . . . . . . . . .
.. Bibliothques mathmatiques et types numriques

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

La Programmation Oriente Objet


. Terminologie . . . . . . . . . . . . . . . . . . . . . .
.. Notations UML de base . . . . . . . . . . .
. Classes et instanciation dobjets . . . . . . . . . . .
.. Linstruction class . . . . . . . . . . . . . .
.. Linstanciation et ses aributs . . . . . . .
.. Retour sur les espaces de noms . . . . . . .
. Mthodes . . . . . . . . . . . . . . . . . . . . . . . . .
. Mthodes spciales . . . . . . . . . . . . . . . . . . .
.. Linitialisateur . . . . . . . . . . . . . . . . .
.. Surcharge des oprateurs . . . . . . . . . .
.. Exemple de surcharge . . . . . . . . . . . .
. Hritage et polymorphisme . . . . . . . . . . . . . .
.. Hritage et polymorphisme . . . . . . . . .
.. Exemple dhritage et de polymorphisme
. Notion de conception oriente objet . . . . . . . . .
.. Association . . . . . . . . . . . . . . . . . . .
.. Drivation . . . . . . . . . . . . . . . . . . .
. Un exemple complet . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

La POO graphique
. Programmes pilots par des vnements
. La bibliothque tkinter . . . . . . . . . .
.. Prsentation . . . . . . . . . . . .
.. Les widgets de tkinter . . . . . .
.. Le positionnement des widgets .
. Trois exemples . . . . . . . . . . . . . . .
.. Une calculee . . . . . . . . . . .
.. tkPhone, un exemple sans menu
.. IDLE, un exemple avec menu . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

Teniques avances
. Techniques procdurales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Le pouvoir de lintrospection . . . . . . . . . . . . . . . . . . . . . . .
.. Gestionnaire de contexte (ou bloc gard) . . . . . . . . . . . . . . . .
.. Utiliser un dictionnaire pour lancer des fonctions ou des mthodes
.. Les fonctions rcursives . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Les listes dnies en comprhension . . . . . . . . . . . . . . . . . .
.. Les dictionnaires dnis en comprhension . . . . . . . . . . . . . .
.. Les ensembles dnis en comprhension . . . . . . . . . . . . . . . .
.. Les gnrateurs et les expressions gnratrices . . . . . . . . . . . .
.. Les fonctions incluses . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Les dcorateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. Techniques objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Les Functors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Les accesseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Le duck typing et les annotations . . . . . . . . . . . . . . . . . . . . .
. Techniques fonctionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Directive lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Les fonctions map, filter et reduce . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.

.. Linterprteur IPython . . . . . . .
.. La bibliothque NumPy . . . . . . . .
.. La bibliothque matplotlib . . . .
.. La bibliothque SymPy . . . . . . . .
Bibliothques tierces . . . . . . . . . . . . .
.. Une grande diversit . . . . . . . .
.. Un exemple : la bibliothque Unum
Packages . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.

.. Les applications partielles de fonctions . . . . .


La persistance et la srialisation . . . . . . . . . . . . . .
.. Srialisation avec pickle et json . . . . . . . . .
.. Stockage avec sqlite3 . . . . . . . . . . . . . . .
Les tests . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Tests unitaires et tests fonctionnels . . . . . . .
.. Module unittest . . . . . . . . . . . . . . . . . .
La documentation des sources . . . . . . . . . . . . . . .
.. Le format reST . . . . . . . . . . . . . . . . . . . .
.. Le module doctest . . . . . . . . . . . . . . . . .
.. Le dveloppement dirig par la documentation

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

A Interlude

B Passer du problme au programme

C Jeux de caractres et encodage

D Les expressions rgulires

E Exercices corrigs

Bibliographie et Webographie

Memento Python

Abrg dense Python

Index

Glossaire

Table des matires

Table des gures


.
.
.

Chane de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chane dinterprtation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interprtation du bytecode compil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.

La boucle dvaluation de linterprteur Python


Laectation illustre. . . . . . . . . . . . . . . . .
Lindexation dune chane . . . . . . . . . . . . . .
Extraction de sous-chanes . . . . . . . . . . . . .
Les entres-sorties. . . . . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.

Assignation augmente dun objet non modiable. . . . . . . . . . . . . . . . . . . . . . . . . .


Assignation augmente dun objet modiable. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Oprations sur les ensembles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.

Les avantages de lutilisation des fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Passage par aectation des arguments dappel aux paramtres de dnition. . . . . . . . . .
Rgle LGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.

IPython

en mode console texte ou graphique.


. . . . . . . . . . . . . . . . .
Trac dun sinus cardinal. . . . . . . . . . . . .
Exprimenter SymPy avec live sympy . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.

Diagrammes de classe. . . . . . . . . . . . . . . . . . . . . . . . .
Une association peut tre tiquete et avoir des multiplicits.
Une voiture est un tout qui contient un moteur. . . . . . . . .
On peut mler les deux types dassociation. . . . . . . . . . . .
Un Ion est-un Atome. . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

Deux styles de programmation. . . . . . . .


Un exemple simple : lachage dun Label .
Une calculee graphique minimale. . . . . .
tkPhone. . . . . . . . . . . . . . . . . . . . . .
IDLE. . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

En Python, tous les aributs (donnes, mthodes) sont publics ! . .


Conception UML de la classe Cercle. . . . . . . . . . . . . . . . . . .
PFA applique un widget . . . . . . . . . . . . . . . . . . . . . . . .
Visualisation dun chier de base de donnes sqlite . . . . . . . . .
Exemple de sortie au format PDF. . . . . . . . . . . . . . . . . . . . .
Documentation au format html du script test_documentation2.py.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

ipython notebook

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

C. Table ASCII. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C. Extrait de la table Unicode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Você também pode gostar