Chapitre 5 : Boucles et comparaisons

         1 – Boucles for

    Imaginez que vous ayez une liste de quatre éléments dont vous voulez afficher les éléments les uns après les autres. Dans l’état actuel de vos connaissances, il faudrait taper quelque chose du style :

Code python

animaux = [‘girafe’,’tigre’,’singe’,’souris’]
print animaux[0]
print animaux[1]
print animaux[2]
print animaux[3]
Si votre liste ne contient que quatre é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 :

Code python

>>> animaux = [‘girafe’,’tigre’,’singe’,’souris’]
>>> for i in animaux:
… print i

girafe
tigre
singe
souris
En fait, la variable i va prendre successivement les différentes valeurs de la liste animaux à chacune de ses itérations. D’ores et déjà, remarquez avec attention l’indentation. Vous voyez que l’instruction print i est décalée 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 répéter constituent le corps de la boucle (ou un bloc d’instructions) et doivent être indentées d’un(e) ou plusieurs espace(s) ou tabulation(s). Dans le cas contraire, Python vous renvoie un message d’erreur :

Code python

>>> 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 indentées de la même manière (e.g. si vous avez indenté la première instruction avec deux espaces, vous devez faire de même avec la deuxième 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 :

Code python

>>> 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 chaînes de caractères, mais elles peuvent tout aussi bien utiliser des listes numériques. En utilisant l’instruction range on peut facilement accéder à une liste d’entiers.

Code python

>>> for i in range(4):
… print i

0
1
2
3
Par conséquent, vous pouvez utiliser les boucles comme une itération sur les indices des éléments d’une liste.

Code python

>>> animaux = [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> for i in range(4):
… print animaux[i]

girafe
tigre
singe
souris
Cependant, la méthode à utiliser pour parcourir avec une boucle for les éléments d’une liste est celle qui réalise les itérations directement sur les élements.

Code python

>>> 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, préférez la fonction xrange() qui s’utilise de la même manière que range() mais qui ne construit pas de liste et qui est donc beaucoup plus rapide. La fonction range() ne sera donc employée que pour créer des listes d’entiers.

Code python

>>> 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 élément d’une liste et de l’élément lui-même, la fonction enumerate() est pratique.

Code python

>>> animaux = [‘girafe’,’tigre’,’singe’,’souris’]
>>> for i, ani in enumerate(animaux):
… print i, ani

0 girafe
1 tigre
2 singe
3 souris

         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 des tests. Python est capable d’effectuer toute une série de comparaisons entre le contenu de différentes variables, telles que :

syntaxe Python signification
== égal à
!= différent de
> supérieur à
>= supérieur ou égal à
< inférieur à
<= inférieur ou égal à
Observez l’exemple suivant sur des nombres entiers.

Code python

>>> x = 5
>>> x == 5
True
>>> x > 10
False
>>> x < 10
True
Python renvoie la valeur True si la comparaison est vraie et False si elle est fausse. True et False sont des booléens.

Faites bien attention à ne pas confondre l’opérateur d’affectation = qui donne 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.

Code python

>>> animal = « tigre »
>>> animal == « tig »
False
>>> animal != « tig »
True
>>> animal == ‘tigre’
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 :

Code python

>>> « a » < « b »
True
« a » est inférieur à « b » car il est situé avant dans l’ordre alphabétique. En fait, c’est l’ordre ASCII des caractères qui est pris en compte (i.e. chaque caractère est affecté à un code numérique), on peut donc comparer aussi des caractères spéciaux (comme # ou ~) entre eux. On peut aussi comparer des chaînes à plus d’un caractère.

Code python

>>> « ali » < « alo »
True
>>> « abb » < « ada »
True
Dans ce cas, Python compare caractère par caractère de la gauche vers la droite (le premier 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 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 sont ignorés dans la comparaison), comme dans notre test « abb » < « ada » ci-dessus.

         3 – Boucles while

    Une autre alternative à l’instruction for couramment utilisée en informatique est la boucle while. Le principe est simple. Une série d’instructions est exécutée tant qu’une condition est vraie. Par exemple :

Code python

>>> i = 1
>>> while i <= 4:
… print i
… i = i + 1

1
2
3
4
Remarquez qu’il est encore une fois nécessaire d’indenter le bloc d’instructions. Une boucle while nécessite trois éléments pour fonctionner correctement :

l’initialisation de la variable de test avant la boucle ;
le test de la variable associé à l’instruction while ;
l’incrémentation de la variable de test dans le corps de la boucle.
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 pas. Vous pouvez néanmoins toujours stopper l’exécution d’un script Python à l’aide de la combinaison de touches Ctrl-C.

         4 – Exercices

    Conseil : pour ces exercices, écrivez des scripts dans des fichiers, puis exécutez-les dans un shell.

Soit la liste [‘vache’,’souris’,’levure’,’bacterie’]. Affichez l’ensemble des éléments de cette liste (un élément par ligne) de trois manières différentes (deux avec for et une avec while).
Constituez une liste semaine contenant les 7 jours de la semaine. Écrivez une série d’instructions affichant les jours de la semaine (en utiliser une boucle for), ainsi qu’une autre série 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 éléments de impairs sont incrémentés de 1.
Voici les notes d’un étudiant [14, 9, 6, 8, 12]. Calculez la moyenne de ces notes. Utilisez l’écriture formatée pour afficher la valeur de la moyenne avec deux décimales.
Soit la liste X contenant les nombres entiers de 0 à 10. Calculez le produit des nombres consécutifs deux à deux de X en utilisant une boucle. Exemple pour les premières itérations :

Code python

0
2
6
12
Triangle. Écrivez un script qui dessine un triangle comme celui-ci :

Code python

*
**
***
****
*****

‘*
‘**
‘***
‘****
Triangle inversé. Écrivez un script qui dessine un triangle comme celui-ci :

Code python

‘****
‘***
‘**
‘*

*****
****
***
**
*
Triangle gauche. Écrivez un script qui dessine un triangle comme celui-ci :

Code python

*
**
***
****
*****

‘*
‘**
‘***
‘****
Triangle isocèle. Écrivez un script qui dessine un triangle comme celui-ci :

Code python

*
***
*****
‘*
‘***
‘*****
 »*
 »***
 »*****
 »’*
Exercice +++. Suite de Fibonacci. La suite de Fibonacci est une suite mathématique qui porte le nom de Leonardo Fibonacci, un mathématicien italien du XIIIesiècle. Initialement, cette suite a été utilisée pour décrire la croissance d’une population de lapins mais elle est peut également être utilisée pour décrire certains motifs géométriques retrouvés dans la nature (coquillages, fleurs de tournesol…).
Par définition, 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.