On sait que le code “Ascii” (American Standard Code for Information Interchange) permet de représenter, dans un registre qui va de 0 à 127, les caractères de l’alphabet anglais (ainsi que quelques caractères non imprimables) et qu’il a été complété (pour un registre de codes allant de 128 à 255) dans différents formats pour les caractères accentués (notamment le code “ISO 8859-1”, ou encore “Latin-1”, utilisé pour les langues d’Europe de l’ouest).
Le code “Ascii étendu” identifie donc caractères et octets (valeurs binaires sur 8 bits, de 0 à {2^8-1} = 255).
Pour coder tous ( ?) les caractères et symboles de tous ( ?) les alphabets (par exemple les caractères des langues d’Asie), il a fallu mettre au point une norme mondiale, dite “Unicode”.
Les chaînes de caractères Python sont des séquences non mutables de caractères, et elle utilisent le format Unicode.
Cette universalité se paie du prix qui est la taille suivant laquelle chaque caractère est codé. Mais Python est suffisamment optimisé pour qu’on n’ait pas à s’en soucier. On remarque simplement que la taille d’une chaîne de caractères peut dépendre de la nature de ceux-ci, comme le montrent les exemples suivants.
|
1 2 3 4 5 6 7 |
>>> from sys import getsizeof # la fonction getsizeof permet de calculer une 'empreinte mémoire' >>> getsizeof("abcdef") # six caractères non accentués 55 >>> getsizeof("àbcdef") # on a remplacé la lettre 'a' par la lettre accentuée 'à' 79 >>> getsizeof("αβγδεθ") # six caractères de l'alphabet grec 86 |
Les bytes ressemblent aux chaînes de caractères : ils sont des séquences non mutables d’entiers compris entre 0 et 255 (c’est-à-dire codés sur un octet, “byte” en anglais). On peut tout à fait les considérer comme des chaînes de caractères, à condition de se limiter aux caractères du code ascii standard (pas de caractère accentué).
On peut les créer avec le préfixe b (suivi d’une chaîne alphabétique) ou par la fonction bytes (appliquée à un “iterate”).
|
1 2 3 4 5 6 7 8 9 |
>>> B = b'xyztu'; C = bytes(range(65,91)) # les deux objets B et C sont de type bytes >>> (B, C) # voila comment Python les affiche (b'xyztu', b'ABCDEFGHIJKLMNOPQRSTUVWXYZ') >>> B[0], list(B), B[::-1], C[0::5] # on peut y accéder par index ou par coupe (120, [120, 121, 122, 116, 117], b'utzyx', b'AFKPUZ') >>> D = bytes(range(0,20)); D # le bytes des entiers de 0 à 19 (affichés en hexa) b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13' >>> list(D) # on convertit ce bytes en liste [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] |
On peut appliquer aux “bytes” les fonctions communes sur les séquences non mutables. Comme ils s’apparentent étroitement aux chaînes de caractères, ils possèdent également la plupart des méthodes de la classe string.
Les objets de type bytearray sont des tableaux mutables d’entiers compris entre 0 et 255.
On peut appliquer aux objets de type bytearray les fonctions communes sur les séquences non mutables, mais également les méthodes spécifiques aux séquences mutables (c’est-à-dire les méthodes applicables aux listes). Comme ils s’apparentent étroitement aux chaînes de caractères, ils possèdent également la plupart des méthodes de la classe string.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> B = bytearray(10); B # un "bytearray" de taille 10, dont tous les élts sont nuls bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> for k in range(0,9,2): B[k]=65+k # dans cette boucle, on modifie certains éléments de B >>> B # affiche le nouveau contenu de B bytearray(b'A\x00C\x00E\x00G\x00I\x00') >>> list(B) # convertit ce contenu en une liste [65, 0, 67, 0, 69, 0, 71, 0, 73, 0] >>> B.reverse() # l'objet B, mutable, possède la méthode reverse >>> list(B) # on le vérifie en convertissant B en liste [0, 73, 0, 71, 0, 69, 0, 67, 0, 65] >>> B.append(96); list(B) # nouvelle preuve de la mutabilité d'un bytearray [0, 73, 0, 71, 0, 69, 0, 67, 0, 65, 96] |
On retiendra que les objets de type bytes et bytearray sont adaptés au traitement des informations sur des entiers de l’intervalle [0,255]. Pour plus d’information, on pourra évaluer help(bytes) et help(bytearray).