Cours Python Uni Paris7 2
Cours Python Uni Paris7 2
- Pierre Poulain
I - Introduction..............................................................................................................................................................5
I-A - Avant de commencer..................................................................................................................................... 5
I-B - Premier contact avec Python sous Linux...................................................................................................... 5
I-C - Premier programme Python...........................................................................................................................6
I-D - Commentaires................................................................................................................................................ 6
I-E - Sparateur d'instructions................................................................................................................................7
I-F - Notion de bloc d'instructions et d'indentation................................................................................................ 7
II - Variables.................................................................................................................................................................7
II-A - Types............................................................................................................................................................. 8
II-B - Nommage...................................................................................................................................................... 8
II-C - Oprations.....................................................................................................................................................9
II-C-1 - Oprations sur les chanes de caractres........................................................................................... 9
II-C-2 - Oprations illicites................................................................................................................................ 9
II-C-3 - Fonction type()................................................................................................................................... 10
III - criture................................................................................................................................................................ 10
III-A - criture formate........................................................................................................................................10
III-B - Exercices.................................................................................................................................................... 12
IV - Listes...................................................................................................................................................................12
IV-A - Dfinition.................................................................................................................................................... 12
IV-B - Utilisation....................................................................................................................................................13
IV-C - Opration sur les listes............................................................................................................................. 13
IV-D - Indiage ngatif et tranches...................................................................................................................... 13
IV-E - Fonctions range et len...............................................................................................................................14
IV-F - Listes de listes........................................................................................................................................... 15
IV-G - Exercices................................................................................................................................................... 15
V - Boucles et comparaisons.................................................................................................................................... 16
V-A - Boucles for..................................................................................................................................................16
V-B - Comparaisons............................................................................................................................................. 17
V-C - 5.3 Boucles while....................................................................................................................................... 18
V-D - 5.4 Exercices.............................................................................................................................................. 19
VI - Tests....................................................................................................................................................................20
VI-A - Dfinition.................................................................................................................................................... 20
VI-B - Tests plusieurs cas.................................................................................................................................21
VI-C - Tests multiples........................................................................................................................................... 22
VI-D - Instructions break et continue................................................................................................................... 23
VI-E - Exercices....................................................................................................................................................23
VII - Fichiers...............................................................................................................................................................24
VII-A - Lecture dans un fichier.............................................................................................................................24
VII-A-1 - Mthode read().................................................................................................................................25
VII-A-2 - Mthode readline()........................................................................................................................... 25
VII-A-3 - Mthodes seek() et tell().................................................................................................................. 26
VII-A-4 - Itrations directement sur le fichier..................................................................................................26
VII-B - criture dans un fichier............................................................................................................................ 26
VII-C - Exercices.................................................................................................................................................. 27
VIII - Modules.............................................................................................................................................................27
VIII-A - Dfinition.................................................................................................................................................. 27
VIII-B - Importation de modules........................................................................................................................... 28
VIII-C - Obtenir de l'aide sur les modules imports.............................................................................................29
VIII-D - Modules courants.................................................................................................................................... 29
VIII-E - Module sys : passage d'arguments......................................................................................................... 30
VIII-F - Module os................................................................................................................................................ 31
VIII-G - Exercices................................................................................................................................................. 31
IX - Plus sur les chanes de caractres....................................................................................................................32
IX-A - 9.1 Prambule........................................................................................................................................... 32
IX-B - Chanes de caractres et listes.................................................................................................................32
IX-C - Caractres spciaux.................................................................................................................................. 33
IX-D - Mthodes associes aux chanes de caractres...................................................................................... 33
IX-E - Conversion de types..................................................................................................................................34
-2Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
[Link]
-4Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
I - Introduction
I-A - Avant de commencer
Avant de commencer ce cours, voici quelques indications gnrales qui pourront vous servir pour la suite.
Familiarisez-vous avec le site [Link]. Il contient normment d'informations et de liens sur Python
et vous permet en outre de le tlcharger pour diffrentes plateformes (Linux, Mac, Windows). La page
d'index des modules est particulirement utile.
Pour aller plus loin avec Python, Grard Swinnen a crit un trs bon livre intitul Apprendre programmer
avec Python et tlchargeable gratuitement. Les ditions Eyrolles proposent galement la version papier de
cet ouvrage.
Ce cours est bas sur une utilisation de Python sous Linux, mais il est parfaitement transposable aux
systmes d'exploitation Windows et Mac.
L'apprentissage d'un langage informatique comme Python va ncessiter d'crire des lignes de code l'aide
d'un diteur de texte. Si vous tes dbutants, nous vous conseillons vivement d'utiliser gedit ou nedit, qui sont
les plus proches des diteurs que l'on peut trouver sous Windows (Notepad). Des diteurs comme emacs et
vi sont trs puissants, mais ncessitent un apprentissage particulier.
Celle-ci va dmarrer l'interprteur Python. Vous devriez obtenir quelque chose de ce style :
[fuchs@opera ~]$ Python
Python 2.5.1 (r251:54863, Jul 10 2008, 17:25:56)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Le bloc [fuchs@opera ~]$ reprsente l'invite de commande de votre shell sous Linux.
Le triple chevron >>> est l'invite de Python (prompt en anglais), ce qui signifie que Python attend une commande.
Tapez par exemple l'instruction
print "Hello world !"
Vous pouvez refaire un nouvel essai en vous servant cette fois de l'interprteur comme d'une machine calculer.
>>> 1 + 1
2
>>>
-5Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
ce stade, vous pouvez entrer une autre commande ou bien quitter l'interprteur l'aide des touches Ctrl-D.
Finalement l'interprteur Python est un systme interactif dans lequel vous pouvez entrer des commandes, que
Python excutera sous vos yeux (au moment o vous validerez la commande en tapant sur Entre).
Il existe de nombreux autres langages interprts tels que Perl ou R. Le gros avantage est que l'on peut directement
tester une commande l'aide de l'interprteur, ce qui est trs utile pour dboguer (c'est--dire corriger les ventuelles
erreurs d'un programme). Gardez bien en mmoire cette proprit de Python qui pourra parfois vous faire gagner
un temps prcieux !
Ensuite, enregistrez votre fichier sous le nom [Link], puis quittez l'diteur de texte. L'extension standard des scripts
Python est .py. Pour excuter votre script, vous avez deux moyens.
1
Soit rendre votre fichier excutable. Pour cela deux oprations sont ncessaires :
prcisez au shell la localisation de l'interprteur Python en indiquant dans la premire ligne du script :
#!/usr/bin/env Python
3
4
#!/usr/bin/env Python
print Hello World !
chmod +x [Link]
[fuchs@opera ~]$ ./[Link]
Hello World !
[fuchs@opera ~]$
I-D - Commentaires
Dans un script, tout ce qui suit le caractre # est ignor par Python jusqu' la fin de la ligne et est considr comme
un commentaire. Une exception notable est la premire ligne de votre script qui peut tre #!/usr/bin/env Python et
qui a alors une signification particulire pour Python.
Les commentaires sont indispensables pour que vous puissiez annoter votre code. Il faut absolument les utiliser pour
dcrire les principales parties de votre code dans un langage humain.
#!/usr/bin/env Python
# votre premier script Python
print Hello World !
# dautres commandes plus utiles pourraient suivre
-6Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
La premire ligne correspond une instruction qui va indiquer Python de rpter 10 fois d'autres instructions (il
s'agit d'une boucle, on verra le nom de la commande exacte plus tard). Dans le pseudocode ci-dessus, il y a trois
instructions rpter, nommes sous-instruction1 sous-instruction3.
Notez bien les dtails de la syntaxe. La premire ligne indique que l'on veut rpter une ou plusieurs instructions,
elle se termine par : . Ce symbole : indique Python qu'il doit attendre un bloc d'instructions, c'est--dire un
certain nombre de sous-instructions rpter. Python reconnat un bloc d'instructions, car il est indent. L'indentation
est le dcalage d'un ou plusieurs espaces ou tabulations des instructions sous-instruction1 sous-instruction3,
par rapport instruction_qui_indique__Python_de_rpter_10_fois_ce_qui_suit:.
Pratiquement, l'indentation en Python doit tre homogne (soit des espaces, soit des tabulations, mais pas un
mlange des deux). Une indentation avec quatre espaces est le style d'indentation le plus traditionnel et celui qui
permet une bonne lisibilit du code.
Enfin, la ligne instruction_suivante sera excute une fois que le bloc d'instructions sera termin.
Si tout cela vous semble un peu fastidieux, ne vous inquitez pas. Vous allez comprendre tous ces dtails, et surtout
les acqurir, en continuant ce cours chapitre par chapitre.
II - Variables
Une variable est une zone de la mmoire dans laquelle une valeur est stocke. Aux yeux du programmeur, cette
variable est dfinie par un nom, alors que pour l'ordinateur, il s'agit en fait d'une adresse (i.e. une zone particulire
de la mmoire).
-7Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
En Python, la dclaration d'une variable et son initialisation (c.--d. la premire valeur que l'on va stocker dedans)
se fait en mme temps. Pour vous en convaincre, regardez puis testez les instructions suivantes aprs avoir lanc
l'interprteur :
>>> x = 2
>>> x
2
Dans cet exemple, nous avons dclar, puis initialis la variable x avec la valeur 2. L'interprteur nous a ensuite
permis de regarder le contenu de la variable juste en tapant son nom. Retenez ceci, car c'est une spcificit de
l'interprteur Python , trs pratique pour chasser les erreurs ( debug ) dans un programme. Par contre, la ligne
d'un script Python qui contient seulement le nom d'une variable (sans aucune autre fonction) n'affichera pas la valeur
de la variable l'cran.
II-A - Types
Le type d'une variable correspond la nature de celle-ci. Les trois types principaux dont nous aurons besoin
sont les entiers, les rels et les chanes de caractres. Bien sr, il existe de nombreux autres types (par exemple,
les nombres complexes), c'est d'ailleurs un des gros avantages de Python (si vous n'tes pas effrays, vous pouvez
vous en rendre compte ici ).
Dans l'exemple prcdent, nous avons stock un nombre entier ( int ) dans la variable x , mais il est tout fait
possible de stocker des nombres rels ( float ) ou des chanes de caractres ( string ) :
>>> y = 3.14
>>> y
3.1400000000000001
>>> a = "bonjour"
>>> a
bonjour
>>> b = salut
>>> b
salut
>>> c = girafe
>>> c
girafe
Vous remarquez que Python reconnat certains types de variable automatiquement (entier, rel). Par contre, pour
une chane de caractres, il faut l'entourer de guillemets (simples, doubles voire triples) afin d'indiquer Python le
dbut et la fin de la chane.
Vous vous posez sans doute une question concernant l'exemple du rel. Si vous avez entr le nombre 3.14 ,
pourquoi Python l'imprime-t-il finalement avec des zros derrire ( 3.1400000000000001 ) ? Un autre exemple :
>>> 1.9
1.8999999999999999
>>>
Cette fois-ci, Python crit 1.9 sous la forme 1.8 suivi de plusieurs 9 ! Cela s'explique par le fait que, sans
rentrer dans les dtails techniques, la manire de coder un rel dans l'ordinateur est rarement exacte. Python ne
nous le cache pas et le montre lorsqu'il affiche ce nombre.
II-B - Nommage
Le nom des variables en Python peut-tre constitu de lettres minuscules (a z), de lettres majuscules (A Z), de
chiffres (0 9) ou du caractre soulign (_).
-8Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Nanmoins, un nom de variable ne doit pas dbuter ni par un chiffre, ni par _ et ne peut pas contenir de caractre
accentu. Il faut absolument viter d'utiliser un mot rserv par Python comme nom de variable (par ex. : print
, range , for , from , etc.).
Python est sensible la casse, ce qui signifie que les variables TesT , test ou TEST sont diffrentes. Enfin, n'utilisez
jamais d'espace dans un nom de variable puisque celui-ci est le sparateur d'instructions.
II-C - Oprations
Les quatre oprations de base se font de manire simple sur les types numriques (nombres entiers et rels) :
>>> x = 45
>>> x + 2
47
>>> y = 2.5
>>> x + y
47.5
>>> (x * 10) / y
180.0
Remarquez toutefois que si vous mlangez les types entiers et rels, le rsultat est renvoy comme un rel (car ce
type est plus gnral).
L'oprateur puissance utilise le symbole
modulo % :
**
>>> 2**3
8
>>> 3 % 4
3
>>> 8 % 4
0
L'oprateur d'addition
+
permet de concatner (assembler) deux chanes de caractres et l'oprateur de
multiplication * permet de dupliquer plusieurs fois une chane.
-9Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Notez que Python vous donne le maximum d'indices dans son message d'erreur. Dans l'exemple prcdent, il vous
indique que vous ne pouvez pas mlanger des objets de type str ( string , donc des chanes de caractres) avec
des objets de type int (donc des entiers), ce qui est assez logique.
Faites bien attention, pour Python, la valeur 2 (nombre entier) est diffrente de 2.0 (nombre rel), de mme que
2 (nombre entier) est diffrent de '2' (chane de caractres).
III - criture
Nous avons dj vu au chapitre prcdent la fonction print qui permet d'afficher une chane de caractres. Elle
permet en plus d'afficher le contenu d'une ou plusieurs variables :
>>> x = 32
>>> nom = John
>>> print nom , a , x , ans
John a 32 ans
Python a donc crit la phrase en remplaant les variables x et nom par leur contenu. Vous pouvez noter
galement que pour crire plusieurs blocs de texte sur une seule ligne, nous avons utilis le sparateur , avec
la commande print . En regardant de plus prs, vous vous apercevrez que Python a automatiquement ajout un
espace chaque fois que l'on utilisait le sparateur , . Par consquent, si vous voulez mettre un seul espace
entre chaque bloc, vous pouvez retirer ceux de vos chanes de caractres :
>>> print nom , a , x , ans
John a 32 ans
Pour imprimer deux chanes de caractres l'une ct de l'autre sans espace, vous devrez les concatner :
>>> ani1 = chat
>>> ani2 = souris
>>> print ani1, ani2
chat souris
>>> print ani1 + ani2
chatsouris
[Link]
Remarquez que si vous aviez fait le calcul avec (4500 + 2575)/14800 , vous auriez obtenu 0, car tous les nombres
sont des entiers et le rsultat aurait t, lui aussi, un entier. L'introduction de 4500.0 qui est un rel rsout le
problme, puisque le calcul se fait alors sur des rels.
Nanmoins, le rsultat obtenu prsente trop de dcimales (onze dans le cas prsent). Pour pouvoir crire le rsultat
plus lisiblement, vous pouvez utiliser l'oprateur de formatage % . Dans votre cas, vous voulez formater un rel
pour l'afficher avec deux puis trois dcimales :
>>> print "La
Le proportion
>>> print "La
La proportion
Le signe % est rappel une seconde fois ( % propGC ) pour indiquer les variables formater. Notez que
les rels ainsi formats sont arrondis et non tronqus.
Vous pouvez aussi formater des entiers avec %i ( i comme integer )
>>> nbG = 4500
>>> print "Le gnome de cet exemple contient %i guanines" % nbG
Le gnome de cet exemple contient 4500 guanines
Remarque :
1
Dans l'exemple prcdent, nous avons utilis le symbole % pour formater des variables. Si vous avez
besoin d'crire le symbole pourcentage % sans qu'il soit confondu avec celui servant pour l'criture
formate, il suffit de le doubler. Toutefois, si l'criture formate n'est pas utilise dans la mme chane de
caractres o vous voulez utiliser le symbole pour cent, cette opration n'est pas ncessaire. Par exemple :
>>> nbG = 4500
>>> nbC = 2575
>>> percGC = propGC * 100
>>> print "Ce gnome contient %i G et %i C, soit un %%GC de %.2f" \
% (nbG,nbC,percGC) ,"%"
Ce gnome contient 4500 G et 2575 C, soit un %GC de 47.80 %
Le signe \ en fin de ligne permet de poursuivre la commande sur la ligne suivante. Cette syntaxe est
pratique lorsque vous voulez taper une commande longue.
Enfin, il est possible de prciser sur combien de caractres vous voulez qu'un rsultat soit crit. Dans la portion de
code suivant, le caractre ; sert de sparateur entre les instructions sur une mme ligne :
>>> print 10 ; print 100 ; print 1000
10
100
- 11 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
1000
>>> print "%4i" % 10 ; print "%4i" % 100 ; print "%4i" % 1000
10
100
1000
>>>
Ceci est galement possible sur les chanes de caractres (avec %s, s comme string ) :
>>> print "atom HN" ; print "atom HDE1"
atom HN
atom HDE1
>>> print "atom %4s" % "HN" ; print "atom %4s" % "HDE1"
atom
HN
atom HDE1
Vous voyez tout de suite l'norme avantage de l'criture formate. Cela permet d'crire en colonnes parfaitement
alignes. Nous verrons que ceci est trs pratique si l'on veut crire les coordonnes des atomes d'une molcule au
format PDB.
III-B - Exercices
Conseil : utilisez l'interprteur Python pour les exercices 2 5.
1
2
3
4
5
Ouvrez l'interprteur Python et tapez 1+1 . Que se passe-t-il ? crivez la mme chose dans un script
[Link] . Excutez ce script en tapant Python [Link] dans un shell . Que se passe-t-il ? Pourquoi ?
Calculez le pourcentage de GC avec le code
percGC = ((4500 + 2575)/14800)*100
IV - Listes
IV-A - Dfinition
Une liste est une structure de donnes qui contient une srie de valeurs. Python autorise la construction de liste
contenant des valeurs de types diffrents (par exemple entier et chane de caractres), ce qui leur confre une grande
flexibilit. Une liste est dclare par une srie de valeurs (ne pas oublier les guillemets, simples ou doubles, s'il
s'agit de chanes de caractres) spares par des virgules, et le tout encadr par des crochets. En voici quelques
exemples :
>>> animaux = [girafe,tigre,singe,souris]
>>> tailles = [5, 2.5, 1.75, 0.15]
>>> mixte = [girafe, 5, souris, 0.15]
>>> animaux
[girafe, tigre, singe, souris]
>>> tailles
[5, 2.5, 1.75, 0.15]
>>> mixte
[girafe, 5, souris, 0.15]
Lorsque l'on affiche une liste, Python la restitue telle qu'elle a t saisie.
- 12 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
IV-B - Utilisation
Un des gros avantages d'une liste est que vous pouvez appeler ses lments par leur position. Ce numro est appel
indice (ou index) de la liste.
liste : [girafe, tigre, singe, souris]
indice :
0
1
2
3
Soyez trs attentifs au fait que les indices d'une liste de n lments commence 0 et se termine n-1. Voyez
l'exemple suivant :
>>> animaux = [girafe,tigre,singe,souris]
>>> animaux[0]
girafe
>>> animaux[1]
tigre
>>> animaux[3]
souris
Par consquent, si on appelle l'lment d'indice 4 de notre liste, Python renverra un message d'erreur :
>>> animaux[4]
Traceback (innermost last):
File "<stdin>", line 1, in ?
IndexError: list index out of range
[girafe,tigre]
[singe,souris]
ani2
tigre, singe, souris]
3
tigre, girafe, tigre, girafe, tigre]
Ou encore :
liste
: [A,C,D,E,F,G,H,I,K,L]
indice positif :
0
1
2
3
4
5
6
7
8
9
indice ngatif : -10 -9 -8 -7 -6 -5 -4 -3 - 2 -1
Les indices ngatifs reviennent compter partir de la fin. Leur principal avantage est que vous pouvez appeler le
dernier lment d'une liste l'aide de l'indice -1 sans pour autant connatre la longueur de la liste.
>>> animaux = [girafe,tigre,singe,souris]
- 13 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> animaux[-4]
girafe
>>> animaux[-2]
singe
>>> animaux[-1]
souris
Un autre avantage des listes est la possibilit de slectionner une partie en utilisant un indiage construit sur le
modle [m:n+1] pour rcuprer tous les lments, du mime au nime (de l'lment m inclus l'lment n
+1 exclu). On dit alors qu'on rcupre une tranche de la liste, par exemple :
>>> animaux = [girafe, tigre, singe, souris]
>>> animaux[0:2]
[girafe, tigre]
>>> animaux[0:3]
[girafe, tigre, singe]
>>> animaux[0:]
[girafe, tigre, singe, souris]
>>> animaux[:]
[girafe, tigre, singe, souris]
>>> animaux[1:]
[tigre, singe, souris]
>>> animaux[1:-1]
[tigre, singe]
Remarquez que lorsqu'aucun indice n'est indiqu gauche ou droite du symbole : , Python prend par dfaut
tous les lments depuis le dbut ou tous les lments jusqu' la fin respectivement.
Dans les versions rcentes de Python, on peut aussi prciser le pas en ajoutant un : supplmentaire et en indiquant
le pas par un entier.
>>> animaux = [girafe, tigre, singe, souris]
>>> animaux[0:3:2]
[girafe, singe]
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[::1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[::2]
[0, 2, 4, 6, 8]
>>> x[::3]
[0, 3, 6, 9]
>>> x[1:6:3]
[1, 4]
Finalement, on voit que l'accs au contenu d'une liste avec des crochets fonctionne sur le modle liste[dbut:fin:pas].
listes d'entiers
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(0,5)
[0, 1, 2, 3, 4]
>>> range(15,20)
[15, 16, 17, 18, 19]
>>> range(0,1000,200)
[0, 200, 400, 600, 800]
>>> range(2,-2,-1)
[2, 1, 0, -1]
- 14 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
L'instruction range() fonctionne sur le modle range([dbut,] fin[, pas]). Les arguments entre crochets sont optionnels.
L'instruction len() vous permet de connatre la longueur d'une liste, ce qui parfois est bien pratique lorsqu'on lit un
fichier par exemple, et que l'on ne connat pas a priori la longueur des lignes. Voici un exemple d'utilisation :
>>> animaux = [girafe, tigre, singe, souris]
>>> len(animaux)
4
>>> len(range(10))
10
Dans cet exemple, chaque sous-liste contient une catgorie d'animal et le nombre d'animaux pour chaque catgorie.
Pour accder un lment de la sous-liste, on utilise une double indication.
>>> zoo[1]
[tigre, 2]
>>> zoo[1][0]
tigre
>>> zoo[1][1]
2
On verra un peu plus loin qu'il existe en Python les dictionnaires qui sont trs pratiques pour faire ce genre de choses.
On verra aussi qu'il existe un module nomm numpy permettant de grer des listes ou tableaux de nombres (vecteurs
et matrices), ainsi que de faire des oprations dessus.
IV-G - Exercices
Conseil : utilisez l'interprteur Python.
1
2
3
4
5
6
Constituez une liste semaine contenant les sept jours de la semaine. partir de cette liste, comment
rcuprez-vous seulement les cinq premiers jours de la semaine d'une part, et ceux du week-end d'autre part
( utilisez pour cela l'indication ) ? Cherchez un autre moyen pour arriver au mme rsultat ( en utilisant une
autre indication ).
Trouvez deux manires pour accder au dernier jour de la semaine.
Inversez les jours de la semaine en une commande.
Crez quatre listes hiver, printemps, ete et automne contenant les mois correspondant ces saisons.
Crez ensuite une liste saisons contenant les sous-listes hiver, printemps, ete et automne. Prvoyez ce
que valent les variables suivantes, puis vrifiez-le dans l'interprteur :
saisons[2]
saisons[1][0]
saisons[1:2]
saisons[:][1]
Comment expliquez-vous ce dernier rsultat ?
Affichez la table des 9 en une seule commande avec l'instruction range().
Avec Python, rpondez la question suivante en une seule commande. Combien y a-t-il de nombres pairs
dans l'intervalle [2 , 10000] inclus ?
- 15 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
V - Boucles et comparaisons
V-A - Boucles for
Imaginez que vous ayez une liste de quatre lments dont vous voulez afficher les lments les uns aprs les autres.
Dans l'tat actuel de vos connaissances, il faudrait taper quelque chose du style :
animaux = [girafe,tigre,singe,souris]
print animaux[0]
print animaux[1]
print animaux[2]
print animaux[3]
Si votre liste ne contient que quatre lments, ceci est encore faisable, mais imaginez qu'elle en contienne 100 voire
1000 ! Pour remdier cela, il faut utiliser les boucles. Regardez l'exemple suivant :
>>> animaux = [girafe,tigre,singe,souris]
>>> for i in animaux:
print i
girafe
tigre
singe
souris
En fait, la variable i va prendre successivement les diffrentes valeurs de la liste animaux chacune de ses
itrations. D'ores et dj, remarquez avec attention l' indentation . Vous voyez que l'instruction print i est dcale par
rapport l'instruction for i in animaux:. Outre une meilleure lisibilit, ceci est formellement requis en Python. Toutes
les instructions que l'on veut rpter constituent le corps de la boucle (ou un bloc d'instructions) et doivent tre
indentes d'un(e) ou plusieurs espace(s) ou tabulation(s). Dans le cas contraire, Python vous renvoie un message
d'erreur :
>>> for i in animaux:
print i
File "<stdin>", line 2
print i
^
IndentationError: expected an indented block
Notez galement que si le corps de votre boucle contient plusieurs instructions, celles-ci doivent tre indentes de
la mme manire (e.g. si vous avez indent la premire instruction avec deux espaces, vous devez faire de mme
avec la deuxime instruction, etc.).
Remarquez galement un autre aspect de la syntaxe, une instruction for doit absolument se terminer par le signe
deux-points : .
Il est aussi possible d'utiliser une tranche d'une liste :
>>> animaux = [girafe,tigre,singe,souris]
>>> for i in animaux[1:3]:
print i
tigre
singe
On a vu que les boucles for pouvaient utiliser une liste contenant des chanes de caractres, mais elles peuvent
tout aussi bien utiliser des listes numriques. En utilisant l'instruction range on peut facilement accder une liste
d'entiers.
- 16 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
print i
0
1
2
3
Par consquent, vous pouvez utiliser les boucles comme une itration sur les indices des lments d'une liste.
>>> animaux = [girafe, tigre, singe, souris]
>>> for i in range(4):
print animaux[i]
girafe
tigre
singe
souris
Cependant, la mthode utiliser pour parcourir avec une boucle for les lments d'une liste est celle qui ralise
les itrations directement sur les l ments .
>>> animaux = [girafe,tigre,singe,souris]
>>> for i in animaux:
print i
girafe
tigre
singe
souris
Si vous avez besoin de parcourir votre liste par ses indices, prfrez la fonction xrange() qui s'utilise de la mme
manire que range(), mais qui ne construit pas de liste et qui est donc beaucoup plus rapide. La fonction r ange()
ne sera donc employe que pour crer des listes d'entiers.
>>> animaux = [girafe,tigre,singe,souris]
>>> for i in xrange(4):
print animaux[i]
girafe
tigre
singe
souris
Enfin, si vous avez besoin de l'indice d'un lment d'une liste et de l'lment lui-mme, la fonction enumerate()
est pratique.
>>> animaux = [girafe,tigre,singe,souris]
>>> for i, ani in enumerate(animaux):
print i, ani
0 girafe
1 tigre
2 singe
3 souris
V-B - Comparaisons
Avant de passer une autre sorte de boucles (les boucles while), nous abordons tout de suite les comparaisons .
Celles-ci seront reprises dans le chapitre des tests. Python est capable d'effectuer toute une srie de comparaisons
entre le contenu de diffrentes variables, telles que :
syntaxe Python
signification
- 17 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
==
!=
>
>=
<
<=
gal
diffrent
suprieur
suprieur
infrieur
infrieur
de
ou gal
ou gal
= 5
== 5
> 10
< 10
Python renvoie la valeur True si la comparaison est vraie et False si elle est fausse. True et False sont des boolens.
Faites bien attention ne pas confondre l' oprateur d'affectation = qui donne une valeur une variable et l'
oprateur de comparaison == qui compare les valeurs de deux variables.
Vous pouvez galement effectuer des comparaisons sur des chanes de caractres.
>>> animal
>>> animal
False
>>> animal
True
>>> animal
True
= "tigre"
== "tig"
!= "tig"
== tigre
Dans le cas des chanes de caractres, a priori seuls les tests == et != ont un sens. En fait, on peut aussi utiliser les
oprateurs <, >, <= et >=. Dans ce cas l'ordre alphabtique est pris en compte, par exemple :
>>> "a" < "b"
True
"a" est infrieur "b, car il est situ avant dans l'ordre alphabtique. En fait, c'est l'ordre ASCII des caractres
qui est pris en compte (i.e. chaque caractre est affect un code numrique), on peut donc comparer aussi des
caractres spciaux (comme # ou ~) entre eux. On peut aussi comparer des chanes plus d'un caractre.
>>> "ali" < "alo"
True
>>> "abb" < "ada"
True
Dans ce cas, Python compare caractre par caractre de la gauche vers la droite (le premier avec le premier, le
deuxime avec le deuxime, etc.). Ds qu'un caractre est diffrent entre l'une et l'autre des chanes, il considre que
la chane la plus petite est celle qui prsente le caractre ayant le plus petit code ASCII (les caractres suivants
de la chane sont ignors dans la comparaison), comme dans notre test "abb" < "ada" ci-dessus.
print i
- 18 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
1
2
3
4
i = i + 1
Remarquez qu'il est encore une fois ncessaire d'indenter le bloc d'instructions. Une boucle while ncessite trois
lments pour fonctionner correctement :
1
2
3
Faites bien attention aux tests et l'incrmentation que vous utilisez, car une erreur mne souvent des boucles
infinies qui ne s'arrtent pas. Vous pouvez nanmoins toujours stopper l'excution d'un script Python l'aide de la
combinaison de touches Ctrl-C.
Soit la liste ['vache','souris','levure','bacterie']. Affichez l'ensemble des lments de cette liste (un lment par
ligne) de trois manires diffrentes (deux avec for et une avec while).
Constituez une liste semaine contenant les sept jours de la semaine. crivez une srie d'instructions affichant
les jours de la semaine (en utiliser une boucle for), ainsi qu'une autre srie d'instructions affichant les jours du
week-end (en utilisant une boucle while).
Avec une boucle, affichez les nombres de 1 10 sur une seule ligne.
Soit impairs la liste de nombres [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]. crivez un programme qui, partir de la
liste impairs, construit une liste pairs dans laquelle tous les lments de impairs sont incrments de 1.
Voici les notes d'un tudiant [14, 9, 6, 8, 12]. Calculez la moyenne de ces notes. Utilisez l'criture formate
pour afficher la valeur de la moyenne avec deux dcimales.
Soit la liste X contenant les nombres entiers de 0 10. Calculez le produit des nombres conscutifs deux
deux de X en utilisant une boucle. Exemple pour les premires itrations :
0
2
6
Python
- 19 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
*******
******
*****
****
***
**
*
Exercice +++. Suite de Fibonacci. La suite de Fibonacci est une suite mathmatique qui porte le nom de
Leonardo Fibonacci, un mathmaticien italien du XIIIe sicle. Initialement, cette suite a t utilise pour
dcrire la croissance d'une population de lapins, mais elle peut galement tre utilise pour dcrire certains
motifs gomtriques retrouvs dans la nature (coquillages, fleurs de tournesol).
Par dfinition, les deux premiers termes de la suite de Fibonacci sont 0 et 1. Ensuite, le terme au rang n est la somme
des nombres aux rangs n - 1 et n - 2. Par exemple, les 10 premiers termes de la suite de Fibonacci sont 0, 1, 1,
2, 3, 5, 8, 13, 21, 34.
crivez un script qui construit la liste des 20 premiers termes de la suite de Fibonacci puis l'affiche.
VI - Tests
VI-A - Dfinition
Les tests sont un lment essentiel tout langage informatique si on veut lui donner un peu de complexit, car
ils permettent l'ordinateur de prendre des dcisions si telle ou telle condition est vraie ou fausse. Pour cela, Python
utilise l'instruction if ainsi qu'une comparaison que nous avons aborde au chapitre prcdent. En voici un exemple :
>>> x = 2
>>> if x == 2:
- 20 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
dans le premier exemple, le test tant vrai, l'instruction print "Le test est vrai !" est excute. Dans le second
exemple, le test est faux et rien n'est affich ;
les blocs d'instruction dans les tests doivent forcment tre indents comme les boucles for et while.
L'indentation indique la porte des instructions excuter si le test est vrai ;
l'instruction if se termine comme les instructions for et while par le caractre : .
print
else:
Le test est
>>> x = 3
>>> if x ==
print
else:
Le test est
2:
"Le test est vrai !"
"Le test est faux !"
vrai !
2:
"Le test est vrai !"
"Le test est faux !"
faux !
On peut utiliser une srie de tests dans la mme instruction if, notamment pour tester plusieurs valeurs d'une mme
variable. Par exemple, on se propose de tirer au sort une base d'ADN puis d'afficher le nom de cette dernire. Dans
le code suivant, nous utilisons l'instruction [Link](liste) qui renvoie un lment choisi au hasard dans une
liste. L'instruction import random sera vue plus tard, admettez pour le moment qu'elle est ncessaire.
>>> import random
>>> base = [Link](["a", "t", "c", "g"])
>>> if base == "a":
Dans cet exemple, Python teste la premire condition, puis, si et seulement si elle est fausse, teste la deuxime et
ainsi de suite Le code correspondant la premire condition vrifie est excut puis Python sort du if.
Remarque De nouveau, faites bien attention l'indentation dans ces deux derniers exemples ! Vous devez tre trs
rigoureux ce niveau-l. Pour vous en convaincre, excutez ces deux scripts dans l'interprteur Python :
Script 1 :
nombres = [4, 5, 6]
for i in nombres:
if i == 5:
print "Le test est vrai"
print "car la variable i vaut", i
- 21 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Script 2 :
nombres = [4, 5, 6]
for i in nombres:
if i == 5:
print "Le test est vrai"
print "car la variable i vaut", i
Oprateur
Condition 2
Rsultat
Vrai
Vrai
Faux
Faux
OU
OU
OU
OU
Vrai
Faux
Vrai
Faux
Vrai
Vrai
Vrai
Faux
Vrai
Vrai
Faux
Faux
ET
ET
ET
ET
Vrai
Faux
Vrai
Faux
Vrai
Faux
Faux
Faux
En Python, on utilise le mot rserv and pour l'oprateur ET et le mot rserv or pour l'oprateur OU . Respectez
bien la casse, and et or s'crivent en minuscule. En voici un exemple d'utilisation :
>>> x = 2
>>> y = 2
>>> if x == 2 and y == 2:
Notez que le mme rsultat serait obtenu en utilisant deux instructions if imbriques :
>>> x = 2
>>> y = 2
>>> if x == 2:
if y == 2:
Vous pouvez aussi tester directement l'effet de ces oprateurs l'aide de True et False (attention respecter la casse).
>>> True or False
True
Enfin, on peut utiliser l'oprateur logique de ngation not qui inverse le rsultat d'une condition :
>>> not True
False
>>> not False
True
>>> not (True and True)
False
- 22 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
if i > 2:
break
print i
0
1
2
if i == 2:
continue
print i
0
1
3
4
VI-E - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell.
Constituez une liste semaine contenant les sept jours de la semaine. En utilisant une boucle, crivez chaque
jour de la semaine ainsi que les messages suivants :
Repos ce week-end s'il s'agit du week-end (Les messages ne sont que des suggestions, vous pouvez
laisser aller votre imagination.)
La fonction min() de Python, renvoie l'lment le plus petit d'une liste. Sans utiliser cette fonction, crivez un
script qui dtermine le plus petit lment de la liste [8, 4, 6, 1, 5].
La liste ci-dessous reprsente une squence d'acides amins
["A","R","A","W","W","A","W","A","R","W","W","R","A","G","A","R"]
Voici les notes d'un tudiant [14, 9, 13, 15, 12]. crivez un script qui affiche la note maximum (fonction max()),
la note minimum (fonction min()) et qui calcule la moyenne. Affichez la valeur de la moyenne avec deux
dcimales. Affichez aussi la mention obtenue sachant que la mention est passable si la moyenne est entre 10
inclus et 12 exclu, assez bien entre 12 inclus et 14 exclu et bien au-del de 14.
Faites une boucle qui parcourt les nombres de 0 20 et qui affiche les nombres pairs infrieurs ou gaux
10 d'une part, et les nombres impairs strictement suprieurs 10 d'autre part. Pour cet exercice, vous
pourrez utiliser l'oprateur modulo % qui retourne le reste de la division entire entre deux nombres.
Exercice +++. Conjecture de Syracuse.
- 23 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
[[48.6,53.4],[-124.9,156.7],[-66.2,-30.8],[-58.8,-43.1],
[-73.9,-40.6],[-53.7,-37.5],[-80.6,-16.0],[-68.5,135.0],
[-64.9,-23.5],[-66.9,-45.5],[-69.6,-41.0],[-62.7,-37.5],
[-68.2,-38.3],[-61.2,-49.1],[-59.7,-41.1],[-63.2,-48.5],
[-65.5,-38.5],[-64.1,-40.7],[-63.6,-40.8],[-66.4,-44.5],
[-56.0,-52.5],[-55.4,-44.6],[-58.6,-44.0],[-77.5,-39.1],
[-91.7,-11.9],[48.6,53.4]]
\
\
\
\
\
\
Dterminez les nombres premiers infrieurs 100. Combien y a-t-il de nombres premiers entre 0 et 100 ? Pour vous
aider, nous vous proposons deux mthodes.
Mthode 1 (peu optimale, mais assez intuitive)
Pour chaque nombre de 2 100, calculez le reste de la division entire (avec l'oprateur modulo %) depuis 1 jusqu'
lui-mme. Si c'est un nombre premier, il aura exactement deux nombres pour lesquels le reste de la division entire
est gal 0 (1 et lui-mme). Si ce n'est pas un nombre premier, il aura plus de deux nombres pour lesquels le reste
de la division entire est gal 0.
Mthode 2 (plus optimale et plus rapide, mais un peu plus complique)
Vous pouvez parcourir tous les nombres de 2 100 et vrifier si ceux-ci sont composs, c'est--dire qu'ils sont le
produit de deux nombres premiers. Pratiquement, cela consiste vrifier que le reste de la division entire (oprateur
modulo %) entre le nombre considr et n'importe quel nombre premier est nul. Le cas chant, ce nombre n'est
pas premier.
VII - Fichiers
VII-A - Lecture dans un fichier
Dans la plupart des travaux de programmation, on doit lire ou crire dans un fichier. Python possde pour cela tout
un tas d'outils qui vous simplifient la vie. Avant de passer un exemple concret, crez un fichier dans un diteur de
texte que vous enregistrerez dans votre rpertoire avec le nom [Link], par exemple :
girafe
tigre
singe
souris
La premire commande ouvre le fichier [Link] en lecture seule (ceci est indiqu avec la lettre r). Remarquez
que le fichier n'est pas encore lu, mais simplement ouvert ( un peu comme lorsqu'on ouvre un livre, mais
qu'on ne l'a pas encore lu ). Lorsqu'on affiche la valeur de la variable filin, vous voyez que Python la
considre comme un objet de type fichier
<open file [Link], mode r at 0x7f8ea16efc00>
- 24 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
propos de mthode, on applique la mthode readlines() sur l'objet filin dans l'instruction suivante
(remarquez la syntaxe du type [Link]). Ceci nous retourne une liste contenant toutes les lignes du
fichier ( dans notre analogie avec un livre, ceci correspondrait lire les lignes du livre ).
Enfin, on applique la mthode close( ) sur l'objet filin, ce qui vous vous en doutez, va fermer le fichier ( ceci
correspondrait bien sr fermer le livre ). On pourra remarquer que l'tat de l'objet a chang
<closed file [Link], mode r at 0x7f8ea16efc00>
Vous n'avez bien sr pas retenir ces concepts d'objets pour pouvoir programmer avec Python, nous avons juste
ouvert cette parenthse pour attirer votre attention sur la syntaxe.
Remarque : n'utilisez jamais le mot file comme nom de variable pour un fichier, car file est un mot rserv de Python.
Voici maintenant un exemple complet de lecture d'un fichier avec Python.
>>> filin = open([Link], r)
>>> lignes = [Link]()
>>> lignes
[girafe\n, tigre\n, singe\n, souris\n]
>>> for i in lignes:
print i
girafe
tigre
singe
souris
>>> [Link]()
Vous voyez qu'en cinq lignes de code, vous avez lu et parcouru le fichier.
Remarques :
notez que la liste lignes contient le caractre \n la fin de chacun de ses lments. Ceci correspond au saut
la ligne de chacune d'entre elles (ceci est cod par un caractre spcial que l'on symbolise par \n). Vous
pourrez parfois rencontrer galement la notation octale \012 ;
remarquez aussi que lorsque l'on affiche les diffrentes lignes du fichier l'aide de la boucle for et de
l'instruction print, Python saute chaque fois une ligne.
print ligne
- 25 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
ligne = [Link]()
girafe
tigre
singe
souris
>>> [Link]()
On remarque qu' l'ouverture d'un fichier, le tout premier caractre est considr comme le caractre 0 (tout comme
le premier lment d'une liste). La mthode seek() permet facilement de remonter au dbut du fichier lorsque l'on
est arriv la fin ou lorsqu'on en a lu une partie.
print li
girafe
tigre
singe
souris
>>> [Link]()
La boucle for va demander Python d'aller lire le fichier ligne par ligne. Privilgiez cette mthode par la suite.
[Link](i)
- 26 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> [Link]()
aprs avoir initialis la liste animaux2, nous avons ouvert un fichier, mais cette fois-ci en mode criture (avec
le caractre w) ;
ensuite, on a balay cette liste l'aide d'une boucle. chaque itration, nous avons crit chaque lment de
la liste dans le fichier. Remarquez nouveau la mthode write() qui s'applique sur l'objet filout ;
enfin, on a ferm le fichier avec la mthode close().
Vous voyez qu'il est extrmement simple en Python de lire ou d'crire dans un fichier.
Remarque : si votre programme produit uniquement du texte, vous pouvez l'crire sur la sortie standard (avec
l'instruction print). L'avantage est que dans ce cas l'utilisateur peut bnficier de toutes les potentialits d'Unix
(redirection, tri, parsing ). S'il veut crire le rsultat du programme dans un fichier, il pourra toujours le faire en
redirigeant la sortie.
VII-C - Exercices
Conseil : pour les exercices 1 et 2, utilisez l'interprteur Python. Pour les exercices suivants, crivez des scripts dans
des fichiers, puis excutez-les dans unshell.
1
2
3
Dans l'exemple 'girafe', 'tigre', etc., ci-dessus, comment expliquer vous que Python saute une ligne chaque
itration ? Rcrivez les instructions ad hoc pour que Python crive le contenu du fichier sans sauter de
ligne.
En reprenant le dernier exemple sur l'criture dans un fichier, vous pouvez constater que les noms d'animaux
ont t crits les uns la suite des autres, sans retour la ligne. Comment expliquez-vous ce rsultat ?
Modifiez les instructions de manire crire un animal par ligne.
Dans cet exercice, nous allons utiliser une sortie partielle de DSSP (Define Secondary Structure of Proteins),
qui est un logiciel d'extraction des structures secondaires. Ce fichier contient cinq colonnes correspondant
respectivement au numro de rsidu, l'acide amin, sa structure secondaire et ses angles phi/psi.
Tlchargez le fichier first_helix_1tfe.txt sur le site du cours et sauvegardez-le dans votre rpertoire de
travail (jetez-y un il en passant).
Chargez les lignes de ce fichier en les plaant dans une liste puis fermez le fichier.
crivez chaque ligne.
VIII - Modules
VIII-A - Dfinition
Les modules sont des programmes Python qui contiennent des fonctions que l'on est amen rutiliser souvent (on
les appelle aussi bibliothques ou libraries ). Les dveloppeurs de Python ont mis au point de nombreux modules
qui effectuent une quantit phnomnale de tches. Pour cette raison, prenez le rflexe de vrifier si une partie du
code que vous souhaitez crire n'existe pas dj sous forme de module. La plupart de ces modules sont dj installs
dans les versions standards de Python. Vous pouvez accder une documentation exhaustive sur le site de
Python. Surfez un peu sur ce site, la quantit de modules est impressionnante.
- 27 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
l'aide du mot-cl from, vous pouvez importer une fonction spcifique d'un module donn. Remarquez que dans ce
cas il est inutile de rpter le nom du module, seul le nom de ladite fonction est requis.
On peut galement importer toutes les fonctions d'un module :
>>> from random import *
>>> x = [1, 2, 3, 4]
>>> shuffle(x)
>>> x
[2, 3, 1, 4]
>>> shuffle(x)
>>> x
[4, 2, 1, 3]
>>> randint(0,50)
46
>>> uniform(0,2.5)
0.64943174760727951
Comme vous l'avez devin, l'instruction from random import * importe toutes les fonctions du module random. On
peut ainsi utiliser toutes ses fonctions directement, par exemple shuffle(), qui permute une liste alatoirement.
Dans la pratique, plutt que de charger toutes les fonctions d'un module en une seule fois (from random import
*), nous vous conseillons de charger le module (import random) puis d'appeler explicitement les fonctions voulues
([Link](0,2)).
Enfin, si vous voulez vider de la mmoire un module dj charg, vous pouvez utiliser l'instruction del :
>>> import random
>>> [Link](0,10)
2
>>> del random
>>> [Link](0,10)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name random is not defined
- 28 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Vous pouvez constater qu'un rappel d'une fonction du module random aprs l'avoir vid de la mmoire retourne un
message d'erreur.
Enfin, il est galement possible de dfinir un alias (un nom plus court) pour un module :
>>> import random as rand
>>> [Link](1, 10)
6
Dans cet exemple, les fonctions du module random sont accessibles via l'alias rand.
On peut se promener dans l'aide avec les flches ou les touches page-up et page-down (comme dans les commandes
Unix man, more ou less). Il est aussi possible d'invoquer de l'aide sur une fonction particulire d'un module de la
manire suivante help([Link]).
La commande help() est en fait une commande plus gnrale permettant d'avoir de l'aide sur n'importe quel objet
charg en mmoire.
>>> x = range(2)
>>> help(x)
Help on list object:
class list(object)
| list() -> new list
| list(sequence) -> new list initialized from sequences items
|
| Methods defined here:
|
| __add__()
|
x.__add__(y) <==> x+y
|
Enfin, si on veut connatre en seul coup d'il toutes les mthodes ou variables associes un objet, on peut utiliser
la commande dir :
>>> import random
>>> dir(random)
[BPF, LOG4, NV_MAGICCONST, RECIP_BPF, Random, SG_MAGICCONST, SystemRandom,
TWOPI, WichmannHill, _BuiltinMethodType, _MethodType, __all__, __builtins__,
__doc__, __file__, __name__, _acos, _ceil, _cos, _e, _exp, _hexlify,
_inst, _log, _pi, _random, _sin, _sqrt, _test, _test_generator,
_urandom, _warn, betavariate, choice, expovariate, gammavariate, gauss,
getrandbits, getstate, jumpahead, lognormvariate, normalvariate,
paretovariate, randint, random, randrange, sample, seed, setstate,
shuffle, uniform, vonmisesvariate, weibullvariate]
>>>
[Link]
Nous vous conseillons vivement d'aller surfer sur les pages de ces modules pour dcouvrir toutes leurs potentialits.
Vous verrez plus tard comment crer votre propre module lorsque vous tes amens rutiliser souvent vos propres
fonctions.
Enfin, notez qu'il existe de nombreux autres modules qui ne sont pas installs de base dans Python, mais qui sont
de grand intrt en bioinformatique (au sens large). Citons-en quelques-uns : numpy (algbre linaire, transforme
de Fourier), biopython (recherche dans les banques de donnes biologiques), rpy (dialogue R/Python)
Dans l'exemple prcdent, poulain@cumin> reprsente l'invite du shell , [Link] est le nom du script Python, salut,
girafe et 42 sont les arguments passs au script.
La variable [Link] est une liste qui reprsente tous les arguments de la ligne de commande, y compris le nom
du script lui-mme qu'on peut retrouver dans [Link][0]. On peut donc accder chacun de ces arguments avec
[Link][1], [Link][2]
On peut aussi utiliser la fonction [Link]() pour quitter un script Python. On peut donner comme argument un objet
(en gnral une chane de caractres) qui sera renvoy au moment o Python quittera le script. Par exemple, si
vous attendez au moins un argument en ligne de commande, vous pouvez renvoyer un message pour indiquer
l'utilisateur ce que le script attend comme argument :
#!/usr/bin/env Python
import sys
if len([Link]) != 2:
- 30 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Notez qu'ici on vrifie que le script possde deux arguments, car le nom du script lui-mme est le premier argument
et [Link] constitue le second.
VIII-F - Module os
Le module os gre l'interface avec le systme d'exploitation.
Une fonction pratique de ce module permet de grer la prsence d'un fichier sur le disque.
>>> import sys
>>> import os
>>> if [Link]("[Link]"):
Dans cet exemple, si le fichier n'est pas prsent sur le disque, on quitte le programme avec la fonction exit() du
module sys.
La fonction system() permet d'appeler n'importe quelle commande externe.
>>> import os
>>> [Link]("ls -al")
total 5416
drwxr-xr-x 2 poulain dsimb
4096 2010-07-21 14:33
drwxr-xr-x 6 poulain dsimb
4096 2010-07-21 14:26
-rw-r--r-- 1 poulain dsimb 124335 2010-07-21 14:31
-rw-r--r-- 1 poulain dsimb 4706057 2010-07-21 14:31
-rw-r--r-- 1 poulain dsimb 233585 2010-07-21 14:30
-rw-r--r-- 1 poulain dsimb 463559 2010-07-21 14:33
0
.
..
[Link]
NC_000913.fna
NC_001133.fna
NC_001133.gbk
La commande externe ls -al est introduite comme une chane de caractres la fonction system().
VIII-G - Exercices
Conseil : pour les trois premiers exercices, utilisez l'interprteur Python. Pour les exercices suivants, crivez des
scripts dans des fichiers, puis excutez-les dans un shell.
Affichez sur la mme ligne les nombres de 10 20 (inclus) ainsi que leur racine carre avec 3 dcimales
(module math). Exemple :
10
11
12
13
3.162
3.317
3.464
3.606
- 31 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Nous pouvons donc utiliser certaines proprits des listes comme les tranches :
>>> animaux = "girafe tigre"
>>> animaux[0:4]
gira
>>> animaux[9:]
gre
>>> animaux[:-2]
girafe tig
A contrario des listes, les chanes de caractres prsentent toutefois une diffrence notable, ce sont des listes non
modifiables. Une fois dfinie, vous ne pouvez plus modifier un de ses lments. Le cas chant, Python renvoie
un message d'erreur :
>>> animaux = "girafe tigre"
>>> animaux[4]
f
>>> animaux[4] = "F"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: str object does not support item assignment
Par consquent, si vous voulez modifier une chane, vous tes obligs d'en construire une nouvelle. Pour cela,
n'oubliez pas que les oprateurs de concatnation (+) et de duplication (*) (cf chapitre variables et criture ) peuvent
vous aider. Vous pouvez galement gnrer une liste, qui elle est modifiable, puis revenir une chane.
- 32 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Lorsqu'on souhaite crire un texte sur plusieurs lignes, il est trs commode d'utiliser les guillemets triples permettant
de conserver le formatage (notamment les retours la ligne) :
>>> x = souris
chat
abeille
>>> x
souris\nchat\nabeille
>>> print x
souris
chat
abeille
Les fonctions lower() et upper() passent un texte en minuscules et en majuscules respectivement. On remarque que
l'utilisation de ces fonctions n'altre pas la chane de dpart, mais renvoie la chane transforme.
Pour mettre en majuscule la premire lettre seulement, vous pouvez faire :
>>> x[0].upper() + x[1:]
Girafe
Il existe une mthode associe aux chanes de caractres qui est particulirement pratique, la fonction split() :
>>> animaux = "girafe tigre singe"
>>> [Link]()
[girafe, tigre, singe]
- 33 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
print i
girafe
tigre
singe
La fonction split() dcoupe la ligne en champs, en utilisant comme sparateur les espaces ou les tabulations. Il est
possible de modifier le sparateur de champs, par exemple :
>>> animaux = "girafe:tigre:singe"
>>> [Link](":")
[girafe, tigre, singe]
animal = "girafe"
[Link](i)
[Link](afe)
[Link](tig)
Si l'lment recherch est trouv, alors l'indice du dbut de l'lment dans la chane de caractres est renvoy. Si
l'lment n'est pas trouv, alors la valeur -1 est renvoye.
Si l'lment recherch est trouv plusieurs fois, seul l'indice de la premire occurrence est retourn :
>>> animaux = "girafe tigre"
>>> [Link]("i")
1
On trouve aussi la fonction replace(), qui serait l'quivalent de la fonction de substitution de la commande Unix sed :
>>> animaux = "girafe tigre"
>>> [Link]("tigre", "singe")
girafe singe
>>> [Link]("i", "o")
gorafe togre
Enfin, la fonction count() compte le nombre d'occurrences d'une chane de caractres passe en argument :
>>>
>>>
2
>>>
0
>>>
1
- 34 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> int(i)
456
>>> float(i)
456.0
>>> i = 3.1416
>>> float(i)
3.1415999999999999
Ces conversions sont essentielles lorsqu'on lit ou crit des nombres dans un fichier. En effet, les nombres dans un
fichier sont considrs comme du texte par la fonction readlines(), par consquent il faut les convertir si on veut
effectuer des oprations numriques dessus.
Les lments de la liste initiale sont concatns les uns la suite des autres et intercals par un sparateur qui peut
tre n'importe quelle chane de caractres (ici, nous avons utilis un tiret, un espace et rien).
Attention, la fonction join() ne s'applique qu' une liste de chanes de caractres.
>>> maliste = ["A", 5, "G"]
>>> " ".join(maliste)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected string, int found
Nous esprons qu'aprs ce petit tour d'horizon vous serez convaincu de la richesse des mthodes associes aux
chanes de caractres. Pour avoir une liste exhaustive de l'ensemble des mthodes associes une variable
particulire, vous pouvez utiliser la commande dir().
>>> dir(animaux)
[__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __ge__,
__getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__,
__hash__, __init__, __le__, __len__, __lt__, __mod__, __mul__, __ne__,
__new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__,
__setattr__, __str__, capitalize, center, count, decode, encode,
endswith, expandtabs, find, index, isalnum, isalpha, isdigit, islower,
isspace, istitle, isupper, join, ljust, lower, lstrip, partition,
replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split,
splitlines, startswith, strip, swapcase, title, translate, upper,
zfill]
Pour l'instant vous pouvez ignorer les mthodes qui commencent et qui se terminent par deux tirets bas (underscores)
__ .
Vous pouvez ensuite accder l'aide et la documentation d'une fonction particulire avec help() :
- 35 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> help([Link])
Help on built-in function split:
split()
[Link]([sep [,maxsplit]]) -> list of strings
Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator.
(END)
IX-G - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell .
Soit la liste ['girafe', 'tigre', 'singe', 'souris']. Avec une boucle, affichez chaque lment ainsi que sa taille
(nombre de caractres).
Soit la squence nuclique ATATACGGATCGGCTGTTGCCTGCGTAGTAGCGT. Calculez la frquence de
chaque base dans cette squence.
Soit la squence protique ALA GLY GLU ARG TRP TYR SER GLY ALA TR P . Transformez cette
squence en une chane de caractres en utilisant le code une lettre pour les acides amins.
Distance de Hamming.
La distance de Hamming mesure la diffrence entre deux squences de mme taille en sommant le nombre
de positions qui, pour chaque squence, ne correspondent pas au mme acide amin. Calculez la distance de
Hamming pour les squences AGWPSGGASAGLAIL et IGWPSAGASAGLWIL.
Palindrome.
Un palindrome est un mot ou une phrase dont l'ordre des lettres reste le mme si on le lit de gauche droite
ou de droite gauche. Par exemple, ressasser et Engage le jeu que je le gagne sont des palindromes.
crivez un script qui dtermine si une chane de caractres est un palindrome. Pensez vous dbarrasser des
majuscules et des espaces. Testez si les expressions suivantes sont des palindromes : Radar , Never odd
or even , Karine alla en Iran , Un roc si biscornu .
Mot composable.
Un mot est composable partir d'une squence de lettres si la squence contient toutes les lettres du mot.
Comme au Scrabble, chaque lettre de la squence ne peut tre utilise qu'une seule fois. Par exemple, coucou
est composable partir de uocuoceokzefhu.
crivez un script qui permet de savoir si un mot est composable partir d'une squence de lettres. Testez-le
avec diffrents mots et squences.
Remarque : dans votre script, le mot et la squence de lettres seront des chanes de caractres.
Alphabet et pangramme.
Les codes ASCII des lettres minuscules de l'alphabet vont de 97 (lettre a) 122 (lettre z). La fonction chr()
prend en argument un code ASCII sous forme d'un entier et renvoie le caractre correspondant. Ainsi chr(97)
renvoie 'a', chr(98) renvoie 'b' et ainsi de suite.
crivez un script qui construit une chane de caractres contenant toutes les lettres de l'alphabet.
Un pangramme est une phrase comportant au moins une fois chaque lettre de l'alphabet. Par exemple, Portez
ce vieux whisky au juge blond qui fume est un pangramme.
Modifiez le script prcdent pour dterminer si une chane de caractres est un pangramme ou non. Pensez
vous dbarrasser des majuscules le cas chant. Testez si les expressions suivantes sont des pangrammes :
Monsieur Jack vous dactylographiez bien mieux que votre ami Wolf , Buvez de ce whisky que le patron
juge fameux .
- 36 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Tlchargez le fichier pdb 1BTA dans votre rpertoire. Faites un script qui rcupre seulement les
carbones alpha et qui les affiche l'cran.
En vous basant sur le script prcdent, affichez l'cran les carbones alpha des deux premiers rsidus.
Toujours avec le mme script, calculez la distance inter atomique entre ces deux atomes.
En vous basant sur le script prcdent, calculez les distances entre carbones alpha conscutifs. Affichez ces
distances sous la forme
la fin du script, faites galement afficher la moyenne des distances. La distance inter carbone alpha dans les
protines est trs stable et de l'ordre de 3,8 angstrms. Observez avec attention les valeurs que vous avez obtenues.
Expliquez l'anomalie dtecte.
x = [1,2,3]
[Link](5)
x
2, 3, 5]
x = [1,2,3]
x = x + [5]
x
2, 3, 5]
insert()
pour insrer un objet dans une liste avec un indice dtermin.
>>> [Link](2,-15)
>>> x
[1, 2, -15, 3, 5]
del
pour supprimer un lment d'une liste un indice dtermin.
>>> del x[1]
>>> x
[1, -15, 3, 5]
remove()
- 37 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
sort()
pour trier une liste
>>> [Link]()
>>> x
[-15, 1, 3]
reverse()
pour inverser une liste
>>> [Link]()
>>> x
[3, 1, -15]
count()
pour compter le nombre d'lments (pass en argument) dans une liste.
>>>
>>>
3
>>>
1
>>>
0
l=[1, 2, 4, 3, 1, 1]
[Link](1)
[Link](4)
[Link](23)
Remarque 1 : attention, une liste remanie n'est pas renvoye ! Pensez-y dans vos utilisations futures des listes.
Remarque 2 : attention, certaines fonctions ci-dessus dcalent les indices d'une liste (par exemple insert(), del, etc.).
La mthode append() est particulirement pratique, car elle permet de construire une liste au fur et mesure des
itrations d'une boucle. Pour cela, il est commode de dfinir pralablement une liste vide de la forme maliste = [].
Voici un exemple o une chane de caractres est convertie en liste :
>>> seq = CAAAGGTAACGC
>>> seq_list = []
>>> seq_list
[]
>>> for i in seq:
seq_list.append(i)
>>> seq_list
[C, A, A, A, G, G, T, A, A, C, G, C]
Remarquez que vous pouvez directement utiliser la fonction list() qui prend n'importe quel objet squentiel (liste,
chane de caractres, tuples, etc.) et qui renvoie une liste :
>>> seq = CAAAGGTAACGC
>>> list(seq)
[C, A, A, A, G, G, T, A, A, C, G, C]
- 38 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Cette mthode est certes plus simple, mais il arrive parfois que l'on doive utiliser les boucles tout de mme, comme
lorsqu'on lit un fichier.
= [1, 3, 5, 7, 9]
in liste
in liste
not in liste
not in liste
La variation avec not permet, a contrario , de vrifier qu'un lment n'est pas dans une liste.
x = [1,2,3]
y = x
y
2, 3]
x[1] = -15
y
-15, 3]
Vous voyez que la modification de x modifie y aussi. Rappelez-vous de ceci dans vos futurs programmes, car cela
pourrait avoir des effets dsastreux ! Techniquement, Python utilise des pointeurs (comme dans le langage C) vers
les mmes objets et ne cre pas de copie moins que vous n'en ayez fait la demande explicitement. Regardez cet
exemple :
>>>
>>>
>>>
>>>
[1,
x = [1,2,3]
y = x[:]
x[1] = -15
y
2, 3]
Dans l'exemple prcdent, x[:] a cr une copie la vole de la liste x. Vous pouvez utiliser aussi la fonction list()
qui renvoie explicitement une liste :
>>>
>>>
>>>
>>>
[1,
x = [1,2,3]
y = list(x)
x[1] = -15
y
2, 3]
Attention, les deux techniques prcdentes ne fonctionnent que pour les listes une dimension, autrement dit les
listes qui ne contiennent pas elles-mmes d'autres listes.
>>> x = [[1,2],[3,4]]
>>> x
[[1, 2], [3, 4]]
>>> y = x[:]
>>> y[1][1] = 55
- 39 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> y
[[1, 2], [3, 55]]
>>> x
[[1, 2], [3, 55]]
>>> y = list(x)
>>> y[1][1] = 77
>>> y
[[1, 2], [3, 77]]
>>> x
[[1, 2], [3, 77]]
La mthode de copie qui marche tous les coups consiste appeler la fonction deepcopy() du module copy.
>>> import copy
>>> x = [[1,2],[3,4]]
>>> x
[[1, 2], [3, 4]]
>>> y = [Link](x)
>>> y[1][1] = 99
>>> y
[[1, 2], [3, 99]]
>>> x
[[1, 2], [3, 4]]
X-D - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell.
1
2
3
4
5
6
Soit la liste de nombres [8, 3, 12.5, 45, 25.5, 52, 1]. Triez les nombres de cette liste par ordre croissant, sans
utiliser la fonction sort() (les fonctions min(), append() et remove() vous seront utiles).
Gnrez alatoirement une squence nuclique de 20 bases en utilisant une liste et la mthode append().
Transformez la squence nuclique TCTGTTAACCATCCACTTCG en sa squence complmentaire inverse.
N'oubliez pas que la squence complmentaire doit tre inverse, pensez aux mthodes des listes !
Soit la liste de nombres [5, 1, 1, 2, 5, 6, 3, 4, 4, 4, 2]. Enlevez les doublons de cette liste, triez-la et affichez-la.
Gnrez alatoirement une squence nuclique de 50 bases contenant 10 % de A, 50 % de G, 30 % de T et
10 % de C.
Exercice +++. Triangle de Pascal
Comprenez comment une ligne est construite partir de la prcdente. partir de l'ordre 1 (ligne 2, 11), gnrez
l'ordre suivant (121). Vous pouvez utiliser une liste pralablement gnre avec range(). Gnralisez l'aide d'une
boucle. crivez dans un fichier [Link] les lignes du triangle de Pascal de l'ordre 1 jusqu' l'ordre 10.
XI - Dictionnaires et tuples
XI-A - Dictionnaires
Les dictionnaires se rvlent trs pratiques lorsque vous devez manipuler des structures complexes dcrire et
que les listes prsentent leurs limites. Les dictionnaires sont des collections non ordonnes d'objets, c.--d. qu'il n'y
a pas de notion d'ordre (i.e. pas d'indice). On accde aux valeurs d'un dictionnaire par des cls. Ceci semble un
peu confus ? Regardez l'exemple suivant :
- 40 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> ani1 = {}
>>> ani1[nom] = girafe
>>> ani1[taille] = 5.0
>>> ani1[poids] = 1100
>>> ani1
{nom: girafe, poids: 1100, taille: 5.0}
>>> ani1[taille]
5.0
En premier, on dfinit un dictionnaire vide avec les symboles {} (tout comme on peut le faire pour les listes avec []).
Ensuite, on remplit le dictionnaire avec diffrentes cls auxquelles on affecte des valeurs (une par cl). Vous pouvez
mettre autant de cls que vous voulez dans un dictionnaire (tout comme vous pouvez ajouter autant d'lments
que vous voulez dans une liste). Pour rcuprer la valeur d'une cl donne, il suffit d'utiliser une syntaxe du style
dictionnaire['cle'].
On peut aussi initialiser toutes les cls d'un dictionnaire en une seule opration :
>>> ani2 = {nom:singe, poids:70, taille:1.75}
print ani[nom]
girafe
singe
- 41 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Vous voyez que les dictionnaires permettent de grer des structures complexes de manire plus explicite que les
listes.
L'affectation et l'indiage fonctionnent comme avec les listes, mais si l'on essaie de modifier un des lments du
tuple, Python renvoie un message d'erreur. Si vous voulez ajouter un lment (ou le modifier), vous devez crer un
autre tuple :
>>> x = (1,2,3)
>>> x + (2,)
(1, 2, 3, 2)
Remarquez que pour utiliser un tuple d'un seul lment, vous devez utiliser une syntaxe avec une virgule (element,),
ceci pour viter une ambigut avec une simple expression. Autre particularit des tuples, il est possible d'en crer
de nouveaux sans les parenthses, ds lors que ceci ne pose pas d'ambigut avec une autre expression :
>>>
>>>
(1,
>>>
>>>
(1,
x = (1,2,3)
x
2, 3)
x = 1,2,3
x
2, 3)
Toutefois, nous vous conseillons d'utiliser systmatiquement les parenthses afin d'viter les confusions.
Enfin, on peut utiliser la fonction tuple(sequence) qui fonctionne exactement comme la fonction list, c'est--dire qu'elle
prend en argument un objet squentiel et renvoie le tuple correspondant :
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> tuple(range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> tuple("ATGCCGCGAT")
(A, T, G, C, C, G, C, G, A, T)
Remarque : les listes, dictionnaires, tuples sont des objets qui peuvent contenir des collections d'autres objets.
On peut donc construire des listes qui contiennent des dictionnaires, des tuples ou d'autres listes, mais aussi des
dictionnaires contenant des tuples, des listes, etc.
XI-C - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell.
- 42 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
ACCTAGCCATGTAGAATCGCCTAGGCTTTAGCTAGCTCTAGCTAGCTG
En utilisant un dictionnaire, faites un programme qui rpertorie tous les mots de deux lettres qui existent dans la
squence (AA, AC, AG, AT, etc.) ainsi que leur nombre d'occurrences puis qui les affiche l'cran.
En vous basant sur les scripts prcdents, extrayez les mots de deux lettres et leur occurrence sur le gnome
du chromosome I de la levure du boulanger Saccharomyces cerevisiae NC_001133.fna . Attention, le
gnome complet est fourni au format fasta.
Crez un script [Link] qui prend en arguments un fichier genbank suivi d'un entier compris entre 1
et 4. Ce script doit extraire du fichier genbank tous les mots (ainsi que leur nombre d'occurrences) du nombre
de lettres passes en option.
Appliquez ce script sur le gnome d' Escherichia coli : NC_000913.fna (au format fasta). Cette mthode
vous parat-elle efficace sur un gnome assez gros comme celui d' E. Coli ? Comment pourrait-on en
amliorer la rapidit ?
partir du fichier PDB 1BTA , construisez un dictionnaire qui contient quatre cls se rfrant au premier
carbone alpha : le numro du rsidu, puis les coordonnes x, y et z.
Sur le mme modle que ci-dessus, crez une liste de dictionnaires pour chacun des carbones alpha de la
protine.
l'aide de cette liste, calculez les coordonnes x, y et z du barycentre de ces carbones alpha.
XII - Fonctions
XII-A - Principe
En programmation, les fonctions sont trs utiles pour raliser plusieurs fois la mme opration au sein d'un
programme. Elles permettent galement de rendre le code plus lisible et plus clair en le fractionnant en blocs logiques.
Vous connaissez dj certaines fonctions Python, par exemple [Link](angle) du module math renvoie le cosinus
de la variable angle exprime en radians. Vous connaissez aussi des fonctions internes Python comme range() ou
len(). Pour l'instant, une fonction est vos yeux une sorte de bote noire :
laquelle vous passez une (ou zro ou plusieurs) valeur(s) entre parenthses. Ces valeurs sont appeles
arguments ;
qui effectue une action. Par exemple [Link]() permute alatoirement une liste ;
et qui renvoie ventuellement un rsultat.
Par exemple si vous appelez la fonction range() en lui passant la valeur 5 (range(5)), celle-ci vous renvoie une liste
de nombres entiers de 0 4 ([0, 1, 2, 3, 4]).
Au contraire, aux yeux du programmeur une fonction est une portion de code effectuant une action bien particulire.
Avant de dmarrer sur la syntaxe, revenons sur cette notion de bote noire :
1
Une fonction effectue une tche. Pour cela, elle reoit ventuellement des arguments et renvoie
ventuellement un rsultat. Ce qui se passe en son sein n'intresse pas directement l'utilisateur. Par
exemple, il est inutile de savoir comment la fonction [Link]() calcule un cosinus, on a juste besoin de
savoir qu'il faut lui passer en argument un angle en radians et qu'elle renvoie le cosinus de cet angle. Ce qui
se passe au sein de la fonction ne regarde que le programmeur (c'est--dire vous dans ce chapitre) ;
- 43 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Chaque fonction effectue en gnral une tche unique et prcise. Si cela se complique, il est plus judicieux
d'crire plusieurs fonctions (qui peuvent ventuellement s'appeler les unes les autres). Cette modularit
amliore la qualit gnrale et la lisibilit du code. Vous verrez qu'en Python, les fonctions prsentent une
grande flexibilit.
XII-B - Dfinition
Pour dfinir une fonction, Python utilise le mot-cl def et si on veut que celle-ci renvoie une valeur, il faut utiliser le
mot-cl return. Par exemple :
>>> def carre(x):
return x**2
Remarquez que la syntaxe de def utilise les : comme les boucles for, while ainsi que les tests if , un bloc
d'instructions est donc attendu. De mme que pour les boucles et les tests, l' indentation de ce bloc d'instructions
(i.e. le corps de la fonction) est obligatoire .
Dans l'exemple prcdent, nous avons pass un argument la fonction carre() qui nous a retourn une valeur que
nous avons affiche l'cran. Que veut dire valeur retourne ? Eh bien, cela signifie que cette dernire est stockable
dans une variable :
>>> res = carre(2)
>>> print res
4
Ici, le rsultat renvoy par la fonction est stocke dans la variable res. Notez qu'une fonction ne prend pas forcment
un argument et ne renvoie pas forcment une valeur, par exemple :
>>> def hello():
print "bonjour"
>>> hello()
bonjour
Dans ce cas la fonction hello() se contente d'imprimer la chane de caractres "hello" l'cran. Elle ne prend aucun
argument et ne renvoie aucun rsultat. Par consquent, cela n'a pas de sens de vouloir rcuprer dans une variable
le rsultat renvoy par une telle fonction. Si on essaie tout de mme, Python affecte la valeur None qui signifie
rien en anglais :
>>> x = hello()
bonjour
>>> print x
None
- 44 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
connu comme tant un langage au typage dynamique, c'est--dire qu'il reconnat pour vous le type des variables au
moment de l'excution, par exemple :
>>> def fois(x,y):
return x*y
>>> fois(2,3)
6
>>> fois(3.1415,5.23)
16.430045000000003
>>> fois(to,2)
toto
L'oprateur * reconnat plusieurs types (entiers, rels, chanes de caractres), notre fonction est donc capable
d'effectuer plusieurs tches !
Un autre gros avantage de Python est que ses fonctions sont capables de renvoyer plusieurs valeurs la fois, comme
dans cette fraction de code :
>>> def carre_cube(x):
return x**2,x**3
>>> carre_cube(2)
(4, 8)
Vous voyez qu'en ralit Python renvoie un objet squentiel qui peut par consquent contenir plusieurs valeurs. Dans
notre exemple Python renvoie un objet tuple, car on a utilis une syntaxe de ce type. Notre fonction pourrait tout
autant renvoyer une liste :
>>> def carre_cube2(x):
return [x**2,x**3]
>>> carre_cube2(3)
[9, 27]
Enfin, il est possible de passer un ou plusieurs argument(s) de manire facultative et de leur attribuer une valeur
par dfaut :
>>> def useless_fct(x=1):
return x
>>> useless_fct()
1
>>> useless_fct(10)
10
Notez que si on passe plusieurs arguments une fonction, le ou les arguments facultatifs doivent tre situs aprs
les arguments obligatoires. Il faut donc crire def fct(x, y, z=1):.
x = 2
>>> mafonction()
x vaut 2 dans la fonction
- 45 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> print x
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name x is not defined
Lorsque Python excute le code de la fonction, il connat le contenu de la variable x. Par contre, de retour dans le
module principal (dans notre cas, il s'agit de l'interprteur Python), il ne la connat plus d'o le message d'erreur. De
mme, une variable passe en argument est considre comme locale lorsqu'on arrive dans la fonction :
>>> def mafonction(x):
>>> mafonction(2)
x vaut 2 dans la fonction
>>> print x
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name x is not defined
Deuximement, lorsqu'une variable dclare la racine du module (c'est comme cela que l'on appelle un programme
Python), elle est visible dans tout le module.
>>>
>>>
>>>
3
>>>
3
def mafonction():
print x
x = 3
mafonction()
print x
Dans ce cas, la variable x est visible dans le module principal et dans toutes les fonctions du module. Toutefois,
Python ne permet pas la modification d'une variable globale dans une fonction :
>>> def mafonction():
x = x + 1
>>> x=1
>>> mafonction()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in fct
UnboundLocalError: local variable x referenced before assignment
L'erreur renvoye montre que Python pense que x est une variable locale qui n'a pas t encore assigne. Si on veut
vraiment modifier une variable globale dans une fonction, il faut utiliser le mot-cl global :
>>>
>>>
>>>
>>>
2
def mafonction():
global x
x = x + 1
x=1
mafonction()
x
Dans ce dernier cas, le mot-cl global a forc la variable x a tre globale plutt que locale au sein de la fonction.
- 46 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>>
>>>
>>>
>>>
[1,
def mafonction():
liste[1] = -127
liste = [1,2,3]
mafonction()
liste
-127, 3]
De mme que si vous passez une liste en argument, elle est tout autant modifiable au sein de la fonction :
>>>
>>>
>>>
>>>
[1,
def mafonction(x):
x[1] = -15
y = [1,2,3]
mafonction(y)
y
-15, 3]
Si vous voulez viter ce problme, utilisez des tuples, Python renverra une erreur puisque ces derniers sont non
modifiables ! Une autre solution pour viter la modification d'une liste lorsqu'elle est passe en tant qu'argument est
de la passer explicitement (comme nous l'avons fait pour l'affectation) afin qu'elle reste intacte dans le programme
principal.
>>>
>>>
>>>
>>>
[1,
>>>
>>>
[1,
def mafonction(x):
x[1] = -15
y = [1,2,3]
mafonction(y[:])
y
2, 3]
mafonction(list(y))
y
2, 3]
Dans ces deux derniers exemples, une copie de y est cre la vole lorsqu'on appelle la fonction, ainsi la liste
y du module principal reste intacte.
x = 4
>>> x = -15
>>> mafonction()
Dans la fonction x vaut 4
>>> print Dans le module principal x vaut,x
Dans le module principal x vaut -15
Vous voyez que dans la fonction, x a pris la valeur qui lui tait dfinie localement en priorit sur sa valeur dfinie
dans le module principal.
Conseil : mme si Python peut reconnatre une variable ayant le mme nom que ses fonctions ou variables internes,
vitez de les utiliser, car ceci rendra votre code confus !
- 47 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
XII-G - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell.
Prdisez le comportement de ce code sans le recopier dans un script ni dans l'interprteur Python :
def hello(prenom):
print "Bonjour", prenom
hello("Patrick")
print x
Prdisez le comportement de ce code sans le recopier dans un script ni dans l'interprteur Python :
x = 10
def hello(prenom):
print "Bonjour", prenom
hello("Patrick")
print x
Prdisez le comportement de ce code sans le recopier dans un script ni dans l'interprteur Python :
x = 10
def hello(prenom):
print "Bonjour", prenom
print x
hello("Patrick")
print x
Prdisez le comportement de ce code sans le recopier dans un script ni dans l'interprteur Python :
x = 10
def hello(prenom):
x = 42
print "Bonjour", prenom
print x
hello("Patrick")
print x
Crez une fonction qui prend une liste de base et qui renvoie la squence complmentaire d'une squence
d'ADN sous forme de liste.
partir d'une squence d'ADN ATCGATCGATCGCTGCTAGC, renvoyez le brin complmentaire (n'oubliez
pas que la squence doit tre inverse).
Crez une fonction distance() qui calcule une distance euclidienne en trois dimensions entre deux atomes.
En reprenant l'exercice sur le calcul de la distance entre carbones alpha conscutifs de la protine 1BTA
(chapitre sur les chanes de caractres ), refaites la mme chose en utilisant votre fonction distance().
- 48 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Cette action de recherche de donnes dans un fichier est appele plus gnralement parsing (qui signifie littralement
analyse syntaxique en anglais). Le parsing fait partie du travail quotidien du bioinformaticien, il est sans arrt en
train de fouiller dans des fichiers pour en extraire des informations d'intrt par exemple rcuprer les coordonnes
3D des atomes d'une protine dans un fichier PDB ou alors extraire les gnes d'un fichier genbank.
Dans ce chapitre, nous ne ferons que quelques rappels sur les expressions rgulires. Pour une documentation plus
complte, rfrez-vous la page d'aide des expressions rgulires sur le site officiel de Python.
Certains programmes Unix comme egrep, sed ou encore awk savent interprter les expressions rgulires. Tous ces
programmes fonctionnent gnralement selon le schma suivant :
1
2
[fuchs@rome cours_Python]$
Ici, egrep renvoie toutes les lignes du fichier genbank du virus de l'herps (herp_virus.gbk) qui correspondent
l'expression rgulire ^DEF (i.e. DEF en dbut de ligne).
Avant de voir comment Python gre les expressions rgulires, voici quelques lments de syntaxe des
mtacaractres :
- 49 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
[ABC]
[A-Z]
[a-z]
[0-9]
[A-Za-z0-9]
[^AB]
- 50 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
{n}
{n,m}
{n,}
{,m}
(CG|TT)
print "OK"
OK
- 51 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Nous vous recommandons plutt l'usage de la fonction search(). Si vous souhaitez avoir une correspondance avec
le dbut de la chane, vous pouvez toujours utiliser l'accroche de dbut de ligne ^.
XIII-B-3 - Groupes
Python renvoie un objet MatchObject lorsqu'une expression rgulire trouve une correspondance dans une chane
pour qu'on puisse rcuprer des informations sur les zones de correspondance.
>>> regex = [Link](([0-9]+)\.([0-9]+))
>>> resultat = [Link]("pi vaut 3.14")
>>> [Link](0)
3.14
>>> [Link](1)
3
>>> [Link](2)
14
>>> [Link]()
8
>>> [Link]()
12
Les parenthses dans l'expression rgulire permettent de crer des groupes qui seront rcuprs ultrieurement par
la fonction group(). La totalit de la correspondance est donne par group(0), le premier lment entre parenthses
est donn par group(1) et le second par group(2).
Les fonctions start() et end() donnent respectivement la position de dbut et de fin de la zone qui correspond
l'expression rgulire. Notez que la fonction search() ne renvoie que la premire zone qui correspond l'expression
rgulire, mme s'il en existe plusieurs :
>>> resultat = [Link]("pi vaut 3.14 et e vaut 2.72")
>>> [Link](0)
3.14
- 52 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
[Link](quelque
vaut quelque chose
[Link](quelque
vaut quelque chose
Nous esprons que vous tes convaincus de la puissance du module re et des expressions rgulires, alors vos
expressions rgulires !
58..272
complement(55979..56935)
Rcuprez maintenant la squence nuclique et affichez-la l'cran. Vrifiez que vous n'avez pas fait
d'erreur en comparant la taille de la squence extraite avec celle indique dans le fichier genbank.
Mettez cette squence dans une liste et rcuprez les deux premiers gnes (en les affichant l'cran).
Attention, le premier gne est un gne complmentaire, n'oubliez pas de prendre le complmentaire inverse
de la squence extraite.
partir de toutes ces petites oprations que vous transformerez en fonctions, concevez un programme
[Link] qui extrait tous les gnes d'un fichier genbank fourni en argument et les affiche l'cran.
Pour cela vous pourrez utiliser tout ce que vous avez vu jusqu' prsent (fonctions, listes, modules, etc.).
partir du script prcdent, refaites le mme programme ([Link]) en crivant chaque gne au
format fasta dans un fichier.
- 53 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>ligne de commentaire
squence sur une ligne de 80 caractres maxi
suite de la squence ..
suite de la squence ..
Vous utiliserez comme ligne de commentaire le nom de l'organisme, suivi du numro du gne, suivi des positions
de dbut et de fin du gne, comme dans cet exemple :
>Saccharomyces cerevisiae 1 1807 2169
Les noms des fichiers fasta seront de la forme [Link], [Link], etc.
XIV-B - Utilisation
Pour appeler une fonction ou une variable de ce module, il faut que le fichier [Link] soit dans le rpertoire
courant (dans lequel on travaille) ou bien dans un rpertoire indiqu par la variable d'environnement Unix
PYTHONPATH. Ensuite, il suffit d'importer le module et toutes ses fonctions (et variables) vous sont alors accessibles.
La premire fois qu'un module est import, Python cre un fichier avec une extension .pyc (ici [Link]) qui
contient le bytecode (code prcompil) du module.
L'appel du module se fait avec la commande import message. Notez que le fichier est bien enregistr avec une
extension .py et pourtant on ne la prcise pas lorsqu'on importe le module. Ensuite on peut utiliser les fonctions
comme avec un module classique.
>>> import message
>>> [Link]("Joe")
hello Joe !
>>> [Link]("Bill")
ciao Bill
>>> [Link]("Monsieur")
bonjour Monsieur
- 54 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
>>> [Link]
16092008
Les commentaires (entre triples guillemets) situs en dbut de module et sous chaque fonction permettent de fournir
de l'aide invoque ensuite par la commande help() :
>>> help(message)
NAME
message - Module inutile qui affiche des messages :-)
FILE
/home/cumin/poulain/[Link]
FUNCTIONS
Hello(nom)
Affiche hello !
Bonjour(nom)
Affiche bonjour !
Ciao(nom)
Affiche ciao !
DATA
date = 16092008
Remarques :
les fonctions dans un module peuvent s'appeler les unes les autres ;
les fonctions dans un module peuvent appeler des fonctions situes dans un autre module s'il a t
pralablement import avec la commande import.
Vous voyez que les modules sont d'une simplicit enfantine crer. Si vous avez des fonctions que vous serez
amens utiliser souvent, n'hsitez plus !
- 55 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Prenons un exemple simple, supposons que vous souhaitiez rapatrier le fichier PDB de la protine barstar. En Unix
vous utiliseriez probablement la commande wget, regardez comment faire en Python :
>>> import urllib2
>>> u = [Link]("[Link]
>>> pdb_lines = [Link]()
>>> [Link]()
>>> for i in pdb_lines:
print i,
HEADER
RIBONUCLEASE INHIBITOR
09-MAY-94
1BTA
TITLE
THREE-DIMENSIONAL SOLUTION STRUCTURE AND 13C ASSIGNMENTS OF
TITLE
2 BARSTAR USING NUCLEAR MAGNETIC RESONANCE SPECTROSCOPY
COMPND
MOL_ID: 1;
COMPND
2 MOLECULE: BARSTAR;
COMPND
3 CHAIN: A;
COMPND
4 ENGINEERED: YES
SOURCE
MOL_ID: 1;
SOURCE
2 ORGANISM_SCIENTIFIC: BACILLUS AMYLOLIQUEFACIENS;
SOURCE
3 ORGANISM_TAXID: 1390
[]
>>>
Comme vous le voyez, il suffit d'utiliser la fonction urlopen() et de lui passer en argument une URL (i.e. adresse
internet) sous forme de chane de caractres. Ds lors, les mthodes associes aux fichiers (cf chapitre 6) sont
accessibles (read(), readline(), readlines(), etc.).
Il est galement possible d'enregistrer le fichier tlcharg :
>>>
>>>
>>>
>>>
>>>
>>>
>>>
import urllib2
u = [Link]("[Link]
pdb_file_content = [Link]()
[Link]()
f = open("[Link]","w")
[Link](pdb_file_content)
[Link]()
Dans ce dernier exemple, nous rcuprons le fichier complet sous la forme d'une chane de caractres unique (avec
la fonction read()). Le fichier est ensuite enregistr dans le rpertoire courant (duquel vous avez lanc l'interprteur
Python). Nous vous laissons imaginer comment faire sur une srie de plusieurs fichiers (cf. exercices).
- 56 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Attention ne pas utiliser la fonction load une fois de trop, sinon une erreur est gnre :
>>> [Link](filein)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/[Link]", line 1370, in load
return Unpickler(file).load()
File "/usr/lib/python2.5/[Link]", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.5/[Link]", line 880, in load_eof
raise EOFError
EOFError
>>>
Il est noter qu'il existe un module quivalent, mais beaucoup plus rapide, le module cpickle .
- 57 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Concevez un script qui rapatrie de manire automatique le fichier [Link] depuis la Protein Data Bank
( l'aide du module urllib2).
On souhaite rcuprer les structures 3D de la partie N-terminale de la protine HSP90 en prsence de
diffrents cocristaux, les codes PDB sont 3K97, 3K98 et 3K99. crivez un script Python qui tlcharge de
manire automatique les fichiers PDB ( l'aide du module urllib2 et d'une boucle) et les enregistre dans le
rpertoire courant.
Reprenez le dictionnaire des mots de quatre lettres du gnome du chromosome I de la levure S. cerevisiae
( exercice 7 sur les dictionnaires et tuples ). Encodez le dictionnaire dans un fichier avec le module pickle.
Quittez Python et regardez attentivement le fichier gnr avec un diteur de texte. Relancez Python, et
dcodez le dictionnaire.
- 58 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Nous avons converti la liste a en array, mais cela aurait donn le mme rsultat si on avait converti le tuple (1,2,3).
Par ailleurs, vous voyez que lorsqu'on demande Python le contenu d'un objet array, les symboles ([]) sont utiliss
pour le distinguer d'une liste [] ou d'un tuple ().
Notez qu'un objet array ne peut contenir que des valeurs numriques. Vous ne pouvez pas, par exemple, convertir
une liste contenant des chanes de caractres en objet de type array.
La fonction arange() est quivalente range() et permet de construire un array une dimension de manire simple.
>>> [Link](10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> [Link](10.0)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8.,
>>> [Link](10,0,-1)
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
>>>
9.])
Un des avantages de la fonction arange() est qu'elle permet de gnrer des objets array qui contiennent des entiers
ou de rels selon l'argument qu'on lui passe.
La diffrence fondamentale entre un objet array une dimension et une liste (ou un tuple) est que celui-ci est considr
comme un vecteur. Par consquent on peut effectuer des oprations lment par lment dessus, ce qui est bien
commode lorsqu'on analyse de grandes quantits de donnes. Regardez ces exemples :
>>> v = [Link](4)
>>> v
array([0, 1, 2, 3])
>>> v + 1
array([1, 2, 3, 4])
>>> v + 0.1
array([ 0.1, 1.1, 2.1,
>>> v * 2
array([0, 2, 4, 6])
>>> v * v
array([0, 1, 4, 9])
3.1])
Notez bien sur le dernier exemple de multiplication que l'array final correspond la multiplication lment par lment
des deux array initiaux. Avec les listes, ces oprations n'auraient t possibles qu'en utilisant des boucles ! Nous
vous encourageons donc utiliser dornavant les objets array lorsque vous aurez besoin de faire des oprations
lment par lment.
Il est aussi possible de construire des objets array deux dimensions, il suffit de passer en argument une liste de
listes la fonction array() :
>>> [Link]([[1,2,3],[2,3,4],[3,4,5]])
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]])
>>>
Attention, plus complexe encore ! On peut aussi crer des tableaux trois dimensions en passant la fonction array()
une liste de listes de listes :
>>> [Link]([[[1,2],[2,3]],[[4,5],[5,6]]])
array([[[1, 2],
[2, 3]],
>>>
[[4, 5],
[5, 6]]])
- 59 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
La fonction array() peut crer des tableaux n'importe quel nombre de dimensions. Toutefois a devient vite
compliqu lorsqu'on dpasse trois dimensions. Retenez qu'un objet array une dimension peut tre considr comme
un vecteur et un array deux dimensions comme une matrice.
Pour rcuprer un ou plusieurs lment(s) d'un objet array, vous pouvez utiliser l'indiage ou les tranchages, de la
mme manire que pour les listes.
>>> a = [Link](10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[5:]
array([5, 6, 7, 8, 9])
>>> a[::2]
array([0, 2, 4, 6, 8])
>>> a[1]
1
Dans le cas d'un objet array deux dimensions, vous pouvez rcuprer une ligne, une colonne ou bien un seul
lment.
>>> a = [Link]([[1,2],[3,4]])
>>> a
array([[1, 2],
[3, 4]])
>>> a[:,0]
array([1, 3])
>>> a[0,:]
array([1, 2])
>>> a[1,1]
4
La syntaxe a[m,:] rcupre la ligne m-1, et a[:,n] rcupre la colonne n-1. Les tranches sont videmment aussi
utilisables sur un tableau deux dimensions.
Il peut tre parfois pnible de construire une matrice (array deux dimensions) l'aide d'une liste de listes. Le module
numpy contient quelques fonctions commodes pour construire des matrices partir de rien. Les fonctions zeros() et
ones() permettent de construire des objets array contenant des 0 ou de 1, respectivement. Il suffit de leur passer un
tuple indiquant la dimensionnalit voulue.
>>> [Link]((3,3))
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> [Link]((3,3),int)
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>> [Link]((3,3))
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
Par dfaut, les fonctions zeros() et ones() gnrent des rels, mais vous pouvez demander des entiers en passant
l'option int en second argument.
Enfin il existe les fonctions reshape() et resize() qui permettent de remanier volont les dimensions d'un array. Il faut
pour cela, leur passer en argument l'objet array remanier ainsi qu'un tuple indiquant la nouvelle dimensionnalit.
>>> a = [Link](9)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> [Link](a,(3,3))
array([[0, 1, 2],
- 60 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
[3, 4, 5],
[6, 7, 8]])
Toutefois, reshape() attend un tuple dont la dimension est compatible avec le nombre d'lments contenus dans
l'array de dpart, alors que resize() s'en moque et remplira le nouvel objet array gnr mme si les longueurs ne
concident pas.
>>> a = [Link](9)
>>> [Link]((2,2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: total size of new array must be unchanged
>>> [Link](a,(2,2))
array([[0, 1],
[2, 3]])
>>> [Link](a,(4,4))
array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 0, 1, 2],
[3, 4, 5, 6]])
Dans l'exemple prcdent, la fonction reshape() renvoie une erreur si les dimensions ne concident pas. La fonction
resize() duplique ou coupe la liste initiale s'il le faut jusqu' tant que le nouvel array soit rempli.
Si vous ne vous souvenez plus de la dimension d'un objet array, la fonction shape() permet d'en retrouver la taille.
>>> a = [Link](3)
>>> [Link](a)
(3,)
Enfin, la fonction transpose() renvoie la transpose d'un array. Par exemple pour une matrice :
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> [Link](a)
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
Notez bien que dot(a,a) renvoie le produit matriciel entre deux matrices, alors que a*a renvoie le produit lment
par lment.
- 61 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Pour toutes les oprations suivantes, il faudra utiliser des fonctions dans le sous-module [Link]. La fonction
inv() renvoie l'inverse d'une matrice carre, det() son dterminant, eig() ses vecteurs et valeurs propres.
>>> a
array([[0, 1],
[2, 3]])
>>> [Link](a)
array([[-1.5, 0.5],
[ 1. , 0. ]])
>>> [Link](a)
-2.0
>>> [Link](a)
(array([-0.56155281, 3.56155281]), array([[-0.87192821, -0.27032301],
[ 0.48963374, -0.96276969]]))
>>> [Link](a)[0]
array([-0.56155281, 3.56155281])
>>> [Link](a)[1]
array([[-0.87192821, -0.27032301],
[ 0.48963374, -0.96276969]])
Notez que la fonction eig() renvoie un tuple dont le premier lment correspond aux valeurs propres et le second
lment aux vecteurs propres.
Vous constatez que numpy redfinit certaines fonctions ou constantes mathmatiques de base, comme pi
(nombre pi), cos() (fonction cosinus) ou abs() (valeur absolue, ou module d'un complexe). Ceci est bien
pratique, car nous n'avons pas appeler ces fonctions ou constantes depuis le module math, le code en est
ainsi plus lisible.
Dans la partie 1), on dfinit le vecteur x reprsentant un angle allant de -2*pi 2*pi radians par pas de 0,1
et le vecteur y comme le cosinus de x.
En 2) on calcule la transforme de Fourier avec la fonction fft() qui renvoie un vecteur (objet array une
dimension) de nombres complexes. Eh oui, le module numpy gre aussi les nombres complexes ! On extrait
ensuite le module du rsultat prcdent avec la fonction abs().
La variable x_ABSTFL reprsente l'abscisse du spectre (en radians-1).
La variable ABSTF contient le spectre lui-mme. L'analyse de ce dernier nous donne un pic 0,15 radian-1,
ce qui correspond bien 2*pi (plutt bon signe de retrouver ce rsultat). Le graphe de ce spectre est
prsent dans la partie ddie matplotlib (section 16.3).
- 62 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Notez que tout au long de cette partie, nous avons toujours utilis la syntaxe [Link]() pour bien vous montrer
quelles taient les fonctions propres numpy. Bien sr dans vos futurs scripts il sera plus commode d'importer
compltement le module numpy avec l'instruction from numpy import *. Vous pourrez ensuite appeler les fonctions
de numpy directement (sans le prfixe numpy.).
Si vous souhaitez quand mme spcifier pour chaque fonction numpy son module d'appartenance, vous pouvez
dfinir un alias pour numpy avec l'instruction import numpy as np. Le module numpy est alors connu sous le nom
np. L'appel de la fonction array() se fera par [Link]().
IUPAC.unambiguous_dna signifie que la squence entre est bien une squence d'ADN.
Obtention de la squence complmentaire et complmentaire inverse.
>>> [Link]()
Seq(TATAGCCGATATCGTACGT, IUPACUnambiguousDNA())
>>> ADN.reverse_complement()
Seq(TGCATGCTATAGCCGATAT, IUPACUnambiguousDNA())
[Link]
plot(x,y)
xlabel(angle (rad))
ylabel(cos(angle))
title(Fonction: y = cos(x))
grid()
show()
Vous constatez que le module matplotlib gnre une fentre graphique interactive permettant l'utilisateur de votre
script de manipuler le graphe (enregistrer comme image, zoomer, etc.).
Revenons maintenant sur le code. Tout d'abord, vous voyez qu'on importe le module qui s'appelle pylab (et non
pas matplotlib). Le module pylab importe lui-mme toutes les fonctions (et variables) du module numpy (e.g. pi, cos,
arange, etc.). Il est plus commode de l'importer par from pylab import * que par import pylab.
La partie qui nous intresse (aprs la ligne # draw the plot) contient les parties spcifiques matplotlib. Vous constatez
que les commandes sont trs intuitives.
La fonction plot() va gnrer un graphique avec des lignes et prend comme valeurs en abscisse (x) et en
ordonnes (y) des vecteurs de type array une dimension.
Les fonctions xlabel() et ylabel() sont utiles pour donner un nom aux axes.
title() permet de dfinir le titre du graphique.
grid() affiche une grille en filigrane.
Jusqu'ici, aucun graphe n'est affich. Pour activer l'affichage l'cran du graphique, il faut appeler la fonction
show(). Celle-ci va activer une boucle dite gtkqui attendra les manipulations de l'utilisateur.
Les commandes Python ventuellement situes aprs la fonction show() seront excutes seulement lorsque
l'utilisateur fermera la fentre graphique (petite croix en haut droite).
[Link]
xlabel(angle (rad))
ylabel(cos(angle))
title(Fonction: y = cos(x))
grid()
show()
# plot TF of cosine
plot(x_ABSTF[:20],ABSTF[:20])
xlabel(inverse angle (rad^-1))
ylabel(Intensity)
title(Spectrum of cosine function)
grid()
show()
Le premier graphe doit afficher la fonction cosinus comme ci-dessus et le second doit ressembler cela :
- 65 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Les fonctions R sont accessibles par le sous-module r du module rpy. Les fonctions png() et plot() sont utilisables
comme en R. Les fonctions qui contiennent un point dans leur nom en R ([Link]()) sont utilisables avec un caractre
soulign _ la place (ici dev_off()).
Voyons maintenant un exemple plus intressant, pour lequel on calcule la distribution des diffrentes bases dans
une squence nuclique :
from rpy import r as R
seq = "ACGATCATAGCGAGCTACGTAGAA"
seq2 = list( seq )
[Link]("rpy_test2.png")
# tri des bases, car unique() nordonne pas les donnes
# alors que table() le fait
seq3 = [Link]( seq2 )
# listes des bases prsentes
bases = [Link]( seq3 )
# effectif de chaque base
effectifs = [Link]( seq3 )
# dessin du barplot et sauvegarde de la position des abscisses
coords = [Link]( effectifs, ylab="nombre de bases")
# ajout du texte pour laxe des abscisses
[Link](coords, -0.5, bases, xpd = True, cex = 1.5, font = 2 )
R.dev_off()
- 66 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Pour plus de concision, le module rpy.r est renomm en R. Les boolens TRUE et FALSE en R (dans la fonction
text()) doivent tre remplacs par leurs quivalents en Python (True et False ; attention la casse).
Extrayez les coordonnes atomiques de tous les carbones alpha de la barstar dans le fichier 1BTA_CA.txt avec la
commande Unix suivante :
awk $1=="ATOM" && $3=="CA" {printf "%.3f %.3f %.3f ", $7, $8, $9} [Link] > 1BTA_CA.txt
Les coordonnes sont toutes enregistres sur une seule ligne, les unes aprs les autres, dans le fichier 1BTA_CA.txt.
Ouvrez le fichier 1BTA_CA.txt avec Python et crez une liste contenant toutes les coordonnes sous forme
de rels avec les fonctions split() et float().
Avec la fonction array() du module numpy, convertissez cette liste en matrice.
Avec la fonction reshape() de numpy, et connaissant le nombre d'acides amins de la barstar, construisez
une matrice deux dimensions contenant les coordonnes des carbones alpha.
Crez une matrice qui contient les coordonnes des n-1 premiers carbones alpha et une autre qui contient les
coordonnes des n-1 derniers carbones alpha.
En utilisant les oprateurs mathmatiques habituels (-, **2, +) et les fonctions sqrt() et sum() du module
numpy, calculez la distance entre les atomes n et n+1.
Affichez les distances entre carbones alpha conscutifs et reprez la valeur surprenante.
Soit la squence protique WVAAGALTIWPILGALVILG. Reprsentez avec le module rpy la distribution des
diffrents acides amins.
- 67 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Reprenez l'exercice du calcul de la distance entre deux carbones alpha conscutifs de la barstar avec numpy
et reprsentez cette distance avec rpy.
Ici, longueur, largeur et couleur sont des attributs alors que calculPerimetre(), calculSurface() et changeCarre() sont
des mthodes. Tous les attributs et toutes les mthodes se rfrent toujours self qui dsigne l'objet lui-mme.
Attention, les mthodes prennent toujours au moins self comme argument.
Exemples d'utilisation de la classe Rectangle :
# cration dun objet Rectangle avec les paramtres par dfaut
rect1 = Rectangle()
print [Link], [Link], [Link]
# sans surprise :
[Link]()
# on change le rectangle en carr
[Link](30)
[Link]()
# cration dun objet Rectangle avec des paramtres imposs
rect2 = Rectangle(2, 3, "rouge")
[Link]()
XVII-A - Exercices
Conseil : pour ces exercices, crivez des scripts dans des fichiers, puis excutez-les dans un shell.
1
2
3
Entranez-vous avec la classe Rectangle. Crez la mthode calculPerimetre() qui calcule le primtre d'un
objet rectangle.
Crez une nouvelle classe Atome avec les attributs x, y, z (qui contiennent les coordonnes atomiques) et la
mthode calculDistance(). Testez cette classe sur plusieurs exemples.
Amliorez la classe Atome avec de nouveaux attributs (par ex. : masse , charge, etc.) et de nouvelles
mthodes (par ex. : calculCentreMasse(), c alculRayonGyration()).
[Link]
Voici un exemple dans lequel on demande l'utilisateur d'entrer un nombre, puis on affiche ce nombre.
>>> nb = int(raw_input("Entrez un nombre: "))
Entrez un nombre: 23
>>> print nb
23
La fonction raw_input() permet l'utilisateur de saisir une chane de caractres. Cette chane de caractres est
ensuite transforme en nombre entier avec la fonction int().
Si l'utilisateur ne rentre pas un nombre, voici ce qui se passe :
>>> nb = int(raw_input("Entrez un nombre: "))
Entrez un nombre: ATCG
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ATCG
L'erreur provient de la fonction int() qui n'a pas pu convertir la chane de caractres "ATCG" en nombre, ce qui est
normal.
Le jeu d'instructions try/except permet de tester l'excution d'une commande et d'intervenir en cas d'erreur.
>>> try:
Dans cet exemple, l'erreur renvoye par la fonction int() (qui ne peut pas convertir "ATCG" en nombre) est intercepte
et dclenche l'affichage du message d'avertissement.
On peut ainsi redemander sans cesse un nombre l'utilisateur, jusqu' ce que celui-ci en rentre bien un.
>>> while 1:
try:
break
except:
Notez que dans cet exemple, l'instruction while 1 est une boucle infinie (car la condition 1 est toujours vrifie) dont
l'arrt est forc par la commande break lorsque l'utilisateur a effectivement bien rentr un nombre.
La gestion des erreurs est trs utile ds lors que des donnes extrieures entrent dans le programme, que ce soit
directement par l'utilisateur (avec la fonction raw_input()) ou par des fichiers.
Vous pouvez par exemple vrifier qu'un fichier a bien t ouvert.
- 69 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
f = open(nom, "r")
except:
Si une erreur est dclenche, c'est sans doute que le fichier n'existe pas l'emplacement indiqu sur le disque ou
que (sous Unix), vous n'ayez pas les droits d'accs pour le lire.
Il est galement possible de spcifier le type d'erreur grer. Le premier exemple que nous avons tudi peut s'crire :
>>> try:
Ici, on intercepte une erreur de type ValueError, ce qui correspond bien un problme de conversion avec int(). Il
existe d'autres types d'erreurs comme RuntimeError, TypeError, NameError, IOError, etc.
Enfin, on peut aussi tre trs prcis dans le message d'erreur. Observez la fonction downloadPage() qui, avec le
module urllib2, tlcharge un fichier sur internet.
import urllib2
def downloadPage(address):
error = ""
page = ""
try:
data = [Link](address)
page = [Link]()
except IOError, e:
if hasattr(e, reason):
error = "Cannot reach web server: " + str([Link])
if hasattr(e, code):
error = "Server failed %d" %([Link])
return page, error
La variable e est une instance (un reprsentant) de l'erreur de type IOError. Certains de ces attributs sont tests avec
la fonction hasattr() pour ainsi affiner le message renvoy (ici contenu dans la variable error).
Cependant, l'excutable Python ne se trouve pas toujours dans le rpertoire /usr/bin. Pour maximiser la portabilit
de votre script Python sur plusieurs systmes Unix, utilisez plutt cette notation :
#! /usr/bin/env Python
- 70 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
Dans le cas prsent, on appelle le programme d'environnement env (qui se situe toujours dans le rpertoire /usr/bin)
pour lui demander o se trouve l'excutable Python.
En rsum, tous vos scripts Python devraient ainsi commencer par les lignes :
#! /usr/bin/env Python
# -*- coding: utf-8 -*-
- 71 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]
poulain@cumin>
Cration dune
mthode 1 (for
mthode 2 (for
mthode 3 (for
mthode 4 (for
./[Link]
liste avec 5000000 lments
in range) : 1.8 secondes
in) : 1.0 secondes
in xrange) : 1.2 secondes
in enumerate): 1.4 secondes
La mthode la plus rapide pour parcourir une liste est donc d'itrer directement sur les lments (for element in liste).
Cette instruction est privilgier le plus possible.
La mthode for i in range(len(liste)) est particulirement lente, car la commande range(len(liste)) gnre une norme
liste avec tous les indices des lments (la cration de liste est assez lente en Python). Si vous voulez absolument
parcourir une liste avec les indices des lments, utilisez plutt la commande for i in xrange(len(liste)), car l'instruction
xrange() ne va pas crer une liste, mais incrmenter un compteur qui correspond l'indice des lments successifs
de la liste.
Enfin, la commande for indice, element in enumerate(liste) est particulirement efficace pour rcuprer en mme
temps l'lment et son indice.
Ou :
print range(0,99)[::2]
[Link]
Slection des lignes correspondantes aux carbones alpha dans un fichier pdb :
# ouverture du fichier pdb (par exemple [Link])
pdb = open("[Link]", "r")
# slection des lignes correspondant aux C alpha
CA_line = [line for line in pdb if [Link]()[0] == "ATOM" and [Link]()[2] == "CA"]
# fermeture du fichier
[Link]()
# ventuellement affichage des lignes
print CA_line
Quittez Python. L'historique de toutes vos commandes est dans votre rpertoire personnel, dans le fichier .history.
Relancez l'interprteur Python.
>>> import readline
>>> readline.read_history_file()
Vous pouvez accder aux commandes de la session prcdente avec la flche du haut de votre clavier.
>>> print "hello"
hello
>>> a = 22
>>> a = a + 11
>>> print a
33
XX - Remerciements
Un grand merci Sander du CMBI de Nijmegen pour la premire version de ce cours.
Merci galement tous les contributeurs, occasionnels ou rguliers : Jennifer Becq, Virginie Martiny, Romain Laurent,
Benoist Laurent, Benjamin Boyer, Hubert Santuz, Catherine Lesourd, Philippe Label, Rmi Cuchillo, Cdric Gageat,
Philibert Malbranche, Mikal Naveau. Nous remercions aussi Denis Mestivier de qui nous nous sommes inspirs
pour certains exercices.
Enfin, merci vous tous, les curieux de Python, qui avez t nombreux nous envoyer des retours sur ce cours,
nous suggrer des corrections et nous signaler des coquilles.
De nombreuses personnes nous ont aussi demand les corrections des exercices. Nous ne les mettons pas sur le
site afin d'viter la tentation de les regarder trop vite, mais vous pouvez nous crire et nous vous les enverrons.
Ce document est sous licence Creative Commons BY-SA
Patrick Fuchs et Pierre Poulain, UFR des Sciences du Vivant, Universit Paris Diderot - Paris 7, version du
17-04-2012.
- 73 Le contenu de cet article a t rdig par Patrick Fuchs et Pierre Poulain et est disponible sous la licence Creative Commons "Paternit Pas d'Utilisation Commerciale". Par contre, les logos
[Link], en-tte, pied de page, css et look & feel de l'article sont eux sous copyright 2013 [Link]
[Link]