2. Interactions

Au chapitre précédent, le programme calculait sans rien dire. Il va maintenant afficher ses résultats et écouter l’utilisateur.

Objectifs de cette session :

  • afficher avec print() : plusieurs arguments, sep, end,

  • composer un message par concaténation ou avec une f-string,

  • mettre en forme du texte : délimiteurs, séquences d’échappement, len(),

  • interroger un type avec type(),

  • convertir une valeur d’un type à un autre avec int(), float(), str() et bool(),

  • lire une saisie avec input(), qui renvoie toujours un str,

  • lire un message d’erreur et le corriger.

2.1. La fonction print()

print() est une fonction native : un outil déjà fourni par Python. On l’appelle en écrivant son nom suivi de parenthèses, et on place entre ces parenthèses ses arguments, c’est-à-dire les valeurs qu’elle doit traiter.

print() accepte un ou plusieurs arguments séparés par des virgules. Python insère une espace à la place de chaque virgule.

Sans argument, print() insère une ligne vide.

La virgule et l’opérateur + font deux choses différentes. La virgule sépare des arguments et ajoute une espace entre eux ; le + concatène (§1.4) et n’ajoute rien du tout.

Deux arguments nommés permettent de modifier ce comportement : sep remplace l’espace inséré entre les arguments, end remplace le retour à la ligne ajouté à la fin.

Note

Tout ce qui suit un # sur une ligne est un commentaire : Python l’ignore complètement. On s’en sert pour expliquer une intention, ou pour désactiver temporairement une ligne de code. La plupart des éditeurs les affichent en gris.

Question

Qu’affiche print("a", "b", sep="") ?

Exercice 1

Affichez votre prénom, votre âge, et une phrase combinant les deux.

Solution
prenom = "Ada"
age = 17
print(prenom)
print(age)
print(prenom, "a", age, "ans.")

2.2. Composer un message

Insérer la valeur d’une variable dans une phrase est l’opération la plus courante d’un programme. Python offre trois manières de le faire.

La troisième est la plus lisible. La lettre f placée juste avant le guillemet ouvrant transforme la chaîne en f-string (formatted string, chaîne formatée). À l’intérieur, tout ce qui est écrit entre accolades { } est remplacé par sa valeur au moment de l’affichage.

Les accolades n’acceptent pas seulement des noms de variables : elles acceptent n’importe quelle expression, c’est-à-dire tout ce qui produit une valeur.

Avertissement

Sans le f, les accolades ne sont que des caractères ordinaires : print("{nom}") affiche {nom}. Une f-string convertit automatiquement les nombres en texte : elle rend str() inutile.

Question

Qu’affiche print(f"{3 * 4}") ?

2.3. Mettre en forme du texte

Une chaîne de caractères se délimite par des apostrophes '…', des guillemets doubles "…", ou trois guillemets """…""" pour un texte qui tient sur plusieurs lignes.

Pour placer le délimiteur à l’intérieur même de la chaîne, on le fait précéder d’une barre oblique inverse \ : on dit qu’on l’échappe.

D’autres combinaisons ne désignent pas des caractères visibles mais des actions de mise en page. On les appelle des séquences d’échappement.

Séquence

Effet

\n

retour à la ligne (newline)

\t

tabulation : aligne en colonnes espacées de 8 caractères

\" \'

un guillemet, une apostrophe

\\

une barre oblique inverse

La fonction len() renvoie la longueur d’une chaîne, c’est-à-dire son nombre de caractères. Combinée à l’opérateur *, qui répète une chaîne (§1.4), elle permet de souligner un titre exactement à sa largeur.

Question

Que vaut len("") ?

Exercice 3

Affichez le tableau suivant, en n’utilisant que deux appels à print(). Le soulignement doit être obtenu avec len(), pas compté à la main.

Résultats
---------
Ada     5.5
Bob     4.0
Solution
titre = "Résultats"
print(titre + "\n" + "-" * len(titre))
print("Ada\t5.5\nBob\t4.0")

Un seul print() peut produire plusieurs lignes, grâce à \n.

2.4. La fonction type()

type() renvoie le type d’une valeur ou d’une variable. Elle ne renvoie pas une chaîne, mais un objet qui décrit ce type : d’où l’affichage <class 'int'> plutôt que int.

