Python 3.x fait une distinction claire entre les types:
str= '...'littéraux = une séquence de caractères Unicode (UTF-16 ou UTF-32, selon la façon dont Python a été compilé)
bytes= b'...'littéraux = une séquence d'octets (entiers compris entre 0 et 255)
Si vous êtes familier avec Java ou C #, pensez au strfur Stringet à bytesmesure byte[]. Si vous connaissez SQL, pensez à stras NVARCHARet bytesas BINARYou BLOB. Si vous êtes familier avec le registre Windows, pensez au strfur REG_SZet à bytesmesure REG_BINARY. Si vous êtes familier avec C (++), oubliez tout ce que vous avez appris charet les chaînes, car UN PERSONNAGE N'EST PAS UN OCTET . Cette idée est depuis longtemps obsolète.
Vous utilisez strlorsque vous souhaitez représenter du texte.
print('שלום עולם')
Vous utilisez byteslorsque vous souhaitez représenter des données binaires de bas niveau comme des structures.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Vous pouvez encoder un stren un bytesobjet.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Et vous pouvez décoder un bytesen un str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Mais vous ne pouvez pas mélanger librement les deux types.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
La b'...'notation est quelque peu déroutante en ce qu'elle permet de spécifier les octets 0x01-0x7F avec des caractères ASCII au lieu de nombres hexadécimaux.
>>> b'A' == b'\x41'
True
Mais je dois souligner qu'un caractère n'est pas un octet .
>>> 'A' == b'A'
False
En Python 2.x
Les versions pré-3.0 de Python n'avaient pas ce genre de distinction entre le texte et les données binaires. Au lieu de cela, il y avait:
unicode= u'...'littéraux = séquence de caractères Unicode = 3.xstr
str= '...'littéraux = séquences d'octets / caractères confondus
- Généralement du texte, codé dans un codage non spécifié.
- Mais également utilisé pour représenter des données binaires comme la
struct.packsortie.
Afin de faciliter la transition de 2.x vers 3.x, la b'...'syntaxe littérale a été rétroportée vers Python 2.6, afin de permettre de distinguer les chaînes binaires (qui devraient être bytesen 3.x) des chaînes de texte (qui devraient être stren 3 .X). Le bpréfixe ne fait rien dans 2.x, mais indique au 2to3script de ne pas le convertir en chaîne Unicode dans 3.x.
Alors oui, les b'...'littéraux en Python ont le même objectif qu'en PHP.
Aussi, juste par curiosité, y a-t-il plus de symboles que le b et le u qui font autre chose?
Le rpréfixe crée une chaîne brute (par exemple, r'\t'est une barre oblique inversée + tau lieu d'un onglet), et des guillemets triples '''...'''ou """..."""autorisent des littéraux de chaîne multi-lignes.