Contenu principal

For ou while ?

Aujourd’hui on va voir la différence entre la boucle for et la boucle while. Quand préfère-t-on utiliser l'une plutôt que l'autre ? Nous verrons plusieurs applications également.

For et while sont équivalents

En général on dit que la boucle for est plus adaptée lorsqu'on connaît à l'avance le nombre d'itérations. Par exemple la boucle for suivante me permet d'afficher 5 fois Bonjour, je connais à l'avance le nombre d'itérations :

for i in range(5):
	print("Bonjour")

Mais rien n'empêche de faire la même chose avec une boucle while : il suffit d'ajouter un compteur et d'itérer tant que le compteur est inférieur à 5 :

compteur = 0
while compteur < 5:
  compteur = compteur + 1
  print("Bonjour")

On peut donc faire la même chose avec une boucle while et une boucle for, mais dans le cas présent c'est quand même plus pratique avec la boucle for : il y a moins de code.

La question devient : quels sont les scénarios dans lesquels la boucle for est la plus adaptée ?

La boucle for pour itérer sur des collections

La boucle for est plus adaptée lorsqu'il s'agit d'itérer sur une collection, n'importe quel type de collection. Mais qu'est-ce qu'une collection ? Et comment en créer ?

  • Par exemple range permet de créer une collection de nombres. Une suite de nombres si vous voulez.
  • Une liste est également une collection : par exemple la liste de chaînes de caractères [ "banane", "pomme", "fraise" ]

Une collection est un ensemble d'éléments sur lequel on peut itérer

Lorsqu'on itère sur cette collection, la variable fruit prend successivement chacune des valeurs de la collection

for fruit in ['banane', 'pomme', 'fraise']:
	print(fruit)

ce qui permet d'afficher :

banane
pomme
fraise

Donc la variable que l'on définit prend successivement chacune des valeurs de la collection.

Itérer sur une chaîne de caractères

De manière plus surprenante, une chaîne de caractères est également une collection. Si vous avez un message comme "Bonjour", vous pouvez itérer dessus caractère par caractère

for c in "Bonjour":
	print(c)
B
o
n
j
o
u
r

Application à la cryptographie

Une application sympathique concerne la cryptographie : l'idée est d'itérer sur chaque caractère pour le modifier, pour le crypter en fait, avant de renvoyer le message crypté. Il y a deux fonctions incluses dans Python qui vont nous aider.

La première c'est ord, qui transforme chaque caractère en un nombre :

>>> ord('a')
97
>>> ord('€')
8364

Cette fonction nous permet d'associer un caractère à un nombre avant de modifier le nombre - en ajoutant deux par exemple - et avant d'aller dans l'autre sens récupérer le caractère qui correspond.

Pour aller dans l'autre sens on utilise la fonction chr.

>>> chr(8364)
€
>>> chr(97)
a

Donc pour crypter le message, on commence par récupérer le nombre associé à chaque caractère à l'aide de ord, ensuite on fait par exemple un décalage de 2, puis on récupère le caractère final à l'aide de chr.

for c in "mon message":
	print(chr(ord(c) + 2))

Ce qui affiche un nouveau message, le message crypté ! Ici le B est devenu un D, le O est devenu un Q etc.

D
q
p
l
q
w
t

La boucle while

La boucle while s'utilise lorsque vous ne savez pas à l'avance combien d'itérations sont nécessaires ou que vous visez une certaine condition.

Par exemple si vous souhaitez calculer le maximum d'une fonction de manière itérative vous devez itérer tant que le maximum n'est pas atteint.

Un cas typique d'utilisation du while est par exemple dans une boucle de jeu : vous devez itérer tant que la personne n'a pas deviné la lettre à trouver.

Application : un jeu interactif

Imaginons qu'on ait choisi une lettre mystère par exemple M, et notre joueur doit deviner cette lettre.

Pour ça on peut utiliser la fonction input en lui passant un message qui va nous permettre de demander au joueur de deviner la lettre de manière interactive. Ce qui est saisit dans la boîte de dialogue qui apparaît est ensuite récupéré dans la variable choix à l'aide de la syntaxe suivante :

choix = input("Devine la lettre")

Tant que le joueur n'a pas trouvé, il recommence. Donc on ne sait pas à l'avance combien d'itérations sont nécessaires : le while est le plus adapté.

lettre = "M"
choix = input("Devine la lettre")
while choix != lettre:
  choix = input("Devine la lettre")