Lire la saisie de l'utilisateur — input() et conversion de types
Lire ce que tape quelqu'un avec input(), pourquoi cela est toujours une str, et quelles erreurs apparaissent quand on le convertit avec int() et float().
Comment voulez-vous apprendre ?
Le problème que nous résolvons
Jusqu'ici, tous les programmes avaient leurs nombres écrits directement dans le fichier. Pour le faire tourner avec d'autres nombres, il fallait ouvrir le fichier et le modifier.
Les vrais programmes ne fonctionnent pas comme ça. Un programme demande, et la personne qui l'utilise répond.
En Python, demander, c'est le rôle de input(). Elle se prend en main en une minute. Mais elle vient avec une règle qui piège au moins une fois tout nouveau programmeur : ce que input() renvoie est toujours du texte — même quand la personne a tapé un nombre tout à fait correct. Ne pas connaître cette seule règle suffit à faire planter votre premier programme de calcul.
À la fin de ce chapitre, vous pourrez
- Lire ce que quelqu'un tape avec
input(), en affichant une question claire - Expliquer pourquoi l'entrée est toujours une
str - La convertir en nombre avec
int()etfloat() - Distinguer une
TypeErrord'uneValueErroret d'une mauvaise réponse sans erreur - Nettoyer l'entrée pour qu'un espace en trop ne casse pas votre programme
Prérequis : Travailler avec du texte — indexation, slices et f-strings.
Comment fonctionne input()
name = input("What is your name? ")
print(f"Hello, {name}!")Lancez-le :
What is your name? Rafi
Hello, Rafi!Trois choses se sont produites. input() a affiché la question entre parenthèses ; puis elle s'arrête et attend que la personne tape quelque chose et appuie sur Entrée ; enfin elle renvoie ce qui a été tapé, et nous l'avons stocké dans name.
Remarquez l'espace à la fin de la question — "What is your name? ". Sans lui, ce que la personne tape se retrouve collé au point d'interrogation, et ça fait bizarre.
Ces programmes doivent être lancés dans le terminal.input()attend que quelqu'un tape, donc cela ne fonctionne pas sur un site web ni dans le volet d'aperçu d'un éditeur. Lancezpython ask.pydans votre propre terminal — c'est d'ailleurs comme ça que tout ce cours fonctionne.
La règle qui piège tout le monde une fois
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strLa personne a tapé 22. L'écran affiche un nombre. Et type(age) répond str. (La ligne File affiche le chemin complet de votre fichier : sur votre ordinateur, elle sera donc différente.)
La raison se comprend si on y réfléchit : un clavier produit des caractères, pas des nombres. Quelqu'un peut taper 22, ou abc, ou 12.5. input() aurait pu deviner — « ça ressemble à un nombre, je le convertis » — mais alors la même ligne de code renverrait parfois une str et parfois un int, et on ne pourrait jamais savoir lequel à l'avance. Python garde donc une seule règle : toujours du texte. Convertir est votre travail.
int() et float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23Les deux étapes tiennent sur une seule ligne, et c'est généralement ainsi qu'on l'écrit :
age = int(input("Your age: "))
print("Next year:", age + 1)Lisez-la de l'intérieur vers l'extérieur : input() a produit du texte, int() l'a transformé en nombre entier, et le résultat est allé dans age.
Pour les décimaux, float() :
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92Lequel utiliser : int pour ce que l'on compte (âges, nombres d'éléments, quantités), float pour ce que l'on mesure (prix, poids, moyennes).
Deux erreurs, et une faute qui ne déclenche aucune erreur
Quand la conversion a été oubliée ou que l'entrée est mauvaise, trois choses différentes peuvent arriver. Les noms se confondent facilement, alors regardez-les côte à côte.
TypeError — le type est incorrect. Vous avez oublié la conversion et essayé d'ajouter un nombre à du texte :
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty contient le texte "3", et + sur du texte ne peut que mettre bout à bout un autre morceau de texte, pas un nombre. Python ne devine pas si vous vouliez additionner ou accoler — alors il s'arrête.
Aucune erreur du tout — juste une mauvaise réponse. Maintenant remplacez + par *, toujours sans la conversion :
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33Cette fois, aucune erreur. "3" * 2 veut dire le texte deux fois — "33". Le programme s'exécute et la réponse est fausse. Une mauvaise réponse silencieuse est pire qu'une erreur, parce que rien ne vient vous le signaler.
ValueError — le type est correct, mais le texte n'est pas un nombre :
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int() veut bien faire le travail, mais pas avec 'twenty'. Le message nomme même la valeur fautive, entre guillemets à la fin.
Un piège subtil mais très réel :
count = int(input("Count: "))Tapez 12.5 et cela lève aussi une ValueError — parce que int() n'accepte pas un texte contenant un point décimal. Si des décimales sont possibles, lisez-le avec float() et convertissez en int() ensuite si besoin.
Nous n'avons pas encore tout ce qu'il faut pour empêcher ces erreurs — cela demande à la fois des conditions et des boucles, et les deux arrivent dans les prochains chapitres. Pour l'instant, sachez reconnaître l'erreur et apprenez à lire le message.
Nettoyer les entrées
Les gens tapent des espaces en trop et mélangent les majuscules. Les méthodes du chapitre précédent sont exactement ce qu'il faut :
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesPrenez l'habitude de mettre .strip() sur tout ce qui vient de input(). Aucune raison qu'un programme plante à cause d'un espace de trop.
Un exemple complet
bill.py :
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10Quatre saisies, quatre traitements différents : le nom est nettoyé et mis en majuscules initiales, l'article est seulement nettoyé, la quantité est convertie en nombre entier, le prix en décimal. Pour chaque saisie, vous devez décider deux choses — de quel type vous avez besoin, et comment la nettoyer.
En cas de problème
TypeError: can only concatenate str (not "int") to str La conversion est absente. Écrivez int(input(...)) ou float(input(...)).
Je voulais multiplier, mais le texte se répète "3" * 2 donne "33". La valeur n'a jamais été convertie en int. Ce bug est dangereux précisément parce qu'aucune erreur n'apparaît — en cas de doute, affichez type().
ValueError: invalid literal for int() with base 10 Ce que la personne a tapé n'est pas un nombre entier — un mot, un décimal, ou rien du tout (juste Entrée). Si des décimales sont possibles, utilisez float().
Le programme reste là sans rien afficher Il attend votre saisie. Sans question donnée à input(), rien n'apparaît à l'écran et on a l'impression qu'il est bloqué. Passez toujours une question.
input() ne fonctionne pas dans mon éditeur Certains éditeurs et blocs de code en ligne n'acceptent pas de saisie. Ouvrez un terminal et lancez python bill.py.
Il y a une ligne vide en trop après Entrée input() prend votre texte et ne garde pas le saut de ligne final. Une ligne vide en trop vient presque certainement d'un print() que vous avez écrit.
Étape 4 sur 6 — Prédire
Vérifiez votre compréhension
La personne tape 42 et appuie sur Entrée. Que s'affiche-t-il à la deuxième ligne ?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
La personne a tapé 3 et le programme a affiché Doubled: 33, sans aucune erreur. Pourquoi, et qu'est-ce qui corrige ça ?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- AÉcrire `qty + qty` à la place de `qty * 2` corrigerait le problème
- BLe `print` a besoin d'un `+` à la place de la virgule
- C`input()` ne sait pas lire les nombres, il faut donc une autre fonction
- D`qty` est une `str`, et multiplier du texte par un nombre le répète — il faut `int(qty) * 2`
Que se passe-t-il si la personne tape 12.5 ?
count = int(input("Count: "))
print(count + 1)- AUne `ValueError` — `int()` n'accepte pas un texte contenant un point décimal ; utilisez `float()` si des décimales sont possibles
- B`count` devient `12`, car `int()` coupe tout ce qui suit le point
- CUne `TypeError`, car le type de l'entrée et celui de la variable ne correspondent pas
- D`count` devient `13`, car `int()` arrondit à l'entier le plus proche
Répondre nécessite un compte
Connectez-vous pour vérifier vos réponses
Les questions sont ci-dessus, et les résoudre de tête est ce qui compte vraiment. Connectez-vous pour voir les réponses, les explications et les indices à trois niveaux.
À vous de jouer
Écrivez un fichier appelé travel.py qui pose quatre questions et affiche un petit calcul :
- Le nom du passager (nettoyé, avec une majuscule initiale)
- Le nombre de passagers (un nombre entier)
- Le tarif par passager (un décimal)
- Le taux de réduction en pourcentage (un décimal)
Puis affichez le total du tarif, le montant de la réduction et le montant final à payer — tous les trois avec deux décimales.
Quand ça fonctionne, essayez de le faire planter trois fois exprès :
- Tapez
twopour le nombre de passagers — quelle erreur apparaît, et que dit le message ? - Tapez
2.5pour le nombre de passagers — que se passe-t-il, et pourquoi ? - Mettez quelques espaces avant et après le nom — la sortie reste-t-elle correcte ?
Si la réponse à la dernière question est oui, vous écrivez déjà un meilleur code que la moyenne des débutants. Les corrections des deux autres arrivent une fois que vous aurez les conditions et les boucles.
Cette mission va plus loin
Ce que vous avez lu ci-dessus est la mission complète — rien n’en a été retiré. Pro ajoute :
- Ce qui se passe vraiment en coulisses : comment Python exécute ce code
- La solution complète de l’exercice, expliquée étape par étape
- Des exercices supplémentaires plus difficiles
- La question d’entretien sur ce sujet, avec une réponse modèle
Étape 6 sur 6
Défi — le quiz du chapitre
Dix questions, de la plus facile à la plus difficile. Les dernières sont difficiles exprès.
Connectez-vous pour faire le quiz