les types de base pour les nombres sont:int, float, complex, bool
les entiers¶
les
intont une précision illimitéePython peut calculer nativement
92857234957203457234572203957 * 94857234957203945702934752934788081805538117400166084413860573792922096998567618527026079ceux 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 / 51.6# division entière (quotient)
8 // 51# reste div. entière
8 % 53nombres : opérateurs¶
# bcp d'autres opérations disponibles
# et notamment:
2 ** 32 # puissance4294967296# tous les opérateurs peuvent être utilisés
# pour faire un effet de bord comme ceci
x = 10
x += 2
x12conversions¶
int(234.5) # cast float ➔ int234nombres complexes¶
# pour écrire un complexe
# il faut utiliser j et non pas i
1j * 1j(-1+0j)a = 3 + 4j
# partie réelle
a.real3.0# partie imaginaire
a.imag4.0le 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.tau6.283185307179586math.sin(math.pi)1.2246467991473532e-16booléens¶
# il y a aussi le type booléen
10 <= 12True# avec comme valeurs True et False
10 >= 12False# True c'est presque exactement 1
True == 1True# et False presque exactement 0
False == 0True# mais pas tout à fait quand même
type(True)bool# alors que
type(1)intopé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 <= 12True# pour tester l'égalité (on en a déjà parlé)
x == 10True# pour tester l'inégalité
x != 10Falseopérateurs is et in¶
ispermet de savoir si deux objets sont le même objet - c’est-à-dire correspondent à la même adresse en mémoireinpermet de savoir si un objet fait partie d’un autre objet
avec ces deux opérateurs, le not permet des syntaxes plutôt lisibles
x is not yx not in y
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]du coup on peut écrire des choses comme
a is bTrue# plus lisible que not (a is c)
a is not cTruea == cTruea != cFalseou encore comme
1 in aTrue# plus lisible que not (1 in a)
1 not in aFalsetest 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
les valeurs “fausses” correspondent à un nombre nul, ou à un container vide (liste, chaine, ..)
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(" ")Truel’encodage des flottants¶
représentés en machine comme des fractions en base 2
le plus souvent une approximation
quand pas une fraction binaire exacte
pas une spécificité de Python
IEE-754: WikiPedia - interactif 64bits
# flottant = imprécision structurelle !
0.1 + 0.20.30000000000000004float = 64 bits¶
sur une machine 64 bits, un float est encodé en double précision, i.e. avec:
1 bit de signe
11 bits pour représenter l’exposant
52 bits pour représenter la mantisse
# pour obtenir des infos sur la précision des flottants
import sys
sys.float_infosys.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)sur 64 bits, l’erreur relative est de l’ordre de 10-15 / 10-16
pas spécifique à Python¶
pas un problème spécifique à Python
si vous ne faites pas de l’analyse numérique
ce problème n’a probablement aucun impact pour vous
sinon, vous êtes déjà au courant
et vous savez notamment qu’il ne faut pas tester avec une égalité stricte
mais plutôt avec un presque égal : utiliser
math.isclose
0.3 == 0.1 + 0.2Falseimport math
math.isclose(0.3, 0.1+0.2)Truecontournements¶
pour contourner¶
le module
decimal, pour travailler sur des nombres décimauxavec plus de précision et de contrôle qu’avec le type float
le module
fractionspermet de travailler sur des rationnels
exemples - decimal¶
from decimal import Decimal
x = Decimal('0.1') + Decimal('0.2')x == Decimal('0.3')Trueexemples - fractions¶
from fractions import Fraction
x = Fraction(1, 10) + Fraction(2, 10)
xFraction(3, 10)x == Fraction(3, 10)Truex == 0.3Falseplus exotique¶
entrer un entier en hexa, binaire, octal¶
pour créer des entiers sous forme littérale, dans d’autres bases
# hexadécimal
0xff255# binaire
0b11111111255# octal
0o377255afficher 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'remarquez que nous n’avons pas défini les variables hex, bin et oct
ce sont des fonctions prédéfinies, connues de Python dès le lancement
le terme anglais pour désigner de telles fonctions est builtin
opérations bitwise¶
y = 4
y | 2 # bitwise OR de 0100 (4) et 0010 (2)6y & 2 # bitwise AND de 0100 (4) et 0010 (2)0y & 15 # bitwise AND de 0100 (4) et 1111 (15)4~ y # bitwise NOT - en pratique ~x == -(x+1)-5rarement utile d’utiliser les opérations bitwise en Python usuel
mais par contre très utile avec numpy et pandas
pour manipuler notamment les masques
décalages¶
x = 3
y = x << 10 # décalage à gauche
y30722**11 + 2**103072x # l'argument n'est pas modifié3y >> 3 # décalage à droite3842**8 + 2**7384