обо мне
Небольшой программист в мире программирования, в настоящее время работает руководителем команды в предпринимательской команде.Стек технологий включает Android, Python, Java и Go, который также является основным стеком технологий нашей команды. Контакт: hylinux1024@gmail.com
Тип массива является базовой структурой массива в различных языках программирования, и в этой статье мы рассмотрим его.PythonРеализации различных типов "массивов" в .
listtuplearray.arraystrbytesbytearray
На самом деле неверно утверждать, что все перечисленные выше типы являются массивами. Здесь массив рассматривается как общее понятие, то есть списки, последовательности и массивы рассматриваются какarray-likeтипы данных для понимания.
Обратите внимание, что весь код в этой статье находится вPython3.7Бег посередине ^_^
0x00 Переменный список динамического списка
listдолжно бытьPythonНаиболее часто используемый тип массива. Он характеризуетсяПеременная, динамическое расширение и хранениеPythonВсе объекты в , использовать без указания типа хранимого элемента.
очень прост в использовании
>>> arr = ["one","two","three"]
>>> arr[0]
'one'
# 动态扩容
>>> arr.append(4)
>>> arr
['one', 'two', 'three', 4]
# 删除一个元素
>>> del arr[2]
>>> arr
['one', 'two', 4]
0x01 Неизменяемый кортеж
tupleоперация сlistпохожий. Он характеризуетсяНеизменный, не расширяемый, сохраняемыйPythonВсе объекты в , использовать без указания типа хранимого элемента.
>>> t = 'one','two',3
>>> t
('one', 'two', 3)
>>> t.append(4)
AttributeError: 'tuple' object has no attribute 'append'
>>> del t[0]
TypeError: 'tuple' object doesn't support item deletion
tupleможно использовать+оператор, который создает новыйtupleОбъекты используются для хранения данных.
>>> t+(1,)
('one', 'two', 3, 1)
>>> tcopy = t+(1,)
>>> tcopy
('one', 'two', 3, 1)
>>> id(tcopy)
4604415336
>>> id(t)
4605245696
Как можно видетьtupleвоплощать в жизнь+Адреса двух объектов после оператора не совпадают
0x02 array.array
если вPythonЕсли вы хотите использовать структуры данных, подобные «массивам» в других языках, вам нужно использоватьarrayмодуль. Он характеризуетсяИзменяемый, хранит значения одного типа, не может хранить объекты.
так какarrayПри использовании указывайте тип данных элемента, так будет эффективнее, чемlistиtupleУ нас есть более спортивная эффективность.
# 使用时指定元素数据类型为`float`
>>> arr = array.array('f', (1.0, 1.5, 2.0, 2.5))
>>> arr
array('f', [1.0, 1.5, 2.0, 2.5])
# 修改一个元素
>>> arr[1]=12.45
>>> arr
array('f', [1.0, 12.449999809265137, 2.0, 2.5])
# 删除一个元素
>>> del arr[2]
>>> arr
array('f', [1.0, 12.449999809265137, 2.5])
# 增加一个元素
>>> arr.append(4.89)
>>> arr
array('f', [1.0, 12.449999809265137, 2.5, 4.889999866485596])
# 如果将一个字符串类型数据存储到一个浮点数的数组将会报错
>>> arr[0]='hello'
TypeError: must be real number, not str
arrayТип данных элементов может ссылаться на следующую таблицу
| Type code | C Type | Python Type |
|---|---|---|
| 'b' | signed char | int |
| 'B' | unsigned char | int |
| 'u' | Py_UNICODE | Unicode character |
| 'h' | signed short | int |
| 'H' | unsigned short | int |
| 'i' | signed int | int |
| 'I' | unsigned int | int |
| 'l' | signed long | int |
| 'L' | unsigned long | int |
| 'q' | signed long long | int |
| 'Q' | unsigned long long | int |
| 'f' | float | float |
| 'd' | double | float |
0x03 Строковая последовательность ул
Python3используется вstrобъект для представления последовательности текстовых символов (видите, это то же самое, что иJavaвводитьStringкак похоже). его особенностинеизменныйUnicodeпоследовательность символов.
существуетstrКаждый из его элементов является строковым объектом.
>>> s ='123abc'
>>> s
'123abc'
>>> s[0]
'1'
>>> s[2]
'3'
# 字符串是不可变的序列,不能删除其中的元素
>>> del s[1]
TypeError: 'str' object doesn't support item deletion
# 要对字符串进行操作,可以转化成list
>>> sn = list(s)
>>> sn
['1', '2', '3', 'a', 'b', 'c']
>>> sn.append(9)
>>> sn
['1', '2', '3', 'a', 'b', 'c', 9]
# 字符串中的元素也是字符串对象
>>> type(s[2])
<class 'str'>
>>> type(s)
<class 'str'>
strОбъекты также могут выполняться+операции, он также создает новый объект для хранения.
>>> s2 = s+'33'
>>> s2
'123abc33'
>>> id(s2)
4605193648
>>> id(s)
4552640416
0x04 bytes
bytesОбъекты используются для хранения последовательностей байтов и характеризуютсяНеизменяемое хранилище, может хранить значения от 0 до 256.
>>> b = bytes([0,2,4,8])
>>> b[2]
4
>>> b
b'\x00\x02\x04\x08'
>>> b[0]=33
TypeError: 'bytes' object does not support item assignment
>>> del b[0]
TypeError: 'bytes' object doesn't support item deletion
0x05 bytearray
bytearrayобъект сbytesАналогично для хранения последовательностей байтов. Он характеризуетсяПеременная, может быть динамически расширенабайтовый массив .
>>> ba = bytearray((1,3,5,7,9))
>>> ba
bytearray(b'\x01\x03\x05\x07\t')
>>> ba[1]
3
# 删除一个元素
>>> del ba[1]
>>> ba
bytearray(b'\x01\x05\x07\t')
>>> ba[0]=2
>>> ba[0]
2
# 添加一个元素
>>> ba.append(6)
# 只能添加字节
>>> ba.append(s)
TypeError: 'str' object cannot be interpreted as an integer
>>> ba
bytearray(b'\x02\x05\x07\t\x06')
# 字节的范围是0-256
>>> ba[2]=288
ValueError: byte must be in range(0, 256)
bytearrayЭто может быть преобразовано вbytesОбъект, но эффективность не очень высока.
# bytearray转成bytes将生成一个新对象
>>> bn = bytes(ba)
>>> id(bn)
4604114344
>>> id(ba)
4552473544
0x06 Взаимное преобразование различных типов
tuple->list
>>> tuple(l)
('a', 'b', 'c')
list->tuple
>>> t
('a', 'b', 'c')
>>> list(t)
['a', 'b', 'c']
str->list
>>> l = list('abc')
>>> l
['a', 'b', 'c']
list->str
>>> l
['a', 'b', 'c']
>>> ''.join(l)
'abc'
str->bytes
>>> s = '123'
>>> bytes(s)
TypeError: string argument without an encoding
>>> bytes(s,encoding='utf-8')
b'123'
# 或者使用str的encode()方法
>>> s.encode()
b'123'
bytes->str
>>> b = b'124'
>>> b
b'124'
>>> type(b)
<class 'bytes'>
>>> str(b,encoding='utf-8')
'124'
# 或使用bytes的decode()
>>> b.decode()
'124'
0x07 Сводка
Эти типы данныхPythonВ реальной разработке соответствующий тип данных должен выбираться в соответствии с конкретными потребностями. Например, когда типы сохраняемых элементов разнообразны, следует использоватьlistилиtuple. иarray.arrayОтносительно говоря, у него есть лучшие пространственные характеристики, но он может хранить только один тип.
Я верю во многие бизнес-сценарииlistилиtupleЭто может удовлетворить потребности, но другие структуры данных должны быть поняты.Когда мы делаем некоторые базовые компоненты, мы будем учитывать производительность структуры данных, или при чтении чужого кода мы можем осознавать это.