Étape 1
On suit pas à pas l'exécution du script en déterminant à chaque tour de boucle la valeur et le type de la variable $x$.
Étape 2
À l'initialisation, $x = 80$ (de type int) et compteur = 0.
Étape 3
Pour les $4$ premiers tours de boucle, $x$ est un entier pair ($80$, $40$, $20$, $10$). L'instruction exécutée est x = x // 2. L'opérateur de division entière // entre deux entiers conserve le type int :
Étape 4
$$x \text{ prend successivement les valeurs } 40\text{, } 20\text{, } 10\text{ et } 5\text{ (toutes de type int)}$$
Étape 5
À la fin de la $4^e$ itération, la variable compteur vaut $4$ et $x = 5$.
Étape 6
Au $5^e$ tour de boucle, $x = 5$ est un entier impair (5 % 2 == 0 est faux). Le bloc else est donc exécuté : x = 5 / 1. En Python, la division classique / renvoie toujours une valeur de type flottant (float). La variable $x$ prend donc la valeur $5{,}0$ (type float).
Étape 7
La variable compteur est incrémentée et prend la valeur $5$.
Étape 8
Au début de la $6^e$ itération, la condition type(x) == int est évaluée. Comme $x$ est désormais de type float (valeur $5{,}0$), la condition renvoie False et la boucle s'arrête.
Étape 9
La valeur finale de la variable compteur est donc $5$.
Méthode clé
En Python, la division entière // entre entiers conserve le type int, tandis que la division classique / renvoie toujours un type float (ex : $5 / 1 = 5{,}0$).
Piège à éviter
Penser que $5 / 1$ reste un entier (type int) sous prétexte que le résultat mathématique est $5$. En Python, l'opérateur / produit systématiquement un flottant (5.0), ce qui modifie le type de la variable.