Chapitre 6 : Tests

         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 si telle ou telle condition est vraie ou fausse. Pour cela, Python utilise l’instruction if ainsi qu’une comparaison que nous avons abordée au chapitre précédent. En voici un exemple :

Code python

>>> x = 2
>>> if x == 2:
… print « Le test est vrai ! »

Le test est vrai !
>>> x = « tigre »
>>> if x == « tigre »:
… print « Le test est vrai ! »

Plusieurs remarques concernant ces deux exemples :

Dans le premier exemple, le test étant vrai, l’instruction print « Le test est vrai ! » est exécutée. Dans le second exemple, le test est faux et rien n’est affiché.
Les blocs d’instruction dans les tests doivent forcément être indentés comme les boucles for et while. L’indentation indique la portée des instructions à exécuter si le test est vrai.
L’instruction if se termine comme les instructions for et while par le caractère :.

         2 – Tests à plusieurs cas

    Parfois, il est pratique de tester si la condition est vraie ou si elle est fausse dans une même instruction if. Plutôt que d’utiliser deux instructions if, on peut se servir de if et de else :

Code python

>>> x = 2
>>> if x == 2:
… print « Le test est vrai ! »
… else:
… print « Le test est faux ! »

Le test est vrai !
>>> x = 3
>>> if x == 2:
… print « Le test est vrai ! »
… else:
… print « Le test est faux ! »

Le test est faux !
On peut utiliser une série de tests dans la même instruction if, notamment pour tester plusieurs valeurs d’une même variable. 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’intruction random.choice(liste) qui renvoie un élément choisi au hasard dans une liste. L’instruction import random sera vue plus tard, admettez pour le moment qu’elle est nécessaire.

Code python

>>> import random
>>> base = random.choice([« a », « t », « c », « g »])
>>> if base == « a »:
… print « choix d’une adénine »
… elif base == « t »:
… print « choix d’une thymine »
… elif base == « c »:
… print « choix d’une cytosine »
… elif base == « g »:
… print « choix d’une guanine »

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

Remarque De nouveau, faites bien attention à l’indentation dans ces deux derniers exemples ! Vous devez être très rigoureuxà ce niveau là. Pour vous en convaincre, exécutez ces deux scripts dans l’interpréteur Python :

Script 1
:

Code python

nombres = [4, 5, 6]
for i in nombres:
if i == 5:
print « Le test est vrai »
print « car la variable i vaut », i
Script 2
:
nombres = [4, 5, 6]

Code python

for i in nombres:
if i == 5:
print « Le test est vrai »
print « car la variable i vaut », i
Comment expliquez-vous ce résultat ?

         3 – Tests multiples

    Les tests multiples permettent de tester plusieurs conditions en même temps en utilisant des opérateurs booléens. Les deux opérateurs les plus couramment utilisés sont le OU et le ET. Voici un petit rappel du mode de fonctionnement de ces opérateurs :

Condition 1 Opérateur Condition 2 Résultat

Vrai OU Vrai Vrai
Vrai OU Faux Vrai
Faux OU Vrai Vrai
Faux OU Faux Faux

Vrai ET Vrai Vrai
Vrai ET Faux Faux
Faux ET Vrai Faux
Faux ET Faux Faux
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, and et or s’écrivent en minuscule. En voici un exemple d’utilisation :

Code python

>>> x = 2
>>> y = 2
>>> if x == 2 and y == 2:
… print « le test est vrai »

le test est vrai
Notez que le même résulat serait obtenu en utilisant deux instructions if imbriquées :

Code python

>>> x = 2
>>> y = 2
>>> if x == 2:
… if y == 2:
… print « le test est vrai »

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

Code python

>>> True or False
True
Enfin, on peut utiliser l’opérateur logique de négation not qui inverse le résultat d’une condition :

Code python

>>> not True
False
>>> not False
True
>>> not (True and True)
False

         4 – Instructions break et continue

    Ces deux instructions permet de modifier le comportement d’une boucle (for ou while) avec un test.


L’instruction break stoppe la boucle.

Code python

>>> for i in range(5):
… if i > 2:
… break
… print i

0
1
2
L’instruction continue saute à l’itération suivante.

Code python

>>> for i in range(5):
… if i == 2:
… continue
… print i

0
1
3
4

         5 – Exercices

    Conseil : pour ces exercices, écrivez des scripts dans des fichiers, puis exécutez-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 :
