5 .2 . Массивоподобные
структуры данных 167
bytes — неизменяемые
массивы одиночных байтов
Объекты
bytes
представляют собой неизменяемые последовательности
одиночных байтов (целых чисел в диапазоне 0
≤
x ≤ 255)
1
. В концептуаль-
ном плане они подобны объектам
str
и их также можно представить как
неизменяемые массивы байтов.
Аналогично строковому типу, тип
bytes
имеет свой собственный лите-
ральный синтаксис, предназначенный для создания объектов, и объекты
этого типа пространственно эффективны. Объекты
bytes
не могут изме-
няться, но, в отличие от строковых объектов, для «изменяемых массивов
байтов» есть специальный тип данных, который называется
bytearray
,
или байтовый массив, в который они могут быть распакованы. Вы узнаете
о нем подробнее в следующем подразделе.
>>> arr = bytes((0, 1, 2, 3))
>>> arr[1]
1
# Байтовые литералы имеют свой собственный синтаксис:
>>> arr
b'x00x01x02x03'
>>> arr = b'x00x01x02x03'
# Разрешены только допустимые "байты":
>>> bytes((0, 300))
ValueError: "bytes must be in range(0, 256)"
# Байты неизменяемы:
>>> arr[1] = 23
TypeError:
"'bytes' object does not support item assignment"
>>> del arr[1]
TypeError:
"'bytes' object doesn't support item deletion"
1
См. документацию Python «bytes»:
https://docs .python .org/3/library/stdtypes .html#bytes
168 Глава 5 • Общие
структуры данных Python
bytearray — изменяемые массивы одиночных байтов
Тип
bytearray
представляет собой изменяемую последовательность целых
чисел в диапазоне 0
≤
x ≤ 255
1
. Они тесно связаны с объектами
bytes
, при
этом главное их отличие в том, что объекты
bytearray
можно свободно
изменять — вы можете переписывать элементы, удалять существующие
элементы или добавлять новые. Объект
bytearray
будет соответствующим
образом расти и сжиматься.
Объекты
bytearray
могут быть преобразованы обратно в неизменяе-
мые объекты
bytes
, но это влечет за собой копирование абсолютно всех
хранящихся в них данных — весьма медленная операция, занимающая
O(
n) времени.
>>> arr = bytearray((0, 1, 2, 3))
>>> arr[1]
1
# Метод repr для bytearray:
>>> arr bytearray(b'x00x01x02x03')
# Байтовые массивы bytearray изменяемы:
>>> arr[1] = 23
>>> arr
bytearray(b'x00x17x02x03')
>>> arr[1]
23
# Байтовые массивы bytearray могут расти и сжиматься в размере:
>>> del arr[1]
>>> arr
bytearray(b'x00x02x03')
>>> arr.append(42)
>>> arr
bytearray(b'x00x02x03*')
# Байтовые массивы bytearray могут содержать только "байты"
1
См. документацию Python «bytearray»:
https://docs .python .org/3/library/stdtypes .
html#bytearray
5 .2 . Массивоподобные структуры данных
169
# (целые числа в диапазоне 0 <= x <= 255)
>>> arr[1] = 'привет'
TypeError: "an integer is required"
>>> arr[1] = 300
ValueError: "byte must be in range(0, 256)"
# Bytearrays может быть преобразован в байтовые объекты:
# (Это скопирует данные)
>>> bytes(arr)
b'x00x02x03*'
Ключевые
выводы
В том, что касается реализации массивов в
Python, вы можете выбирать
из широкого круга встроенных структур данных. В этом разделе мы сосре-
доточились на ключевых функциональных средствах языка и структурах
данных, включенных только в стандартную библиотеку.
Если вы готовы выйти за пределы стандартной библиотеки Python, то
сторонние пакеты, такие как
NumPy
1
, предлагают широкий спектр мас-
сивоподобных реализаций с большим быстродействием для научных
вычислений и науки о данных.
Если ограничиваться массивоподобными структурами данных, включен-
ными в Python, то наш выбор сводится к следующему.
Do'stlaringiz bilan baham: