Les boucles

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Superman

V
Ancien staff
Dec 2, 2009
2,489
0
596
En quoi ça consiste ?

Comme je l'ai dit juste au-dessus, les boucles sont un moyen de répéter des instructions de votre programme un certain nombre de fois. Prenons un exemple simple, même si assez peu réjouissant en lui-même : écrire un programme affichant la table de multiplication par 7, de 1 * 7 à 10 * 7.

... bah quoi ?
langue.png


Bon, ce n'est qu'un exemple, ne faites pas cette tête, et puis je suis sûr que ce sera utile pour certains
blink.gif
. Dans un premier temps, vous devriez arriver au programme suivant :

Code : Python 1
2
3
4
5
6
7
8
9
10
print(" 1 * 7 =",1*7)
print(" 2 * 7 =",2*7)
print(" 3 * 7 =",3*7)
print(" 4 * 7 =",4*7)
print(" 5 * 7 =",5*7)
print(" 6 * 7 =",6*7)
print(" 7 * 7 =",7*7)
print(" 8 * 7 =",8*7)
print(" 9 * 7 =",9*7)
print("10 * 7 =",10*7)




... et le résultat :

Code : Console
1 * 7 = 7
2 * 7 = 14
3 * 7 = 21
4 * 7 = 28
5 * 7 = 35
6 * 7 = 42
7 * 7 = 49
8 * 7 = 56
9 * 7 = 63
10 * 7 = 70