Au travail s’il s’agit du lundi au jeudi
Chouette c’est vendredi s’il s’agit du vendredi
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 liste ci-dessous représente une séquence d’ADN :
[« A », »C », »G », »T », »T », »A », »G », »C », »T », »A », »A », »C », »G »]
Écrivez un script qui transforme cette séquence en sa séquence complémentaire. Rappel : la séquence complémentaire s’obtient en remplaçant A par T, T par A, C par G et G par C.
La fonction min() de Python, renvoie l’élément le plus petit d’une liste. Sans utiliser cette fonction, écrivez un script qui détermine le plus petit élément de la liste [8, 4, 6, 1, 5].
La liste ci-dessous représente une séquence d’acides aminés
[« A », »R », »A », »W », »W », »A », »W », »A », »R », »W », »W », »R », »A », »G », »A », »R »]
Calculez la fréquence en alanine (A), arginine (R), tryptophane (W) et glycine (G) dans cette séquence.
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 décimales. Affichez aussi la mention obtenue sachant que la mention est passable si la moyenne est entre 10 inclus et 12 exclus, assez-bien entre 12 inclus et 14 exclus et bien au-delà de 14.
Faites une boucle qui parcourt les nombres de 0 à 20 et qui affiche les nombres pairs inférieurs ou égaux à 10 d’une part, et les nombres impairs strictement supérieur à 10 d’autre part. Pour cet exercice, vous pourrez utiliser l’opérateur modulo % qui retourne le reste de la division entière entre deux nombres.
Exercice +++. Conjecture de Syracuse.
La conjecture de Syracuse est une conjecture mathématique qui reste improuvée à ce jour et qui est définie de la manière suivante.

Soit un entier positif n. Si n est pair, alors le diviser par 2. Si il est impair, alors le multiplier par 3 et lui ajouter 1. En répétant cette procédure, la suite de nombres atteint la valeur 1 puis se prolonge indéfiniment par une suite de trois valeurs triviales appelée cycle trivial. Jusqu’à présent, la conjecture de Syracuse, selon laquelle depuis n’importe quel entier positif la suite de Syracuse atteint 1, n’a pas été mise en défaut.

Par exemple, les premiers éléments de la suite de Syracuse pour un entier de départ de 10 sont : 10, 5, 16, 8, 4, 2, 1…

Écrivez un script qui, partant d’un entier positif n, crée une liste des nombres de la suite de Syracuse. Avec différents points de départ (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 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.

Remarque 2 : un nombre est pair lorsque le reste de sa division entière (opérateur modulo %) par 2 est nul.

Exercice +++. Attribution simple de structure secondaire.
Les angles dièdres phi/psi d’une 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, par conséquent il est couramment accepté de tolérer une déviation de +/- 30 degrés sur celles-ci. Ci-dessous vous avez une liste de listes contenant les valeurs de phi/psi de la première hélice de la protéine 1TFE. À l’aide de cette liste, écrivez un programme qui teste, pour chacun des résidus, s’ils sont ou non en hélice.

[[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]]
Exercice +++. Détermination des nombres premiers inférieurs à 100.
Voici un extrait de l’article sur les nombres premiers tiré de l’encyclopédie en ligne wikipédia.

«Un nombre premier est un entier naturel qui admet exactement deux diviseurs distincts entiers et positifs (qui sont alors 1 et lui-même). Cette définition exclut 1, qui n’a qu’un seul diviseur entier positif. Par opposition, un nombre non nul produit de deux nombres entiers différents de 1 est dit composé. Par exemple 6 = 2 3 est composé, tout comme 21 = 3 7, mais 11 est premier car 1 et 11 sont les seuls diviseurs de 11. Les nombres 0 et 1 ne sont ni premiers ni composés. »

Déterminez les nombres premiers inférieurs à 100. Combien y a-t-il de nombres premiers entre 0 et 100 ? Pour vous aider, nous vous proposons deux méthodes.
Méthode 1 (peu optimale mais assez intuitive)
Pour chaque nombre de 2 à 100, calculez le reste de la division entière (avec l’opérateur modulo %) depuis 1 jusqu’à lui-même. Si c’est un nombre premier, il aura exactement deux nombres pour lesquels le reste de la division entière est égal à 0 (1 et lui-même). Si ce n’est pas un nombre premier, il aura plus de deux nombres pour lesquels le reste de la division entière est égal à 0.
Méthode 2 (plus optimale et plus rapide, mais un peu plus compliquée)
Vous pouvez parcourir tous les nombres de 2 à 100 et vérifier si ceux-ci sont composés, c’est-à-dire qu’ils sont le produit de deux nombres premiers. Pratiquement, cela consiste à vérifier que le reste de la division entière (opérateur modulo %) entre le nombre considéré et n’importe quel nombre premier est nul. Le cas échéant, ce nombre n’est pas premier.