Python 3.x чітко розрізняє типи:
str= '...'літерали = послідовність символів Unicode (UTF-16 або UTF-32, залежно від способу складання Python)
bytes= b'...'літерали = послідовність октетів (цілі числа від 0 до 255)
Якщо ви знайомі з Java або C #, подумайте strяк Stringі bytesяк byte[]. Якщо ви знайомі з SQL, подумайте strяк NVARCHARіbytes як BINARYабо BLOB. Якщо ви знайомі з реєстром Windows, подумайте strяк REG_SZі bytesяк REG_BINARY. Якщо ви знайомі з C (++), то забудьте все, про що ви дізналися, charі рядки, тому що ХАРАКТЕР НЕ БЮТ . Ця ідея давно застаріла.
Ви використовуєте, strколи хочете представити текст.
print('שלום עולם')
Ви використовуєте, bytesколи хочете представити бінарні дані низького рівня, як структури.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Ти можеш кодувати а strдо bytesоб'єкта.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
І ви можете розшифрувати а bytesв а str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Але ви не можете вільно змішувати два типи.
>>> 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
The b'...'Нотація кілька заплутаним в тому , що вона дозволяє байти 0x01-0x7F повинні бути вказані з ASCII - символів замість шістнадцяткових цифр.
>>> b'A' == b'\x41'
True
Але я мушу наголосити, персонаж - це не байт .
>>> 'A' == b'A'
False
У Python 2.x
У попередніх версіях Python версії 3.0 не мали такого розрізнення між текстовими та бінарними даними. Натомість було:
unicode = u'...' літерали = послідовність символів Unicode = 3.xstr
str = '...' літерали = послідовності змішаних байтів / символів
- Зазвичай текст, закодований у деякому не визначеному кодуванні.
- Але також використовується для представлення двійкових даних, таких як
struct.packвихід.
Щоб полегшити перехід від 2.x до 3.x, b'...'буквальний синтаксис був підтриманий на Python 2.6, щоб дозволити розрізнити бінарні рядки (які мають бути bytesв 3.x) від текстових рядків (які мають бути strу 3 .x). bПриставка нічого не робить в 2.x, але розповідає2to3 сценарій не перетворити його в рядок Unicode в 3.x.
Так що так, b'...'літерали в Python мають ту саму мету, що і в PHP.
Крім того, тільки з цікавості, чи більше символів, ніж b і u, які роблять інші речі?
rПрефікс створює рядок (наприклад, r'\t'є зворотним слешем + tзамість вкладки), а також потрійні лапки '''...'''або """..."""дозволяють багаторядковим рядкові літерали.