Définition
Compter des choses demande un type de nombre qui refuse toute virgule. Le nombre de tentatives qu'il reste à un utilisateur, l'âge inscrit sur un formulaire, la position d'un élément dans une liste : aucun de ces nombres n'a de sens avec une décimale. Python répond à ce besoin avec int, le type des nombres entiers, ceux qui n'ont ni virgule ni reste, qu'ils soient positifs, négatifs ou nuls.
C'est aussi le type par défaut. Écrivez un nombre sans point dans votre code, et Python en fait spontanément un int, sans qu'aucune annotation ne soit nécessaire. Et contrairement à la plupart des langages, sa taille n'est bornée par rien d'autre que la mémoire de la machine : pas de plafond fixé d'avance, pas de dépassement silencieux qui ferait basculer un compteur dans le négatif.
age = 34
solde = -120
compteur = 0
print(type(age))
# <class 'int'>Le nom int désigne à la fois ce type et la fonction qui en fabrique une valeur, ce qui surprend souvent au début : écrire int("42") ne modifie rien sur place, cela construit un entier neuf à partir de la lecture de la chaîne, et laisse la variable d'origine intacte.
Le construire depuis une chaîne
Tout ce qui entre dans un programme entre sous forme de texte. La fonction input renvoie toujours une chaîne de caractères, jamais un nombre. Un champ de formulaire fait pareil, une colonne lue dans un fichier CSV aussi. Convertir cette chaîne en int devient donc un geste que l'on répète sans même y penser, dès qu'un calcul doit suivre une saisie.
saisie = input("Votre âge : ")
age = int(saisie)
if age >= 18:
print("Majeur")Sauter cette étape ne pardonne pas. Comparer un texte à un nombre fait lever à Python une TypeError, et si la chaîne fournie ne représente pas un entier valide, la construction échoue avec une ValueError. Cette seconde erreur se rattrape avec un bloc try/except, ce qui permet de redemander poliment une saisie plutôt que de laisser le programme s'arrêter net.
Le tableau suivant résume ce que int() accepte et refuse, parce que la frontière n'est pas toujours celle qu'on imagine.
| Expression | Résultat |
|---|---|
int("42") | 42 |
int(" 42 ") | 42, les espaces autour sont ignorés |
int("42.5") | ValueError, le point décimal est refusé |
int(42.9) | 42, la partie décimale est coupée |
int(True) | 1, un bool est déjà un entier |
Convertir un nombre à virgule en entier tronque vers zéro, sans jamais arrondir : int(-2.9) vaut -2 et non -3, une différence qui fausse silencieusement un total quand un arrondi était attendu. Pour arrondir au plus proche, utilisez la fonction round avant de convertir.
Les divisions ne se valent pas
Diviser deux entiers avec / surprend souvent au début : le résultat n'est jamais un entier, même quand le calcul tombe juste. 10 / 2 donne 5.0, point décimal compris, parce que Python veut garder la possibilité d'un reste sans jamais le faire disparaître silencieusement. Pour rester dans les entiers, deux autres opérateurs existent : // renvoie le quotient, % renvoie le reste.
10 / 3 # 3.3333333333333335
10 // 3 # 3
10 % 3 # 1
pages = (total + 9) // 10Ce couple règle la plupart des besoins concrets : répartir des éléments sur des pages, savoir si un nombre est pair en testant son reste par 2, convertir des secondes en minutes. Une seule situation reste interdite quelle que soit la forme de la division : diviser par zéro, qui lève toujours une ZeroDivisionError.
Une taille sans plafond
Dans beaucoup de langages, un entier finit par déborder : au-delà d'une certaine valeur, le compteur repart de zéro ou bascule dans le négatif, sans avertissement. Python évite ce piège en n'imposant aucune limite fixe à ses entiers, une seule famille qui grandit tant que la mémoire de la machine le permet.
print(2 ** 200)
# 1606938044258990275541962092341162602522202993782792835301376Cette liberté a un prix : les calculs sur des nombres réellement immenses deviennent plus lents. Mais elle supprime en échange une famille de bugs difficiles à reproduire, ceux qui n'apparaissent qu'après des mois d'utilisation, une fois qu'un compteur a fini par déborder ailleurs.
Un nombre entier littéral peut contenir des tirets bas pour rester lisible, sans que cela change sa valeur : 1_000_000 vaut exactement 1000000. Python les ignore purement à la lecture du code.
Les entiers ont un autre avantage sur les nombres à virgule : ils restent exacts, addition après addition, là où un float accumule de petites erreurs d'arrondi invisibles à l'oeil nu. C'est pourquoi une règle est largement suivie dans le code qui manipule de l'argent : stocker les montants en centimes, sous forme d'entiers, et ne les convertir en euros qu'au moment de les afficher.
Questions fréquentes
Comment savoir si une valeur est bien un entier ?
La fonction type l'affiche directement, et isinstance(valeur, int) permet de le vérifier dans une condition. Un détail à connaître : un booléen répond vrai à ce test, puisque Python le traite comme un entier valant 0 ou 1.
Pourquoi la saisie « 3.5 » est-elle refusée par int() ?
Parce que la construction d'un entier n'accepte que des chiffres, éventuellement précédés d'un signe, jamais un point décimal. Un texte qui en contient un doit d'abord passer par float, puis par une conversion en entier si la troncature du résultat est réellement voulue.
Faut-il déclarer le type avant d'affecter un nombre à une variable ?
Non, Python le déduit toujours de la valeur écrite, et la même variable peut recevoir un texte quelques lignes plus loin sans que rien ne s'y oppose. Les annotations de type documentent l'intention pour les outils d'analyse, mais elles ne sont jamais vérifiées pendant l'exécution du programme.