Licence CC BY-SA

Interactions

Pour casser la monotonie de nos programmes, nous allons maintenant voir comment y ajouter un peu d’interactions.

Entrées utilisateur

Nous avons déjà vu la commande print('message') qui permet d’écrire un message sur le terminal. Il s’agit en fait d’une fonction prenant un nombre variable d’arguments et les affichant successivement dans la fenêtre de l’interpréteur. Les arguments passés peuvent être de n’importe quel type.

>>> print(10, 'text', 4.2)
10 text 4.2

Par défaut, les valeurs sont séparées par une espace. Il est toutefois possible de choisir un autre séparateur en ajoutant un argument sep='xxx' après tous les autres.

>>> print(10, 'text', 4.2, sep=' - ')
10 - text - 4.2

Contrairement aux autres arguments, il est ici nécessaire de préciser un nom (sep) pour que Python fasse la différence avec les autres valeurs : il ne doit pas considérer ' - ' comme une valeur à afficher en plus des autres, mais comme le séparateur entre ces valeurs. On parle alors d’argument nommé.

Sachez aussi que l’on peut appeler la fonction print sans lui passer aucun argument. À quoi cela peut bien servir ? Juste à afficher une ligne vide. Cela revient à appeler print avec une chaîne vide.

>>> print()

>>> print('')

À l’inverse de print, il existe aussi une fonction input pour lire une chaîne de caractères depuis le terminal, selon ce qui est entré par l’utilisateur.

>>> input()
coucou
'coucou'

Après avoir entré la commande input(), on est invité à écrire une ligne de texte en terminant par un retour à la ligne (Entrée). Cette ligne est ensuite renvoyée, sous forme d’une chaîne de caractères, par la fonction input.

Le texte qui s’affiche sous la ligne >>> input() dans l’exemple au-dessus est donc le texte entré dans le terminal par l’utilisateur. Je vous invite alors à essayer ces exemples chez vous pour bien voir comment ils se comportent. Vous pouvez y entrer ce que bon vous semble.

input prend aussi un argument optionnel permettant d’afficher un message juste avant de demander la saisie, comme dans l’exemple suivant.

>>> name = input('Quel est ton nom ? ')
Quel est ton nom ? entwanne
>>> print("Tu t'appelles", name)
Tu t'appelles entwanne

On comprend ainsi tout l’intérêt des variables. Jusqu’ici, nous ne manipulions que des données connues du programme et les variables pouvaient sembler futiles. Mais elles vont maintenant nous servir à stocker et traiter des données venant de l’extérieur, inconnues au lancement du programme.

Conversions de types

Comme indiqué, input renvoie toujours une chaîne de caractères. Comment faire alors pour demander à l’utilisateur un nombre afin de l’utiliser dans un calcul ?

Il y a pour cela des mécanismes pour convertir (dans la mesure du possible) une valeur d’un type vers un autre. Je n’ai pour le moment présenté les types que comme des catégories regroupant des valeurs, mais ils ont en fait une existence propre en Python.
Les nombres entiers correspondent ainsi au type int (pour integer, entier), les nombres à virgule au type float (flottant) et les chaînes de caractère au type str (pour string, chaîne).

Chacun de ces types peut être vu et utilisé comme une fonction permettant de convertir des données vers ce type.

>>> int(4.2)
4
>>> float(4)
4.0
>>> str(4)
'4'
>>> int('10')
10

On voit dans ce dernier exemple que '10' et 10 sont des valeurs de types différents, la première est une chaîne de caractères et la seconde un nombre. Il ne s’agit donc pas de la même chose, on ne peut pas exécuter les mêmes opérations sur les deux.

>>> 10 + 1
11
>>> 10 + '1'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> '10' + '1'
'101'

Ainsi, pour en revenir à la demande initiale, afin traiter une entrée de l’utilisateur comme un nombre, il convient alors de convertir en int le retour d'input.

>>> n = int(input('Choisis un nombre : '))
Choisis un nombre : 5
>>> print('Le double de', n, 'vaut', n * 2)
Le double de 5 vaut 10

Cependant, toute valeur n’est pas convertible d’un type vers un autre, par exemple la chaîne de caractères 'toto' ne correspond à aucun nombre. Lorsque la conversion est impossible, on verra survenir lors de l’appel une erreur explicitant le problème.

>>> int('toto')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'toto'