type() accepte n’importe quelle expression : elle donne alors le type du résultat du calcul, pas celui des valeurs de départ.

Question

Quel est le type renvoyé par type(3 + 3) ?

Question

Quel est le type renvoyé par type(3 / 3) ?

Exercice 4

Sans exécuter le code, prédisez ce qu’affichent ces lignes, puis vérifiez.

print(type(13 // 3))
print(type(13 > 3))
print(type("False"))
print(type(1.0))
Solution

int — la division entière de deux entiers donne un entier.
bool — une comparaison donne toujours True ou False.
str — les guillemets en font une chaîne, même si elle contient le mot False.
float — le point décimal suffit, même suivi d’un zéro.

2.5. Les conversions

Les fonctions int(), float(), str() et bool() convertissent une valeur d’un type à un autre. Elles fabriquent une nouvelle valeur ; elles ne modifient pas la variable de départ.

Avertissement

La conversion d’un float vers un int ne garde que la partie entière : int(3.99) donne 3, et non 4. Ce n’est pas un arrondi. Par ailleurs, int() n’accepte une chaîne que si elle représente un entier : int("3.14") provoque une erreur.

La conversion vers bool suit une règle simple : seuls 0, 0.0 et la chaîne vide "" donnent False. Tout le reste donne True.

Ces conversions sont dites explicites : c’est le programme qui les demande. Entre deux nombres de types différents, Python en fait aussi tout seul, de manière implicite — mais jamais entre un nombre et un texte.

Question

Que vaut int(9.99) ?

Question

Que vaut bool("") ?

Exercice 5

Sans exécuter le code, prédisez le résultat de chaque expression, ainsi que son type.

int("100")
float("2")
str(True)
int(False)
bool("False")
Solution

100 (int) — 2.0 (float) — "True" (str) — 0 (int, car False vaut 0) — True (bool, car la chaîne n’est pas vide).

Exercice 6

Le code suivant contient une erreur. Trouvez-la et corrigez-la de deux manières différentes.

x = "3.14"
y = int(x) + 1
print(y)
Solution

int() n’accepte une chaîne que si elle représente un entier ; "3.14" n’en est pas un.

y = float(x) + 1        # 4.140000000000001 : on garde les décimales
y = int(float(x)) + 1   # 4 : on convertit d'abord en float, puis en int

2.6. La fonction input()

input() met le programme en pause, affiche un message d’invitation et attend que l’utilisateur tape quelque chose puis appuie sur Entrée. Elle renvoie ensuite ce qui a été tapé.

Le message d’invitation est facultatif : input() sans argument attend une saisie sans rien afficher. Une fois la saisie rangée dans une variable, elle s’utilise comme n’importe quelle autre valeur, aussi souvent qu’on veut — et elle peut être réaffectée (§1.2).

Attention : input() renvoie toujours une chaîne de caractères, même quand l’utilisateur tape des chiffres. type() permet de le vérifier.

Pour utiliser la saisie dans un calcul, il faut donc la convertir.

Ou plus directement, en imbriquant les deux appels :

Avertissement

input() renvoie toujours un str. Additionner deux saisies sans conversion concatène les chaînes au lieu de faire une somme. Utilisez int() pour un nombre entier, float() si des décimales sont possibles.

Exercice 7

Que se passe-t-il si on exécute ce code et qu’on tape 5 puis 3 ? Expliquez, puis corrigez.

a = input("Premier nombre : ")
b = input("Deuxième nombre : ")
print("Somme :", a + b)
Solution

Le programme affiche Somme : 53. a et b sont des chaînes, donc + les concatène au lieu de les additionner. Aucune erreur n’est signalée : le programme fait exactement ce qu’on lui a demandé, ce n’est simplement pas ce qu’on voulait.

a = int(input("Premier nombre : "))
b = int(input("Deuxième nombre : "))
print("Somme :", a + b)

Exercice 8

Demandez deux nombres à l’utilisateur et affichez leur somme, leur différence et leur produit, en utilisant des f-strings.

Solution
a = float(input("Premier nombre : "))
b = float(input("Deuxième nombre : "))
print(f"Somme : {a + b}")
print(f"Différence : {a - b}")
print(f"Produit : {a * b}")

Exercice 9

Créez un programme qui demande le prénom et l’âge de l’utilisateur, et affiche : Bonjour Ada, vous avez 17 ans et dans 10 ans vous en aurez 27.

Solution
prenom = input("Votre prénom : ")
age = int(input("Votre âge : "))
print(f"Bonjour {prenom}, vous avez {age} ans et dans 10 ans vous en aurez {age + 10}.")

La conversion en int est indispensable : sans elle, age + 10 échoue.

2.7. Calculer avec des saisies

Tous les opérateurs du chapitre précédent (§1.4) s’appliquent aux valeurs saisies, une fois celles-ci converties. Deux d’entre eux méritent un rappel.

L’opérateur de puissance est **. Ne le confondez pas avec ^, utilisé dans d’autres logiciels comme Excel : en Python, ^ existe aussi, mais il fait tout autre chose.

Une puissance 0.5 donne la racine carrée. Cela suffit pour calculer une diagonale avec le théorème de Pythagore. La fonction round() permet d’arrondir le résultat au nombre de décimales voulu.

Quand les valeurs sont entières, le quotient de la division entière // et le reste % (le modulo) permettent de décomposer une quantité.

Question

En informatique, int est l’abréviation pour

Exercice 10

Le programme ci-dessous demande le rayon d’un cercle et affiche son diamètre et sa circonférence. Complétez-le pour qu’il affiche aussi la surface, donnée par S = πr².

Solution
print(f"Surface      : {round(PI * rayon ** 2, 2)}")

Les parenthèses sont inutiles : ** est prioritaire sur *, donc PI * rayon ** 2 élève d’abord le rayon au carré.

Exercice 11

Demandez trois notes à l’utilisateur, calculez leur moyenne et affichez-la arrondie à une décimale.

Solution
note1 = float(input("Première note : "))
note2 = float(input("Deuxième note : "))
note3 = float(input("Troisième note : "))

moyenne = (note1 + note2 + note3) / 3
print(f"Moyenne : {round(moyenne, 1)}")

Les parenthèses autour de la somme sont indispensables : sans elles, seule note3 serait divisée par 3.

2.8. Erreurs fréquentes

Un message d’erreur n’est pas une punition, c’est un diagnostic. Il s’affiche dans la console et se lit par la fin : la dernière ligne donne le type de l’erreur et la phrase qui l’explique ; les lignes au-dessus indiquent elle s’est produite.

Traceback (most recent call last):
  File "code.py", line 2, in <module>
    print("Vous avez " + age + " ans")
TypeError: can only concatenate str (not "int") to str

Ici : ligne 2, une TypeError, et l’explication « je ne peux concaténer à une chaîne qu’une autre chaîne, pas un entier ».

Les messages sont en anglais, mais toujours les mêmes mots. Une fois ce petit vocabulaire connu, ils deviennent lisibles.

Mot anglais

Ce que ça veut dire

operand

opérande : une des valeurs sur lesquelles un opérateur travaille

unsupported

non pris en charge, impossible

concatenate

concaténer, coller bout à bout

literal

littéral : une valeur écrite telle quelle dans le code

invalid

non valable

is not defined

n’a jamais reçu de valeur

was never closed

n’a jamais été fermée (une parenthèse, un guillemet)

perhaps you forgot…

« vous avez peut-être oublié… » : une suggestion de Python, souvent juste

Cinq types d’erreur couvrent presque tout ce que vous rencontrerez cette année.

Type

Sens

Message typique

SyntaxError

Python n’arrive pas à lire le code

'(' was never closed

NameError

un nom est utilisé sans avoir reçu de valeur

name 'z' is not defined

TypeError

un opérateur reçoit des opérandes de types incompatibles

can only concatenate str (not "int") to str

ValueError

le type est bon, mais la valeur est inexploitable

invalid literal for int() with base 10

ZeroDivisionError

division par zéro

division by zero

Note

Le symbole + fait deux choses différentes selon le type de ses opérandes : entre deux nombres, c’est une addition ; entre deux chaînes, c’est une concaténation (§1.4). Entre un nombre et une chaîne, Python refuse de choisir — il ne sait pas si vous vouliez 5 + 5 ou "5" + "5" — et signale une TypeError. À vous de trancher, en convertissant : int(a) + 5 pour additionner, a + str(5) pour concaténer. Une f-string évite la question, puisqu’elle convertit toute seule.

Exercice 12

Trouvez et corrigez l’erreur.

age = input("Age : ")
print("Dans 5 ans :", age + 5)
Solution

TypeError: can only concatenate str (not "int") to str

input() a renvoyé "17", une chaîne. Le + se retrouve entre une chaîne et l’entier 5 : il ne peut ni additionner ni concaténer.

age = int(input("Age : "))
print("Dans 5 ans :", age + 5)

Remarquez que la virgule, elle, n’a jamais posé problème : print() accepte des arguments de n’importe quel type et les convertit lui-même pour l’affichage. Seul le + est exigeant.

Exercice 13

Trouvez et corrigez l’erreur.

x = int("trois")
Solution

ValueError: invalid literal for int() with base 10: 'trois'

Ce n’est pas une TypeError : int() attend bien une chaîne, et elle en reçoit une. Le problème est son contenu : int() lit des chiffres, pas des mots. Écrivez x = int("3"), ou simplement x = 3.

C’est exactement l’erreur qui apparaît quand un utilisateur tape « trois » au lieu de « 3 » dans un input().

Exercice 14

Corrigez les deux erreurs.

print("Résultat :"  2 + 3)
print(type(42)
Solution

Ligne 1 : SyntaxError: invalid syntax. Perhaps you forgot a comma? — il manque la virgule entre les deux arguments.
Ligne 2 : SyntaxError: '(' was never closed — la parenthèse de print n’est pas fermée.

print("Résultat :", 2 + 3)
print(type(42))

Une SyntaxError empêche Python de lire le fichier : rien ne s’exécute, pas même les lignes correctes. Et comme il s’arrête à la première, il faut parfois corriger et relancer plusieurs fois de suite.

2.9. Exercices

Ces trois programmes réinvestissent tout le chapitre. Écrivez-les dans un éditeur externe (Thonny), puis déposez vos fichiers sur Moodle.

Exercice 15 — Chatbot

Créez un programme qui vous pose l’une après l’autre ces six questions :

  • votre nom,

  • votre âge,

  • votre couleur préférée,

  • votre groupe de musique préféré,

  • votre classe,

  • votre meilleur ami.

À chaque fois, le chatbot mémorise votre réponse dans une variable et la réutilise dans la question suivante, de façon à donner l’illusion d’une conversation. Terminez par une phrase de synthèse qui reprend au moins trois des réponses.

Exercice 16 — Rectangle et sphère

Écrivez deux programmes.

Le premier demande les côtés a et b d’un rectangle et affiche son périmètre p = 2(a+b), sa surface S = ab et sa diagonale d = √(a²+b²).

Le second demande le rayon r d’une sphère et affiche son diamètre d = 2r, sa surface A = 4πr² et son volume V = 4πr³/3.

Tous les résultats sont arrondis à deux décimales et affichés avec des f-strings.

Exercice 17 — Mini-calculatrice

Demandez deux nombres à l’utilisateur, convertissez-les en float, puis affichez sur sept lignes : la somme, la différence, le produit, le quotient arrondi à deux décimales, la puissance, le quotient de la division entière et le reste.

Alignez les résultats en colonnes avec \t.

2.10. Résumé

  • print() affiche ses arguments séparés par une espace ; sep et end modifient ce comportement,

  • la virgule sépare et ajoute une espace, le + concatène et n’ajoute rien,

  • une f-string f"…{expression}…" insère la valeur d’une expression dans un texte, et convertit toute seule,

  • \n, \t, \" et \\ sont des séquences d’échappement ; len() renvoie la longueur d’une chaîne,

  • type() renvoie le type d’une valeur ou du résultat d’une expression,

  • int(), float(), str() et bool() produisent une nouvelle valeur d’un autre type ; seuls 0, 0.0 et "" deviennent False,

  • input() renvoie toujours un str : il faut convertir avant de calculer,

  • un message d’erreur se lit par la fin : d’abord son type, puis la ligne concernée.