1. Introduction
1.1 Avant-propos
Nous avons rsolument opt, dans ce support de cours, pour laversion 3 de Python. Lorsque des diffrences importantes apparaissent entre
Python v2 et v3, nous les signalons avec ce symbole
Avec la version 3 de Python, apparue en 2008, la fondation Python a en effet dcid de gommer certaines imperfections de jeunesse du langage.
La compatibilit arrire avec les versions 2 n'est donc pas garantie, un programme crit en Python v2 ne tournant gnralement pas sans
adaptations avec un interprteur Python v3. Cette version 3 tant cependant disponible depuis suffisamment longtemps, la plupart des modules,
packages, frameworks... ont t adapts, et nous estimons il est temps de passer dfinitivement Python v3.
Nous ferons usage des conventions de notation suivantes :
le code Python est en police de caractre chasse fixe (en faisant usage de la coloration syntaxique offerte par Pandoc), de mme que les
touches de clavier ou combinaison de touches (exemple: <ctrl-D> )
l' italique indique que vous devez substituer vous-mme l'information dsigne et non pas saisir littralement le texte indiqu (exemple:
input(prompt) )
les hyper-liens sont colors (par exemple la table des matires ci-dessus)
la "syntaxe point" (mots spars par un point) fait rfrence au modle orient objet de Python o( bjet.mthode, module.fonction ...) et
implique gnralement de charger pralablement un module (exemple: sys.exit() invoque la fonction exit() du module sys , module
qu'il faut donc pralablement charger avec import sys )
Ce support de cours, qui est sous licence Creative Commons BY-SA, est accessible en ligne l'adresse http://enacit1.epfl.ch/introduction-python/.
Une version PDF formate pour une impression A4 est galement disponible sous la forme des 2 fichiers tlchargeables suivants :introduction-
python.pdf et outils-python.pdf. L'auteur reoit volontiers toutes vos remarques (corrections, suggestions de complments...) l'adresseJean-
Daniel.Bonjour@epfl.ch. Il adresse tous ses remerciements Samuel B. pour sa relecture et ses conseils aviss.
Pour information, ce support de cours a t dit en langage de balisage lger Markdown, puis traduit en HTML avec le convertisseur Pandoc. Si
ces techniques vous intressent, voyez le manuel que nous avons ralis.
2. Programmation Python
Pour des conseils concernant l'installation de Python sur votre machine, voyez notre chapitre "Installation d'un environnement Python v3
complet".
2.1 Gnralits
2.1.1 En-ttes d'un script
Nous verrons plus loin ce qu'est prcisment un script Python. Pour simplifier et comprendre les exemples qui suivent, disons ce stade qu'il s'agit
d'un fichier-texte contenant des instructions Python et qu'il peut tre utile de faire dbuter par 2 lignes d'en-ttes.
Interprteur du script
La premire ligne d'en-tte du script (appele she-bang en raison des 2 1 #!/usr/bin/env python
premiers caractres) spcifie l'interprteur qui doit tre utilis pour 2 # -*- coding: utf-8 -*-
l'excuter. S'agissant de Python, vous verrez parfois : 3
4 print("H, bien le bonjour !")
#!/usr/bin/python , mais cette forme est moins portable que :
#!/usr/bin/env python (exemple ci-contre) qui fonctionne
indpendamment de l'emplacement (path) d'installation de
l'interprteur Python.
Sous GNU/Linux Ubuntu, pour explicitement utiliser l'interprteur
Python v3 provenant des dpts officiels, il faut utiliser le she-bang
#!/usr/bin/env python3 .
Cette premire ligne est ncessaire si l'on veut pouvoir lancer le script depuis un shell en frappant : ./nom_du_script.py . Elle n'est cependant
pas ncessaire (mais tout de mme recommande) si on le lance avec python nom_du_script.py ou python3 nom_du_script.py
Pour des raisons de lisibilit, une instruction Python ne devrait pas 1 print("Affichage d'une longue ligne \
dpasser environ 80 caractres. On peut si ncessaire la rpartir sur 2 de texte. Blabla blabla blabla \
plusieurs lignes en utilisant, en fin de lignes, le caractre de 3 blabla blabla blabla blabla blabla.")
4
continuation de ligne \ (back-slash).
5 liste = ['un', 'deux', 'trois',
Cependant les parties de code dlimites par ( ) , [ ] , { } (tuples, 6 'quatre', 'cinq', 'six']
7
listes, dictionnaires...), triple apostrophe ''' ou triple guillemets
8 chaine = """Une chane de caractres
""" (chanes multi-lignes) peuvent s'tendre sur plusieurs lignes sans 9 multi-lignes""" # intgrant le caractre de
faire usage du caractre \ . 10 # retour la ligne \n
Pour insrer des commentaires dans du code Python : 21 # Commentaire d'une ligne
ce qui dbute par le caractre # (pour autant qu'il ne fasse pas 22
23 print('x =', x) # Commentaire aprs instruction
partie d'une chane de caractres) jusqu' la fin de la ligne est 24
considr comme un commentaire 25 '''Un commentaire chevauchant
les commentaire multi-lignes sont dfinis la faon des chanes 26 plusieurs lignes...'''
de caractres multi-lignes, c--d. prcd et suivi de 3 27
apostrophes ''' ou 3 guillemets """ 28 """et un autre commentaire
29 multi-ligne"""
Les mots-cls ci-contre (que vous pouvez afficher dans un interprteur False def if raise
Python avec la commande help("keywords") ) sont rservs et ne None del import return
True elif in try
peuvent donc pas tre utiliss pour dfinir vos propres identifiants and else is while
(variables, noms de fonction, classes...). as except lambda with
assert finally nonlocal yield
break for not
class from or
continue global pass
Pour le reste, Python ne protge pas l'utilisateur contre l'crasement de noms. Par exemple le fait de dfinir un objetabs=12 masque la fonction
built-in abs() (valeur absolue d'un nombre), fonction que l'on retrouvera en drfrenant l'objet avec del abs .
2.1.4 Typage
Python est un langage typage dynamique fort :
dynamique : car on n'a pas dclarer explicitement les variables utilises, et le type d'une variable peut changer au cours de son utilisation
(selon le type de l'objet rfrenc par la variable)
fort : car l'interprteur peut signaler des erreurs de type (par exemple si l'on dfinit : 2 + "3 francs" ) par opposition un langage
faiblement typ comme PHP (qui retournerait 5 dans ce cas)
Pour vrifier le type d'une variable (ou plutt le type de la donne/objet rfrenc par la variable), on utilisera la fonctiontype(objet) . Sous
IPython, on peut aussi utiliser la commande %whos .
Python propose 4 types simples de base (built-in). Ils sont dits simples 1 # bool : boolen (logique)
(ou sclaires, atomiques) car ils permettent de stocker une seule donne 2 vlog = True
par variable, contrairement aux types containers. Il s'agit de : 3 type(vlog) # => builtins.bool
4 not vlog # => False
bool : boolen (tat vrai ou faux) 5 # notez le 1er car. majuscule de True et False !
int : entier (en prcision illimite depuis Python v3 !) 6
float : rel flottant (double prcision 64 bits) 7 # int : entier de prcision illimite !
complex : complexe flottant 8 a = 2 ; i = -12
9 v = 2**80 # => 1208925819614629174706176
On verra plus loin que ces 4 types sont immutables (contrairement par 10 # dfinition d'entiers en binaire, octal ou hexadc.:
exemple aux listes et dictionnaires). 11 k = 0b111 # => 7
12 m = 0o77 # => 63
On dispose de fonctions d'arrondi et de conversion, notamment : 13 n = 0xff # => 255
troncature et conversion floatint : int(flottant) 14 # conv. chanes bin/octal/hexa en entier & vice-versa:
15 int('111',2) # => 7, et inverse: bin(7) => '0b111'
arrondi, et le cas chant conversion floatint :
16 int('77',8) # => 63, et inverse: oct(63) => '0o77'
round(flottant, ndigits) : arrondi ndigits chiffres aprs 17 int('ff',16) # => 255, et inverse: hex(255) => '0xff'
la virgule (si ndigits positif), ou avant la virgule (si ngatif) ; par 18
dfaut ndigits= 0 , c'est--dire conversion l'entier suprieur (si 19 # float : flottant 64 bits
flottant est positif) ou infrieur (si ngatif) 20 b = -3.3 ; r = 3e10
conversion intfloat : float(entier) 21 abs(b) # => 3.3
22 # arrondi et conversion
pour faire une conversion en entier base 10 d'un nombre exprim 23 int(3.67) # => 3 (int)
sous forme de chane en n'importe quelle base (2= binaire, 8= 24 int(-3.67) # => -4 (int)
octale, 16= hexadcimale, etc...), on peut utiliser 25 round(3.67) # => 4 (int), comme round(3.67, 0)
int('nombre', base) 26 round(3.67,1) # => 3.7 (float)
27 round(133,-1) # => 130 (int)
Pour rcuprer la valeur absolue d'un entier ou flottant, on dispose de 28 round(133,-2) # => 100 (int)
la fonction habituelle abs(entier_ou_flottant) . 29
30 # complex : complexe flottant
31 cplx = 3.4 + 2.1j # ou: cplx = complex(3.4, 2.1)
32 cplx.real # => 3.4
33 cplx.imag # => 2.1
Vous aurez remarqu dans ces exemples que, contrairement d'autres langages, il n'y a pas de ; (point-virgule) la fin des instructions. Cela ne
serait ncessaire que si l'on souhaite dfinir plusieurs instructions sur la mme ligne, ce qui est rarement pratiqu en Python et dconseill pour des
raisons de lisibilit.
On vient de voir plus haut que l'assignation de variables s'effectue 1 x1 = x2 = x3 = 3 # => x1, x2, x3 prennent la val. 3
classiquement avec = 2
3 y1,y2,y3 = 4,5,6 # => y1=4, y2=5, y3=6
Python permet de faire aussi de l'assignation multiple, c'est--dire : 4 y1, y2 = y2, y1 # permutation => y1=5, y2=4
5
assigner la mme valeur plusieurs variables
6 tpl = (10,'abc') # ici un tuple...
assigner un tuple un autre tuple (il faut alors autant de 7 v1, v2 = tpl # => v1=10, v2='abc'
variables gauche qu' droite)
On peut drfrencer une donne (ou tout type d'objet) avec 21 v1 = 123 # => cration donne 123 rfrence par v1
del objet ou del(objet) . Pour drfrencer un attribut, on utilise 22 type(v1) # l'OBJET rfrenc de type builtins.int
del objet.attr ou delattr(objet,'attr') . 23 id(v1) # => 9361312 (adresse mmoire)
24
Explications techniques : Python accde aux donnes en mode 25 v2 = v1 # => nouv. variable pointant sur mme DONNE
"rfrence". Soit une variable laquelle on a assign une valeur. Si 26 id(v2) # => 9361312 => pointe bien sur MME donne !
27
on lui assigne ensuite une autre valeur, la variable se "rfre" ds lors
28 v1 = 'a' # => cration donne 'a', et chang. rf. v1
cette nouvelle donne. Qu'advient-il alors de l'ancienne donne ? 29 type(v1) # l'OBJET rfrenc de type builtins.str
Pour autant que plus aucune variable ne s'y rfre, le "garbage 30 id(v1) # => 9361332 => v1 pointe bien s/AUTRE donne
collector" la supprimera alors automatiquement, librant ainsi de la 31
mmoire. Sachant cela, on comprend mieux le mcanisme de "typage 32 del v2 # => la donne 123 n'est plus rfrence (ni
dynamique" de Python : une variable n'a en elle-mme pas de type, 33 # par v1 ni v2) => le garbage collector
elle a celui de la donne laquelle elle se rfre couramment ! 34 # pourra supprimer donne de la mmoire
Pour afficher quelque-chose sur la console, on utilise la fonction 1 print('Le produit de', a, 'et', b, 'est', a*b)
print dont la syntaxe gnrale est : 2 print('Total des %s : %.2f CHF' % ('Dpenses',123))
3
print(arguments, sep=' ', end='\n', file=sys.stdout) 4 # Ci-dessous, rsultats quivalents :
Seuls le(s) argument(s) sont ncessaires, les autres paramtres sep , 5 print('Hello world !')
6 print('Hello ',end=''); print('world !')
end et file tant facultatifs. Par dfaut print crit les 7
argument(s) sur la sortie standard, ajoutant un caractre espace entre 8
chaque argument, et envoie finalement un newline (saut de ligne). 9 # Sous Python v2 on aurait crit :
Mais on peut librement modifier les valeurs de ces paramtres. 10 print 'Hello', # la virgule limine le saut de ligne
11 print 'world !'
Notez qu'on peut passer autant d'argument(s) que l'on veut
(contrairement la fonction disp de MATLAB/Octave qui est
limite 1 argument).
Remarque : on a vu que le nommage des fonctions rpond aux mmes rgles que les variables. Les noms de fonctions sont donc galement
sensibles aux majuscules/minuscules ( PRINT ou Print retournant ainsi une erreur de type "... is not defined").
Sous Python 2, print tait une commande et non pas une fonction. Les arguments taient donc pass la suite de la commande sans
parenthses. Pour supprimer le saut de ligne, il fallait faire suivre le dernier argument d'une virgule.
partir de Python v3, on utilise pour cela la fonction 21 nom = input('Votre nom ? ')
input(prompt) qui affiche le prompt puis retourne ce que 22 # retourne une chane
l'utilisateur a frapp sous forme de chane (dans tous les cas !). 23 poids = float(input('Votre poids ? '))
24 # gnre une erreur si on saisit une chane
Notez, dans les exemples ci-contre, l'usage des fonctions de 25 annee = int(input('Votre anne de naissance ? '))
conversion int en entier et float en rel, ainsi que de eval qui 26 # gnre erreur si saisie chane ou flottant
27
value une expression Python et retourne son rsultat.
28
29 res = eval(input('Entrer expression Python : '))
30 # => valuation de l'expression (comme input MATLAB)
Sous Python 2, on disposait des fonctions raw_input pour saisir une chane, et input pour saisir un nombre, une variable ou une
expression. L'ancien comportement de input (correspondant au input sans second paramtre 's' de MATLAB/Octave) est obtenu sous
Python v3 avec eval(input(...)) .
Depuis Python v3, la division / de deux nombres entiers retourne toujours un flottant, et c'est donc l'utilisateur de le convertir si ncessaire en
entier avec int (troncature) ou round (arrondi).
Sous Python 2, la division / de deux nombres entiers retournait toujours un entier qui pouvait donc tre tronqu, comme le fait la division
// Python v3.
Python offre notamment les oprateurs suivants : 1 1 < 2 and 2 < 3 # => True
2 'oui' == 'OUI'.lower() # => True
oprateurs de comparaison : == (gal), != (diffrent), < 3 False or not True and True # => False
(infrieur), <= (infrieur ou gal), > (suprieur), >= (suprieur 4
ou gal) 5 [1,2,3] == [1,2,3] # => True
comparaison d'objets : is (mme objet), in (membre du 6 [1,3,2] == [1,2,3] # => False
7
container)
8 a=[1,2] ; b=[1,2]; a is b # => False
oprateurs logiques (ci-aprs selon leur ordre de priorit) : not 9 a=[1,2] ; b=a; a is b # => True
(ngation logique), and (et logique), or (ou logique) 10
Ces oprateurs retournent les valeurs True ou False de type 11 2 in [1,2,3] # => True
12 'cd' in 'abcdef' # => True
boolen. Notez qu'il n'est pas ncessaire d'entourer les expressions
logiques de parenthses comme dans d'autres langages.
Python permet de chaner les comparaisons ! On peut par exemple dfinir lacondition 10 < age < 20 qui est quivalente
age>10 and age<20 .
Pour davantage d'information sur les traitements relatifs aux chanes de caractres, voir le chapitre spcifiqueplus bas.
2.2.2 Listes
Copie de listes
Cette problmatique de copie ne concerne pas les types immutables tels que lestuples et frozensets, car il n'y a par dfinition aucun risque qu'on
modifie leurs donnes.
2.2.3 Tuples
Moins flexibles que les listes en raison de leur immutabilit, l'intrt des tuples rside cependant dans le fait qu'ils occupent moins d'espace
mmoire et que leur traitement est plus efficace.
2.2.4 Dictionnaires
L'accs une valeur du dictionnaire s'effectue en lui passant entre crochets [ ] la cl correspondante. Les mthodes .keys() , .values() et
.items() retournent des objets permettant d'itrer, par une boucle for, respectivement les cls, les valeurs et les paires cls/valeurs.
Les dictionnaires n'tant pas ordonns (non indics par des entiers mais par des cls), la technique du slicing n'est bien entendu pas applicable.
Si l'on veux recopier les donnes d'un dictionnaire dic1 , le problme est le mme qu'avec leslistes : on ne fera pas dic2=dic1 (les 2
variables se rfrant dans ce cas au mme objet), mais une copie rcursive (dans toute la profondeur du dictionnaire) avec
dic2 = copy.deepcopy(dic1) (ncessitant l'importation du module copy ).
2.2.5 Sets
1 # Dfinition
2 set1 = {'a', 'b', 'a', 'c'} # => {'a', 'c', 'b'}
3 type(set1) # => type builtins.set (cf. %whos IPython)
4 len(set1) # => 3
5
6 set2 = set( ('b','c','d','c') ) # => {'c', 'b', 'd'}
7 # seconde faon de dfinir un set, notez doubles ( ) !
8
9 # Ajout ou suppression d'lments
10 set3 = set() # set vide
11 set3 |= {1, 2} # ajout plusieurs lm. => {1, 2}
12 # identique : set3 = set3 | {1,2}
13 # ou : set3.update({1,2})
Le set est un type Python permettant de crer des collectionsnon 14 set3.add(3) # ajout 1 lm. seul. => {1, 2, 3}
ordonnes modifiables constitues d'lments uniques de types 15 set3.remove(2) # dtruit 1 lm. => {1, 3}
immutables. Son grand intrt rside dans le fait qu'on peut appliquer 16 set3.discard(2) # remove, mais pas err. si lm. absent
ces objets des oprations propres aux ensembles (union, intersection, 17 set3.pop() # retourne lm. arbitraire et dtruit
diffrence...), d'o le nom de sets (ensembles). 18 set3.clear() # dtruit tous les lm. => { }
19
Notez bien que ce ne sont pas des squences (les lments ne sont pas 20 # Oprations propres aux ensembles
ordonns, donc non accessibles par des indices entiers), mais ils 21 set1 | set2 # union => {'a', 'b', 'c', 'd'}
supportent l'itration (l'ordre n'tant cependant pas significatif). C'est 22 set1 & set2 # intersection => {'b', 'c'}
23 set1 - set2 # diffrence => {'a'}
un peu des dictionnaires (dont les cls sont aussi uniques) mais sans
24 set2 - set1 # diffrence => {'d'}
valeurs. 25 set1 ^ set2 # ou exclusif => {'a', 'd'}
On cre un set avec la fonction set(iterable) ou en numrant les 26 # lm. prsents dans set1 ou set2 mais pas les deux
27
lments entre accolades {elem, elem...} . L'usage des accolades,
28 # Tests
comme pour les dictionnaires, est cohrent, ces deux types de 29 {1,2} == {2, 1} # sets identiques => True
donnes contenant des lments uniques (les donnes elles-mmes 30 1 in {1, 2, 3} # prsence lm. isol => True
pour les sets, et les cls pour les dictionnaires). 31 {1,2} <= {1,2,3,4} # prsence de tous les lm. => True
A la place des oprateurs prsents dans les exemples ci-contre, on
peut utiliser des mthodes : .union(iterable) pour | ,
.intersection(iterable) pour & , .difference(iterable)
pour - , .symmetric_difference(iterable) pour ^ .
La problmatique de copie de sets est la mme que pour leslistes et dictionnaires. Pour rellement copier les donnes d'un set s1 , on ne fera
donc pas s2=s1 (les 2 variables pointant dans ce cas sur le mme objet), mais s2=s1.copy() ou s2=set(s1) .
2.2.6 Frozensets
Un frozenset est simplement un set immutable, c'est--dire non 1 fset = frozenset( {'x','y','z','x'} ) # ou...
modifiable. 2 fset = frozenset( ('x','y','z','x') ) # identique
3 type(fset) # => type builtins.frozenset
On cre un objet de type frozenset avec la fonction
frozenset(iterable) .
Tout ce que l'on a vu concernant les sets est applicable, l'exception de ce qui a trait la modification. Les frozensets occupent moins d'espace en
mmoire que les sets, et leur traitement est plus efficace.
2.2.8 Le slicing
Applicable aux containers indics par des entiers, c'est dire les 1 lst = [1,2,3,4,5,6,7]
squences (listes, tuples et chanes ; donc pas les dictionnaires ni les 2
sets et frozensets), la technique du slicing est une forme avance de 3 lst[-1] # => 7
4 lst[-3:] # => [5, 6, 7]
l'indexation permettant d'accder aux lments par intervalles (ranges)
5 lst[-1:-3:-1] # => [7, 6] (et non pas [7, 6, 5] !)
et tranches (slices). Sa syntaxe gnrale est : 6 lst[-1:-3] # => [] car on ne peut pas aller de -1
sequ[debut:fin:pas] , dsignant dans la squence sequ les 7 # -3 avec le pas par dfaut de 1
lments d'indices debut indice fin-1 , avec une priodicit de 8 lst[2:-2] # => [3, 4, 5]
pas . 9 lst[::2] # => [1, 3, 5, 7]
10 lst[::-1] # => [7, 6, 5, 4, 3, 2, 1]
On a dj vu que les lments d'une squence sont numrots 11 lst[:2] # => [1, 2]
positivement de gauche droite de 0 len(sequ)-1 (et non de 1 12 lst[:-2] # => [1, 2, 3, 4, 5]
len(sequ) comme sous MATLAB/Octave ou Fortran). 13
14 lst[2:-2] = 'a' # remplacement d'lments
Mais ce qu'il faut ajouter ici c'est qu'ils sont aussi numrots 15 lst # => [1, 2, 'a', 6, 7]
ngativement de droite gauche de -1 , -2 , -3 ... jusqu' 16 lst[1:-1] = [] # suppression d'lments
-len(sequ) ! Par consquent, comme on le voit dans les exemples 17 lst # => [1, 7]
ci-contre, les paramtres debut , fin et pas peuvent aussi prendre 18
19 chaine = 'abcdef'
des valeurs ngatives. S'agissant du pas , une valeur positive signifie 20 chaine[::-1] # du dern. au 1er car. (miroir)=> 'fedcba'
un dplacement vers les lments suivants ( droite), et ngative vers 21 chaine[::-2] # idem en sautant 1 car. sur 2 => 'fdb'
les lments prcdents ( gauche).
Il faut encore prciser que chacun de ces 3 paramtres debut , fin et pas peut tre omis :
si l'on ne spcifie pas la valeur debut et que le pas est positif ou non spcifi, cela correspond 0 (premier lm. de la squence) ; mais
si le pas est ngatif, cela correspond alors len(sequ)+1 (dernier lm. de la squence)
si l'on ne spcifie pas la valeur fin et que le pas est positif ou non spcifi, cela correspond len(sequ)+1 (dernier lm. de la
squence) ; mais si le pas est ngatif, cela correspond alors 0 (premier lm. de la squence)
si l'on ne spcifie pas la valeur de pas , c'est la valeur 1 qui est utilise par dfaut (dplacement vers l'lm. suivant)
Il faut finalement relever que, contrairement MATLAB/Octave, Python ne permet pas d'adresser des lments en numrant leurs indices
spars par des virgules. L'expression lst[0,3,4] retourne donc une erreur.
Sous Python 2, la fonction range fabriquait directement une liste, et il existait une fonction xrange (qui a dsormais disparu) qui se
comportait comme la fonction range actuelle (cration d'un itrateur).
La fonction enumerate(sequence, debut) cre un objet itrable 21 lst = list(range(3,7)) # => [3, 4, 5, 6]
retournant l'indice et la valeur des lments d'une squence (liste, 22
tuple et chane) ou d'un objet iterable. Cette fonction est galement 23 en0 = enumerate(lst)
24 type(en0) # => type builtins.enumerate
trs utilise dans les boucles for. 25 list(en0) # => [(0, 3), (1, 4), (2, 5), (3, 6)]
Si l'on passe le paramtre debut (valeur entire), les indices retourns 26
Sachez encore qu'il existe un module standard itertools permettant de crer diffrents types d'itrateurs.
Expressions conditionnelles
La boucle for permet d'itrer les valeurs d'une liste, d'un tuple, d'une 1 # Sur listes ou tuples
chane ou de tout objet itrable. Comme dans les autres structures de 2 lst = [10, 20, 30]
contrle, le caractre : (double point) dfinit le dbut du bloc 3 for n in lst:
4 print(n, end=' ') # => 10 20 30
d'instruction contrl par for . 5
Pour itrer sur une suite de nombres entiers, on utilise souvent la 6 for index in range(len(lst)):
7 print(index, lst[index])
fonction range (objet itrable) prsente plus haut.
8 # => affiche: 0 10
Ci-contre, notez aussi l'utilisation de la fonction enumerate retournant 9 # 1 20
donc un objet permettant d'itrer sur l'indice et la valeur d'une 10 # 3 30
11
squence, d'o les 2 variables qui suivent le mot-cl for !
12 for index,val in enumerate(lst):
De mme, la mthode dictionnaire.items() retourne un objet 13 print(index, val)
permettant d'itrer sur la cl et la valeur de chaque lment d'un 14 # => mme affichage que ci-dessus
15
dictionnaire. Les mthodes .keys() et .values() retournent quant
16 # Sur chanes
elles respectivement les cls et les valeurs du dictionnaire. 17 voyelles = 'aeiouy'
18 for car in 'chaine de caracteres':
19 if car not in voyelles:
Aprs le bloc d'instruction subordonn au for , on pourrait (mais 20 print(car, end='')
cela n'est pas courant !) ajouter une clause else suivie d'un bloc 21 # => affiche les consonnes: chn d crctrs
d'instructions, ces dernires s'excutant 1 fois lorsque l'on a termin 22
d'itrer. 23 # Sur dictionnaires
24 carres = {}
25 for n in range(1,4):
26 carres[n] = n**2 # => {1: 1, 2: 4, 3: 9}
27
28 for k in carres: # itre par dfaut sur la cl !
29 # identique : for k in carres.keys():
30 print(k, end=' ') # => 1 2 3
31
32 for n in sorted(carres):
33 # identique : for n in sorted(carres.keys()):
34 print("Carr de %u = %u" % (n,carres[n]))
35 # => affiche: Carr de 1 = 1
36 # Carr de 2 = 4
37 # Carr de 3 = 9
38
39 for cle,val in carres.items():
40 print('Cl: %s, Valeur: %s' % (cle, val))
41 # => affiche: Cl: 1, Valeur: 1
42 # Cl: 2, Valeur: 4
43 # Cl: 3, Valeur: 9
Comme pour la boucle for, aprs le bloc d'instruction subordonn while , on pourrait aussi ajouter une clause else suivie d'un bloc
d'instructions, ces dernires s'excutant 1 fois lorsque la condition sera fausse.
Dans une boucle for ou une boucle while : 1 # Affiche les nombres impairs et leur carr jusqu' ce
2 # que le carr atteigne 25 => 1 1 , 3 9 , 5 25
l'instruction continue passe l'itration suivante de la boucle 3 for n in range(0, 10):
courante (i.e. sans poursuivre l'excution des instructions du 4 if (n % 2) == 0: # nombre pair
bloc) 5 continue # => re-boucler
l'instruction break sort de la boucle courante ; si la boucle 6 carre = n**2
comporte un bloc else , celui-ci n'est pas excut 7 if carre > 25:
8 break # => sortir de la boucle
9 print(n, carre)
De faon gnrale, on implmente une fonction lorsqu'un ensemble 1 def somProd(n1, n2):
d'instructions est susceptible d'tre utilis plusieurs fois dans un 2 """Fonction calculant somme et produit de n1 et n2
programme. Cette dcomposition en petites units conduit du code 3 Rsultat retourn dans un tuple (somme, produit)"""
4 return (n1+n2, n1*n2)
plus compact, plus lisible et plus efficace.
5
L'exemple ci-contre illustre les principes de base de dfinition d'une 6
fonction en Python : 7 help(somProd) # => affiche :
8 somProd(n1, n2)
la premire ligne def nomFonction(arguments...): 9 Fonction calculant somme et produit de n1 et n2
dfinit le nom avec lequel on invoquera la fonction, suivi entre 10 Rsultat retourn dans un tuple (somme, produit)
parenthses de son(ses) ventuel(s) arguments (paramtres 11
d'entre) spars par des virgules ; cette ligne doit se terminer 12 somProd(3,10) # => (13, 30)
13 somProd() # => erreur "somProd() takes exactly 2 args"
par : 14 # et mme erreur si on passe 1 ou >2 args.
les instructions de la fonction (corps de la fonction) constituent 15
ensuite un bloc qui doit donc tre indent droite 16 # Une fonction tant un objet, on peut l'assigner
au dbut du corps on peut dfinir, sous forme de 17 # une variable, puis utiliser celle-ci comme un
chane/commentaire multi-ligne, le texte d'aide en-ligne (appel 18 # "alias" de la fonction !
docstrings) qui sera affich avec help(fonction) 19 sp = somProd
20 sp(3,10) # => (13, 30)
avec return expression on sort de la fonction en renvoyant
optionnellement des donnes de retour sous forme d'un objet de
n'importe quel type ; si l'on ne passe pas d'argument return ,
la fonction retournera alors None (objet nul) ; dans l'exemple
ci-contre, on retourne 2 valeurs que l'on a choisi d'emballer sous
forme de tuple
S'agissant du nom de la fonction, il est de coutume, en Python, de le faire dbuter par un caractre minuscule. En outre s'il est compos de
plusieurs mots, on concatne ceux-ci et les faisant dbuter chacun par une majuscule. Exemple : uneFonctionBienNommee .
Lors de l'appel la fonction, il est aussi possible de passer les 21 def fct(p1, p2=9, p3='abc'):
paramtres de faon nomme avec paramtre=valeur . Dans ce 22 # 1 param. obligatoire, et 2 param. optionnels
cas, l'ordre dans lequel on passe ces paramtres n'est pas significatif ! 23 return (p1, p2, p3)
24
On peut en outre dfinir, dans la dclaration def , des paramtres 25 print(fct()) # => erreur (1 param. oblig.)
optionnels. Si l'argument n'est pas fourni lors de l'appel de la 26 print(fct(1)) # => (1, 9, 'abc')
fonction, c'est la valeur par dfaut indiques dans la dfinition qui 27 print(fct(1, 2)) # => (1, 2, 'abc')
28 print(fct(1, 2, 3)) # => (1, 2, 3)
sera utilise par la fonction. 29 print(fct(p3=3, p1='xyz')) # => ('xyz', 9, 3)
Si le nombre de paramtres n'est pas fix d'avance, on peut utiliser les 41 def fct1(*params_tpl):
techniques suivantes : 42 print(params_tpl)
43
rcuprer les paramtres positionnels sur un tuple en dfinissant 44 fct1(1, 'a') # => (1, 'a')
une variable prcde de * 45
rcuprer les paramtres nomms sur un dictionnaire en 46
On peut finalement combiner ces diffrentes techniques de dfinition de paramtres (paramtres optionnels, tuple, dictionnaire) ! Par exemple la
fonction fct(n1, n2=4, *autres) a 1 paramtres obligatoire, 1 paramtre facultatif avec valeur par dfaut, et 0 ou plusieurs paramtres
positionnels supplmentaires facultatifs.
Il est important de noter que sous Python les objets transmis aux 61 def ajoutElem(liste, elem):
fonctions sont passs par rfrence (adresses vers ces objets), 62 liste.append(elem)
63 elem = 'xyz'
contrairement MATLAB/Octave (passage par valeur) ! S'ils sont
64 # notez que cette fonction n'a pas de return !
modifis par les fonctions, ces objets le seront donc galement dans le 65
programme appelant ! 66 liste=['un']
Il y a cependant une exception cette rgle qui concerne les variables 67 elem='deux'
68 ajoutElem(liste, elem)
de type non modifiable (immutables), celles-ci tant alors passes par 69 print(liste) # => ['un', 'deux'] : liste a t modifie!
valeur (copie des donnes). Cela concerne donc lestypes simples 70 print(elem) # => 'deux' : chane n'a PAS t modifie
(entier, flottant, complexe) et les containers de type tuples, chanes et
frozensets.
Lambda fonctions
Pour les fonctions donc le corps ne contiendrait qu'une seule 121 # La lambda fonction ci-dessous :
instruction return expression , Python offre la possibilit de 122 somProd = lambda n1, n2: (n1+n2, n1*n2)
123
dfinir une fonction anonyme aussi appele lambda fonction (ou 124 # est quivalente :
lambda expression). Sa syntaxe est : 125 def somProd(n1, n2):
lambda arguments... : expression 126 return (n1+n2, n1*n2)
127
Dans l'exemple ci-contre, nous l'assignons la lambda fonction une 128 # Dans les 2 cas :
variable pour pouvoir l'utiliser comme une fonction classique. Dans la 129 somProd(3, 10) # => (13, 30)
pratique, les lambda fonctions sont utiles pour dfinir une fonction
simple comme argument une autre fonction, pour retourner des
valeurs, etc...
2.4.2 Modules
Utilisation de modules
criture de modules
Crer un module revient simplement a crer un fichier nomm 61 # Fichier mon_module.py ________________________________
module.py dans lequel seront dfinies les diffrents objets 62
.py : modules source Python 86 $ python mon_module.py # => affiche ce qui suit :
87 Exemple de la fonction carre()
.pyc : modules Python compils en bytecode 88 carre(4) => 16
(automatiquement gnr et mis en cache lorsque l'on importe le 89 Exemple de la fonction cube()
module) 90 cube(3) => 27
Lorsque l'on dveloppe interactivement, Python ne charge le module que la premire fois qu'on l'importe. Si l'on veut recharger un module que
l'on vient de modifier, il faut faire : imp.reload(module) . Il faut cependant tre attentif au fait que les objets crs avant le rechargement du
module ne sont pas mis jour par cette opration !
2.4.3 Packages
Un package (paquetage) permet de runir plusieurs modules sous un seul nom et pouvant ainsi tre chargs par une seule instruction
import package . C'est donc un ensemble de modules physiquement rassembls dans un rpertoire ou une arborescence. Nous n'entrerons ici pas
davantage dans les dtails d'implmentation d'un package.
2.4.4 Scripts
Un script (ou programme) Python est un fichier de code Python que 1 # Fichier monScript.py _________________________________
l'on peut excuter dans un interprteur Python. Son nom se termine en 2
Comme on le voit dans l'exemple ci-dessus, on peut rcuprer sur l'attribut sys.argv le nom du script et lesarguments qui lui ont t passs
l'excution. Mais sachez qu'il existe des modules spcifiquement ddis au parsing d'arguments (notamment argparse ) qui vous seront bien
utiles si vous souhaitez invoquer le script la faon des commandes Unix (avec des arguments du type : -option, -option=valeur, --option, etc...).
2.5.1 Formatage
Oprateur de conversion %
Le formatage permet de composer des chanes de caractres incorporant des donnes de types entier, flottant et chane. Cela correspond, sous C ou
MATLAB/Octave, l'usage de la fonction sprintf . Sous Python, on utilise la syntaxe suivante :
'chane avec spcifications de conversion %s %d %o %x %f %e' % ( valeurs, variables ou expressions )
la suite de la chane et de l'oprateur de conversion % , les objets 1 data = [ 100, 'stylos', 2.5,
insrer (valeurs, variables, expressions) sont passs entre parenthses, 2 20, 'plumes', 25,
c'est--dire sous forme de tuple. Les valeurs seront alors insres dans 3 2, 'calculettes', 105 ]
4 n = 0
la chane aux emplacements baliss par des spcifications de 5 while n < len(data):
conversion qui doivent exactement correspondre, en nombre et type, 6 print(' %4d %-12s %7.2f ' %
avec les lments insrs ! 7 ( data[n], data[n+1], data[n+2] ) )
8 n += 3
Les principales spcifications de conversion sont les suivantes (issues
9
du langage C) : 10 # L'excution du code ci-dessus affiche :
%s pour une chane 11 100 stylos 2.50
12 20 plumes 25.00
%d , %o ou %x pour un entier, respectivement en base dcimale,
13 2 calculettes 105.00
octale ou hexadcimale
%f ou %e pour un flottant, respectivement en notation fixe ou
notation scientifique avec exposant
Dfinis dans la chane entre accolades { } , les indicateurs de format 21 # Pour obtenir le mme affichage que l'ex. ci-dessus :
permettent de spcifier notamment : 22 ...
23 print(' {:4d} {:<12s} {:7.2f} '.format(
un nombre entier : c'est l'indice de l'lment du tuple insrer 24 data[n], data[n+1], data[n+2]) )
(passage par position) 25 ...
un nom : c'est la cl de l'lment insrer (passage par nom) 26
Template de chane
Sous Python v2 (depuis 2.4), le module string offrait une 61 from string import Template
mthode .Template() permettant de dfinir des modles de chanes 62
63 coords = [ (11, 22), (33, 44) ]
puis en faire usage par un mcanisme de substitution. Mais cette
64 tpl = Template('X = $x, Y = $y')
technique, bien que toujours disponible sous Python v3, n'est plus 65
tellement utile, tant donn que la mthode .format() , avec le 66 for point in coords:
passage par nom, fait la mme chose sans ncessiter de module 67 print( tpl.substitute(x=point[0], y=point[1]) )
spcifique. 68 # => affiche :
69 X = 11, Y = 22
70 X = 33, Y = 44
En outre des mthodes boolennes permettent de tester les caractres d'une chane : .isalnum() (alphanumrique), .isalpha() (alphabtique),
.isdecimal() , .isdigit() et .isnumeric() (numrique).
0 : pas de buffer (uniquement pour fichier binaire) 16 # On doit le cas chant grer soi-mme les
17 # erreurs d'ouverture, p.ex. ici avec l'impl-
nombre: buffer de la taille spcifie par nombre 18 # mentation de notre propre fonction 'error' :
il est possible de dfinir le type d'encodage ; en l'absence de ce 19
paramtre, l'encodage par dfaut dpend de l'OS, mais c'est 20 import sys
gnralement 'utf-8' , l'encodage 'latin1' tendant 21 def error(msg): # fct d'affich. message & exit
disparatre 22 sys.stderr.write("Error: %s\n" % msg)
23 sys.exit('Aborting...')
24
25 try:
26 fd = open('inexistant.txt', 'r')
27 except IOError as err:
28 error(err.strerror) # erreur => avorter
29 # ... suite du programme si OK
30
31 # Si fichier inexistant => cela affichera :
32 Error: No such file or directory
33 An exception has occurred, use %tb to
34 see the full traceback.
35 SystemExit: Aborting...
La fermeture du fichier s'effectue logiquement avec fd.close() . En 41 # ... suite de l'exemple ci-dessus :
cas d'oubli, tous les fichiers ouverts sont automatiquement ferms la 42 fd.close() # fermeture du fichier
sortie du programme. 43 fd.closed # => True
2.6.2 Lecture
Plusieurs mthodes peuvent tre utilises, selon que l'on souhaite lire Dans les exemples qui suivent, on utilisera le fichier essai.txt
le fichier : contenant les 3 lignes suivantes :
A. d'une traite 1re ligne
B. par paquets d'un certain nombre de caractres 2e ligne
C. ligne aprs ligne fin
B) Si le fichier est trs volumineux, la lecture d'une seule traite n'est 41 fd = open('essai.txt', 'r') # ouverture
pas approprie (saturation mmoire). On peut alors utiliser la mthode 42 chaine = ''
.read(nbcar) de lecture par paquets de nbcar caractres. 43 while True:
44 paquet = fd.read(10) # paquet 10 car.
La taille de paquet de l'exemple ci-contre est bien entendu trop petite ; 45 if paquet: # paquet non vide
ce n'est que pour les besoins de la dmonstration. 46 chaine += paquet
47 else: # paquet vide => fin du fichier
48 break
49 fd.close() # fermeture
50 # => chaine = '1re ligne\n2e ligne\nfin\n'
C) Une lecture ligne par ligne peut s'avrer judicieuse si l'on veut 61 # Solution 1
analyser chaque ligne au fur et mesure de la lecture, ou que le fichier 62 fd = open('essai.txt', 'r')
est trs volumineux (i.e. qu'on ne veut/peut pas le charger en 63 while True: # boucle sans fin
64 ligne = fd.readline()
mmoire).
65 if not ligne: break # sortie boucle
Dans tous les exemples ci-contre, on illustre leur fonctionnement en 66 # identique : if len(ligne)==0: break
affichant les lignes au cours de la lecture, raison pour laquelle on 67 print(ligne.rstrip())
supprime le \n terminant chaque ligne lue avec la mthode de chane 68 fd.close()
69
.rstrip() . 70 # Solution 2, plus lgre
La solution 1 utilise la mthode .readline() . Elle est 71 fd = open('essai.txt', 'r')
72 for ligne in fd.readlines():
explicite mais verbeuse : on lit jusqu' ce que ligne soit vide, 73 print(ligne.rstrip())
signe que l'on est alors arriv la fin du fichier. Note : en cas de 74 fd.close()
ligne vide dans le fichier, la variable ligne n'est pas vide mais 75
contient \n . 76 # Solution 3, plus lgante
La solution 2 utilise la mthode .readlines() vue plus haut 77 fd = open('essai.txt', 'r')
78 for ligne in fd:
et non pas .readline() . 79 print(ligne.rstrip())
La solution 3, encore plus simple, dmontre le fait qu'un fichier 80 fd.close()
est un objet itrable fournissant une ligne chaque itration ! 81
La solution 3bis (drive de la prcdente) s'appuie sur 82 # Solution 3bis, encore plus compacte
83 with open('essai.txt', 'r') as fd:
l'instruction with dont le rle est de dfinir uncontexte au
84 for ligne in fd:
sortir duquel certaines actions sont automatiquement excutes ; 85 print(ligne.rstrip())
l'objet-fichier supportant le contexte manager, la fermeture du
fichier est donc automatiquement prise en charge lorsque l'on
sort du bloc with , et il n'y a donc pas besoin de faire
explicitement un close !
B) La mthode .writelines(sequence ou ensemble) crit dans 21 liste = ['1re ligne\n', '2e ligne\n', 'fin\n']
le fichier une squence (tuple ou liste) ou un ensemble (set ou 22 # les lments doivent se terminer
frozenset) contenant exclusivement des chanes. Tous les lments 23 # par \n si l'on veut des sauts de ligne
24
sont crits de faon concatne. Tout comme .write , elle n'envoie 25 fd = open('ecrit.txt', 'w')
pas non plus de newline. Si l'on veut des sauts de ligne aprs chaque 26 fd.writelines(liste)
lment, le caractre '\n' devrait tre inclu la fin de chaque 27 fd.close()
lment. Si ce n'est pas le cas, on peut utiliser print (voir ci-aprs).
C) La fonction print(...) , en lui passant l'argument file = fd , 41 liste = ['1re ligne', '2e ligne', 'fin']
peut aussi tre utilise pour crire dans un fichier ! Elle se comporte 42 # ici lments non termins par \n
43
de faon standard, donc envoie par dfaut un newline aprs l'criture,
44 fd = open('ecrit.txt', 'w')
moins d'ajouter le paramtre end = '' (chane vide). 45 for ligne in liste:
46 print(ligne, file=fd)
47 fd.close()
On montre ci-contre comment on peut simplifier la technique B) en 61 with open('ecrit.txt', 'w') as fd:
faisant usage de l'instruction with qui nous dispense de fermer le 62 fd.writelines(liste)
fichier. Mais on pourrait simplifier de faon analogue les techniques
A) et C) !
2.8.1 os
Le module os offre une interface d'accs aux services du systme d'exploitation, et ceci de faon uniforme et portable (c--d. fonctionnant sur
tous les OS). Il contient un sous-module os.path donnant accs au objets du systme de fichiers (rpertoires, fichiers, liens...).
Nous ne prsentons ci-aprs que les mthodes les plus courantes. Sachez que os implmente en outre des fonctions de gestion de processus.
2.8.2 glob
Le module glob a pour seul objectif de rcuprer, pour le rpertoire Soit le rpertoire contenant les fichiers suivants :
courant ou spcifi, la liste des fichiers dont le nom correspond
ess1.dat ess2.dat fi1.txt fi2.txt
certains critres (pattern matching) dfinis au moyen des caractres fich1.txt z2.txt
suivants :
? : correspond 1 caractre quelconque Quelques exemples de matching :
* : correspond 0 N caractres quelconques 1 import glob
[squence] : correspond l'un des caractres de la squence 2
spcifie, p.ex. [abc] , [a-z] , [0-9] 3 glob.glob('*.dat') # => ['ess1.dat', 'ess2.dat']
[!squence] : correspond un caractres ne faisant pas partie 4 glob.glob('f??.*') # => ['fi1.txt', 'fi2.txt']
5 glob.glob('[ef]*2.*') # => ['fi2.txt', 'ess2.dat']
de la squence spcifie 6 glob.glob('[!f]*.*') # => ['ess1.dat', 'ess2.dat']
La fonction .glob(pattern) retourne une liste de noms de 7
2.8.4 filecmp
Le module filecmp permet de tester si des fichiers sont identiques, 1 # Comparaison de 2 fichiers ____________________________
par comparaison individuelle ou par contenu de rpertoire : 2
3 import filecmp
.cmp(fichier1, fichier2, listefichiers) : compare les 4
fichiers fichier1 et fichier2 ; retourne True s'ils sont identiques, 5 if filecmp.cmp('f1.dat', 'f2.dat'):
et False sinon 6 print('Fichiers identiques')
7 else:
.cmpfiles(dir1, dir2) : compare, dans les 2 rpertoires
8 print('Fichiers diffrents')
dir1 et dir2 (sans descendre dans ventuels sous-rpertoires), les 9
fichiers de noms dfinis dans listefichiers ; retourne une liste 10
comprenant 3 sous-listes : la premire avec les noms des fichiers 11 # Comparaison de 2 rpertoires _________________________
identiques, la seconde avec les noms des fichiers diffrents, la 12 #
troisime avec les noms des fichiers prsents seulement dans l'un 13 # Soient 2 rpertoires contenant les fichiers suivants
14 # - Rpertoire : dir1 dir2 Remarques :
ou l'autre des 2 rpertoires 15 # - Fichiers : a.txt a.txt identiques
16 # b.txt b.txt diffrents
Si l'on est intress afficher les diffrences de contenu entre des 17 # c.txt -- unique
fichiers, on se tournera vers le module difflib . 18 # -- d.txt unique
19
20 import filecmp, os
21
22 set1 = { fn for fn in os.listdir(dir1)
23 if os.path.isfile(os.path.join(dir1,fn)) }
24 # set contenant le nom de tous les fichiers de dir1
25 # (if exclut les noms des ventuels sous-rpertoires)
26 set2 = { fn for fn in os.listdir(dir2)
27 if os.path.isfile(os.path.join(dir2,fn)) }
28 # set contenant le nom de tous les fichiers de dir2
29
30 res = filecmp.cmpfiles(dir1, dir2, set1 | set2)
31 # on considre les fichiers de noms correspondant
32 # l'union des 2 sets set1 et set2 =>
33 # res[0] = ['a.txt'] : liste fich. identiques
34 # res[1] = ['b.txt'] : liste fich. diffrents
35 # res[2] = ['c.txt', 'd.txt'] : fichiers uniques
Les mthodes et attributs ci-dessous sont beaucoup plus techniques et probablement moins utiles pour vous :
.platform : type de la plateforme sur laquelle s'excute le programme (linux2, win32, darwin, cygwin...)
.version : version de l'interprteur Python utilis
.executable : chemin de l'interprteur Python utilis
.path : liste des rpertoires dans lesquels s'effectue la recherche de modules lors d'un import ; incorpore les rpertoires dfinis par la
variable d'environnement PYTHONPATH
.builtin_module_names : tuple indiquant les modules C compils dans l'interprteur Python
.modules : dictionnaire des modules chargs
.ps1 (pas valable sous IPython) : prompt de l'interprteur Python (par dfaut >>> ), peut tre chang avec sys.ps1=chaine
.ps2 (pas valable sous IPython) : prompt secondaire pour les lignes de continuation (par dfaut ... ), pouvant galement tre chang
.setrecursionlimit(nombre) : pour modifier la profondeur max de rcursion (par dfaut 1000, que l'on peut voir avec
.getrecursionlimit() )
.dont_write_bytecode : par dfaut False , cette variable permet de demander de ne pas crire de fichiersbytecode ( .pyc ou .pyo )
lors de l'importation de modules
.getsizeof(objet) : taille mmoire d'un objet en octets
Le module platform fournit des informations assez techniques sur la plateforme matrielle sur laquelle s'excute le programme.
Le module math donne accs aux fonctions de la librairie Le module random fournit des gnrateurs alatoires.
mathmatique standard C. Pour le support des nombres complexes, Citons notamment : .random() , .uniform(debut, fin) ,
voir les fonctions de mme nom du module cmath . Les diffrentes
.randint(debut, fin) , .randrange (debut, fin, pas) ,
catgories de fonctions sont :
.gauss(mu, sigma) , etc...
constantes : .pi , .e
arrondi, troncature : .ceil , .floor , .trunc
puissance, racine : .pow , .sqrt
trigonomtriques : .cos , .sin , .tan , .acos , .asin ,
.atan , .atan2 , .cosh , .sinh , .tanh , .acosh , .asinh ,
.atanh
logarithmiques, exponentielles : .log , .log10 , .log1p ,
.ldexp , .exp , .expm1 , .frexp
conversion d'angles : .degrees , .radians
gamma : .gamma , .lgamma
autres : .fabs (val abs), .factorial , .fsum (somme
iterable), .hypot (distance euclidienne), .fmod (modulo),
.modf , .erf , .erfc , .copysign
test : .isfinite , .isinf , .isnan
2.8.7 time
Le module time offre une interface l'horloge systme (date/heure courante, pause...) ainsi que des fonctions de conversion de format.
Contrairement au module datetime (qui gre les dates sous forme d'objets depuis le dbut de notre re), celui-ci gre en interne les
dates/heures sous forme de rel flottant (dates numriques) qui expriment le temps coul en secondes depuis l'origine ici dfinie au 1.1.1970
00:00 UTC (GMT) (dnomme epoch sous Linux). Ce module ne permet donc pas de manipuler des dates antrieures cette origine, mais il se
prte mieux que datetime au stockage de sries chronologiques (sous forme de liste de rels).
Les dates/heures peuvent se prsenter sous diffrentes formes :
datenum : date numrique (selon description ci-dessus)
datestruct : objet de type time.struct_time offrant les attributs suivants :
date: tm_year (anne), tm_mon (mois), tm_mday (jour), tm_wday (jour semaine: 0=lundi...)
heure: tm_hour (heure), tm_min (minute), tm_sec (seconde)
autres: tm_yday (numro du jour dans l'anne), tm_isdst (daylight saving time: 0=heure hiver, 1=heure t)
datetuple : date sous forme de tuple de 9 entiers (anne, mois, jour, heure, min, sec, 0, 0, -1)
datechaine : date convertie en chane avec .strftime(format, date)
les diffrents objets du module datetime (voir chapitre suivant)
En guise d'illustration de ce que l'on vient de voir, construisons une 41 import time
srie chronologique affichant ce qui suit (dates/heures toutes les 6 42
heures entre 2 dates) : 43 # Srie chronologique de 'deb' -> 'fin' avec pas 'step'
44 deb = time.mktime((2013,11,20,0,0,0,0,0,-1)) # date num.
20-11-2013 00:00:00 45 fin = time.mktime((2013,11,22,0,0,0,0,0,-1)) # date num.
20-11-2013 06:00:00 46 step = 6*60*60 # 6 heures exprimes en secondes
20-11-2013 12:00:00 47
20-11-2013 18:00:00 48 datenum = deb
21-11-2013 00:00:00 49 while datenum <= fin:
21-11-2013 06:00:00 50 jourstruct = time.localtime(datenum)
21-11-2013 12:00:00 51 print(time.strftime('%d-%m-%Y %H:%M:%S',jourstruct))
21-11-2013 18:00:00 52 datenum += step
22-11-2013 00:00:00
A) La classe .datetime et ses objets dateheure : 1 import datetime as dt # nom abrg 'dt' pour simplifier
2
ses attributs sont : year , month , day , 3 # Instant prsent
hour , minute , second , microsecond , 4 now = dt.datetime.today() # => (2013, 11, 19, 17, 32, 36)
tzinfo (time zone) 5 type(now) # => objet de type datetime.datetime
dateheure= datetime.datetime.today() ou 6 print(now) # => affiche: 2013-11-19 17:32:36.780077
7
dateheure= datetime.datetime.now(tz=timezone) : 8 # Dfinition d'une date/heure, attributs
retourne la date/heure courante locale sur l'objet dateheure 9 dh = dt.datetime(2013,11,18,0,27,35)
(l'argument timezone tant optionnel) ; utcnow() retournerait 10 dh.year # => 2013
l'heure UTC 11 dh.month # => 11
dateheure= datetime.datetime(year, month, day, 12 dh.day # => 18
13 dh.hour # => 0
hour=0, minute=0, second=0) : retourne la date/heure 14 dh.minute # => 27
spcifie sur l'objet dateheure 15 dh.second # => 35
dateheure=dateheure .replace(champ=val...) : modifie 16
l'objet dateheure en remplaant la val du champ spcifi (le nom 17 # Formatage
des champs correspondant aux attributs vus plus haut, donc : 18 dh.strftime('It\'s %A %d %B %Y at %H:%M:%S')
19 # => "It's Monday 18 November 2013 at 00:27:35"
year , month , day , etc...)
20 dh.strftime('%jme jour de %Y, dans la %Ume semaine')
datestruct=dateheure .timetuple() : retourne date/heure sur 21 # => '322me jour de 2013, dans la 46me semaine'
un objet de type datestruct (voir module time ) 22 dh.ctime() # => 'Mon Nov 18 00:27:35 2013'
print(datestruct) : affiche la date/heure au format '2013- 23 dh.isoformat() # => '2013-11-18T00:27:35'
24
11-19 17:32:36.780077'
25 # Manipulations
datechaine=dateheure .strftime(format) : conversion en 26 now > dh # => True
chane l'aide du format spcifi (voir codes de formatage au 27 delta = now - dh # => (1, 61501) : jours et secs
chapitre prcdent) ; la fonction inverse serait 28 type(delta) # => datetime.timedelta
dateheure .strptime(datechaine,format) 29 dh - now # => (-2, 24899)
dateheure .ctime() : retourne la date sous forme de chane au 30 # i.e. reculer de 2 jours et avancer de 24899 sec.
31
format 'Mon Nov 18 00:27:35 2013' 32 # Conversions de types
dateheure .isoformat() : retourne la date sous forme de 33 dh.date() # => objet date (2013, 11, 18)
chane au format ISO '2013-11-18T00:27:35' 34 dh.time() # => objet time (0, 27, 35)
dateheure .date() : retourne la date sur un objet de type
.date
dateheure .time() : retourne l'heure sur un objet de type
.time
On peut finalement comparer des dates/heures en comparant des
objets .datetime ou .date avec les oprateurs < et >
B) La classe .date n'est qu'une simplification de la classe 41 import datetime as dt # nom abrg 'dt' pour simplifier
.datetime en ce sens qu'elle ne contient que la date (sans heure) : 42
43 # Jour courant
ses attributs sont donc uniquement : year , month , day 44 auj = dt.date.today() # => objet (2013, 11, 19)
date= datetime.date.today() : retourne la date courante 45 type(auj) # => objet de type datetime.date
locale sur l'objet date 46 print(auj) # => affiche: 2013-11-19
47
date= datetime.date(year, month, day) : retourne la date 48 # Attributs
spcifie sur l'objet date 49 auj.year # => 2013
Pour le reste, les mthodes de l'objet .datetime vues plus haut 50 auj.month # => 11
51 auj.day # => 19
s'appliquent galement.
52
53 # Manipulations
54 proch_anni = dt.date(auj.year, 2, 8)
55 if proch_anni < auj:
56 proch_anni = proch_anni.replace(year=auj.year+1)
57 nb_jours = proch_anni - auj
58 print(proch_anni.strftime('Next birthday: %A %d %B %Y'
59 print('In: %d days' % (nb_jours.days) ) # => affiche :
60 # Next birthday: Saturday 08 February 2014
61 # In: 81 days
D) La classe .timedelta permet d'exprimer une diffrence de temps 91 import datetime as dt # nom abrg 'dt' pour simplifier
entre des objets .datetime ou .date 92
93 # Dfinition de dates/heures
ses attributs sont : days , seconds , microseconds 94 dh0 = dt.datetime(2013,11,20) # le 20.11.2013 0:00:00
la soustraction d'objets .datetime ou .date retourne un objet 95 dh1 = dt.datetime(2013,11,21,2,15,30,444)
.timedelta , et l'on peut aussi ajouter ou soustraire un 96 # le 21.11.2013 2:15:30 et 444 microsec
97
.timedelta une .datetime ou .date 98 # Calcul de timedelta, attributs
pour dfinir manuellement un objet .timedelta on utilise : 99 delta = dh1 - dh0 # => (1, 8130, 444) : jour,sec,micro
delta= datetime.timedelta(days=val, seconds=val, 100 # mais: dh0 -dh1 => (-2, 78269, 999556) , donc
microseconds=val, milliseconds=val, 101 # reculer de 2 jours et avancer de 78269 sec...
102 type(delta) # => objet de type datetime.timedelta
minutes=val, hours=val, weeks=val) chaque argument
103 print(delta) # => affiche: 1 day, 2:15:30.000444
tant optionnel, les val (entier ou flottant) par dfaut tant 0 104
secs=delta. total_seconds() : retourne un rel secs exprimant 105 # Attributs et mthodes
le nombre de secondes de l'objet delta 106 delta.days # => 1
107 delta.seconds # => 8130
108 delta.microseconds # => 444
109 delta.total_seconds() # 94530.000444 (secondes)
Nous reprenons ci-contre l'ide de la srie chronologique du chapitre 121 import datetime as dt # nom abrg 'dt' pour simplifier
prcdent (dates/heures toutes les 6 heures entre 2 dates), en 122
l'implmentant ici avec les objets .datetime et .timedelta . Elle 123 # Srie chronologique
124 deb = dt.datetime(2013,11,20) # objet datetime
affiche la srie ci-dessous : 125 fin = dt.datetime(2013,11,22) # objet datetime
20-11-2013 00:00:00 126 step = dt.timedelta(hours=6) # objet timedelta
20-11-2013 06:00:00 127
2.8.9 calendar
Le module orient-objet calendar permet de manipuler des calendriers, un peu la faon de la commande cal Unix.
Quelques fonctions :
.weekday(annee,mois,jour) : retourne le numro de jour
dans la semaine ( 0 =lundi ... 6 =dimanche) de la date spcifie
.monthcalendar(annee,mois) : retourne une matrice (c--d.
liste imbrique) des jours du mois spcifi
.monthrange(annee,mois) : retourne un tuple avec : numro
de jour du premier jour du mois, nombre de jours dans le mois
.isleap(annee) : teste si l'anne est bissextile
Ci-dessous, 1erjour dfinit le numro de jour de la semaine auquel
dbute l'affichage des semaines. Si l'on omet ce paramtre, c'est par
dfaut 0 =lundi.
Les classes .TextCalendar et .LocaleTextCalendar permettent
de crer des calendriers mensuels/annuels sous forme texte :
.TextCalendar(1erjour).formatmonth(annee,mois,w=2,l=1)
: retourne une chane contenant le calendrier du mois spcifi ;
par dfaut les jours occupent w=2 caractres, et les semaine l=1
ligne ;
la mthode .prmonth(...) fonctionne de la mme faon mais
affiche le calendrier du mois sur la console
.TextCalendar(1erjour).formatyear(annee,mois,w=2,l=1,m=3)
: retourne une chane contenant le calendrier de l'annee spcifie
; il y aura par dfaut m=3 mois cte--cte ; 1 import calendar as cal
la mthode .pryear(...) fonctionne de la mme faon mais 2
affiche le calendrier de l'anne sur la console 3 # Fonctions
la classe .LocaleTextCalendar(locale) fonctionne de la 4 cal.weekday(2013,11,19) # => 1 (lundi)
5 cal.monthcalendar(2013,11) # => liste/matrice :
mme manire, sauf qu'on peut lui passer un paramtre
6 # [[ 0, 0, 0, 0, 1, 2, 3],
dfinissant la locale (langue), par exemple : 7 # [ 4, 5, 6, 7, 8, 9, 10],
locale='fr_FR.UTF-8' 8 # [11, 12, 13, 14, 15, 16, 17],
Les classes .HTMLCalendar et .LocaleHTMLCalendar permettent 9 # [18, 19, 20, 21, 22, 23, 24],
10 # [25, 26, 27, 28, 29, 30, 0]]
de crer des calendriers mensuels/annuels HTML : 11 cal.monthrange(2013,11) # => (4, 30)
.HTMLCalendar(1erjour).formatmonth(annee,mois) : 12 cal.isleap(2012) # => True
13
retourne une chane HTML contenant le calendrier du mois
14
spcifi 15 # Classes TextCalendar et LocaleTextCalendar
.HTMLCalendar(1erjour).formatyear(annee,width=3) : 16 catext = cal.LocaleTextCalendar(locale='fr_FR.UTF-8')
retourne une chane HTML contenant le calendrier de l'annee 17 catext.prmonth(2013,11) # => affiche :
spcifie ; il y aura par dfaut width=3 mois cte--cte 18 # novembre 2013
la classe .LocaleHTMLCalendar(locale) fonctionne de la 19 # lu ma me je ve sa di
20 # 1 2 3
mme manire, sauf qu'on peut lui passer un paramtre
21 # 4 5 6 7 8 9 10
dfinissant la locale (langue), par exemple : 22 # 11 12 13 14 15 16 17
locale='fr_FR.UTF-8' 23 # 18 19 20 21 22 23 24
Finalement, la classe .Calendar permet de crer des listes de dates 24 # 25 26 27 28 29 30
25 catext.pryear(2013) # => voir lien 1. ci-dessous
ou crer des itrateurs. Nous vous renvoyons la documentation pour 26
les dtails. 27
28 # Classes HTMLCalendar et LocaleHTMLCalendar
29 # (on crit ci-dessous directement dans fich. HTML)
30 cahtml=cal.LocaleHTMLCalendar(locale='fr_FR.UTF-8')
31
32 with open('cal-nov-2013.html', 'w') as fd:
33 fd.write(cahtml.formatmonth(2013,11))
34 # => voir lien 2. ci-dessous
35
36 with open('cal-2013.html', 'w') as fd:
37 fd.write(cahtml.formatyear(2013))
38 # => voir lien 3. ci-dessous
39
2.8.10 this
Pour conclure sur une touche humoristico-philosophique cette prsentation des modules les plus importants de la librairie standard, voici le
module this qui n'a pas d'autre but que de rsumer la philosophie Python. Il suffit de l'importer... et vous verrez alors apparatre le texte ci-
dessous d'un gourou Python !
3. Scientific Python
Jean-Daniel Bonjour, EPFL, ENAC-IT (2013-2015) (Page visite fois depuis le 1-12-2013)