公司做免费网站,动漫制作专业主修课程,在线图片编辑器软件,ui交互设计软件前言数组类型是各种编程语言中基本的数组结构了#xff0c;本文来盘点下Python中各种“数组”类型的实现。listtuplearray.arraystrbytesbytearray其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念#xff0c;即把列表、序列、数组都当作array-like数据类…前言数组类型是各种编程语言中基本的数组结构了本文来盘点下Python中各种“数组”类型的实现。listtuplearray.arraystrbytesbytearray其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念即把列表、序列、数组都当作array-like数据类型来理解。注意本文所有代码都是在Python3.7中跑的^_^0x00 可变的动态列表listlist应该是Python最常用到的数组类型了。它的特点是可变的、能动态扩容可存储Python中的一切对象使用时不用指定存储的元素的类型。使用非常简单 0x01 不可变的tupletuple的操作与list类似。它的特点是不可变不能扩容可存储Python中的一切对象使用时不用指定存储的元素的类型。 t one,two,3t
(one, two, 3)t.append(4)
AttributeError: tuple object has no attribute appenddel t[0]
TypeError: tuple object doesnt support item deletiontuple可以使用运算符这个运算将创建一个新的tuple对象用于存储数据。 t(1,)
(one, two, 3, 1)tcopy t(1,)tcopy
(one, two, 3, 1)id(tcopy)
4604415336id(t)
4605245696可以看出tuple执行运算符之后两个对象的地址是不一样0x02 array.array如果在Python中要用到其它语言中类似“数组”的数据结构就需要用到array模块了。它的特点是可变的、存储相同类型的数值不能存储对象。因为array在使用的时候要指定元素数据类型因此它比list和tuple都有比较高效空间性能。# 使用时指定元素数据类型为floatarr 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.45arr
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 strarray中元素的数据类型可以参考下表0x03 字符串序列strPython3中使用str对象来表示一个文本字符序列(看这跟Java中的字符串String是多么相似呢)。它的特点不可变的Unicode字符序列。在str中它的每一个元素都是字符串对象。 s 123abcs
123abcs[0]
1s[2]
3
# 字符串是不可变的序列不能删除其中的元素del s[1]
TypeError: str object doesnt 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 strtype(s)
class strstr对象也可以执行操作它也会生成一个新对象用于存储。 s2 s33s2
123abc33id(s2)
4605193648id(s)
45526404160x04 bytesbytes对象用于存储字节序列它的特点是不可变存储可存储0-256的数值。 b bytes([0,2,4,8])b[2]
4b
bx00x02x04x08b[0]33
TypeError: bytes object does not support item assignmentdel b[0]
TypeError: bytes object doesnt support item deletion 0x05 bytearraybytearray对象与bytes类似用于存储字节序列。它的特点是可变的能动态扩容的字节数组。 ba bytearray((1,3,5,7,9))ba
bytearray(bx01x03x05x07t)ba[1]
3
# 删除一个元素del ba[1]ba
bytearray(bx01x05x07t)ba[0]2ba[0]
2
# 添加一个元素ba.append(6)
# 只能添加字节ba.append(s)
TypeError: str object cannot be interpreted as an integerba
bytearray(bx02x05x07tx06)
# 字节的范围是0-256ba[2]288
ValueError: byte must be in range(0, 256)bytearray可以转化成bytes对象但效率不是很高。# bytearray转成bytes将生成一个新对象bn bytes(ba)id(bn)
4604114344id(ba)
45524735440x06 各个类型相互转化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)
abcstr-bytes s 123bytes(s)
TypeError: string argument without an encodingbytes(s,encodingutf-8)
b123
# 或者使用str的encode()方法s.encode()
b123bytes-str b b124b
b124type(b)
class bytesstr(b,encodingutf-8)
124
# 或使用bytes的decode()b.decode()
1240x07 总结这些数据类型都是Python自带的在实际开发中应该根据具体需求选择合适的数据类型。例如当要存储的元素类型是多种多样的那么就应该使用list或者tuple。而array.array相对来说拥有较好的空间性能但它只能存储单一类型。我相信在很多业务场景中list或tuple是可以满足需求的只是其它数据结构也要有所了解在我们做一些基础组件时会考虑数据结构的性能或者阅读他人的代码时能做到心中有数。