164 Глава 5 • Общие
структуры данных Python
не изменяются. Это означает, что элементы не могут динамически добав-
ляться или удаляться — все элементы в кортеже должны быть определены
во время создания.
Точно так же, как и списки, кортежи могут содержать элементы произ-
вольных типов данных. В этой гибкости много мощности, но, опять-таки,
это также означает, что данные упакованы менее плотно, чем это было бы
в типизированном массиве.
>>> arr = 'один', 'два', 'три'
>>> arr[0]
'one'
# Кортежи имеют хороший метод repr:
>>> arr ('один', 'два', 'три')
# Кортежи не могут изменяться:
>>> arr[1] = 'привет'
TypeError:
"'tuple' object does not support item assignment"
>>> del arr[1]
TypeError:
"'tuple' object doesn't support item deletion"
# Кортежи могут содержать произвольные типы данных:
# (При добавлении элементов создается копия кортежа)
>>> arr + (23,)
('один', 'два', 'три', 23)
array .array — элементарные типизированные массивы
Модуль Python
array
обеспечивает пространственно-эффективное хра-
нение элементарных типов данных в стиле языка C, таких как байты,
32-разрядные
целые числа, числа с плавающей точкой и т. д.
Массивы, создаваемые на основе класса
array.array
, могут изменяться
и ведут себя аналогично спискам, за исключением одного важного раз-
личия — они являются «типизированными массивами», ограниченными
единственным типом данных
1
.
1
См. документацию Python «array.array»:
https://docs .python .org/3/library/array .html
5 .2 . Массивоподобные
структуры данных 165
Из-за этого ограничения объекты
array.array
со многими элементами
более пространственно эффективны, чем списки и кортежи. Хранящиеся
в них элементы плотно упакованы, и это может быть полезно, если вам
нужно хранить много элементов одного и того же типа.
Кроме того, массивы поддерживают многие из тех же методов, что и у
обычных списков, и вы можете их использовать в качестве «прямой за-
мены» без необходимости вносить в свой код другие изменения.
>>> import array
>>> arr = array.array('f', (1.0, 1.5, 2.0, 2.5))
>>> arr[1]
1.5
# Массивы имеют хороший метод repr:
>>> arr
array('f', [1.0, 1.5, 2.0, 2.5])
# Массивы могут изменяться:
>>> arr[1] = 23.0
>>> arr
array('f', [1.0, 23.0, 2.0, 2.5])
>>> del arr[1]
>>> arr
array('f', [1.0, 2.0, 2.5])
>>> arr.append(42.0)
>>> arr
array('f', [1.0, 2.0, 2.5, 42.0])
# Массивы — это "типизированные" структуры данных:
>>> arr[1] = 'привет'
TypeError: "must
be real number, not str"
str — неизменяемые массивы символов Юникода
В Python 3.
x объекты строкового типа
str
используются для хранения
текстовых данных в виде неизменяемых последовательностей символов
Юникода
1
. В сущности, это означает, что тип
str
представляет собой
1
См. документацию Python «str»:
https://docs .python .org/3 .6/library/stdtypes .html#text-
sequence-type-str
166 Глава 5 • Общие структуры данных Python
неизменяемый массив символов. Как это ни странно, но тип
str
также
является рекурсивной структурой данных: каждый символ в строке сам
является
объектом
str
длиной, равной
1
.
Строковые объекты пространственно эффективны, потому что они плотно
упакованы и специализируются на одном-единственном типе данных.
Если вы храните текст в кодировке Юникод, то лучше использовать этот
тип данных. Поскольку строки в Python не могут изменяться, модифи-
кация строкового значения требует создания модифицированной копии.
Самым близким эквивалентом «изменяющейся последовательности
символов» будет список, в котором символы хранятся по отдельности.
>>> arr = 'abcd'
>>> arr[1]
Do'stlaringiz bilan baham: