Les entiers en Python ne sont pas des entiers "machine" sur 32 ou 64 bits, ce sont des entiers mathématiques "non bornés". On peut cependant demander d'afficher un entier en binaire ou en hexadécimal, et saisir un entier en binaire ou en hexadécimal.
hex(42)
bin(42)
0x11
0b11
Il est intéressant d'expliquer comment les opérations de quotient et reste permettent de retrouver l'écriture en base b d'un nombre, en partant de la base 10. Par exemple, si je veux afficher un nombre en base 3, je peux utiliser la méthode suivante.
def base3(n):
if n < 3 :
print(n, end='')
else :
base3(n // 3)
print(n % 3, end='')
base3(42)
On trouvera quelques éléments de réponse dans le manuel ISN https://wiki.inria.fr/wikis/sciencinfolycee/images/a/a7/Informatique_et_Sciences_du_Numérique_-_Spécialité_ISN_en_Terminale_S._version_Python.pdf
Les calculs avec des flottants sont toujours inexacts, il ne faut donc pas s'attendre à ce qu'un test d'égalité entre deux flottants soit exact
a = 10.0 ** 100
b = a + 10.0 ** -100
a == b
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 0.7
0.1 + 0.1 + 0.1 == 0.3
from math import sqrt
sqrt(2) ** 2
Signalons enfin les flottants $-\infty$ et $+\infty$, bien pratiques dans certaines situations, par exemple comme élément neutre de min et max.
import math
def minimum(L) :
"""renvoie le minimum de la liste L, plus l'infini si L=[]"""
res = math.inf
for x in L :
if x < res :
res = x
return res
minimum([1,2,3])
minimum([])
On peut signaler que Python, sous l'influence du langage C, convertit à la volée les entiers en booléens et vice-versa
0 == False
1 == True
1 + True
if 1 : print('1->True')
Les opérateurs booléens paresseux sont bien utiles pour éviter de provoquer des erreurs dans des tests
x = 0
if x != 0 and 1 / x == 3 : print('x vaut 1/3')
if 1 / x == 3 and x != 0 : print('x vaut 1/3')
On peut retrouver le point de code unicode d'un caractère ou obtenir le caractère correspondant à un point de code donné avec les fonctions chr et ord
ord('a'),ord('b'),ord('é'), ord('€')
chr(32), chr(64), chr(257), chr(49829)
On peut aussi voir les différents encodages possibles d'une chaîne de caractères comme suite d'octets, et les erreurs de décodage qui peuvent en résulter.
s1 = 'une chaine sans accent facile a representer en ASCII'
s1.encode('ASCII')
s2 = "une chaîne qu'on peut représenter en Latin 1 ou UTF 8, mais pas en ASCII à cause des accents"
s2.encode('latin-1')
s2.encode('utf-8')
s2.encode('ASCII')
s3 = "1€, c'est déjà trop cher pour latin 1"
s3.encode('utf-8')
s3.encode('latin-1')
"ça c'est une erreur de décodage".encode('utf-8').decode('latin-1')