Conversion de types
Convertissez explicitement entre int, float, str et bool, et comprenez quand les conversions échouent.
- Convertir des valeurs avec int(), float(), str() et bool()
- Comprendre la troncature contre l'arrondi
- Reconnaître quand les conversions lèvent une ValueError
- Gérer correctement le type de retour de input()
Pourquoi une valeur devrait-elle changer d’ensemble ?
Vous tapez votre année de naissance dans un formulaire. Le input() de Python vous rend une chaîne, "2004". Mais "2004" n’est pas un nombre au sens arithmétique : essayez "2004" + 26 et Python répond "200426", car pour une chaîne, + veut dire joindre, pas additionner.
Vous tenez les chiffres d’un nombre sans tenir le nombre. Son ensemble d’appartenance est le mauvais. Une valeur qui traverse le clavier jusqu’à un programme arrive comme texte, et le texte ne sait pas faire de l’arithmétique.
Un programme doit donc convertir sans cesse une valeur d’un ensemble à un autre : de str vers int avant de calculer une année, de int vers str avant de l’imprimer à côté d’une étiquette. Python vous donne quatre fonctions pour cela, une par ensemble de destination.
Quatre fonctions de conversion
Chacune porte le nom de l’ensemble qu’elle produit :
int("42") # 42 — str -> int "42" était des chiffres ; c'est maintenant un nombre
float("3.14") # 3.14 — str -> float
str(42) # "42" — int -> str le nombre devient texte
bool(0) # False — nombre -> valeur de véritéLes lire à voix haute dit ce qu’elles sont : str(42) signifie « donne-moi la version chaîne de ». Le nom de la fonction est le nom de l’ensemble de destination, et les parenthèses sont la machine de conversion elle-même.
Convertir ne consiste pas à arrondir, c’est tronquer
Voici une subtilité qui coûte de vrais bugs aux débutants. Vous voulez la partie entière de . Quelle réponse faut-il donner ?
L’instinct naturel est d’arrondir : . Le int(3.9) de Python renvoie en revanche :
int(3.9) # 3 — la partie décimale est coupée, pas arrondie
round(3.9) # 4 — ceci est un arrondiint() tronque : il jette la partie fractionnaire et garde le reste, en se déplaçant vers zéro. La différence surgit dès que les nombres deviennent négatifs :
int(-3.9) # -3 — vers zéro
import math
math.floor(-3.9) # -4 — vers moins l'infiniLa droite numérique tranche : tronquer marche vers , math.floor descend (vers ), et round va vers l’entier le plus proche. Choisissez celui qui correspond à ce que vous vouliez dire par « la partie entière ».
Certaines conversions doivent échouer
Passer d’un ensemble à l’autre n’est pas toujours possible. Lesquelles de ces conversions voyez-vous fonctionner ?
int("hello") # ValueError: invalid literal for int()
int("3.14") # ValueError: invalid literal for int() ("3.14" : des chiffres avec un point)
float("hello") # ValueError: could not convert string to float"hello" ne contient aucun chiffre, rien à convertir, donc Python refuse. int("3.14") est plus retors : il contient des chiffres, mais la fonction int n’accepte qu’un littéral entier, or n’est pas entier. Il faut passer par float pour le réduire :
int(float("3.14")) # 3 — analyse 3.14, tronque à 3Remarquez la philosophie : Python échoue bruyamment plutôt que de deviner tout bas. Une devinette silencieuse corromprait vos données ; une erreur sonore arrête le programme pour que vous décidiez.
Le piège quotidien : input() renvoie une chaîne
À chaque fois, sans exception, input() renvoie un str, même quand l’utilisateur tape 2004. Le nombre que vous vouliez est encore de l’autre côté d’une conversion :
year_text = input("Birth year? ") # str, toujours
year = int(year_text) # maintenant il sait faire de l'arithmétique
print(f"About {2026 - year} years old")Oublier la conversion est l’une des erreurs initiales les plus courantes, et voici à quoi ressemble exactement l’oubli :
age = input("Age? ")
print(age + 1) # TypeError: can only concatenate str (not "int") to strL’erreur est la machine qui joue franc jeu : age vit dans (les chaînes), et + sur une chaîne ne veut pas dire addition. La leçon est une habitude : si une valeur vient de l’extérieur, convertissez-la avant de faire des mathématiques avec.
Un exemple travaillé : la mesure tronquée
Un capteur signale "3.9" comme du texte, et un afficheur ne montre que des unités entières. Deux conversions, une intention chacune :
raw = "3.9"
numeric = float(raw) # 3.9 — analyse le nombre réel
whole = int(numeric) # 3 — tronque vers zéro
print(f"{whole} units") # 3 units — le .9 est coupé, pas arrondiL’entonnoir compte parce que chaque étape est une promesse différente : float(...) change le texte en valeur réelle, int(...) tranche ensuite vers zéro, et vous ne demandez jamais à une fonction de faire les deux. Dites quelle promesse vous entendez et la conversion cesse de surprendre.
Pièges courants
int("3.14")lève une erreur. Vous ne pouvez pas parser une chaîne décimale directement enint(). Réduisez-la à la main :int(float("3.14")), ouround(float("3.14")).int()tronque ;round()arrondit.int(4.7)vaut4, pas5. Demandez-vous quelle opération vous décrivez vraiment en disant « convertis ceci en entier ».float("inf")est valide. Python connaît l’infini :float('inf'). Pratique dans les algorithmes d’optimisation ; troublant lorsqu’il s’invite dans un résultat que vous attendiez fini.int()etbool()tronquent et réinterprètent en silence.int(3.9)tranche la fraction en silence ;bool("")renvoieFalseen silence. Analyser du texte échoue bruyamment (ValueError), mais les conversions nombre-à-nombre sont calmes, ce sont celles à vérifier deux fois.
🧩 Défis
🧩 Défi, réfléchissez d'abord, puis révélez
Prédisez int(-7.9) et -7.9 // 1. Sont-ils identiques ? Expliquez toute différence.
💡 Réponse : int(-7.9) vaut -7 (tronque vers zéro, coupe la partie décimale), tandis que -7.9 // 1 vaut -8.0 (plancher vers moins l'infini). Ils concordent pour les positifs et divergent pour les négatifs.
🧩 Défi, réfléchissez d'abord, puis révélez
Écrivez un programme qui demande un nom et une année de naissance (deux invites input() distinctes), calcule un âge approximatif et affiche une phrase comme "Amina, you are about 21 years old."
💡 Réponse : Lisez le nom et l'année avec deux appels à input(), convertissez l'année avec int(), soustrayez-la de l'année courante (p. ex. 2026) et affichez avec une f-string : print(f"{name}, you are about {2026 - year} years old.").
🧩 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 si 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 $\text{dividende} = \text{diviseur} \cdot \text{quotient} + \text{reste}$.
🤔 Questions socratiques
input()renvoie toujours unstr. Qu’est-ce qui cloche avecage + 10si vous sautez la conversion ? Que dit exactement le message d’erreur ?- Pour convertir
"3.14"en entier, pourquoiint("3.14")échoue-t-il maisint(float("3.14"))réussit-il ? Que fait l’étape intermédiaire ? - Python a
math.floor()etmath.ceil(). En quoi diffèrent-ils deint()sur les nombres négatifs ? Quand choisiriez-vous chacun ?
✅ Vérification rapide
1. Que vaut int(4.7) ?
2. Que renvoie toujours input("Name: ") ?
3. Que se passe-t-il avec int("3.14") ?