Bon, c'est sûrement la première idée qui vous est venue, et ça fonctionne, très bien même. Seulement, vous reconnaitrez qu'un programme comme ça n'est pas bien utile. Si on compte partir d'une variable à présent, une variable qui contiendrait le 7 (comme ça, si on décide d'afficher la table de multiplication de 6, on n'aura qu'à changer la valeur de la variable). Pour cet exemple, on utilise une variable nb qui contiendra 7. Les instructions seront légèrement différentes, mais vous devriez toujours pouvoir écrire ce programme :

Code : Python 1
2
3
4
5
6
7
8
9
10
11
nb = 7
print(" 1 *", nb, "=", 1*nb)
print(" 2 *", nb, "=", 2*nb)
print(" 3 *", nb, "=", 3*nb)
print(" 4 *", nb, "=", 4*nb)
print(" 5 *", nb, "=", 5*nb)
print(" 6 *", nb, "=", 6*nb)
print(" 7 *", nb, "=", 7*nb)
print(" 8 *", nb, "=", 8*nb)
print(" 9 *", nb, "=", 9*nb)
print("10 *", nb, "=",10*nb)




Le résultat est le même, vous pouvez vérifier. Mais le code est quand-même un peu plus intéressant : on peut changer la table de multiplication à afficher en changeant la variable nb.

Mais ce programme reste assez peu pratique. Il fait une action bien répétitive, et les programmeurs sont très paresseux
clin.png
, d'où les boucles.
La boucle while

La boucle que je vais présenter se retrouve dans la plupart des autres langages de programmation, et sous le même nom. Elle permet de répéter un bloc d'instructions tant qu'une condition est vraie (while signifie "tant que" en anglais). J'espère que le concept de bloc d'instructions est clair pour vous, sinon, je vous renvoie au chapitre précédent.

La syntaxe du while est :

Code : Python1
2
3
4
5
while condition:
# instruction 1
# instruction 2
# ...
# instruction N




Vous devriez reconnaitre la forme d'un bloc d'instructions, du moins je l'espère
blink.gif
.

Quelle condition va-t-on utiliser ?


Et bien, c'est là le point important. On va dans cet exemple créer une variable que l'on va incrémenter dans le bloc d'instructions. Tant que cette variable sera inférieure à 10, le bloc s'exécutera pour afficher la table.

Si ce n'est pas clair, regardez ce code, quelques commentaires suffiront pour le comprendre :

Code : Python1
2
3
4
5
6
nb = 7 # on garde la variable contenant le nombre dont on veut la table de multiplication
i = 0 # c'est notre variable compteur que nous allons incrémenter dans la boucle

while i<10: # tant que i est strictement inférieure à 10
print(i+1 , "*" , nb , "=" , (i+1)*nb)
i += 1 # on incrémente i de 1 à chaque tour de boucle




Prenons ce code ligne par ligne :


  1. On instancie notre variable nb qui va accueillir le nombre sur lequel nous allons travailler (7 en l'occurence). Vous avez bien entendu la possibilité de faire entrer ce nombre à l'utilisateur, vous savez le faire à présent.
  2. On instancie la variable i qui sera notre compteur durant la boucle. i est un standard utilisé quand il s'agit de boucles et de variables s'incrémentant, mais il va de soi que vous auriez pu lui donner un autre nom. On l'initialise à 0.
  3. Un saut de ligne ne fait jamais de mal
    smile.png
    !
  4. On trouve ici l'instruction while qui se décode, comme je l'ai indiqué en commentaire, en "tant que i est strictement inférieure à 10". N'oubliez pas les deux points à la fin de la ligne.
  5. La ligne du print, vous devez la reconnaitre. Maintenant, la plus grande partie de la ligne affichée est constituée de variables, à part les signes mathématiques. Vous remarquez qu'à chaque fois qu'on utilise i dans cette ligne, pour l'affichage ou le calcul, on lui ajoute 1. Cela est dû au fait qu'en programmation, on a l'habitude, (habitude que vous devrez prendre) de commencer à compter à partir de 0. Seulement ce n'est pas le cas de la table de multiplication, qui va de 1 à 10 et non de 0 à 9, comme c'est le cas ici. Certes j'aurais pu changer la condition et la valeur initiale de i, ou même mettre l'incrémentation de i avant l'affichage, mais j'ai voulu prendre le cas le plus utilisé, le format de boucle que vous retrouverez le plus souvent. Rien ne vous empêche de faire les tests, et je vous y encourage même.
  6. Ici, on incrémente la variable i de 1. Si on est dans le premier tour de boucle, i passe donc de 0 à 1. Et alors, puisqu'il s'agit de la fin du bloc d'instructions, on revient à l'instruction while. while vérifie que i est toujours inférieure à 10. Si c'est le cas (et ça l'est pour l'instant), on réexécute le bloc d'instructions. En tout, on exécute ce bloc 10 fois, jusqu'à ce que i passe de 9 à 10. Alors, l'instruction while vérifie la condition, se rend compte qu'elle est à présent fausse (i n'est pas inférieure à 10, puisqu'elle est maintenant égale à 10) et s'arrête. S'il y avait du code après le bloc, il serait à présent exécuté.


N'oubliez pas d'incrémenter i ! Sinon, vous créerez ce qu'on appelle une boucle infinie, puisque i ne sera jamais supérieure à 10, et que la condition du while sera toujours vraie... Elle s'exécutera donc à l'infini, du moins hypothétiquement. Si votre ordinateur se lance dans une boucle infinie à cause de votre programme, vous devrez taper, sous Windows ou Linux, ctrl + C dans la fenêtre de l'interpréteur pour interrompre la boucle. Python ne le fera pas tout seul, car pour lui, il se passe bel et bien quelque chose, et de toute façon il est incapable de différencier une boucle infinie d'une boucle finie : c'est au programmeur de le faire.

La boucle for

L'instruction while, ai-je dit, est la plus présente dans la plupart des autres langages. Dans le C++ ou le Java, on retrouve également des instructions for mais qui n'ont pas le même sens. C'est assez particulier et c'est le point sur lequel je risque de manquer d'exemples pour l'illustrer, toute son utilité se révélera au chapitre sur les listes. Notez que, si vous avez fait du Perl ou du PHP, vous pouvez retrouver les boucles for sous un mot-clé assez proche : foreach.

L'instruction for travaille sur des ensembles de données. Elle est en fait spécialisée dans le parcours d'un ensemble de données. Nous n'avons pas vu (et nous ne verrons pas tout de suite), ces ensembles assez particuliers et utilisés, mais aussi complexes. Toutefois, il y en a un que nous avons vu depuis quelque temps déjà : les chaînes de caractères.

Les chaînes de caractères sont des ensembles... de caractères
heureux.png
! Vous pouvez parcourir une chaîne de caractères, et cela était rendu possible également par while, nous verrons plus tard comment. Pour l'instant, intéressons-nous à for .

L'instruction for se construit ainsi :

Code : Python1
for element in ensemble:




element est une variable créée par le for, ce n'est pas à vous de l'instancier. Elle prend successivement les valeurs contenues dans l'ensemble parcouru.

Ce n'est pas très clair ? Alors, comme d'habitude, tout s'éclaire avec le code !
smile.png


Code : Python1
2
3
chaine = "Bonjour les ZER0S"
for lettre in chaine:
print(lettre)




Code : Console
B
o
n
j
o
u
r

l
e
s

Z
E
R
0
S



Est-ce plus clair ? En fait, la variable lettre prend successivement la valeur de chaque lettre contenue dans la chaîne de caractères (d'abord B, puis o, puis n...). On les affiche avec print et cette fonction fait un retour à la ligne après chaque message, ce qui fait que toutes les lettres sont sur une seule colonne. Littéralement, la ligne 2 signifie "pour lettre dans chaine". Arrivé à cette ligne, l'interpréteur va créer une variable lettre qui contiendra le premier élément de la chaîne (la première lettre, autrement dit). Après l'exécution du bloc, la variable "lettre" contient la seconde lettre, et ainsi de suite, tant qu'il y a une lettre dans la chaîne.

Notez bien que du coup, il est inutile d'incrémenter la variable lettre (ce qui serait d'ailleurs assez ridicule vu que ce n'est pas un nombre). Python se charge de l'incrémentation, un des grands avantages de l'instruction for.

A l'instar des conditions que nous avons vu jusqu'ici, in peut être utilisée ailleurs que dans une boucle for.

Code : Python1
2
3
4
5
6
chaine = "Bonjour les ZER0S"
for lettre in chaine:
if lettre in "AEIOUYaeiouy": # lettre est une voyelle
print(lettre)
else: # lettre est une consonne... ou plutôt, lettre n'est pas une voyelle
print("*")




... ce qui donne :

Code : Console
*
o
*
*
o
u
*
*
*
e
*
*
*
E
*
*
*



Voilà ! Soit l'interpréteur affiche les lettres si ce sont des voyelles, soit il affiche des "*". Notez bien que le 0 n'est pas affiché à la fin, Python ne se doute nullement qu'il s'agit d'un "o" stylisé
langue.png
.

Retenez bien cette utilisation de in dans une condition. On cherche à savoir si un élément quelconque est contenu dans un ensemble quelconque (ici si la lettre est contenue dans "AEIOUYaeiouy", c'est-à-dire si lettre est une voyelle). On retrouvera plus loin cette fonctionnalité.
Un petit bonus : les mot-clés break et continue

Je vais ici vous montrer deux nouveaux mot-clés, break et continue. Vous ne les utiliserez peut-être pas beaucoup, mais vous devez au moins savoir qu'ils existent... et à quoi ils servent
clin.png
.

break


Le mot-clé break permet tout simplement d'interrompre une boucle. Il est souvent utilisé dans une forme de boucle que je n'approuve pas trop :

Code : Python1
2
3
4
5
6
while 1: # 1 est toujours vrai -> boucle infinie
print("Entrez 'Q' pour quitter")
lettre = input()
if lettre=="Q":
print("Fin de la boucle")
break




La boucle while a pour condition 1, c'est-à-dire une condition qui sera toujours vraie. Autrement dit, en regardant la ligne du while, on pense à une boucle infinie. En pratique, on demande à l'utilisateur d'entrer une lettre (un 'Q' pour quitter). Tant que l'utilisateur n'entre pas cette lettre, le programme lui redemande d'entrer une lettre. Quand il entre 'Q', le programme affiche Fin de la boucle et la boucle s'arrête grâce au mot-clé break.

Ce mot-clé permet d'arrêter une boucle quel que soit la condition de la boucle. Python sort immédiatement de la boucle et exécute le code qui se trouve ensuite, si il y en a.

C'est un exemple un peu simpliste, mais vous pouvez voir l'idée d'ensemble. Dans ce cas-là et, à mon sens, dans la plupart des cas ou break est utilisé, on pourrait s'en sortir en précisant une véritable condition à la ligne du while. Par exemple, pourquoi ne pas créer un booléen qui sera vrai tout au long de la boucle et faux quand la boucle doit s'arrêter ? Ou bien tester directement si lettre != "Q" dans le while ?

Parfois, break est véritablement utile et fait gagner du temps. Mais ne l'utilisez pas à outrance, préférez une boucle avec une condition claire plutôt qu'un bloc d'instructions avec un break, qui sera plus dure à appréhender d'un seul regard.

continue


Le mot-clé continue permet de... continuer une boucle, en repartant directement à la ligne du while ou for. Un petit exemple s'impose je pense :

Code : Python1
2
3
4
5
6
7
8
i=1
while i<20: # tant que i est inférieure à 20
if i%3==0:
i+=4 # on ajoute 4 à i
print("On incrémente i de 4. i est maintenant égale à", i)
continue # on retourne au while sans exécuter les autres lignes
print("La variable i =", i)
i+=1 # dans le cas classique on ajoute juste 1 à i




Voici le résultat :

Code : Console
La variable i = 1
La variable i = 2
On incrémente i de 4. i est maintenant égale à 7
La variable i = 7
La variable i = 8
On incrémente i de 4. i est maintenant égale à 13
La variable i = 13
La variable i = 14
On incrémente i de 4. i est maintenant égale à 19
La variable i = 19



Comme vous le voyez, tous les trois tours de boucle, i s'incrémente de 4. Arrivé au mot-clé continue, Python n'exécute pas la fin du bloc mais revient au début de la boucle en retestant la condition du while. Autrement dit, quand Python arrive à la ligne 6, il saute à la ligne 2, sans exécuter la ligne 7 et 8. Au nouveau tour de boucle, Python reprend l'exécution normale de la boucle (continue n'ignore la fin du bloc que pour le tour de boucle courant).

Mon exemple ne démontre pas de manière éclatante l'utilité de continue. Les rares fois où j'utilise ce mot-clé, c'est par exemple pour supprimer des éléments d'une liste, mais nous n'avons pas encore vu les listes
clin.png
. L'essentiel pour l'instant c'est que vous vous souveniez de ces deux mot-clés et que vous sachiez ce qu'ils font, si vous les rencontrez au détour d'une instruction
smile.png
. Personnellement, je n'utilise pas très souvent ces mot-clés, mais c'est aussi une question de goût.


Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!