Opérateurs arithmétiques
Additionnez, soustrayez, multipliez, divisez, divisez entièrement, module et puissances, les huit opérateurs arithmétiques.
- Utiliser les huit opérateurs arithmétiques : +, -, *, /, //, %, **
- Comprendre la division entière contre la division réelle
- Appliquer la précédence des opérateurs (PEMDAS)
- Utiliser des parenthèses pour outrepasser la précédence
Les opérateurs qu’une machine vole aux mathématiques
Vous avez écrit des fonctions auxiliaires dans les leçons précédentes : stocker une valeur, l’imprimer, changer son type. Rien de tout cela n’est utile tant qu’un programme ne peut faire quelque chose avec les nombres. Faites donc une pause : un ordinateur existe pour évaluer des expressions, et toute expression se construit avec des opérateurs qui joignent des valeurs. Vous connaissez déjà ceux de l’arithmétique sur papier, mais la machine coupe deux d’entre eux en morceaux.
Les opérateurs et leurs significations
Python en fournit huit. Les quatre premiers sont exactement ce que vous attendez :
7 + 2 # 9 — addition
7 - 2 # 5 — soustraction
7 * 2 # 14 — multiplication
7 / 2 # 3.5 — division réelle (renvoie toujours un float)Viennent ensuite trois qui répondent à des questions que vous ne posiez qu’en devoir :
7 // 2 # 3 — division entière (arrondit vers −∞)
7 % 2 # 1 — modulo (le reste)
7 ** 2 # 49 — puissance (7²)** est l’écriture par Python d’une puissance : . Les deux nouveaux venus sont // et %, et ce ne sont pas des variantes, ce sont les deux moitiés d’une seule question légitime.
Deux moitiés d’une seule division
Posez une question réelle : combien de groupes entiers de 4 tiennent dans 15, et que reste-t-il ?
La réponse comporte deux parties, le quotient et le reste . Le // de Python répond à la première et le % à la seconde :
15 // 4 # 3 — combien de groupes de 4
15 % 4 # 3 — ce qui reste
4 * 3 + 3 # 15 ✓ l'identité se vérifieCette identité n’est pas une décoration, c’est la définition des deux opérateurs, et elle ne peut faillir tant que la même machine calcule les deux parties.
Il y a un pli. Quel quotient Python rapporte-t-il pour ? Écrivez-le comme une question de groupement :
Les options sont ou . Python prend le plancher, comme la fonction mathématique :
-7 // 2 # -4 — floor(-3.5) = -4, pas -3
-7 % 2 # 1 — cohérent avec le plancher : -7 = 2·(-4) + 1Les deux opérateurs restent fidèles l’un à l’autre : l’identité tient sans exception, et cela vaut mieux que « la réponse intuitive ».
L’ordre des opérations, tranché
Dans une expression à plusieurs opérateurs, il faut un ordre fixe, sinon chaque lecteur calculerait une valeur différente pour . Python adopte l’ordre appris sous le nom PEMDAS :
**d’abord (puissance)- puis
*,/,//,%(de gauche à droite) - puis
+,-(de gauche à droite)
2 + 3 * 4 # 14, pas 20
(2 + 3) * 4 # 20 — les parenthèses outrepassent
2 ** 3 ** 2 # 512, pas 64Ce dernier est une vraie surprise. ** est associatif à droite, donc 2 ** 3 ** 2 se lit , comme dans la notation empilée où les puissances grimpent dans une seule direction. Dans le doute, écrivez les parenthèses, un lecteur qui ne les voit pas ne devinera pas votre intention.
Un exemple travaillé : le reste du plan de lecture
La paire quotient/reste fait tourner un plan de lecture :
pages = 301
per_day = 30
days = pages // per_day # 10 — jours entiers de lecture
leftover = pages % per_day # 1 — le reste du onzième jour
print(f"{days} full days, {leftover} leftover")
days * per_day + leftover # 301 — l'identité tientL’identité de division devient un grand livre : days et leftover sont ses deux colonnes, et l’identité est le reçu qui prouve qu’aucune perte n’a eu lieu.
Pièges courants
/contre//.7 / 2vaut3.5(un float) ;7 // 2vaut3(un int). Prenez//seulement quand le quotient entier est ce que le problème demande.- Division entière avec des négatifs.
-7 // 2vaut-4, pas-3. Le plancher va vers , pas vers zéro. %fonctionne aussi sur les floats.7.5 % 2vaut1.5, l’identité ci-dessus vaut pour les réels comme pour les entiers.**lie plus fort que*.2 * 3 ** 2vaut18, pas36, la puissance se calcule d’abord. Mettez des parenthèses quand vous voulez dire(2 * 3) ** 2= 36.
🧩 Défis
🧩 Défi, réfléchissez d'abord, puis révélez
Sans l’exécuter, calculez 15 // 4 et 15 % 4 à la main, puis vérifiez que reproduit .
💡 Réponse : 15 // 4 vaut 3 (le plancher de $3.75$), et 15 % 4 vaut 3, puisque $15 = 4\cdot 3 + 3$. Ensemble, 4 * 3 + 3 = 15, l'identité de la division, vérifiée.
🧩 Défi, réfléchissez d'abord, puis révélez
Comment extrairiez-vous le chiffre des centaines d’un nombre ? Avec n = 4567, obtenez 5 en n’utilisant que l’arithmétique, sans chaînes.
💡 Réponse : (n // 100) % 10, divisez d'abord par 100 pour déplacer le chiffre vers la droite (4567 → 45), puis modulo 10 pour ne garder que le dernier (45 → 5).
🧩 Défi, réfléchissez d'abord, puis révélez
Pourquoi Python emploie-t-il ** pour la puissance au lieu de ^ ? Que fait ^ en réalité en Python ?
💡 Réponse : ^ est l'opérateur XOR bit à bit en Python, pas la puissance. Python utilise ** pour éviter le conflit avec la convention des langages où ^ signifie XOR.
🤔 Questions socratiques
- Pourquoi la division entière arrondit-elle vers moins l’infini plutôt que vers zéro ? Quel bénéfice pratique découle de ce choix (indice : pensez à
divmod()qui renvoie un couple cohérent) ? 2 ** 3 ** 2vaut512, pas64. Pourquoi**est-il associatif à droite quand+et*le sont à gauche ?- Où la modular arithmétique gagne-t-elle son sel dans la vie réelle ? Pensez aux horloges, aux jours du calendrier ou aux indices de tableaux.
✅ Vérification rapide
1. Que vaut -7 // 2 ?
2. Quel est le résultat de 2 ** 3 ** 2 ?
3. Que vaut 7 % 3 ?