4 - Boucle non bornée
Nous avons vu les boucles bornées : les boucles qui travaillent en boucle un nombre de fois défini à l'avance.
Nous avons vu les instructions conditionnelles : comment agir en fonction des besoins.
Voyons aujourd'hui les boucles non bornées : on agit en boucle tant qu'une condition est évaluée à True.
IDE Python proposé : Thonny
1 - Rappel préalable : le module random
Le hasard dans Python
La fonction randint() du module random permet d'obtenir un entier au hasard compris entre le nombre de départ d fourni (inclus) et le nombre de fin f fourni (inclus).
Exemple : random.randint(0, 5) va renvoyer un nombre pouvant être 0, 1, 2, 3, 4 ou 5.
Pour obtenir un nombre aléatoire compris entre -50 et +200, il suffit de faire ceci :
1
2 |
|
Différence énorme avec range pour lequel on transmet une valeur de fin non incluse dans l'intervalle des valeurs possibles.
Exemple : range(0, 5) va permettre de récupérer une à une les valeurs 0, 1, 2, 3, et 4. Pas 5.
Pour pouver récupérer vos anciennes lignes sur la console en plaçant le curseur de la souris sur la console et en utilisant la touche FLECHE DU HAUT de votre clavier.
01° Taper ceci dans la console pour comprendre comment réaliser un tirage aléatoire entre 5 et 10 : le résultat sera toujours soit 5, soit 6, soit 7, soit 8, soit 9, soit 10.
>>> import random
>>> random.randint(5, 10)
?
>>> random.randint(5, 10)
?
>>> random.randint(5, 10)
?
02° Que doit-on taper dans la console pour obtenir un résultat simulant un dé à 6 faces ?
...CORRECTION...
>>> random.randint(1, 6)
2 - Boucle non bornée tant que / while
Nous allons donc parler de la boucle TANT QUE ou WHILE en anglais.
1 - Définition Boucle non bornée : la boucle TANT QUE / WHILE
Définition d'une boucle non bornée : Une boucle non bornée est une boucle dont l’exécution dépend de l’évaluation d’une expression qu'on nommera condition de poursuite.
Le principe est simple :
- On évalue la condition de poursuite à VRAI ou FAUX
- SI la condition de poursuite est évaluée à VRAI, on réalise le bloc, et on revient à l'étape 1.
- SINON, on quitte définitivment la boucle.
On parle de boucle non bornée puisqu'on ne connait pas à l'avance le nombre de fois où la boucle va être réalisée : on réalise la boucle TANT QUE la condition de poursuite sera évaluée à VRAI. WHILE en anglais. Il n'y a pas de nombre limite au bout duquel on quitte la boucle. Ca peut tourner à l'infini.
2 - Déclaration en Python
En Python, c'est l'indentation qui renseigne sur l'appartenance des instructions à la boucle. Le mot-clé pour déclarer une boucle TANT QUE est while :
L1 while condition de poursuite:
L2 instruction A
L3 instruction B
L4 instruction C
L5
L6 suite du programme
Le principe est donc :
- D'évaluer la condition de poursuite.
- SI elle est évaluée à True, on réalise les lignes 2-3-4 puis on revient à la ligne 1 et on évalue à nouveau la condition de poursuite en ligne 1.
- SINON, c'est qu'elle est évaluée à False, on quitte la boucle et on part directement en ligne 6.
Commençons par un exemple simple : réaliser l'équivalent d'une boucle FOR partant de 0 jusqu'à atteindre 40, de 10 en 10 : 0 puis 10 puis 20 puis 30 puis 40.
03° Placer le programme sur Python Tutor. Observer son fonctionnement. Pourquoi peut-on dire qu'une boucle TANT QUE est un mélange de boucle POUR et d'instruction conditionnelle ?
1
2
3
4
5
6
7 |
|
CLIQUEZ ICI POUR VOIR LE DEROULEMENT SEQUENTIEL
x :
x < 40 ? :
...CORRECTION...
Avant chaque nouveau tour de boucle, on évalue la condition, un peu comme avec un IF.
Si la condition renvoie VRAI, on réalise l'action puis on renvoie au début de la boucle où on va évaluer une nouvelle fois la condition pour voir si on recommence, ou pas.
Il s'agit donc d'une sorte de "boucle conditionnelle".
04° Quelle est l'erreur présente ici et qui provoque une boucle infinie ?
1
2
3
4
5
6
7 |
|
...CORRECTION...
Il y a une mauvaise indentation de la ligne 5 : l'incrémentation de la variable x n'est plus à l'intérieur de la boucle.
On ne va exécuter cette ligne qu'après être sorti de la boucle.
Le problème ? La condition pour continuer dépend de x, or on ne change jamais sa valeur lors de l'exécution de la boucle.
x vaut 0 au début et garde cette valeur... à l'infini.
Exemple
Un exemple concret avec le remplissage de votre sac pour aller au lycée :
1
2
3
4
5 | while vous_avez_encore_des_choses_a_prendre:
prendre_objet_suivant()
mettre_cet_objet_dans_votre_sac()
partir_au_lycée()
|
Vous allez donc faire les lignes 1-2-3 en boucle tant que vos affaires ne sont pas totalement faites.
05° Premier exemple lié à un problème mathématique : existe-il un couple de deux nombres x et y (tel que y = x + 1) pour lequel la formule suivante est valide ?
y2 - x2 = 9
On peut répondre en partant de x = 0 et en testant avec 0 et 1. Tant que cela ne fonctionne pas, on incrémente x de 1 et on continue donc avec 1 et 2, puis avec 2 et 3, puis avec 3 et 4...
1
2
3
4
5
6
7 |
|
La condition de poursuite de la boucle est que la formule soit fausse avec les valeurs x+1 et x actuelles.
Questions
- (à l'oral) Aurait-on pu faire pareil avec une boucle bornée ?
- (à l'oral) Pourquoi avoir placé 0 initialement dans la variable x sur la ligne 0 ?
- (à l'oral) Donner la traduction en français des lignes 3, 4 et 5.
- Donner les lignes d’exécution sachant que x = 4 valide la demande.
- Existe-t-il deux nombres pour une différence de 99 ?
- Que constate-t-on si on cherche une différence de 100 ?
...CORRECTION...
- (à l'oral) Aurait-on pu faire pareil avec une boucle bornée ?
- (à l'oral) Pourquoi avoir placé 0 initialement dans la variable x sur la ligne 0 ?
- (à l'oral) Donner la traduction en français des lignes 3, 4 et 5.
- Donner les lignes d’exécution sachant que x = 4 valide la demande.
- Existe-t-il deux nombres pour une différence de 99 ?
- Que constate-t-on si on cherche une différence de 100 ?
1
3 (avec x valant 0) puis 4 et 5.
3 (avec x valant 1) puis 4 et 5.
3 (avec x valant 2) puis 4 et 5.
3 (avec x valant 3) puis 4 et 5.
3 (avec x valant 4) puis 7.
Je ne sais pas, mais il suffit de modifier le 9 en 99 pour le savoir !
Cela semble boucler à l'infini : le programme ne s'arrête jamais car la condition de poursuite ne donne jamais False.
06° Voici un exemple lié au domaine du jeu : on veut lancer deux dés à 6 faces tant que les deux dés ne donnent pas le même résultat. On mémorise le nombre de jets nécessaires pour obtenir ce double.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
Questions
- (à l'oral) Aurait-on pu faire pareil avec une boucle bornée ?
- (à l'oral) Pourquoi avoir placé 0 et 1 initialement dans la variable de1 et de2 sur les lignes 3-4 ?
- (à l'oral) Donner la traduction en français des lignes 7, 8, 9, 10.
- Donner les lignes exécutées en supposant qu’on tire 1-3 puis 5-4 puis 1-6 puis 6-6.
...CORRECTION...
1-3-4-5.
7 (avec de1=1 et de2=0) puis 8-9-10-11
7 (avec de1=1 et de2=3) puis 8-9-10-11
7 (avec de1=5 et de2=4) puis 8-9-10-117 (avec de1=1 et de2=6) puis 8-9-10-11
7 (avec de1=6 et de2=6) puis 13-14.
07° Un exemple financier. Vous avez 500 euros sur un compte qui rapporte 10 % par an. Combien d’années faut-il laisser l’argent en banque pour parvenir à dépasser à 1000 euros ?
1
2
3
4
5
6
7
8
9
10
11 |
|
Questions
- (à l'oral) Aurait-on pu faire pareil avec une boucle bornée ?
- (à l'oral) Donner la traduction en français des lignes 4, 5 et 6.
3 - Choix attentif de la valeur initiale
Les variables nécessaires à l'évaluation du TANT QUE doivent toutes être définies avant la ligne du TANT QUE.
Si la condition est basée sur une variable qui est calculée dans le bloc de la boucle elle-même, comment faire ? Facile : on initialise cette variable avec une "fausse valeur" initiale de façon à pouvoir rentrer dans la boucle au départ.
08° Un exemple avec un jeu de hasard. Il faut tenter de deviner un nombre mystère compris entre 1 et 10.
1
2
3
4
5
6
7
8
9 |
|
La fonction input() sert à récupérer ce que l'utilisateur vient de valider sur le clavier. Par contre, on récupère alors un string (par exemple "5").
On le transforme en entier en utilisant la fonction int() (par exemple int("5")) renvoie la valeur 5.
Questions
- Pourquoi avoir placer 0 dans la réponse initiale en ligne 4 ?
- Donner la signification en français des lignes 3-4-6-7.
- Lancer et tester le jeu.
09° Transformer le jeu pour en faire un jeu de plus et du moins : si la réponse n'est pas bonne, il faut indiquer au joueur s'il doit donner un résultat plus grand ou plus petit.
10° Finir Py-rate maintenant que vous avez toutes les bases : utilisation de fonctions, for, if, while.
3 - FAQ
Rien pour le moment
Activité publiée le 05 01 2023
Dernière modification : 05 01 2023
Auteur : ows. h.