%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/04_boucle_for\|← Boucle `for`]] | [[Code et Développement/Programmation/Lecture de Code - Python/06_chaines\|Chaînes →]] |
> |:---|---:|
%% nav-fin %%
# Boucle `while`
## Principe
La boucle `while` répète un bloc **tant que** la condition est vraie.
```python
while condition:
# bloc répété
```
La condition est testée **avant** chaque tour. Si elle est fausse dès le départ, le bloc n'est jamais exécuté.
---
## Exemple — compte à rebours
**À manipuler :** suivez l'exécution avec l'entrée 5. La ligne 2 teste la condition avant chaque tour. Au dernier passage, n vaut 0 : le test est faux et la boucle s'arrête.
```sq-trace
n = int(input()) # entrée : 5
while n > 0:
print(n)
n = n - 1
---
1 | n = 5 |
2 | |
3 | | 5
4 | n = 4 |
2 | |
3 | | 4
4 | n = 3 |
2 | |
3 | | 3
4 | n = 2 |
2 | |
3 | | 2
4 | n = 1 |
2 | |
3 | | 1
4 | n = 0 |
2 | |
```
**Sortie** : 5, 4, 3, 2, 1, un nombre par ligne.
---
## Pattern classique — extraction de chiffres
`n % 10` donne le dernier chiffre de `n`. `n // 10` retire ce chiffre.
**À manipuler :** suivez l'exécution avec l'entrée 123.
```sq-trace
n = int(input()) # entrée : 123
while n > 0:
print(n % 10) # dernier chiffre
n = n // 10 # retire le dernier chiffre
---
1 | n = 123 |
2 | |
3 | | 3
4 | n = 12 |
2 | |
3 | | 2
4 | n = 1 |
2 | |
3 | | 1
4 | n = 0 |
2 | |
```
**Sortie** : 3, 2, 1, un chiffre par ligne.
---
## `while` vs `for`
| | `for` | `while` |
|---|---|---|
| Quand utiliser | nombre de tours connu | condition de sortie variable |
| Risque | aucun | boucle infinie si condition jamais fausse |
| Typique | parcours de séquence | algorithme itératif |
---
## Pièges fréquents
- **Boucle infinie** : si la variable de la condition ne change jamais, la boucle ne s'arrête pas.
```python
n = 5
while n > 0:
print(n) # n n'est jamais modifié : boucle infinie
```
- **Condition jamais vraie** : si la condition est fausse dès le départ, le bloc n'est jamais exécuté (contrairement à `do…while` dans d'autres langages).
- **Décalage de un** : `while n > 0` s'arrête quand `n` vaut 0. Le tour avec `n = 0` n'est pas exécuté.
- **Modification de la mauvaise variable** : si la condition porte sur `x` mais que la boucle modifie `y`, la boucle ne converge pas.
## À vous
**À manipuler :** prédisez la sortie.
```sq-affiche
n = 1
while n < 20:
n = n * 3
print(n)
---
réponse: 27
explication: n vaut 1, 3, 9, puis 27. 27 < 20 est faux : la boucle s'arrête et le programme affiche 27.
```
```sq-affiche
n = int(input())
compte = 0
while n > 1:
n = n // 2
compte += 1
print(compte)
---
entrée: 20
réponse: 4
explication: n vaut 20, 10, 5, 2, puis 1. La boucle fait 4 tours.
```
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/04_boucle_for\|← Boucle `for`]] | [[Code et Développement/Programmation/Lecture de Code - Python/06_chaines\|Chaînes →]] |
> |:---|---:|
%% nav-fin %%