Définition
Un programme dont toutes les valeurs sont écrites dans le code donne toujours le même résultat : il calcule l'âge d'une personne dont l'année de naissance est fixée à la ligne 3, et il faut rouvrir le fichier pour interroger quelqu'un d'autre. Pour servir plusieurs personnes, il lui faut une information venue de l'extérieur.
input est la porte d'entrée la plus simple : la fonction interrompt le programme, attend qu'une ligne soit tapée au clavier, puis renvoie ce qui a été saisi. Aucun fichier, aucun réseau, juste la touche Entrée.
prenom = input("Votre prénom : ") # le programme s'arrête sur cette ligne
print("Bonjour", prenom) # il ne reprend qu'après la touche Entrée
# Votre prénom : Camille
# Bonjour CamilleLe texte entre les parenthèses s'appelle l'invite. Il s'affiche avant la pause et sans retour à la ligne, pour que la saisie apparaisse juste derrière lui. Il reste facultatif, mais un input() nu laisse un curseur clignotant que personne ne sait comment remplir.
La valeur revient comme n'importe quel résultat de fonction : sans une variable pour la retenir, elle serait lue puis perdue aussitôt.
La saisie revient toujours sous forme de texte
Voici ce qui surprend le plus : quoi que la personne tape, la valeur obtenue est une chaîne de caractères. Un 25 saisi au clavier vaut "25" et non le nombre 25. Rien ne le montre à l'écran, puisque print affiche les deux de la même façon, mais la différence éclate au premier calcul.
age = input("Votre âge : ")
print(age + 1) # revient à écrire "25" + 1 : du texte plus un nombre
# TypeError: can only concatenate str (not "int") to strLa TypeError qui suit est la première erreur que rencontre presque tout débutant. Son message dit exactement ce qui se passe : Python sait ajouter du texte à du texte et additionner deux nombres, il refuse de mélanger les deux.
Ce refus n'est pas un caprice : la fonction lit des caractères sans savoir ce qu'ils représentent. Un 25 peut être une quantité, un code postal ou un numéro de rue. Seul le programme connaît le sens de sa question, c'est donc à lui de convertir.
Les tutoriels écrits avant 2010 lisent le texte avec raw_input : le input de Python 2 évaluait la saisie comme du code. En Python 3, input se contente de lire et raw_input a disparu.
Convertir la saisie
La conversion dépend de ce que le programme attend, et chacune a sa façon de rompre quand la saisie ne convient pas. Voici les quatre besoins courants.
| Besoin | Écriture | Si la saisie ne convient pas |
|---|---|---|
| Un entier | int(saisie) | Lève une ValueError |
| Un nombre décimal | float(saisie) | Lève une ValueError |
| Du texte | Rien à faire | Ne peut pas échouer |
| Un oui ou un non | saisie.lower() == "oui" | Répond simplement faux |
La dernière ligne piège presque tout le monde, parce que bool semble tout indiqué pour transformer un oui ou un non en vrai ou faux.
bool(saisie) ne répond jamais à la question posée : toute chaîne non vide vaut vrai, "non" et "False" compris. Une confirmation écrite ainsi accepte tout, refus explicite inclus, et le défaut ne se voit qu'une fois l'action irréversible déclenchée.
Seule une comparaison explicite est fiable, parce qu'elle nomme la réponse attendue. Le lower du tableau sert à cela : il ramène OUI, Oui et oui à la même écriture avant de comparer.
Se protéger d'une saisie invalide
Une saisie vient d'un être humain, donc elle sera fausse un jour : un mot au lieu d'un nombre, une virgule au lieu d'un point, la touche Entrée pressée trop vite. Sans précaution, int() lève une erreur et le programme s'arrête net.
La parade tient en deux morceaux : un try autour de la conversion pour intercepter l'erreur, et une boucle while qui repose la question jusqu'à obtenir une valeur exploitable.
while True:
saisie = input("Votre âge : ").strip()
try:
age = int(saisie)
break # une conversion réussie sort de la boucle
except ValueError:
print("Veuillez saisir un nombre entier.")La méthode strip retire les espaces qu'un copier-coller traîne derrière lui : sans elle, un " 25 " parfaitement lisible à l'écran ferait échouer la conversion.
Quant à l'except, il vise une erreur précise plutôt que toutes. Un except nu attraperait aussi l'interruption au clavier : la personne qui tente de quitter avec Ctrl+C se verrait redemander son âge en boucle, sans moyen de sortir.
Questions fréquentes
Comment demander un mot de passe sans qu'il s'affiche à l'écran ?
Pas avec input, qui montre tout ce qui est tapé. Le module getpass, fourni avec Python, fait le même travail en masquant la frappe : from getpass import getpass puis secret = getpass("Mot de passe : "). La valeur renvoyée reste une chaîne de caractères, à convertir comme les autres.
Comment lire plusieurs valeurs sur une seule ligne ?
En découpant la chaîne obtenue avec split : a, b = input().split() répartit dans deux variables deux mots séparés par un espace. Le nombre de morceaux doit correspondre exactement au nombre de variables attendues, sinon l'affectation échoue. Mieux vaut donc vérifier la longueur de la liste obtenue avant de la répartir.
Le programme reste bloqué, est-ce normal ?
Oui, l'attente est le principe même de la fonction : rien ne reprend avant la touche Entrée. Sur un serveur ou dans un script automatisé, où personne n'est là pour répondre, ce blocage devient un défaut, et l'appel doit céder la place à un argument de ligne de commande. Pour apprendre, un programme qui pose une question et réagit à la réponse reste le meilleur point de départ, et c'est celui par lequel ouvre notre formation Python.