PyDA Course
📖 Leçon 3 Débutant ⏱ 15 minutes ⚡ +10 XP ColabKagglenbviewerBinderDeepnoteGitHub types · int · float · str · bool · typage-dynamique

Types de données

Identifiez les types fondamentaux de Python, int, float, str, bool, et comprenez ce que chacun représente.

🎯 Ce que vous apprendrez :
  • Identifier les valeurs int, float, str et bool
  • Utiliser type() pour vérifier le type d'une valeur
  • Comprendre le typage dynamique en Python
  • Reconnaître les valeurs vraies et fausses

L’ensemble auquel appartient un nombre

Répondez à deux questions : vous tenez 77 pommes et vous en coupez une en deux. Tenez-vous maintenant 7+127 + \frac{1}{2} pommes au même sens que vous teniez 77 ? Une demi-pomme n’est pas un nombre entier de pommes, le 77 vit dans Z\mathbb{Z}, et le 7127\frac{1}{2} vit dans Q\mathbb{Q}.

Un mathématicien répond en demandant à quel ensemble une valeur appartient. La même distinction poursuit chaque programme : la machine stocke 4242 différemment de 42.542.5, et 4242 différemment de "42". Le mot que Python emploie pour « dans quel ensemble vit cette valeur » est type.

Alors : combien d’ensembles vaut-il la peine de distinguer ? Quatre, pour commencer.

TypeCe que c’est, mathématiquementExemples
intZ\mathbb{Z}, les entiers, stockés exactement42, -7
floatR\mathbb{R}, approché avec un nombre fixe de chiffres binaires3.14, -0.5
strune séquence finie de caractères"hello"
bool{True,False}\{\text{True}, \text{False}\}True, False

La ligne float contient une réserve délibérée, approché. Un entier est stocké exactement, à chaque fois. Un nombre réel, presque jamais : comment stockeriez-vous 1/3=0.3331/3 = 0.333\ldots avec un nombre fini de chiffres ? Impossible, donc Python conserve une approximation finie, et les comptes divergent sur les derniers chiffres. Ce seul fait explique une surprise célèbre que vous allez bientôt rencontrer.

Demander l’ensemble d’appartenance

Devant une valeur, vous pouvez demander son type directement :

python
type(42)      # <class 'int'>
type(3.14)    # <class 'float'>
type("hi")    # <class 'str'>
type(True)    # <class 'bool'>

Deux remarques de notation. D’abord, type(...) est une fonction, vous lui confiez une valeur et elle vous rend l’objet de type auquel cette valeur appartient. Ensuite, la réponse s’affiche <class 'int'> ; le mot class est le terme de Python pour type, et le mot entre guillemets est le nom de l’ensemble. Lisez <class 'float'> comme « appartient à l’ensemble float ».

Un nom ne s’engage pas envers un ensemble

C’est ici que les dividendes commencent. Dans un langage à typage statique, vous déclareriez à l’avance : x est un entier. Python, lui, laisse un nom pointer où il veut :

python
x = 5
print(type(x))    # <class 'int'>
x = "hello"
print(type(x))    # <class 'str'>

Rediriger un nom vers un autre ensemble est légal, si bien que le type de x ne se lit dans aucune déclaration, seulement en demandant envers quoi il pointe actuellement. C’est le typage dynamique. C’est commode, et c’est aussi la raison pour laquelle votre programme peut silencieusement confier une chaîne à une fonction qui attend des nombres : rien ne l’en empêche jusqu’à ce que l’opération elle-même échoue.

Quelles valeurs se comportent comme True ?

Toute valeur est vraie ou fausse (truthy / falsy), ou bien elle se comporte comme True dans une condition, ou bien comme False. La règle est compacte, et il vaut la peine de la vérifier :

  • Falsy : le 00, le 0.00.0, la chaîne vide "" et None
  • Truthy : tout le reste
python
bool(0)         # False
bool(1)         # True
bool(-1)        # True   — tout nombre non nul est truthy
bool("")        # False
bool("hello")   # True   — toute chaîne non vide est truthy

