Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Sommaire
Introduction
La calculatrice Python
Contrle du ux dinstructions
Conteneurs standard
Modules et paages
La POO graphique
Teniques avances
A Interlude
E Exercices corrigs
Bibliographie et Webographie
Memento Python
Index
Glossaire
Avant-propos
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 .
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.
Introduction
. Matriel et logiciel
..
Lordinateur
..
Langages
..
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.
--
Introduction
Des centaines de langages ont t crs, mais lindustrie nen utilise quune minorit.
.
source
compilateur
objet
excuteur
rsultat
F . Chane de compilation
Dans la technique de linterprtation chaque ligne du source analys est traduite au fur et mesure en
instructions directement excutes. Aucun programme objet nest gnr. Cee technique est trs souple
mais les codes gnrs sont peu performants : linterprteur doit tre utilis chaque nouvelle excution
.
source
interprteur
rsultat
F . Chane dinterprtation
.
source
compilateur
bytecode
interprteur
rsultat
Introduction
..
. Algorithme et programme
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.
..
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 .
--
La calculatrice Python
>>>
Rachage de linvite.
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
..
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.
id3 = 7
... else:
...
id3 = -4
Dnition
Le type dun objet Python dtermine de quelle sorte dobjet il sagit.
--
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
2013
>>> 0b11111011101
# binaire (base 2)
2013
>>> 0o3735
# octal (base 8)
2013
>>> 0x7dd
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
2
>>> abs(3 - 20)
# valeur absolue
17
Bases usuelles
Un entier crit en base (par exemple 179) peut tre reprsent en binaire, octal et hexadcimal en
utilisant les syntaxes suivantes :
# 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
..
Le type bool
>>> 2 > 8
False
>>> 2 <= 8 < 15
True
--
La calculatrice Python
et
True.
Les
not(a)
False
True
True
False
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.
.. Le type float
Un float est not avec un point dcimal (jamais avec une virgule) ou en notation exponentielle
avec un e symbolisant le puissance suivi des chires de lexposant. Par exemple :
2.718
.02
-1.6e-19
6.023e23
.. Le type complex
Les complexes sont crits en notation cartsienne forme de deux oants.
La partie imaginaire est suxe par j :
>>> print(1j)
1j
>>> print((2+3j) + (4-7j))
(6-4j)
>>> print((9+5j).real)
9.0
>>> print((9+5j).imag)
5.0
--
La calculatrice Python
>>> print((abs(3+4j)))
. Variables et aectation
# module
5.0
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
- -
La calculatrice Python
>>> a
2
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
# affectation simple
>>> v += 2
>>> v
6
>>> c = d = 8
>>> c, d
(8, 8)
>>> e, f = 2.7, 5.1
>>> (e, f)
(2.7, 5.1)
>>> g, h = [G, H]
>>> [g, h]
[G, H]
>>> a = 3
>>> a, b = a + 2, a * 2
>>> a, b
(5, 6)
- -
La calculatrice Python
x = a
y = b
z = .c
z =. y
x = 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 :
- -
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
upper().
>>> abracadabra.upper()
ABRACADABRA
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
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
>>> s.startswith(cH)
True
>>> s.endswith(aSSe)
False
..
>>> s.center(20, -)
----cHAise basSe--->>> s.rjust(20, @)
@@@@@@@@cHAise basSe
zfill(width)
>>> s.zfill(20)
00000000cHAise basSe
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
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)
- -
La calculatrice Python
.. Indexation simple
Pour indexer une chane, on utilise loprateur [ ] dans lequel lindex, un entier sign qui commence
0 indique la position dun caractre :
>>> s = 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]
.. 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
ayo
>>> s[-2:]
X
>>> s[:3]
Ray
>>> s[3:]
on X
>>> s[::2]
# du dbut la fin, de 2 en 2
RynX
>>> s[::-1]
X noyaR
- -
permet
La calculatrice Python
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
.. 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()
>>>
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)
d \144 \x64
- -
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]
... elif x % 2 != 0:
...
...
... else:
...
...
x est positif et impair
ce qui est bien aussi !
...
La condition est vraie
..
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 :
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]
.. 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
...
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]
: ))
: ))
.. 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
..
if x == 5:
...
break
...
print(x, end= )
...
1 2 3 4
>>> print(Boucle interrompue pour x =, x)
Boucle interrompue pour x = 5
..
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
..
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
: ))
: ))
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
if cible == entier:
...
...
break
# voici linterruption !
... else:
...
...
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:
...
...
break
# voici linterruption !
... else:
...
...
6 est absent de la squence [2, 11, 8, 7, 5]
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).
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 :
- -
Contrle du ux dinstructions
. Ruptures de squences
# traitement de lexception 1
# traitement de lexception 2
...
else:
...
finally:
...
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
. Squences
Dnition
Une squence est un conteneur ordonn dlments indexs par des entiers indiquant leur position
dans le conteneur.
. 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.
Conteneurs standard
. Listes
..
..
Mthodes
- -
. Tuples
Conteneurs standard
>>> 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:
...
...
...
...
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.
- -
Conteneurs standard
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
Nous avons dj vu que lopration daectation, apparemment innocente, est une relle dicult de
Python.
i = 1
msg = Quoi de neuf ?
e = 2.718
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[:]
>>> c.append(5)
>>> c
[1, 2, 3, 4, 5]
>>> d = copy.copy(a)
>>> 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)
>>> nouvelle_liste_de_dicos
[{a: [1, 2], b: [3, 4]}, {c: (4, 5, 6)}]
7+2
[0]
[1]
. 1]
m += [6,
+=
[0]
[1]
. 1]
m += [6,
[0]
[1]
[2]
[3]
. 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.
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 = {}
>>> 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)
>>> d4
{taille: 176, nom: 3}
>>>
>>> d5 = dict([(nom, 3), (taille, 176)])
>>> 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
{s, p, a}
>>> p in X
True
>>> m in Y
False
>>> X - Y
{m}
>>> Y - X
set()
>>> X ^ 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).
. Remarquez que lon prcise lencoding. Ceci sera justi ultrieurement (cf. annexe C p. )
- -
Conteneurs standard
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()
>>> f.close()
>>> f = open(truc.txt, r, encoding=utf8)
>>> s = f.readlines()
>>> f.close()
>>> s = f.readline()
>>> f.close()
>>>
>>> # Affichage des lignes dun fichier une une
>>> f = open(truc.txt, encoding=utf8)
print(ligne)
...
>>> f.close()
- -
. Aage format
Conteneurs standard
print(i, ->, v)
...
0 -> tic
1 -> tac
2 -> toe
...
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 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
- -
Conteneurs standard
. Aage format
{0!r}.format(texte\n))
texte
texte\n
Formatages numriques :
s = int
print(s) # int
s = int
print(s) # int
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)
: 3.14
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))
[
>>> print([{:^25}].format(s))
[
>>> 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.
- -
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.
. Dnition et syntaxe
A
A
APPEL/RETOUR
C
B
D
APPEL/RETOUR
B
E.
return k/n
p2 = util.proportion(une_autre_chaine, des)
...
sous-problme
sous-
sous-
complexe
problme 1
problme 2
sous-
sous-
problme 3
problme 4
- -
somme = a + b
produit = a * b
print(La somme de, a, et, b, est, somme, et le produit, produit)
dfinition
appel
c, d = maFonction(7, k, 1.618)
.
F . Passage par aectation des arguments dappel aux paramtres de dnition.
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)
. Une fonction vaut quelque chose, une procdure fait quelque chose.
- -
: ))
: ))
s, v = surfaceVolumeSphere(rayon)
print(Sphre de surface { :g} et de volume { :g}.format(s, v))
..
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
..
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):
...
...
>>> 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
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
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)
- -
. Espaces de noms
2.718
>>> print(math.pi)
3.141592653589793
..
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.
..
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
: porte locale
z = x + y
return z
x = 99
print(fonc(1)) # 100
print(x) # 99
- -
. Espaces de noms
- -
Modules et packages
. 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.
.. 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
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)
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))
optional arguments:
-h, --help
--sum
- -
. Batteries included
Modules et paages
positional arguments:
N
optional arguments:
-h, --help
--sum
$ 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
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
- -
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)])
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.
..
- -
. 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 ;
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
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
Out[5]: array([
2.5,
5. ,
7.5,
10. ])
# 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
- -
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])
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()
. 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
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)
- -
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
..
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 !
..
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
- -
. 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__
- -
. 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
..
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.
(b) Un hritage
F . Diagrammes de classe.
..
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.
..
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]
- -
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.
x = v + 3
...
y = x + 1
...
>>> a = C()
>>> a.x
8
>>> a.x = 2
- -
. Mthodes
>>> a.x
2
>>> C.x
8
>>> C.x = -1
>>> 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:
...:
...:
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
# 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)
...
print(self.z)
...
>>> obj = C()
>>> obj.affiche()
- -
. Mthodes spciales
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:
...
...
...
>>> une_instance = C(42)
>>> une_instance.x
42
Cest une procdure automatiquement invoque lors de linstanciation : elle ne retourne aucune valeur.
Mthode spciale
__neg__
Utilisation
-obj1
__add__
obj1 + obj2
__sub__
obj1 - obj2
__mul__
obj1 * obj2
__div__
obj1 / obj2
__floordiv__
obj1 // obj2
- -
..
. 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:
...
...
...
...
...
...
...
# addition vectorielle
...
>>> 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.
..
Dans lexemple suivant, la classe QuadrupedeDebout hrite de la classe mre Quadrupede, et la mthode
est polymorphe :
piedsAuContactDuSol()
def piedsAuContactDuSol(self):
return 4
...
>>> class QuadrupedeDebout(Quadrupede):
...
...
def piedsAuContactDuSol(self):
return 2
...
>>> chat = Quadrupede()
>>> chat.piedsAuContactDuSol()
4
>>> homme = QuadrupedeDebout()
>>> homme.piedsAuContactDuSol()
2
repr()
- -
et
str().
.. Association
Dnition
Une association reprsente un lien unissant les instances de classe. Elle repose sur la relation a-un
ou utilise-un .
.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
Agrgation
Dnition
Une agrgation est une association non symtrique entre deux classes (lagrgat et le composant).
- -
Composition
Dnition
Une composition est un type particulier dagrgation dans laquelle la vie des composants est lie
celle de lagrgat.
..
Drivation
Dnition
La drivation dcrit la cration de sous-classes par spcialisation. Elle repose sur la relation est-un .
...
...
...
self.nom = rectangle
def __str__(self):
...
...
>>> class Carre(Rectangle):
# hritage simple
...
...
...
...
super().__init__(cote, cote)
...
...
>>> r = Rectangle()
>>> c = Carre()
>>> print(r)
nom : rectangle
>>> print(c)
nom : carr
- -
. Un exemple complet
. Un exemple complet
Le script suivant propose un modle simpli datome et dion.
La variable de classe table liste les premiers lments du tableau de Mendeleev.
class Atome :
atomes simplifis (les 10 premiers lments).
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])
Nom de llment
: bore
: lithium
. adapt de [], p. .
- -
. Un exemple complet
: oxygene
- -
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.
. 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
..
Dnition
On appelle widget (mot valise, contraction de window et gadget) les composants graphiques de base
dune bibliothque.
. 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 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()
- -
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,
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,
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
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
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
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 clear(self) :
self.nameEnt.delete(0, end)
self.phoneEnt.delete(0, end)
..
IDLE,
- -
La POO graphique
. Trois exemples
tkinter .
F . IDLE.
- -
. 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.
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
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__)
. 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
try :
fh = open(filename)
for line in fh :
process(line)
finally :
fh.close()
with open(filename) as fh :
for line in fh :
process(line)
- -
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
Miaou
Attention au *OUILLE* !
Miaou
Ouah
nous avons rencontr 2 flin(s)
Les animaux rencontrs sont
..
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
..
Dnition
Une liste en comprhension est quivalente une boucle for qui construirait la mme liste en utilisant
la mthode append().
result2 = []
for x in une_seq :
result2.append(x+1)
result4 = []
for x in une_seq :
if x > 23:
result4.append(x+1)
result6 = []
for x in une_seq :
for y in une_autre :
result6.append(x+y)
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])):
...
...
-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 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
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\
- -
grep
. Teniques procdurales
Teniques avances
Fonction fabrique.
...
def plus(increment):
...
...
...
...
>>>
>>> p = creer_plus(23)
>>> q = creer_plus(42)
>>>
>>> print(p(100) =, p(100))
(p(100) =, 123)
>>> print(q(100) =, q(100))
(q(100) =, 142)
def uneMethode(self):
...
print(normal)
...
>>> class CasSpecial:
...
def uneMethode(self):
...
print(spcial)
...
>>> def casQuiConvient(estNormal=True):
...
...
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
- -
Teniques avances
. Teniques objets
...
def f3() :
...
@f1 @f2 @f3
def g() :
pass
:, cptr)
Fonction decore
: 1
3
Fonction decore
: 1
3
Fonction decore
: 2
7
Fonction decore
: 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():
...
...
>>> callable(maFonction)
True
. callable en anglais.
. Cee notion sera dveloppe ultrieurement [cf. p. ]
- -
. Teniques objets
Teniques avances
Il est possible de transformer les instances dune classe en functor si la mthode spciale __call__()
est dnie dans la la classe :
>>> class A:
...
def __init__(self):
...
...
self.historique = []
def __call__(self, a, b):
...
self.historique.append((a, b))
...
return a + b
...
>>> a = A()
>>> a(1, 2)
3
>>> a(3, 4)
7
>>> a(5, 6)
11
>>> a.historique
[(1, 2), (3, 4), (5, 6)]
.. Les accesseurs
Le problme de lencapsulation
Dans le paradigme objet, ltat dun objet est priv, les autres objets nont pas le droit de le consulter
ou de le modier.
Classiquement, on distingue les visibilits suivantes :
publique ;
protge ;
prive.
- -
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.
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
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
..
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
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):
...
...
>>> ma_fonction(1, 2, 3)
1 2 3
>>> ma_fonction(1, 2)
1 2 valeur_par_dfaut
>>> ma_fonction.__annotations__
- -
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
return x**2
...
>>> print(f(8))
64
>>>
>>> g = lambda x : x**2
>>> print(g(8))
64
..
. cf. Wikipedia
- -
. Teniques fonctionnelles
Teniques avances
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().
...
>>> f(1, 2, 3, 4)
1234
>>> g = partial(f, 1, 2, 3)
>>> g(4)
1234
>>> h = partial(f, 1, 2)
>>> h(3, 4)
1234
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.
..
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
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))
- -
. Les tests
Teniques avances
Le chier tel_bd produit peut tre visualis par le programme SQLite database browser (+ Fig. .).
. Les tests
Ds lors quun programme dpasse le stade du petit script, le problme des erreurs et donc des tests
se pose invitablement .
Dnition
Un test consiste appeler la fonctionnalit spcie dans la documentation, avec un scnario qui
correspond un cas dutilisation, et vrier que cee fonctionnalit se comporte comme prvu.
- -
Teniques avances
..
. Les tests
Module unittest
Le module standard unittest fournit loutil PyUnit, outil que lon retrouve dans dautres langages : 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
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()
- -
Teniques avances
.. Le format reST
Le format reStructuredText, communment appel reST est un systme de balises utilis pour formater
des textes.
la dirence de LATEX ou dHTML il enrichit le document de manire non intrusive , cest--dire
que les chiers restent directement lisibles.
docutils
Le projet docutils, qui inclut linterprteur reST, fournit un jeu dutilitaires :
rst2html gnre un rendu html avec une feuille de style css intgre ;
rst2latex cre un chier LATEX quivalent ;
rst2s5 construit une prsentation au format s, qui permet de crer des prsentations interactives en
HTML.
Sphinx
Sphinx est un logiciel libre de type gnrateur de documentation. Il sappuie sur des chiers au format
reStructuredText, quil convertit en HTML, PDF, man, et autres formats.
De nombreux projets utilisent Sphinx pour leur documentation ocielle, cf. http://sphinx-doc.org/
examples.html
rstpdf
Par ailleurs, le programme rst2pdf gnre directement une documentation au format PDF.
Voici un exemple simple de chier texte au format reST.
On remarque entre autres que :
la principale balise est la ligne blane qui spare les direntes structures du texte ;
la structuration se fait en soulignant les titres des sections de dirents niveaux avec des caractres
de ponctuation (= - _ : , etc.). chaque fois quil rencontre un texte ainsi soulign, linterprteur
associe le caractre utilis un niveau de section ;
un titre est gnralement soulign et surlign avec le mme caractre, comme dans lexemple suivant :
======================
Fichier au format reST
======================
Section 1
=========
On est dans la section 1.
Sous-section
~~~~~~~~~~~~
. cf. [], p.
- -
Teniques avances
..
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.
- -
Teniques avances
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)
>>> 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
>>> 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.
..
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. .
- -
Teniques avances
Source du module :
import doctest
doctest.testfile(test_documentation2.txt, verbose=True)
- -
A A
Interlude
Le Zen de Python
Prre
la beaut la laideur,
lexplicite limplicite,
le simple au complexe,
le complexe au compliqu,
le droul limbriqu,
lar au compact.
Prends en compte la lisibilit.
Les cas particuliers ne le sont jamais assez pour violer les rgles.
Mais, la puret, privilgie laspect pratique.
Ne passe pas les erreurs sous silence,
Ou billonne-les explicitement.
Face lambigut, deviner ne te laisse pas aller.
Sache quil ne devrait avoir quune et une seule faon de procder.
Mme si, de prime abord, elle nest pas vidente, moins dtre Nerlandais.
Mieux vaut maintenant que jamais.
Cependant jamais est souvent mieux quimmdiatement.
Si limplmentation sexplique dicilement, cest une mauvaise ide.
Si limplmentation sexplique aisment, cest peut-tre une bonne ide.
Les espaces de noms, sacre bonne ide ! Faisons plus de trucs comme a !
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
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/
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.
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
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.
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 .
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)
ou :
# -*- coding : latin1 -*-
. Retour chap. , p.
. Notons que utf8 et latin1 sont des alias de utf-8 et latin-1.
- -
A D
Introduction
Ds les dbuts de linformatique, les concepteurs des systmes dexploitation eurent lide dutiliser
des mtacaractres permeant de reprsenter des modles gnraux. Par exemple, dans un shell Linux ou
dans une fentre de commande Windows, le symbole * remplace une srie de leres, ainsi *.png indique
tout nom de chier contenant lextension png. Python ore en standard les modules glob et fnmatch pour
utiliser la notations des mtacaractres.
Depuis ces temps historiques, les informaticiens ont voulu gnraliser ces notations. On distingue
classiquement trois stades dans lvolution des expressions rgulires :
les expressions rgulires de base (BRE, Basic Regular Expressions) ;
les expressions rgulires tendues (ERE, Extended Regular Expressions) ;
les expressions rgulires avances (ARE, Advanced Regular Expressions).
Trois stades auxquels il convient dajouter le support de lencodage Unicode.
Python supporte toutes ces volutions.
\$
un dollar et
\
\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
- -
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}
Exemples
On propose plusieurs exemples dextraction de dates historiques telles que 14
- -
juillet 1789.
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
:, 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())
- -
nbr = re.compile(r\d+)
print(En hexa
Ce qui ache :
Premier anniversaire : Bastille le 14 juillet 1790
En hexa : Bastille le 0xe juillet 0x6fd
&
\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
. 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 :
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
@
@@
: verif.py
#
# auteur
: Bob Cordeau
#==============================================================================
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from sys import exit
# 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
:) # Erreur
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from math import pi
: ))
: ))
volume = (pi*rayon*rayon*hauteur)/3.0
print(Volume du cne =, volume, m3)
F
# -*- coding : utf8 -*Calcul dun prix TTC.
: { :.2f}\n.format(prixHT * 1.196))
F
# -*- coding : utf8 -*Somme dentiers et nombre dentiers suprieur 100.
:, somme)
F
- -
Exercices corrigs
# -*- coding : utf8 -*Parit.
: ))
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.
: ))
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.
: ))
while n < 1:
n = int(input(Entrez un entier STRICTEMENT POSITIF, s.v.p.
: ))
F
# -*- coding : utf8 -*Approximation de e.
- -
Exercices corrigs
: { :.3f}.format(exp))
F
# -*- coding : utf8 -*Gardien de phare.
F
# -*- coding : utf8 -*Permis de chasse.
:, end= )
if payer == 0:
print(rien payer)
else :
print(payer, euros)
F
# -*- coding : utf8 -*Histoire de train.
- -
Exercices corrigs
F
# -*- coding : utf8 -*Proportion dune squence dans une chane dADN.
def proportion(a, s) :
Retourne la proportion de la squence <s> dans la chane <a>.
return 100*a.count(s)/len(a)
def saisie(ch) :
s = input({ :s}
: .format(ch))
: .format(ch))
return s
F
# -*- coding : utf8 -*Echanges.
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, randint
:)
:)
F
# -*- coding : utf8 -*Amplitude et moyenne dune liste de flottants.
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, random
- -
Exercices corrigs
: ))
: ))
: { :.2f}.format(max(t) - min(t)))
: { :.2f}.format(sum(t)/n))
F
# -*- coding : utf8 -*Min, max et moyenne dune liste dentiers.
: {0[0]}, max
: {0[1]}, moy
: {0[2]}.format(l))
F
# -*- coding : utf8 -*Nombres romains (version 1).
: ))
: ))
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]
)
F
# -*- coding : utf8 -*Liste dentiers diffrents.
# Import ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from random import seed, randint
- -
Exercices corrigs
: ))
: ))
# 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
: ))
: ))
F
# -*- coding : utf8 -*Jeu de ds (1).
- -
Exercices corrigs
n = int(input(Entrez un entier [2 .. 12]
: ))
: ))
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).
: ))
: ))
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
: .format(MAX)))
: .format(MAX)))
: .format(nbd, 6*nbd)))
: .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
: .format(MAX)))
: .format(MAX)))
: .format(d, 6*d)))
.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
: {}
.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, .
Types de base
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",)
[]
()
non modifiable
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
Affectation de variables
la squence en paramtre
x = 1.2+8+sin(0)
dict([(3,"trois"),(1,"un")])
conteneur de plusieurs
valeurs (ici un tuple)
incrmentation
x-=2
dcrmentation
valeur constante non dfini
{1:'un',3:'trois'}
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"""
noms de
variables
dict
' chapp
non modifiable,
squence ordonne de caractres
":".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
1
-5
2
-4
3
-3
4
-2
5
-1
lst[1]67
lst[-2]42
lst[0]11 le premier
lst[-1]1968 le dernier
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]
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
Maths
Oprateurs: + - * / // % **
(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
ab
entire reste
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")
s = 0
i = 1 initialisations avant la boucle
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
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
Affichage / Saisie
print("v=",3,"cm:",x,",",y+4)
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)
s = input("Directives:")
input retourne toujours une chane, la convertir vers le type
dsir (cf encadr Conversions au recto).
s.update(s2)
s.add(cl) s.remove(cl)
s.discard(cl)
Fichiers
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)
en criture
encodage des
caractres pour les
fichiers textes:
utf8 ascii
latin1
en lecture
for ligne in f:
bloc de traitement de la ligne
de squences d'entiers
non compris
def nomfct(p_x,p_y,p_z):
"""documentation"""
# bloc instructions, calcul de res, etc.
valeur rsultat de l'appel.
return res
r = nomfct(3,i+2,2*i)
Appel de fonction
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
<>^=
+ - 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)
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
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)
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
Abrg ncessairement incomplet pour tenir sur une feuille, voir sur
http://docs.python.org/py3k.
Contexte Gr
with garde() as v :
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
-6
-5
-4
-3
-2
-1
-6
-5
-4
-3
-2
-1
+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):
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
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
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):
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.
@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)
>>> 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
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.
for i in range(len(food)) :
print(food[i])
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 . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Modules et paages
. Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Import . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Exemples . . . . . . . . . . . . . . . . . . . . . . . . .
. Baeries included . . . . . . . . . . . . . . . . . . . . . . . . .
. Python scientique . . . . . . . . . . . . . . . . . . . . . . . .
.. Bibliothques mathmatiques et types numriques
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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 . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Interlude
E Exercices corrigs
Bibliographie et Webographie
Memento Python
Index
Glossaire
Chane de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chane dinterprtation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interprtation du bytecode compil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
IPython
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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. . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ipython notebook
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
C. Table ASCII. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C. Extrait de la table Unicode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .