Cours de Python
Cours de Python
Cours de Python
Introduction
1. https://www.python.org/psf/
2. Nous sommes d’accord, cette notion est très relative.
8
1.3. Notations utilisées Chapitre 1. Introduction
Si, néanmoins, vous deviez un jour travailler sur un ancien programme écrit en Python 2, sachez qu’il existe quelques
différences importantes entre Python 2 et Python 3. Le chapitre 21 Remarques complémentaires vous apportera plus de préci-
sions.
1.2.2 Miniconda
Nous vous conseillons d’installer Miniconda 3 , logiciel gratuit, disponible pour Windows, Mac OS X et Linux, et qui
installera pour vous Python 3.
Avec le gestionnaire de paquets conda, fourni avec Miniconda, vous pourrez installer des modules supplémentaires qui
sont très utiles en bioinformatique (NumPy, scipy, matplotlib, pandas, Biopython), mais également les notebooks Jupyter.
Vous trouverez en ligne 4 une documentation pas à pas pour installer Miniconda, Python 3 et les modules supplémentaires qui
seront utilisés dans ce cours.
Pour ces derniers, le numéro à gauche indique le numéro de la ligne et sera utilisé pour faire référence à une instruction
particulière. Ce numéro n’est bien sûr là qu’à titre indicatif.
Par ailleurs, dans le cas de programmes, de contenus de fichiers ou de résultats trop longs pour être inclus dans leur
intégralité, la notation [...] indique une coupure arbitraire de plusieurs caractères ou lignes.
pour Mac OS X :
1 iMac - de - pierre : Downloads$ python
2 Python 3.7.1 ( default , Dec 14 2018 , 19:28:38)
3 [ Clang 4.0.1 ( tags / RELEASE_401 / final )] :: Anaconda , Inc . on darwin
4 Type " help " , " copyright " , " credits " or " license " for more information .
5 >>>
ou pour Linux :
1 pierre@jeera :~ $ python
2 Python 3.7.1 ( default , Dec 14 2018 , 19:28:38)
3 [ GCC 7.3.0] :: Anaconda , Inc . on linux
4 Type " help " , " copyright " , " credits " or " license " for more information .
5 >>>
Les blocs
— PS C:\Users\pierre> pour Windows,
— iMac-de-pierre:Downloads$ pour Mac OS X,
— pierre@jeera:~$ pour Linux.
représentent l’invite de commande de votre shell. Par la suite, cette invite de commande sera représentée simplement par
le caractère $, que vous soyez sous Windows, Mac OS X ou Linux.
Le triple chevron >>> est l’invite de commande (prompt en anglais) de l’interpréteur Python. Ici, Python attend une
commande que vous devez saisir au clavier. Tapez par exemple l’instruction :
print("Hello world!")
puis validez cette commande en appuyant sur la touche Entrée.
Python a exécuté la commande directement et a affiché le texte Hello world!. Il attend ensuite votre prochaine instruc-
tion en affichant l’invite de l’interpréteur Python (>>>). En résumé, voici ce qui a dû apparaître sur votre écran :
1 >>> print (" Hello world !")
2 Hello world !
3 >>>
Vous pouvez refaire un nouvel essai en vous servant cette fois de l’interpréteur comme d’une calculatrice :
1 >>> 1+1
2 2
3 >>> 6*3
4 18
À ce stade, vous pouvez entrer une autre commande ou bien quitter l’interpréteur Python, soit en tapant la commande
exit() puis en validant en appuyant sur la touche Entrée, soit en pressant simultanément les touches Ctrl et D sous Linux et
Mac OS X ou Ctrl et Z puis Entrée sous Windows.
L’interpréteur Python est donc un système interactif dans lequel vous pouvez entrer des commandes, que Python exécutera
sous vos yeux (au moment où vous validerez la commande en appuyant sur la touche Entrée).
Il existe de nombreux autres langages interprétés comme Perl 8 ou R 9 . Le gros avantage de ce type de langage est qu’on
peut immédiatement tester une commande à l’aide de l’interpréteur, ce qui est très utile pour débugger (c’est-à-dire trouver et
corriger les éventuelles erreurs d’un programme). Gardez bien en mémoire cette propriété de Python qui pourra parfois vous
faire gagner un temps précieux !
8. http://www.perl.org
9. http://www.r-project.org
Remarque
L’extension de fichier standard des scripts Python est .py.
Si c’est bien le cas, bravo ! Vous avez exécuté votre premier programme Python.
1.7 Commentaires
Dans un script, tout ce qui suit le caractère # est ignoré par Python jusqu’à la fin de la ligne et est considéré comme un
commentaire.
Les commentaires doivent expliquer votre code dans un langage humain. L’utilisation des commentaires est rediscutée
dans le chapitre 15 Bonnes pratiques en programmation Python.
Voici un exemple :
1 # Votre premier commentaire en Python .
2 print ( ' Hello world ! ')
3
4 # D ' autres commandes plus utiles pourraient suivre .
Remarque
On appelle souvent à tort le caractère # « dièse ». On devrait plutôt parler de « croisillon 11 ».
Pratiquement, l’indentation en Python doit être homogène (soit des espaces, soit des tabulations, mais pas un mélange
des deux). Une indentation avec 4 espaces est le style d’indentation recommandé (voir le chapitre 15 Bonnes pratiques en
programmation Python).
Si tout cela semble un peu complexe, ne vous inquiétez pas. Vous allez comprendre tous ces détails chapitre après chapitre.
12. http://www.inforef.be/swi/python.htm
13. https://perso.limsi.fr/pointal/python:courspython3
14. https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python
15. http://www.python.org
16. https://docs.python.org/fr/3/py-modindex.html
Variables
2.1 Définition
Une variable est une zone de la mémoire de l’ordinateur dans laquelle une valeur est stockée. Aux yeux du programmeur,
cette variable est définie par un nom, alors que pour l’ordinateur, il s’agit en fait d’une adresse, c’est-à-dire d’une zone
particulière de la mémoire.
En Python, la déclaration d’une variable et son initialisation (c’est-à-dire la première valeur que l’on va stocker dedans)
se font en même temps. Pour vous en convaincre, testez les instructions suivantes après avoir lancé l’interpréteur :
1 >>> x = 2
2 >>> x
3 2
Ligne 1. Dans cet exemple, nous avons déclaré, puis initialisé la variable x avec la valeur 2. Notez bien qu’en réalité, il
s’est passé plusieurs choses :
— Python a « deviné » que la variable était un entier. On dit que Python est un langage au typage dynamique.
— Python a alloué (réservé) l’espace en mémoire pour y accueillir un entier. Chaque type de variable prend plus ou moins
d’espace en mémoire. Python a aussi fait en sorte qu’on puisse retrouver la variable sous le nom x.
— Enfin, Python a assigné la valeur 2 à la variable x.
Dans d’autres langages (en C par exemple), il faut coder ces différentes étapes une par une. Python étant un langage dit de
haut niveau, la simple instruction x = 2 a suffi à réaliser les 3 étapes en une fois !
Lignes 2 et 3. L’interpréteur nous a permis de connaître le contenu de la variable juste en tapant son nom. Retenez ceci
car c’est une spécificité de l’interpréteur Python, très pratique pour chasser (debugger) les erreurs dans un programme. Par
contre, la ligne d’un script Python qui contient seulement le nom d’une variable (sans aucune autre indication) n’affichera pas
la valeur de la variable à l’écran lors de l’exécution (pour autant, cette instruction reste valide et ne générera pas d’erreur).
Sachez par ailleurs que l’opérateur d’affectation = s’utilise dans un certain sens. Par exemple, l’instruction x = 2 signifie
qu’on attribue la valeur située à droite de l’opérateur = (ici, 2) à la variable située à gauche (ici, x). D’autres langages de
programmation comme R utilisent les symboles <- pour rendre l’affectation d’une variable plus explicite, par exemple x <-
2.
Enfin, dans l’instruction x = y - 3, l’opération y - 3 est d’abord évaluée et ensuite le résultat de cette opération est
affecté à la variable x.
13
Chapitre 2. Variables 2.3. Nommage
1 >>> y = 3.14
2 >>> y
3 3.14
4 >>> a = " bonjour "
5 >>> a
6 ' bonjour '
7 >>> b = ' salut '
8 >>> b
9 ' salut '
10 >>> c = """ girafe """
11 >>> c
12 ' girafe '
13 >>> d = ''' lion ' ' '
14 >>> d
15 ' lion '
Remarque
Python reconnaît certains types de variable automatiquement (entier, float). Par contre, pour une chaîne de caractères, il
faut l’entourer de guillemets (doubles, simples, voire trois guillemets successifs doubles ou simples) afin d’indiquer à Python
le début et la fin de la chaîne de caractères.
Dans l’interpréteur, l’affichage direct du contenu d’une chaîne de caractères se fait avec des guillemets simples, quel que
soit le type de guillemets utilisé pour définir la chaîne de caractères.
En Python, comme dans la plupart des langages de programmation, c’est le point qui est utilisé comme séparateur décimal.
Ainsi, 3.14 est un nombre reconnu comme un float en Python alors que ce n’est pas le cas de 3,14.
2.3 Nommage
Le nom des variables en Python peut être constitué de lettres minuscules (a à z), de lettres majuscules (A à Z), de nombres
(0 à 9) ou du caractère souligné (_). Vous ne pouvez pas utiliser d’espace dans un nom de variable.
Par ailleurs, un nom de variable ne doit pas débuter par un chiffre et il n’est pas recommandé de le faire débuter par le
caractère _ (sauf cas très particuliers).
De plus, il faut absolument éviter d’utiliser un mot « réservé » par Python comme nom de variable (par exemple : print,
range, for, from, etc.).
Enfin, Python est sensible à la casse, ce qui signifie que les variables TesT, test ou TEST sont différentes.
On appelle cela écriture ou notation scientifique. On pourra noter deux choses importantes :
— 1e6 ou 3.12e-3 n’implique pas l’utilisation du nombre exponentiel e mais signifie 1 × 106 ou 3.12 × 10−3 respecti-
vement ;
— Même si on ne met que des entiers à gauche et à droite du symbole e (comme dans 1e6), Python génère systématique-
ment un float.
Enfin, vous avez sans doute constaté qu’il est parfois pénible d’écrire des nombres composés de beaucoup de chiffres, par
exemple le nombre d’Avogradro 6.02214076 × 1023 ou le nombre d’humains sur Terre (au 26 août 2020) 7807568245. Pour
s’y retrouver, Python autorise l’utilisation du caractère « souligné » (ou underscore) _ pour séparer des groupes de chiffres.
Par exemple :
1 >>> av og a dr o_ nu m be r = 6.022 _140_76e23
2 >>> print ( a vo ga dr o_ n um be r )
3 6.02214076 e +23
4 >>> hu ma n s_ on _e a rt h = 7 _807_568_245
5 >>> print ( h um an s_ on _ ea rt h )
6 7807568245
Dans ces exemples, le caractère _ est utilisé pour séparer des groupes de 3 chiffres mais on peut faire ce qu’on veut :
2.5 Opérations
2.5.1 Opérations sur les types numériques
Les quatre opérations arithmétiques de base se font de manière simple sur les types numériques (nombres entiers et floats) :
1 >>> x = 45
2 >>> x + 2
3 47
4 >>> x - 2
5 43
6 >>> x * 3
7 135
8 >>> y = 2.5
9 >>> x - y
10 42.5
11 >>> ( x * 10) + y
12 452.5
Remarquez toutefois que si vous mélangez les types entiers et floats, le résultat est renvoyé comme un float (car ce type
est plus général). Par ailleurs, l’utilisation de parenthèses permet de gérer les priorités.
L’opérateur / effectue une division. Contrairement aux opérateurs +, - et *, celui-ci renvoie systématiquement un float :
1 >>> 3 / 4
2 0.75
3 >>> 2.5 / 2
4 1.25
Pour obtenir le quotient et le reste d’une division entière (voir ici 2 pour un petit rappel sur la division entière), on utilise
respectivement les symboles // et modulo % :
1 >>> 5 // 4
2 1
3 >>> 5 % 4
4 1
5 >>> 8 // 4
6 2
7 >>> 8 % 4
8 0
Les symboles +, -, *, /, **, // et % sont appelés opérateurs, car ils réalisent des opérations sur les variables.
Enfin, il existe des opérateurs « combinés » qui effectue une opération et une affectation en une seule étape :
1 >>> i = 0
2 >>> i = i + 1
3 >>> i
4 1
5 >>> i += 1
6 >>> i
7 2
8 >>> i += 2
9 >>> i
10 4
L’opérateur += effectue une addition puis affecte le résultat à la même variable. Cette opération s’appelle une « incrémen-
tation ».
Les opérateurs -=, *= et /= se comportent de manière similaire pour la soustraction, la multiplication et la division.
Attention
Vous observez que les opérateurs + et * se comportent différemment s’il s’agit d’entiers ou de chaînes de caractères : 2
+ 2 est une addition alors que "2" + "2" est une concaténation. On appelle ce comportement redéfinition des opérateurs.
Nous serons amenés à revoir cette notion dans le chapitre 19 Avoir la classe avec les objets.
Notez que Python vous donne des informations dans son message d’erreur. Dans le second exemple, il indique que vous
devez utiliser une variable de type str c’est-à-dire une chaîne de caractères et pas un int, c’est-à-dire un entier.
Attention
Pour Python, la valeur 2 (nombre entier) est différente de 2.0 (float) et est aussi différente de '2' (chaîne de caractères).
6 456
7 >>> float ( i )
8 456.0
9 >>> i = '3.1416 '
10 >>> float ( i )
11 3.1416
On verra au chapitre 7 Fichiers que ces conversions sont essentielles. En effet, lorsqu’on lit ou écrit des nombres dans un
fichier, ils sont considérés comme du texte, donc des chaînes de caractères.
Toute conversion d’une variable d’un type en un autre est appelé casting en anglais, il se peut que vous croisiez ce terme
si vous consultez d’autres ressources.
Remarque
Ceci n’était pas le cas en Python 2. Pour en savoir plus sur ce point, vous pouvez consulter le chapitre 21 Remarques
complémentaires.
Par rapport à la discussion de la rubrique précédente, min() et max() sont des exemples de fonction prenant plusieurs
arguments. En Python, quand une fonction prend plusieurs arguments, on doit les séparer par une virgule. min() et max()
prennent en argument autant d’entiers et de floats que l’on veut, mais il en faut au moins deux.
2.11 Exercices
Conseil : utilisez l’interpréteur Python pour les exercices suivants.
Affichage
Ligne 1. On a utilisé l’instruction print() classiquement en passant la chaîne de caractères "Hello world!" en argu-
ment.
Ligne 3. On a ajouté un second argument end="", en précisant le mot-clé end. Nous aborderons les arguments par mot-clé
dans le chapitre 9 Fonctions. Pour l’instant, dites-vous que cela modifie le comportement par défaut des fonctions.
Ligne 4. L’effet de l’argument end="" est que les trois chevrons >>> se retrouvent collés après la chaîne de caractères
"Hello world!".
Une autre manière de s’en rendre compte est d’utiliser deux fonctions print() à la suite. Dans la portion de code suivante,
le caractère « ; » sert à séparer plusieurs instructions Python sur une même ligne :
1 >>> print (" Hello ") ; print (" Joe ")
2 Hello
3 Joe
4 >>> print (" Hello " , end ="") ; print (" Joe ")
5 HelloJoe
6 >>> print (" Hello " , end =" ") ; print (" Joe ")
7 Hello Joe
La fonction print() peut également afficher le contenu d’une variable quel que soit son type. Par exemple, pour un
entier :
1 >>> var = 3
2 >>> print ( var )
3 3
Il est également possible d’afficher le contenu de plusieurs variables (quel que soit leur type) en les séparant par des
virgules :
1 >>> x = 32
2 >>> nom = " John "
3 >>> print ( nom , " a " , x , " ans ")
4 John a 32 ans
Python a écrit une phrase complète en remplaçant les variables x et nom par leur contenu. Vous remarquerez que pour
afficher plusieurs éléments de texte sur une seule ligne, nous avons utilisé le séparateur « , » entre les différents éléments.
Python a également ajouté un espace à chaque fois que l’on utilisait le séparateur « , ». On peut modifier ce comportement en
passant à la fonction print() l’argument par mot-clé sep :
1 >>> x = 32
2 >>> nom = " John "
3 >>> print ( nom , " a " , x , " ans " , sep ="")
19
Chapitre 3. Affichage 3.2. Écriture formatée
4 Johna32ans
5 >>> print ( nom , " a " , x , " ans " , sep =" -")
6 John -a -32 - ans
Pour afficher deux chaînes de caractères l’une à côté de l’autre, sans espace, on peut soit les concaténer, soit utiliser
l’argument par mot-clé sep avec une chaîne de caractères vide :
1 >>> ani1 = " chat "
2 >>> ani2 = " souris "
3 >>> print ( ani1 , ani2 )
4 chat souris
5 >>> print ( ani1 + ani2 )
6 chatsouris
7 >>> print ( ani1 , ani2 , sep ="")
8 chatsouris
— Dans la chaîne de caractères, les accolades vides {} précisent l’endroit où le contenu de la variable doit être inséré.
— Juste après la chaîne de caractères, l’instruction .format(nom, x) fournie la liste des variables à insérer, d’abord la
variable nom puis la variable x. La méthode .format() agit sur la chaîne de caractères à laquelle elle est attachée par
le point.
Remarque
Il est possible d’indiquer entre les accolades {} dans quel ordre afficher les variables, avec 0 pour la variable à afficher en
premier, 1 pour la variable à afficher en second, etc. (attention, Python commence à compter à 0). Cela permet de modifier
l’ordre dans lequel sont affichées les variables.
1 >>> x = 32
2 >>> nom = " John "
3 >>> print ("{0} a {1} ans ". format ( nom , x ))
4 John a 32 ans
5 >>> print ("{1} a {0} ans ". format ( nom , x ))
6 32 a John ans
Imaginez maintenant que vous vouliez calculer, puis afficher, la proportion de GC d’un génome. La proportion de GC
s’obtient comme la somme des bases Guanine (G) et Cytosine (C) divisée par le nombre total de bases (A, T, C, G) du génome
considéré. Si on a, par exemple, 4500 bases G et 2575 bases C, pour un total de 14800 bases, vous pourriez procéder comme
suit (notez bien l’utilisation des parenthèses pour gérer les priorités des opérateurs) :
1 >>> prop_GC = (4500 + 2575) / 14800
2 >>> print (" La proportion de GC est " , prop_GC )
3 La proportion de GC est 0 . 4 7 8 0 4 0 5 4 0 5 4 0 5 4 0 5
Le résultat obtenu présente trop de décimales (seize dans le cas présent). Pour écrire le résultat plus lisiblement, vous
pouvez spécifier dans les accolades {} le format qui vous intéresse. Dans le cas présent, vous voulez formater un float pour
l’afficher avec deux puis trois décimales :
1 >>> print (" La proportion de GC est {:.2 f }". format ( prop_GC ))
2 Le proportion de GC est 0.48
3 >>> print (" La proportion de GC est {:.3 f }". format ( prop_GC ))
4 La proportion de GC est 0.478
Notez enfin que le formatage avec .xf (x étant un entier positif) renvoie un résultat arrondi.
Il est par ailleurs possible de combiner le formatage (à droite des 2 points) ainsi que l’emplacement des variables à
substituer (à gauche des 2 points), par exemple :
1 >>> print (" prop GC (2 d é ci .) = {0:.2 f } , prop GC (3 d é ci .) = {0:.3 f }". format ( prop_GC ))
2 prop GC (2 d é ci .) = 0.48 , prop GC (3 d é ci .) = 0.478
Vous remarquerez qu’on utilise ici la même variable (prop_GC) à deux endroits différents.
Vous pouvez aussi formater des entiers avec la lettre d :
1 >>> nb_G = 4500
2 >>> print (" Ce g é nome contient {: d } guanines ". format ( nb_G ))
3 Ce g é nome contient 4500 guanines
Remarque
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 préciser sur combien de caractères vous voulez qu’un résultat soit écrit et comment se fait l’ali-
gnement (à gauche, à droite ou centré). Dans la portion de code suivante, le caractère ; sert de séparateur entre les instructions
sur une même ligne :
1 >>> print (10) ; print (1000)
2 10
3 1000
4 >>> print ("{: >6 d }". format (10)) ; print ("{: >6 d }". format (1000))
5 10
6 1000
7 >>> print ("{: <6 d }". format (10)) ; print ("{: <6 d }". format (1000))
8 10
9 1000
10 >>> print ("{:^6 d }". format (10)) ; print ("{:^6 d }". format (1000))
11 10
12 1000
13 >>> print ("{:*^6 d }". format (10)) ; print ("{:*^6 d }". format (1000))
14 **10**
15 *1000*
16 >>> print ("{:0 >6 d }". format (10)) ; print ("{:0 >6 d }". format (1000))
17 000010
18 001000
Notez que > spécifie un alignement à droite, < spécifie un alignement à gauche et ˆ spécifie un alignement centré. Il
est également possible d’indiquer le caractère qui servira de remplissage lors des alignements (l’espace est le caractère par
défaut).
Ce formatage est également possible sur des chaînes de caractères avec la lettre s (comme string) :
1 >>> print (" atom HN ") ; print (" atom HDE1 ")
2 atom HN
3 atom HDE1
4 >>> print (" atom {: >4 s }". format (" HN ")) ; print (" atom {: >4 s }". format (" HDE1 "))
5 atom HN
6 atom HDE1
Vous voyez tout de suite l’énorme avantage de l’écriture formatée. Elle vous permet d’écrire en colonnes parfaitement
alignées. Nous verrons que ceci est très pratique si l’on veut écrire les coordonnées des atomes d’une molécule au format PDB
(pour en savoir plus sur ce format, reportez-vous à l’annexe A Quelques formats de données rencontrés en biologie).
Pour les floats, il est possible de combiner le nombre de caractères à afficher avec le nombre de décimales :
1 >>> print ("{:7.3 f }". format ( perc_GC ))
2 47.804
3 >>> print ("{:10.3 f }". format ( perc_GC ))
4 47.804
L’instruction 7.3f signifie que l’on souhaite écrire un float avec 3 décimales et formaté sur 7 caractères (par défaut justifiés
à droite). L’instruction 10.3f fait la même chose sur 10 caractères. Remarquez que le séparateur décimal . compte pour un
caractère.
Enfin, si on veut afficher des accolades littérales et utiliser la méthode .format() en même temps, il faut doubler les
accolades pour échapper au formatage :
1 >>> print (" Accolades litt é rales {{}} et pour le formatage {}". format (10))
2 Accolades litt é rales {} et pour le formatage 10
La méthode .format() agit sur la chaîne de caractères à laquelle elle est attachée par un point et n’a rien à voir avec
la fonction print(). Si on donne une chaîne de caractères suivie d’un .format() à la fonction print(), Python évalue
d’abord le formatage et c’est la chaîne de caractères qui en résulte qui est affichée à l’écran. Tout comme dans l’instruction
print(5*5), c’est d’abord la multiplication (5*5) qui est évaluée, puis son résultat qui est affiché à l’écran. On peut s’en
rendre compte de la manière suivante dans l’interpréteur :
1 >>> "{:10.3 f }". format ( perc_GC )
2 ' 47.804 '
3 >>> type ("{:10.3 f }". format ( perc_GC ))
4 < class 'str ' >
Python affiche le résultat de l’instruction "{:10.3f}".format(perc_GC) comme une chaîne de caractères et la fonction
type() nous le confirme.
Il est également possible de définir le nombre de chiffres après la virgule. Dans l’exemple ci-dessous, on affiche un nombre
avec aucun, 3 et 6 chiffres après la virgule :
1 >>> av og a dr o_ nu m be r = 6.022 _140_76e23
2 >>> print ("{:.0 e }". format ( a vo g ad ro _n um b er ))
3 6 e +23
4 >>> print ("{:.3 e }". format ( a vo g ad ro _n um b er ))
5 6.022 e +23
6 >>> print ("{:.6 e }". format ( av og ad r o_ nu mb er ))
7 6.022141 e +23
La syntaxe est légèrement différente. Le symbole % est d’abord appelé dans la chaîne de caractères (dans l’exemple ci-
dessus %d, %d et %.2f) pour :
— Désigner l’endroit où sera placée la variable dans la chaîne de caractères.
— Préciser le type de variable à formater, d pour un entier (i fonctionne également) ou f pour un float.
— Éventuellement pour indiquer le format voulu. Ici .2 signifie une précision de deux décimales.
Le signe % est rappelé une seconde fois (% (nb_G, nb_C, prop_GC)) pour indiquer les variables à formater.
Cette ancienne façon de formater une chaîne de caractères vous est présentée à titre d’information. Ne l’utilisez pas dans
vos programmes.
la méthode .format() est liée à "Joe a {} ans" qui est un objet de type chaîne de caractères. La méthode renvoie une
nouvelle chaîne de caractères avec le bon formatage (ici, 'Joe a 20 ans').
Nous aurons de nombreuses occasions de revoir cette notation objet.méthode().
3.6 Exercices
Conseil : utilisez l’interpréteur Python pour les exercices 2 à 5.
3.6.2 Poly-A
Générez une chaîne de caractères représentant un brin d’ADN poly-A (c’est-à-dire qui ne contient que des bases A) de 20
bases de longueur, sans taper littéralement toutes les bases.
Listes
4.1 Définition
Une liste est une structure de données qui contient une série de valeurs. Python autorise la construction de liste contenant
des valeurs de types différents (par exemple entier et chaîne de caractères), ce qui leur confère une grande flexibilité. Une liste
est déclarée par une série de valeurs (n’oubliez pas les guillemets, simples ou doubles, s’il s’agit de chaînes de caractères)
séparées par des virgules, et le tout encadré par des crochets. En voici quelques exemples :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> tailles = [5 , 2.5 , 1.75 , 0.15]
3 >>> mixte = [ ' girafe ' , 5 , ' souris ' , 0.15]
4 >>> animaux
5 [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
6 >>> tailles
7 [5 , 2.5 , 1.75 , 0.15]
8 >>> mixte
9 [ ' girafe ' , 5 , ' souris ' , 0.15]
Lorsque l’on affiche une liste, Python la restitue telle qu’elle a été saisie.
4.2 Utilisation
Un des gros avantages d’une liste est que vous pouvez appeler ses éléments par leur position. Ce numéro est appelé indice
(ou index) de la liste.
1 liste : [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 indice : 0 1 2 3
Soyez très attentifs au fait que les indices d’une liste de n éléments commence à 0 et se termine à n-1. Voyez l’exemple
suivant :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> animaux [0]
3 ' girafe '
4 >>> animaux [1]
5 ' tigre '
6 >>> animaux [3]
7 ' souris '
Par conséquent, si on appelle l’élément d’indice 4 de notre liste, Python renverra un message d’erreur :
1 >>> animaux [4]
2 Traceback ( innermost last ):
3 File " < stdin >" , line 1 , in ?
4 IndexError : list index out of range
24
4.4. Indiçage négatif Chapitre 4. Listes
puis lui ajouter deux éléments, l’un après l’autre, d’abord avec la concaténation :
1 >>> a = a + [15]
2 >>> a
3 [15]
4 >>> a = a + [ -5]
5 >>> a
6 [15 , -5]
Dans l’exemple ci-dessus, nous ajoutons des éléments à une liste en utilisant l’opérateur de concaténation + ou la méthode
.append(). Nous vous conseillons dans ce cas précis d’utiliser la méthode .append() dont la syntaxe est plus élégante.
Nous reverrons en détail la méthode .append() dans le chapitre 11 Plus sur les listes.
ou encore :
1 liste : [ 'A ' , 'B ' , 'C ' , 'D ' , 'E ' , 'F ']
2 indice positif : 0 1 2 3 4 5
3 indice n é gatif : -6 -5 -4 -3 - 2 -1
Les indices négatifs reviennent à compter à partir de la fin. Leur principal avantage est que vous pouvez accéder au dernier
élément d’une liste à l’aide de l’indice -1 sans pour autant connaître la longueur de cette liste. L’avant-dernier élément a lui
l’indice -2, l’avant-avant dernier l’indice -3, etc.
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> animaux [ -1]
3 ' souris '
4 >>> animaux [ -2]
5 ' singe '
Pour accéder au premier élément de la liste avec un indice négatif, il faut par contre connaître le bon indice :
1 >>> animaux [ -4]
2 ' girafe '
4.5 Tranches
Un autre avantage des listes est la possibilité de sélectionner une partie d’une liste en utilisant un indiçage construit sur le
modèle [m:n+1] pour récupérer tous les éléments, du émième au énième (de l’élément m inclus à l’élément n+1 exclu). On
dit alors qu’on récupère une tranche de la liste, par exemple :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> animaux [0:2]
3 [ ' girafe ' , ' tigre ']
4 >>> animaux [0:3]
5 [ ' girafe ' , ' tigre ' , ' singe ']
6 >>> animaux [0:]
7 [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
8 >>> animaux [:]
9 [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
10 >>> animaux [1:]
11 [ ' tigre ' , ' singe ' , ' souris ']
12 >>> animaux [1: -1]
13 [ ' tigre ' , ' singe ']
Notez que lorsqu’aucun indice n’est indiqué à gauche ou à droite du symbole deux-points, Python prend par défaut tous
les éléments depuis le début ou tous les éléments jusqu’à la fin respectivement.
On peut aussi préciser le pas en ajoutant un symbole deux-points supplémentaire et en indiquant le pas par un entier.
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> animaux [0:3:2]
3 [ ' girafe ' , ' singe ']
4 >>> x = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
5 >>> x
6 [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
7 >>> x [::1]
8 [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
9 >>> x [::2]
10 [0 , 2 , 4 , 6 , 8]
11 >>> x [::3]
12 [0 , 3 , 6 , 9]
13 >>> x [1:6:3]
14 [1 , 4]
Finalement, on se rend compte que l’accès au contenu d’une liste fonctionne sur le modèle liste[début:fin:pas].
La commande list(range(10)) a généré une liste contenant tous les nombres entiers de 0 inclus à 10 exclu. Nous
verrons l’utilisation de la fonction range() toute seule dans le chapitre 5 Boucles et comparaisons.
Dans l’exemple ci-dessus, la fonction range() a pris un argument, mais elle peut également prendre deux ou trois argu-
ments, voyez plutôt :
1 >>> list ( range (0 , 5))
2 [0 , 1 , 2 , 3 , 4]
3 >>> list ( range (15 , 20))
4 [15 , 16 , 17 , 18 , 19]
5 >>> list ( range (0 , 1000 , 200))
6 [0 , 200 , 400 , 600 , 800]
7 >>> list ( range (2 , -2 , -1))
8 [2 , 1 , 0 , -1]
L’instruction range() fonctionne sur le modèle range([début,] fin[, pas]). Les arguments entre crochets sont
optionnels. Pour obtenir une liste de nombres entiers, il faut l’utiliser systématiquement avec la fonction list().
Enfin, prenez garde aux arguments optionnels par défaut (0 pour début et 1 pour pas) :
1 >>> list ( range (10 ,0))
2 []
Ici la liste est vide car Python a pris la valeur du pas par défaut qui est de 1. Ainsi, si on commence à 10 et qu’on avance par
pas de 1, on ne pourra jamais atteindre 0. Python génère ainsi une liste vide. Pour éviter ça, il faudrait, par exemple, préciser
un pas de -1 pour obtenir une liste d’entiers décroissants :
1 >>> list ( range (10 ,0 , -1))
2 [10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1]
Dans cet exemple, chaque sous-liste contient une catégorie d’animal et le nombre d’animaux pour chaque catégorie.
Pour accéder à un élément de la liste, on utilise l’indiçage habituel :
1 >>> zoo [1]
2 [ ' tigre ' , 2]
On verra un peu plus loin qu’il existe en Python des dictionnaires qui sont également très pratiques pour stocker de
l’information structurée. On verra aussi qu’il existe un module nommé NumPy qui permet de créer des listes ou des tableaux
de nombres (vecteurs et matrices) et de les manipuler.
Même si en théorie ces fonctions peuvent prendre en argument une liste de strings, on les utilisera la plupart du temps
avec des types numériques (liste d’entiers et / ou de floats).
Nous avions déjà croisé min(), max() dans le chapitre 2 Variables. On avait vu que ces deux fonctions pouvaient prendre
plusieurs arguments entiers et / ou floats, par exemple :
1 >>> min (3 , 4)
2 3
Attention toutefois à ne pas mélanger entiers et floats d’une part avec une liste d’autre part, car cela renvoie une erreur :
Soit on passe plusieurs entiers et / ou floats en argument, soit on passe une liste unique.
4.10 Exercices
Conseil : utilisez l’interpréteur Python.
4.10.2 Saisons
Créez 4 listes hiver, printemps, ete et automne contenant les mois correspondants à ces saisons. Créez ensuite une
liste saisons contenant les listes hiver, printemps, ete et automne. Prévoyez ce que renvoient les instructions suivantes,
puis vérifiez-le dans l’interpréteur :
1. saisons[2]
2. saisons[1][0]
3. saisons[1:2]
4. saisons[:][1]. Comment expliquez-vous ce dernier résultat ?
Boucles et comparaisons
Si votre liste ne contient que 4 éléments, ceci est encore faisable mais imaginez qu’elle en contienne 100 voire 1000 ! Pour
remédier à cela, il faut utiliser les boucles. Regardez l’exemple suivant :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> for animal in animaux :
3 ... print ( animal )
4 ...
5 girafe
6 tigre
7 singe
8 souris
Remarque
Les notions de bloc d’instruction et d’indentations avait été abordées rapidement dans le chapitre 1 Introduction.
29
Chapitre 5. Boucles et comparaisons 5.1. Boucles for
Dans l’exemple suivant, le corps de la boucle contient deux instructions : print(animal) et print(animal*2) car elles
sont indentées par rapport à la ligne débutant par for :
1 for animal in animaux :
2 print ( animal )
3 print ( animal *2)
4 print (" C ' est fini ")
La ligne 4 print("C'est fini") ne fait pas partie du corps de la boucle car elle est au même niveau que le for (c’est-
à-dire non indentée par rapport au for). Notez également que chaque instruction du corps de la boucle doit être indentée de
la même manière (ici 4 espaces).
Remarque
Outre une meilleure lisibilité, les deux-points et l’indentation sont formellement requis en Python. Même si on peut in-
denter comme on veut (plusieurs espaces ou plusieurs tabulations, mais pas une combinaison des deux), les développeurs
recommandent l’utilisation de quatre espaces. Vous pouvez consulter à ce sujet le chapitre 15 Bonnes pratiques de program-
mation en Python.
Faites en sorte de configurer votre éditeur de texte favori de façon à écrire quatre espaces lorsque vous tapez sur la touche
Tab (tabulation).
Dans les exemples ci-dessus, nous avons exécuté une boucle en itérant directement sur une liste. Une tranche d’une liste
étant elle même une liste, on peut également itérer dessus :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> for animal in animaux [1:3]:
3 ... print ( animal )
4 ...
5 tigre
6 singe
On a vu que les boucles for pouvaient utiliser une liste contenant des chaînes de caractères, mais elles peuvent tout aussi
bien utiliser des listes contenant des entiers (ou n’importe quel type de variable).
1 >>> for i in [1 , 2 , 3]:
2 ... print ( i )
3 ...
4 1
5 2
6 3
range(3) la variable x est de type range (tout comme on avait les types int, float, str ou list) à utiliser spécialement avec les
boucles.
L’instruction list(range(4)) se contente de transformer un objet de type range en un objet de type list. Si vous vous
souvenez bien, il s’agit d’une fonction de casting, qui convertit un type en un autre (voir chapitre 2 Variables). Il n’y au-
cun intérêt à utiliser dans une boucle la construction for i in list(range(4)):. C’est même contre-productif. En effet,
range() se contente de stocker l’entier actuel, le pas pour passer à l’entier suivant, et le dernier entier à parcourir, ce qui re-
vient à stocker seulement 3 nombres entiers et ce quelle que soit la longueur de la séquence, même avec un range(1000000).
Si on utilisait list(range(1000000)), Python construirait d’abord une liste de 1 million d’éléments dans la mémoire puis
itérerait dessus, d’où une énorme perte de temps !
La variable i prendra les valeurs successives 0, 1, 2 et 3 et on accèdera à chaque élément de la liste animaux par son
indice (i.e. animaux[i]). Notez à nouveau le nom i de la variable d’itération car on itère sur les indices.
Quand utiliser l’une ou l’autre des 2 méthodes ? La plus efficace est celle qui réalise les itérations directement sur les
éléments :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> for animal in animaux :
3 ... print ( animal )
4 ...
5 girafe
6 tigre
7 singe
8 souris
Toutefois, il se peut qu’au cours d’une boucle vous ayez besoin des indices, auquel cas vous devrez itérer sur les indices :
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> for i in range ( len ( animaux )):
3 ... print (" L ' animal {} est un ( e ) {}". format (i , animaux [ i ]))
4 ...
5 L ' animal 0 est un ( e ) girafe
6 L ' animal 1 est un ( e ) tigre
7 L ' animal 2 est un ( e ) singe
8 L ' animal 3 est un ( e ) souris
Python possède toutefois la fonction enumerate() qui vous permet d’itérer sur les indices et les éléments eux-mêmes.
1 >>> animaux = [ ' girafe ' , ' tigre ' , ' singe ' , ' souris ']
2 >>> for i , animal in enumerate ( animaux ):
3 ... print (" L ' animal {} est un ( e ) {}". format (i , animal ))
4 ...
5 L ' animal 0 est un ( e ) girafe
6 L ' animal 1 est un ( e ) tigre
7 L ' animal 2 est un ( e ) singe
8 L ' animal 3 est un ( e ) souris
5.2 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 6 sur les Tests.
Python est capable d’effectuer toute une série de comparaisons entre le contenu de deux variables, telles que :
Python renvoie la valeur True si la comparaison est vraie et False si elle est fausse. True et False sont des booléens (un
nouveau type de variable).
Faites bien attention à ne pas confondre l’opérateur d’affectation = qui affecte une valeur à une variable et l’opérateur
de comparaison == qui compare les valeurs de deux variables.
Vous pouvez également effectuer des comparaisons sur des chaînes de caractères.
1 >>> animal = " tigre "
2 >>> animal == " tig "
3 False
4 >>> animal != " tig "
5 True
6 >>> animal == ' tigre '
7 True
Dans le cas des chaînes de caractères, a priori seuls les tests == et != ont un sens. En fait, on peut aussi utiliser les
opérateurs <, >, <= et >=. Dans ce cas, l’ordre alphabétique est pris en compte, par exemple :
1 >>> " a " < " b "
2 True
"a" est inférieur à "b" car le caractère a est situé avant le caractère b dans l’ordre alphabétique. En fait, c’est l’ordre
ASCII 2 des caractères qui est pris en compte (à chaque caractère correspond un code numérique), on peut donc aussi comparer
des caractères spéciaux (comme # ou ~) entre eux. Enfin, on peut comparer des chaînes de caractères de plusieurs caractères :
1 >>> " ali " < " alo "
2 True
3 >>> " abb " < " ada "
4 True
Dans ce cas, Python compare les deux chaînes de caractères, caractère par caractère, de la gauche vers la droite (le premier
caractère avec le premier, le deuxième avec le deuxième, etc). Dès qu’un caractère est différent entre l’une et l’autre des deux
chaînes, il considère que la chaîne la plus petite est celle qui présente le caractère ayant le plus petit code ASCII (les caractères
suivants de la chaîne de caractères sont ignorés dans la comparaison), comme dans l’exemple "abb" < "ada" ci-dessus.
2. http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
1 >>> i = 1
2 >>> while i <= 4:
3 ... print ( i )
4 ... i = i + 1
5 ...
6 1
7 2
8 3
9 4
Remarquez qu’il est encore une fois nécessaire d’indenter le bloc d’instructions correspondant au corps de la boucle (ici,
les instructions lignes 3 et 4).
Une boucle while nécessite généralement trois éléments pour fonctionner correctement :
1. Initialisation de la variable d’itération avant la boucle (ligne 1).
2. Test de la variable d’itération associée à l’instruction while (ligne 2).
3. Mise à jour de la variable d’itération dans le corps de la boucle (ligne 4).
Faites bien attention aux tests et à l’incrémentation que vous utilisez car une erreur mène souvent à des « boucles infinies
» qui ne s’arrêtent jamais. Vous pouvez néanmoins toujours stopper l’exécution d’un script Python à l’aide de la combinaison
de touches Ctrl-C (c’est-à-dire en pressant simultanément les touches Ctrl et C). Par exemple :
1 i = 0
2 while i < 10:
3 print (" Le python c ' est cool !")
Ici, nous avons omis de mettre à jour la variable i dans le corps de la boucle. Par conséquent, la boucle ne s’arrêtera jamais
(sauf en pressant Ctrl-C) puisque la condition i < 10 sera toujours vraie.
La boucle while combinée à la fonction input() peut s’avérer commode lorsqu’on souhaite demander à l’utilisateur une
valeur numérique. Par exemple :
1 >>> i = 0
2 >>> while i < 10:
3 ... reponse = input (" Entrez un entier sup é rieur à 10 : ")
4 ... i = int ( reponse )
5 ...
6 Entrez un entier sup é rieur à 10 : 4
7 Entrez un entier sup é rieur à 10 : -3
8 Entrez un entier sup é rieur à 10 : 15
9 >>> i
10 15
La fonction input() prend en argument un message (sous la forme d’une chaîne de caractères), demande à l’utilisateur
d’entrer une valeur et renvoie celle-ci sous forme d’une chaîne de caractères. Il faut ensuite convertir cette dernière en entier
(avec la fonction int()).
5.4 Exercices
Conseil : pour ces exercices, créez des scripts puis exécutez-les dans un shell.
5.4.7 Triangle
Créez un script qui dessine un triangle comme celui-ci :
1 *
2 **
3 ***
4 ****
5 *****
6 ******
7 *******
8 ********
9 *********
10 **********
5.4.10 Pyramide
Créez un script pyra.py qui dessine une pyramide comme celle-ci :
1 *
2 ***
3 *****
4 *******
5 *********
6 ***********
7 *************
8 * ** ** ** * ** ** ** *
9 *****************
10 *******************
Essayez de faire évoluer votre script pour dessiner la pyramide à partir d’un nombre arbitraire de lignes N. Vous pourrez
demander à l’utilisateur le nombre de lignes de la pyramide avec les instructions suivantes qui utilisent la fonction input() :
1 reponse = input (" Entrez un nombre de lignes ( entier positif ): ")
2 N = int ( reponse )
Attention à bien respecter l’alignement des chiffres qui doit être justifié à droite sur 4 caractères. Testez pour une matrice
3 × 3, puis 5 × 5, et enfin 10 × 10.
Créez une seconde version de votre script, cette fois-ci avec deux boucles while.
1 ligne colonne
2 1 2
3 1 3
4 1 4
5 2 3
6 2 4
7 3 4
8 Pour une matrice 4 x4 , on a parcouru 6 cases
également être utilisée pour décrire certains motifs géométriques retrouvés dans la nature (coquillages, fleurs de tournesol. . . ).
Pour la suite de Fibonacci (xn ), le terme au rang n (avec n > 1) est la somme des nombres aux rangs n − 1 et n − 2 :
xn = xn−1 + xn−2
Par définition, les deux premiers termes sont x0 = 0 et x1 = 1.
À titre d’exemple, les 10 premiers termes de la suite de Fibonacci sont donc 0, 1, 1, 2, 3, 5, 8, 13, 21 et 34.
Créez un script qui construit une liste fibo avec les 15 premiers termes de la suite de Fibonacci puis l’affiche.
Améliorez ce script en affichant, pour chaque élément de la liste fibo avec n > 1, le rapport entre l’élément de rang n et
l’élément de rang n − 1. Ce rapport tend-il vers une constante ? Si oui, laquelle ?
Tests
6.1 Définition
Les tests sont un élément essentiel à tout langage informatique si on veut lui donner un peu de complexité car ils permettent
à l’ordinateur de prendre des décisions. Pour cela, Python utilise l’instruction if ainsi qu’une comparaison que nous avons
abordée au chapitre précédent. Voici un premier exemple :
1 >>> x = 2
2 >>> if x == 2:
3 ... print (" Le test est vrai !")
4 ...
5 Le test est vrai !
et un second :
1 >>> x = " souris "
2 >>> if x == " tigre ":
3 ... print (" Le test est vrai !")
4 ...
On peut utiliser une série de tests dans la même instruction if, notamment pour tester plusieurs valeurs d’une même
variable.
38
6.4. Tests multiples Chapitre 6. Tests
Par exemple, on se propose de tirer au sort une base d’ADN puis d’afficher le nom de cette dernière. Dans le code suivant,
nous utilisons l’instruction random.choice(liste) qui renvoie un élément choisi au hasard dans une liste. L’instruction
import random sera vue plus tard dans le chapitre 8 Modules, admettez pour le moment qu’elle est nécessaire.
1 >>> import random
2 >>> base = random . choice ([" a " , " t " , " c " , " g "])
3 >>> if base == " a ":
4 ... print (" choix d ' une ad é nine ")
5 ... elif base == " t ":
6 ... print (" choix d ' une thymine ")
7 ... elif base == " c ":
8 ... print (" choix d ' une cytosine ")
9 ... elif base == " g ":
10 ... print (" choix d ' une guanine ")
11 ...
12 choix d ' une cytosine
Dans cet exemple, Python teste la première condition, puis, si et seulement si elle est fausse, teste la deuxième et ainsi de
suite. . . Le code correspondant à la première condition vérifiée est exécuté puis Python sort du bloc d’instructions du if.
Résultat :
1 Le test est vrai
2 car la variable nb vaut 5
Code 2
1 nombres = [4 , 5 , 6]
2 for nb in nombres :
3 if nb == 5:
4 print (" Le test est vrai ")
5 print (" car la variable nb vaut {}". format ( nb ))
Résultat :
1 car la variable nb vaut 4
2 Le test est vrai
3 car la variable nb vaut 5
4 car la variable nb vaut 6
Les deux codes pourtant très similaires produisent des résultats très différents. Si vous observez avec attention l’indentation
des instructions sur la ligne 5, vous remarquerez que dans le code 1, l’instruction est indentée deux fois, ce qui signifie qu’elle
appartient au bloc d’instructions du test if. Dans le code 2, l’instruction de la ligne 5 n’est indentée qu’une seule fois, ce
qui fait qu’elle n’appartient plus au bloc d’instructions du test if, d’où l’affichage de car la variable nb vaut xx pour
toutes les valeurs de nb.
et de l’opérateur ET :
En Python, on utilise le mot réservé and pour l’opérateur ET et le mot réservé or pour l’opérateur OU. Respectez bien la
casse des opérateurs and et or qui, en Python, s’écrivent en minuscule. En voici un exemple d’utilisation :
1 >>> x = 2
2 >>> y = 2
3 >>> if x == 2 and y == 2:
4 ... print (" le test est vrai ")
5 ...
6 le test est vrai
Notez que le même résultat serait obtenu en utilisant deux instructions if imbriquées :
1 >>> x = 2
2 >>> y = 2
3 >>> if x == 2:
4 ... if y == 2:
5 ... print (" le test est vrai ")
6 ...
7 le test est vrai
Vous pouvez aussi tester directement l’effet de ces opérateurs à l’aide de True et False (attention à respecter la casse).
1 >>> True or False
2 True
Enfin, on peut utiliser l’opérateur logique de négation not qui inverse le résultat d’une condition :
1 >>> not True
2 False
3 >>> not False
4 True
5 >>> not ( True and True )
6 False
L’instruction continue saute à l’itération suivante, sans exécuter la suite du bloc d’instructions de la boucle.
1 >>> for i in range (5):
2 ... if i == 2:
3 ... continue
4 ... print ( i )
5 ...
6 0
7 1
8 3
9 4
Toutefois, nous vous le déconseillons formellement. Pourquoi ? Python stocke les valeurs numériques des floats sous forme
de nombres flottants (d’où leur nom !), et cela mène à certaines limitations 1 . Observez l’exemple suivant :
1 >>> (3 - 2.7) == 0.3
2 False
3 >>> 3 - 2.7
4 0.2999999999999998
Nous voyons que le résultat de l’opération 3 - 2.7 n’est pas exactement 0.3 d’où le False en ligne 2.
En fait, ce problème ne vient pas de Python, mais plutôt de la manière dont un ordinateur traite les nombres flottants
(comme un rapport de nombres binaires). Ainsi certaines valeurs de float ne peuvent être qu’approchées. Une manière de s’en
rendre compte est d’utiliser l’écriture formatée en demandant l’affichage d’un grand nombre de décimales :
1 >>> 0.3
2 0.3
3 >>> "{:.5 f }". format (0.3)
4 '0.30000 '
5 >>> "{:.60 f }". format (0.3)
6 '0.299999999999999988897769753748434595763683319091796875000000 '
7 >>> "{:.60 f }". format (3.0 - 2.7)
8 '0.299999999999999822364316059974953532218933105468750000000000 '
On observe que lorsqu’on tape 0.3, Python affiche une valeur arrondie. En réalité, le nombre réel 0.3 ne peut être
qu’approché lorsqu’on le code en nombre flottant. Il est donc essentiel d’avoir cela en tête lorsque l’on effectue un test .
Conseil
Pour les raisons évoquées ci-dessus, il ne faut surtout pas tester si un float est égal à une certaine valeur. La bonne pratique
est de vérifier si un float est compris dans un intervalle avec une certaine précision. Si on appelle cette précision delta, on peut
procéder ainsi :
1 >>> delta = 0.0001
2 >>> var = 3.0 - 2.7
3 >>> 0.3 - delta < var < 0.3 + delta
4 True
5 >>> abs ( var - 0.3) < delta
6 True
Ici on teste si var est compris dans l’intervalle 0.3±delta. Les deux méthodes mènent à un résultat strictement équivalent :
— La ligne 3 est intuitive car elle ressemble à un encadrement mathématique.
— La ligne 5 utilise la fonction valeur absolue abs() et est plus compacte.
6.7 Exercices
Conseil : pour ces exercices, créez des scripts puis exécutez-les dans un shell.
Vous remarquerez qu’un nombre est pair lorsque le reste de sa division entière par 2 est nul.
Créez un script qui, partant d’un entier positif n (par exemple 10 ou 20), crée une liste des nombres de la suite de Syracuse.
Avec différents points de départ (c’est-à-dire avec différentes valeurs de n), la conjecture de Syracuse est-elle toujours vérifiée ?
Quels sont les nombres qui constituent le cycle trivial ?
Remarque
1. Pour cet exercice, vous avez besoin de faire un nombre d’itérations inconnu pour que la suite de Syracuse atteigne
le chiffre 1 puis entame son cycle trivial. Vous pourrez tester votre algorithme avec un nombre arbitraire d’itérations,
typiquement 20 ou 100, suivant votre nombre n de départ.
2. Un nombre est pair lorsque le reste de sa division entière (opérateur modulo %) par 2 est nul.
6.7.8 Attribution de la structure secondaire des acides aminés d’une protéine (exercice +++)
Dans une protéine, les différents acides aminés sont liés entre eux par une liaison peptidique. Les angles phi et psi sont
deux angles mesurés autour de cette liaison peptidique. Leurs valeurs sont utiles pour définir la conformation spatiale (appelée
« structure secondaire ») adoptée par les acides aminés.
Par exemples, les angles phi et psi d’une conformation en « hélice alpha » parfaite ont une valeur de -57 degrés et -47
degrés respectivement. Bien sûr, il est très rare que l’on trouve ces valeurs parfaites dans une protéine, et il est habituel de
tolérer une déviation de ± 30 degrés autour des valeurs idéales de ces angles.
Vous trouverez ci-dessous une liste de listes contenant les valeurs des angles phi et psi de 15 acides aminés de la protéine
1TFE 3 :
1 [[48.6 , 53.4] ,[ -124.9 , 156.7] ,[ -66.2 , -30.8] , \
2 [ -58.8 , -43.1] ,[ -73.9 , -40.6] ,[ -53.7 , -37.5] , \
3 [ -80.6 , -26.0] ,[ -68.5 , 135.0] ,[ -64.9 , -23.5] , \
4 [ -66.9 , -45.5] ,[ -69.6 , -41.0] ,[ -62.7 , -37.5] , \
5 [ -68.2 , -38.3] ,[ -61.2 , -49.1] ,[ -59.7 , -41.1]]
Pour le premier acide aminé, l’angle phi vaut 48.6 et l’angle psi 53.4. Pour le deuxième, l’angle phi vaut -124.9 et l’angle
psi 156.7, etc.
En utilisant cette liste, créez un script qui teste, pour chaque acide aminé, s’il est ou non en hélice et affiche les valeurs des
angles phi et psi et le message adapté est en hélice ou n’est pas en hélice.
Par exemple, pour les 3 premiers acides aminés :
1 [48.6 , 53.4] n ' est pas en h é lice
2 [ -124.9 , 156.7] n ' est pas en h é lice
3 [ -66.2 , -30.8] est en h é lice
D’après vous, quelle est la structure secondaire majoritaire de ces 15 acides aminés ?
Remarque
Pour en savoir plus sur le monde merveilleux des protéines, n’hésitez pas à consulter la page Wikipedia sur la structure
secondaire des protéines 4 .
Pour vous guider, voici ce que donnerait le programme avec la conversation précédente :
1 Pensez à un nombre entre 1 et 100.
2 Est - ce votre nombre est plus grand , plus petit ou é gal à 50 ? [+/ -/=] +
3 Est - ce votre nombre est plus grand , plus petit ou é gal à 75 ? [+/ -/=] +
4 Est - ce votre nombre est plus grand , plus petit ou é gal à 87 ? [+/ -/=] -
5 Est - ce votre nombre est plus grand , plus petit ou é gal à 81 ? [+/ -/=] -
6. https://fr.wikipedia.org/wiki/Dichotomie
6 Est - ce votre nombre est plus grand , plus petit ou é gal à 78 ? [+/ -/=] +
7 Est - ce votre nombre est plus grand , plus petit ou é gal à 79 ? [+/ -/=] =
8 J ' ai trouv é en 6 questions !
Les caractères [+/-/=] indiquent à l’utilisateur comment il doit interagir avec l’ordinateur, c’est-à-dire entrer soit le
caractère + si le nombre choisi est plus grand que le nombre proposé par l’ordinateur, soit le caractère - si le nombre choisi
est plus petit que le nombre proposé par l’ordinateur, soit le caractère = si le nombre choisi est celui proposé par l’ordinateur
(en appuyant ensuite sur la touche Entrée).