Les types numériques

Le typage des objets.

Dans un langage de programmation, on manipule des objets de diverses "natures". Il est important de connaître cette nature (on parlera du type de l'objet) pour savoir quelles opérations sont possibles sur cet objet.

Par exemple, on se doute bien que l'on ne peut pas traiter de la même façon un nombre et une chaîne de caractères. Qu'on ne peut pas ajouter un nombre et une chaîne de caractères.

Exemple : peut-on ajouter le nombre 2 et le mot 'coucou' ? Non, bien sûr.


2+'coucou'
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Python signale ainsi qu'il ne peut pas ajouter un entier (type int) et une chaîne de caractères (type str).

Le typage des nombres.

Nous manipulerons essentiellement deux types de nombres : les nombres de type int et les nombres de type float.

Le type int correspond aux entiers. Le type float correspond dans une première approche aux nombres réels.

Il est important de bien distinguer en programmation ces deux types de nombres, car ils ne sont pas codés en machine de la même façon et les opérations de base (addition, multiplication...) portant sur les int et sur les float ne sont pas programmées de la même façon.

Exemple : on aimerait connaître le nombre exact de mots qu'il est possible de coder sur 64 bits. Peut-on pour cela faire une opération avec le type int en python ? avec le type float ?

Nous expliquerons plus tard dans le cours que le nombre cherché est 264. En python, si nous tapons 2**64, nous calculons 264 avec les opérations portant sur des nombres de type int, tandis que si nous entrons 2.0**64, les opérations se feront avec le type float (2.0 désigne un float, tandis que 2 est un int).


print(type(2))
print(type(2.0))

Réponse de python :

<class 'int'>
<class 'float'>

Pour le calcul de 264 :


print(2**64)
print(2.0**64)

Réponse de python :

18446744073709551616
1.8446744073709552e+19

Le résultat est exact avec un calcul utilisant le type int. Il ne l'est plus avec un calcul utilisant le type float.

Une réflexion sur le type à utiliser et sur la réponse apportée sera donc nécessaire dans la plupart des cas. Pour vous convaincre de la nécessité de cette réflexion, consulter cette page.

Métissage ?

Peut-on mélanger deux types distincts dans une même opération?

Nous avons déjà vu plus haut qu'on ne saurait ajouter un nombre et une chaîne de caractères. Mais peut-on ajouter un int et un float?


a = 2
b = 3.0
print('Le type de a : ', type(a)) 
print( 'Le type de b : ', type(b))

c = a+b
print('Valeur de c :', c)
print('Le type de c : ', type(c) )

Réponse de python :

Le type de a :   class 'int' 
Le type de b :   class 'float' 
Valeur de c : 5.0
Le type de c :   class 'float' 

L'opération est donc acceptée et le résultat de l'addition sera un float : à chaque fois qu'une opération fait intervenir un int et un float, python modifie le nombre int en un float (de valeur la plus proche possible parmi les float) puis effectue une opération sur les float.

De façon générale, on évitera autant que possible les mélanges de types dans une même opération. Lorsqu'il sera tout de même utile de faire un tel mélange, il faudra prendre le temps de prévoir la nature du résultat et les conséquences éventuelles.

Opérations et comparaisons sur les nombres

Tableau des opérations et comparaisons possibles entre deux "int".

a et b sont de type int

opérations et comparaisons sur le type int
a+b Résultat de type int, somme de a et b.
a-b Résultat de type int, différence de a et b.
a*b Résultat de type int, produit de a et b.
a/b Résultat de type float, approximation de a/b.
a//b Résultat de type int, quotient de la division euclidienne de a par b.
a%b Résultat de type int, reste de la division euclidienne de a par b.
a**b ou pow(a,b) Résultat de type int, ab.
a < b Résultat de type bool : True si a < b, False sinon.
a > b Résultat de type bool : True si a > b, False sinon.
a >= b Résultat de type bool : True si a ≥ b, False sinon.
a <= b Résultat de type bool : True si a ≤ b, False sinon.
a == b Résultat de type bool : True si a = b, False sinon.
a != b Résultat de type bool : True si a ≠ b, False sinon.

Tableau des opérations et comparaisons possibles entre deux "float".

a et b sont de type float

Opérations et comparaisons sur le type float
a+b Résultat de type float, somme de a et b.
a-b Résultat de type float, différence de a et b.
a*b Résultat de type float, produit de a et b.
a/b Résultat de type float, approximation de a/b.
a**b ou pow(a,b) Résultat de type float, ab.
a < b Résultat de type bool : True si a < b, False sinon.
a > b Résultat de type bool : True si a > b, False sinon.
a >= b Résultat de type bool : True si a ≥ b, False sinon.
a <= b Résultat de type bool : True si a ≤ b, False sinon.
a == b Résultat de type bool : True si a = b, False sinon.
a != b Résultat de type bool : True si a ≠ b, False sinon.

"Augmented assignment operators"

a et b désignant deux variables de type numérique, une instruction telle que a = a+b est souvent utile en programmation. En python, cette instruction peut aussi se réécrire sous la forme a += b.

Un tel 'raccourci' existe aussi avec les autres opérations sur les nombres (*, /, -, **, %).

Le type bool

Le type bool (abréviation de booléen) cité ci-dessus comme type des expressions de comparaison est un type pour lequel il n'existe que deux valeurs : True (vrai) et False (faux).


print(2 == 3)
print(2 == 2)
print(2 == 2.0)
print(2 < 2.0)

Réponse de python3 :

False
True
True
False

On remarque que l'on a pu comparer un int et un float (certains langages de programmation refuseraient cela). Pour effectuer ces comparaisons, python transforme (avant d'effectuer la comparaison) le nombre de type int en un nombre de type float (le nombre 2 devient donc 2.0 et la comparaison n'est effectuée qu'ensuite).