Узнайте обо всех типах данных массива в Python в одной статье

Python

обо мне
Небольшой программист в мире программирования, в настоящее время работает руководителем команды в предпринимательской команде.Стек технологий включает Android, Python, Java и Go, который также является основным стеком технологий нашей команды. Контакт: hylinux1024@gmail.com

Тип массива является базовой структурой массива в различных языках программирования, и в этой статье мы рассмотрим его.PythonРеализации различных типов "массивов" в .

  • list
  • tuple
  • array.array
  • str
  • bytes
  • bytearray

На самом деле неверно утверждать, что все перечисленные выше типы являются массивами. Здесь массив рассматривается как общее понятие, то есть списки, последовательности и массивы рассматриваются как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Это может удовлетворить потребности, но другие структуры данных должны быть поняты.Когда мы делаем некоторые базовые компоненты, мы будем учитывать производительность структуры данных, или при чтении чужого кода мы можем осознавать это.

0x08 Учебные материалы