Skip to article frontmatterSkip to article content

les types de base pour les nombres sont:int, float, complex, bool

les entiers

92857234957203457234572203957 * 948572349572039457029347529347
88081805538117400166084413860573792922096998567618527026079

ceux qui ont eu à faire ça en C apprécieront

nombres : division

les opérations usuelles ne posent pas de souci, c’est bien sûr + - * avec ( et )
mais la division mérite quelques mots:

# division exacte/flottante
8 / 5
1.6
# division entière (quotient)
8 // 5
1
# reste div. entière
8 % 5
3

nombres : opérateurs

# bcp d'autres opérations disponibles
# et notamment:

2 ** 32         # puissance
4294967296
# tous les opérateurs peuvent être utilisés
# pour faire un effet de bord comme ceci

x = 10
x += 2
x
12

conversions

int(234.5)      # cast float ➔ int
234

nombres complexes

# pour écrire un complexe
# il faut utiliser j et non pas i

1j * 1j
(-1+0j)
a = 3 + 4j

# partie réelle
a.real
3.0
# partie imaginaire
a.imag
4.0

le module math

# pour anticiper un peu
# sur les listes...
# ici on veut les 6 derniers
# symboles dans le module math

import math

dir(math)[-6:]
['sumprod', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
math.tau
6.283185307179586
math.sin(math.pi)
1.2246467991473532e-16

booléens

# il y a aussi le type booléen

10 <= 12
True
# avec comme valeurs True et False

10 >= 12
False
# True c'est presque exactement 1

True == 1
True
# et False presque exactement 0

False == 0
True
# mais pas tout à fait quand même

type(True)
bool
# alors que

type(1)
int

opérateurs sur les booléens

# tout simplement avec les mots-clé and, or, et not

x = 10

(8 <= x) and (x <= 12)
True
# cela dit dans ce cas-là on peut écrire
# de manière plus simple

8 <= x <= 12
True
# pour tester l'égalité (on en a déjà parlé)

x == 10
True
# pour tester l'inégalité

x != 10
False

opérateurs is et in

avec ces deux opérateurs, le not permet des syntaxes plutôt lisibles

voyons cela sur un exemple vous vous souvenez de l’exemple avec les deux objets liste ?

# ici on crée deux objets liste distincts

# le premier (avec deux références)
a = b = [1, 2]
# le deuxième
c = [1, 2]
%load_ext ipythontutor
%%ipythontutor curInstr=2

a = b = [1, 2]
c = [1, 2]
Loading...

du coup on peut écrire des choses comme

a is b
True
# plus lisible que   not (a is c)
a is not c
True
a == c
True
a != c
False

ou encore comme

1 in a
True
# plus lisible que   not (1 in a)
1 not in a
False

test sur un booléen

# on peut - bien sûr - faire un `if`
# (ou un while) sur un booléen
a = 3
b = 4

type(a == b)
bool
# ici le sujet du if est bien booléen

if a == b:
    print("pareils")
else:
    print("différents")
différents

test sur un non-booléen

# mais aussi : avec n'importe quoi d'autre
# ici le sujet du if est un nombre

if a:
    print("pas faux")
pas faux
# en fait équivalent à ceci:

if bool(a):
    print("pas faux")
pas faux

tests sur une valeur non booléenne & conversion

en fait ce qui est à l’oeuvre ici, c’est la mécanique générale pour convertir entre types de données:

# si on appelle int() on convertit en entier

int(3.4)
3
# eh bien de la même manière
# si on appelle bool() on convertit en booléen

bool(3.4)
True
# un nombre nul est "faux"

bool(0)
False
# une chaine vide est "fausse"

bool("")
False
# un nombre non nul est "vrai"
bool(1)
True
# une chaine non vide - même avec 
# un seul espace - est "vraie"
bool(" ")
True

l’encodage des flottants

# flottant = imprécision structurelle !

0.1 + 0.2
0.30000000000000004

float = 64 bits

# pour obtenir des infos sur la précision des flottants

import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

pas spécifique à Python

0.3 == 0.1 + 0.2
False
import math

math.isclose(0.3, 0.1+0.2)
True

contournements

pour contourner

exemples - decimal

from decimal import Decimal
x = Decimal('0.1') + Decimal('0.2')
x == Decimal('0.3')
True

exemples - fractions

from fractions import Fraction
x = Fraction(1, 10) + Fraction(2, 10)
x
Fraction(3, 10)
x == Fraction(3, 10)
True
x == 0.3
False

plus exotique

entrer un entier en hexa, binaire, octal

pour créer des entiers sous forme littérale, dans d’autres bases

# hexadécimal
0xff
255
# binaire
0b11111111
255
# octal
0o377
255

afficher un entier sous forme hexa, binaire, octale

dans l’autre sens, trouver la représentation en base n
sous forme de chaine de caractères du coup

hex(255)    # traduire en hexa (-> str)`
'0xff'
bin(255)    # traduire en binaire (-> str)
'0b11111111'
oct(255)    # traduire en octal (-> str)
'0o377'

opérations bitwise

y = 4
y | 2      # bitwise OR de 0100 (4) et 0010 (2)
6
y & 2      # bitwise AND de 0100 (4) et 0010 (2)
0
y & 15     # bitwise AND de 0100 (4) et 1111 (15)
4
~ y        # bitwise NOT - en pratique ~x == -(x+1)
-5

décalages

x = 3
y = x << 10 # décalage à gauche
y
3072
2**11 + 2**10
3072
x          # l'argument n'est pas modifié
3
y >> 3     # décalage à droite
384
2**8 + 2**7
384