Exercice 1 : Types, opérateurs et résultats surprenants
Toutes les questions demandent la valeur ET le type du résultat. Répondez sans machine : l'épreuve se passe sans interpréteur, et savoir prévoir ce que Python va faire est précisément la compétence évaluée.
- a) Donnez la valeur et le type de : 7 // 2, 7 / 2, 7 % 2, 2 ** 10.
- b) Donnez la valeur de -7 // 2 et de -7 % 2. Le résultat de la division entière vous surprend-il ? Expliquez la règle utilisée par Python.
- c) Que vaut 0.1 + 0.2 ? L'expression 0.1 + 0.2 == 0.3 est-elle vraie ? Justifiez, puis proposez la bonne façon de comparer deux flottants.
- d) Donnez la valeur de : '3' + '4', '3' * 4, int(3.9), int(-3.9).
- e) Que valent round(2.5), round(3.5) et round(0.5) ? Formulez la règle d'arrondi réellement appliquée par Python.
Voir la correction
a) 7 // 2 vaut 3 (int) : c'est le quotient entier. 7 / 2 vaut 3.5 (float) : l'opérateur / renvoie TOUJOURS un flottant, même quand la division tombe juste. 7 % 2 vaut 1 (int), le reste. 2 ** 10 vaut 1024 (int).
b) -7 // 2 vaut -4, et non -3. Python arrondit le quotient vers le bas (vers moins l'infini), pas vers zéro. Et -7 % 2 vaut 1, un reste positif. Les deux sont cohérents : la relation doit rester vraie, et en effet . En Python, le reste a toujours le signe du diviseur.
c) 0.1 + 0.2 vaut 0.30000000000000004, donc l'expression est FAUSSE. En binaire, 0,1 et 0,2 n'ont pas d'écriture finie, exactement comme 1/3 n'en a pas en base 10 : la machine en stocke une approximation, et les erreurs s'additionnent. On ne teste donc jamais l'égalité de deux flottants ; on écrit abs(a - b) < 1e-9, ou l'on travaille avec des entiers quand c'est possible (des centimes plutôt que des euros).
d) '3' + '4' vaut '34' : entre deux chaînes, + est la concaténation. '3' * 4 vaut '3333' : chaîne fois entier, c'est la répétition. int(3.9) vaut 3 et int(-3.9) vaut -3 : int() tronque vers zéro, elle n'arrondit pas (attention, ce n'est donc PAS la même chose que //).
e) round(2.5) vaut 2, round(3.5) vaut 4 et round(0.5) vaut 0. La règle n'est pas « 0,5 s'arrondit au-dessus » mais l'arrondi au pair le plus proche : en cas d'égalité parfaite, Python choisit l'entier pair. Ce choix évite le biais systématique vers le haut quand on arrondit de longues séries de valeurs.