Observez ce qui est dans la liste et ce qui en est exclu. -1 est True ; 0 ne l’est pas. La chaîne "0" est True, elle est non vide, et pour les chaînes le critère est la vacuité, pas la valeur de leur contenu. Cette règle se rembourse dès votre premier if : if score: signifie si score n’est pas nul.

Un exemple travaillé : auditer une expression

Les ensembles paient dès qu’une expression les mélange. Lisez le reçu ligne par ligne et demandez l’ensemble de chaque résultat :

python
unit_price = 4.75
quantity = 4
bill = unit_price * quantity     # float : le float absorbe l'int
type(bill)                       # <class 'float'>
bool(bill)                       # True — tout non-nul est truthy

type(10 / 2)                     # <class 'float'> — la division réelle ne rend jamais int

Lisez bill comme le produit de deux ensembles distincts. Les ensembles ne se « mélangent » pas, le float l’emporte, car la proportion n’est un nombre entier d’aucune échelle et l’ensemble le plus large doit la contenir. L’habitude d’audit consiste à demander directement à l’ensemble : type(...) confirme ce que vous soupçonniez au lieu de parier sur la chance.

Pièges courants

  • 4 / 2 vaut 2.0, pas 2. La division réelle (/) renvoie toujours un float en Python 3, même quand la division est exacte. Pour un résultat entier, demandez la division entière : 4 // 22.
  • True + True vaut 2. bool est une sous-classe de int en Python : True se comporte comme 11 et False comme 00 en arithmétique. Les deux ensembles se recouvrent, mais type(True) répond toujours bool.
  • type() indique le type concret. type(True) est bool, pas int, si à l’aise que True soit dans les sommes.
  • type() décrit le résultat, pas les opérandes. type(2 * 3.0) est float, un int multiplié par un float vit dans l’ensemble float. Ne le prédisez pas à partir des pièces ; demandez à la réponse.

🧩 Défis

🧩 Défi, réfléchissez d'abord, puis révélez

Prédisez type(7 / 2), puis vérifiez.

💡 Réponse : type(7 / 2) est float, la division réelle (/) produit toujours un float en Python 3, même quand les deux opérandes sont des entiers et que le quotient est un nombre entier.

🧩 Défi, réfléchissez d'abord, puis révélez

Prédisez bool(0), bool(0.0), bool("") et bool("0"). Lesquelles sont vraies, lesquelles fausses ?

💡 Réponse : bool(0) → False, bool(0.0) → False, bool("") → False (chaîne vide), bool("0") → True (chaîne non vide, même si son contenu est le caractère « 0 »).

🧩 Défi, réfléchissez d'abord, puis révélez

En Python, 0.1 + 0.2 n’est pas égal à 0.3. Voici le même problème sur papier : que se passe-t-il quand vous représentez 1/3=0.3331/3 = 0.333\ldots avec deux décimales ? Expliquez maintenant pourquoi un float, qui approche R\mathbb{R} avec un nombre fini de chiffres binaires, ne peut pas représenter 0.10.1 exactement.

💡 Réponse : Avec deux décimales, le $1/3$ doit devenir $0.33$, une perte déjà actée avant tout calcul. De même, $0.1$ n'a pas de forme binaire exacte ; le float stocke une valeur proche, et additionner deux de ces valeurs traîne de minuscules erreurs : 0.1 + 0.2 donne 0.30000000000000004, pas 0.3. Précision finie, pas un bug de Python.

🤔 Questions socratiques

  • Si bool(-1) est True, quelle règle unique explique que 1-1 soit vrai mais 00 faux ? La règle se généralise-t-elle des nombres aux chaînes ?
  • Python possède isinstance(42, int) qui renvoie True. isinstance serait-il plus fiable que type(x) == int pour vérifier des types ? Pourquoi ?
  • Pourquoi Python écrit-il True et False en majuscules plutôt que true et false ? Quels autres mots en majuscules Python réserve-t-il ?

✅ Vérification rapide

1. Quel est le type de 3.14 ?

2. Quel est le résultat de True + True ?

3. Laquelle de ces valeurs est fausse (falsy) ?

typesintfloatstrbooltypage-dynamique