SNT Python 4

Identification

Infoforall

6 - 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

Documents de cours : pdf ou odt.

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
import random n = random.randint(-50, 200)

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 :

  1. On évalue la condition de poursuite à VRAI ou FAUX
  2. SI la condition de poursuite est évaluée à VRAI, on réalise le bloc, et on revient à l'étape 1.
  3. 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 :

  1. D'évaluer la condition de poursuite.
  2. 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.
  3. 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 ?
  • Retrouver les lignes suivies par l'interpréteur Python
1 2 3 4 5 6 7
x = 0 while x < 40: print(x) x = x + 10 print("Fin du TANT QUE")

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 ? Justifier en fournissant les lignes suivies par l'interpréteur.

1 2 3 4 5 6 7
x = 0 while x < 31: print(x) x = x + 10 print("FIN DU TANT QUE")

...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 nombre x pour lequel la formule suivante est valide ?

(x+1)2 - x2 = 9

L'idée

L1 : On part de x = 0.

L3 : Tant que le terme de gauche ne donne pas 9 avec la valeur pointée par x,

L4 : on incrémente x de 1.

L5 : on affiche le x qu'on vient de tester.

Fin de la boucle, on repart en Ligne 3.

Le programme

1 2 3 4 5 6 7
x = 0 while ( (x+1)**2 - x**2 ) != 9: x = x + 1 print("Test avec x valant ", x) print("Valeurs obtenues : ", x+1, " et ", x)

La condition de poursuite de la boucle est bien que le terme de gauche ne donne pas 9 avec les valeurs x+1 et x actuelles.

Questions

  1. Donner les lignes d’exécution sachant que x = 4 valide la demande.
  2. Existe-t-il un tel nombre pour une dufférence de 99 ?
  3. Que constate-t-on si on cherche pour une différence de 100 ?

...CORRECTION...

  1. Donner les lignes d’exécution sachant que x = 4 valide la demande.
  2. 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.

  3. Existe-t-il deux nombres pour une différence de 99 ?
  4. Je ne sais pas, mais il suffit de modifier le 9 en 99 pour le savoir !

  5. Que constate-t-on si on cherche une différence de 100 ?
  6. 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
from random import randint de1 = 0 de2 = 1 nombre = 0 while de1 != de2: nombre = nombre + 1 de1 = randint(1, 6) de2 = randint(1, 6) print(de1, " et ", de2) print("Nombre de lancés :") print(nombre)

Questions

Donner les lignes exécutées en supposant qu’on tire 1-3 sur les dés la première fois qu'on rencontre les lignes 9, 10 puis 5-4 la deuxième fois puis 1-6 puis enfin 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-11

7 (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
argent = 500 duree = 0 while argent < 1000: duree = duree + 1 argent = argent * 1.1 print("Argent au final") print(argent) print("Durée total") print(duree)

Questions

  1. Donner la traduction en français des lignes 4, 5 et 6.
  2. Calculer argent après le premier tour de boucle.
  3. Calculer argent après le deuxième tour de boucle.
  4. Calculer argent après le troisième tour de boucle.
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
from random import randint mystere = randint(1, 10) reponse = 0 while mystere != reponse: reponse = int(input("Votre réponse : ")) print("Bravo")

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

  1. Pourquoi avoir placer 0 dans la réponse initiale en ligne 4 ?
  2. Donner la signification en français des lignes 3-4-6-7.
  3. 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

Les conditions IF, les boucles bornées FOR et non bornées WHILE seront désormais utilisées de façon régulière.

Activité publiée le 05 01 2023
Dernière modification : 05 01 2023
Auteur : ows. h.