共计 3727 个字符,预计需要花费 10 分钟才能阅读完成。
前情提醒: 测试代码中,右尖括号(>
)表示命令行中输出的命令;独自一行并以井字符(#
)结尾的为输入内容;库的导入仅在本文的第一个测试代码中展示,其余代码块均省略库的导入代码。
- 零碎类型:
Windows 10
- python 版本:
Python 3.9.0
array
模块定义了一种对象类型,能够紧凑的示意以 字符
、 整数
、 浮点数
等根本类型为元素组成的数组。array
模块中定义的数组属于序列类型,其行为也与列表类型十分类似,然而数组中的元素的数据类型是受到限制的,只能设置在初始化时指定的某一种类型。
++PS: 数组与列表、元组等组合数据类型类似,能够由多个值组成。出于集体习惯,小编把这些值称为元素,也就是说,列表、元组等能够是由多个元素组成的,在本文中也将组成数组的那些值也称为元素。++
array
模块在应用时,须要先实例化一个数组对象,而后再进行下一步操作:
array.array(typecode[, initializer])
'''
参数:
typecode: 指定以后数组所能承受的元素数据类型
initializer: 可选参数, 数组初始化时增加的元素, 必须是可迭代对象, 元素的数据类型受参数 typecode 的限度
'''
typecode
参数的值是一个字符,这个字符被称为 类型码,其代表一种类型限度,所有的类型码能够应用 array.typecodes
查看:
import array
print(array.typecodes)
# bBuhHiIlLqQfd
在上述的例子中,返回值中的每个字符都是一个类型码,那么这些类型码都是什么意思呢?
类型码 C 类型 Python 类型 以字节示意的最小尺寸
'b' signed char int 1
'B' unsigned char int 1
'u' wchar_t Unicode 字符 2
'h' signed short int 2
'H' unsigned short int 2
'i' signed int int 2
'I' unsigned int int 2
'l' signed long int 4
'L' unsigned long int 4
'q' signed long long int 8
'Q' unsigned long long int 8
'f' float float 4
'd' double float 8
接下来就能够初始化一个数组了:
test = array.array('u', 'ABC')
print(test)
# array('u', 'ABC')
初始化的元素类型肯定要和设置的类型码统一,否则将报错:
test = array.array('b', 'ABC')
# TypeError: cannot use a str to initialize an array with typecode 'b'
array
模块的大多数内容都在初始化后的数组对象上开展的,那么上面将依据性能进行分组介绍。
属性
array.typecode
: 获取数组的类型码array.itemsize
: 获取在外部示意中一个元素的字节长度
test = array.array('u', 'ABC')
print(test.typecode)
# u
print(test.itemsize)
# 2
增加
增加性能比拟对立的一点就是都没有返回值,间接作用于数组自身。
array.append(x)
将一个值为 x
的新元素增加到数组的开端。参数 x
必须是一个合乎类型码的值。
array.extend(iterable)
将来自 iterable
可迭代对象中的元素增加到数组的开端。iterable
可迭代对象中所有元素都合乎类型码。
array.fromlist(list)
将 list
中的元素增加到数组开端。list
中所有元素都合乎类型码。
array.fromunicode(s)
将 Unicode
字符串增加到数组开端,数组的类型码必须是 u
,否则将产生 ValueError
谬误。
array.insert(i, x)
将参数 x
插入到在数组中索引为 i
的地位。若指定参数 i
为正数,则将元素 x
插入到数组开端。参数 x
必须是一个合乎类型码的值。
test = array.array('u', 'A')
'''append()'''
test.append('B')
print(test)
# array('u', 'AB')
'''extend()'''
test.extend(['C', 'D'])
print(test)
# array('u', 'ABCD')
'''fromlist()'''
test.fromlist(['E', 'F'])
print(test)
# array('u', 'ABCDEF')
'''fromunicode()'''
test.fromunicode('IJ')
print(test)
# array('u', 'ABCDEFIJ')
'''insert()'''
test.insert(6, 'H')
print(test)
# array('u', 'ABCDEFHIJ')
统计 and 获取
array.count(x)
获取值为 x
的元素的个数。参数 x
必须是一个合乎类型码的值。
array.index(x)
获取第一个值为 x
的元素所在的地位,也就是索引值。参数 x
必须是一个合乎类型码的值。
array.pop([i])
将指定索引值的元素从数组中移除并返回,默认移除并返回数组中的最初一个元素。
test = array.array('u', 'ABCABC')
'''count()'''
print(test.count('A'))
# 2
'''index()'''
print(test.index('B'))
# 1
'''pop()'''
print(test.pop())
# C
print(test)
# array('u', 'ABCAB')
机器值、文件相干
array.frombytes(s)
将二进制字符串解读后退出数组开端。
array.fromfile(f, n)
将从文件对象 f
中读取 n
个元素增加到数组开端。如果可读数据少于参数 n
,那么将报 EOFError
谬误,然而无效的元素依然会增加到数组中。参数 f
必须是内置文件对象。
array.tobytes()
将数组转换成机器值并返回。
array.tofile(f)
将数组转换成机器值并写入到文件中。参数 f
必须是内置文件对象。
array.byteswap()
将数组中的所有元素字节对调,此办法仅反对大小为 1
、2
、4
、8
字节的值,其余的值将报 RuntimeError
谬误。
test = array.array('u', 'ABC')
'''tobytes()'''
print(test.tobytes())
# b'A\x00B\x00C\x00'
'''tofile()'''
with open('./test', 'wb+') as f:
test.tofile(f)
f.seek(0) # 指针挪动到文件起始地位
print(f.read()) # 读取文件内容
# b'A\x00B\x00C\x00'
'''frombytes()'''
test.frombytes(b'A\x00B\x00C\x00')
print(test)
# array('u', 'ABCABC')
'''fromfile()'''
with open('./test', 'rb+') as f:
test.fromfile(f, 3)
print(test)
# array('u', 'ABCABCABC')
'''byteswap()'''
test = array.array('u', 'ABC')
test.byteswap()
print(test)
# array('u', '䄀䈀䌀')
转换
array.tolist()
将数组转换成列表.
array.tounicode()
将数组转换成 Unicode
字符串,数组的类型码为 u
,否则将报 ValueError
谬误。
test = array.array('u', 'ABC')
'''tolist()'''
print(test.tolist())
# ['A', 'B', 'C']
'''tounicode()'''
print(test.tounicode())
# ABC
其余
array.buffer_info()
返回一个元组 (address, length)
以给出用于寄存数组内容的缓冲区元素的以后内存地址和长度。
array.remove(x)
从数组中移除第一个值为 x
的元素。参数 x
必须是一个合乎类型码的值。
array.reverse()
反转数组内元素的程序。
test = array.array('u', 'ABCABC')
'''buffer_info()'''
print(test.buffer_info())
# (1864606516176, 6)
'''remove()'''
test.remove('C')
print(test)
# array('u', 'ABABC')
'''reverse()'''
test.reverse()
print(test)
# array('u', 'CBABA')
参考资料
官网文档: https://docs.python.org/zh-cn…
公众号 :「python 库详解」,专一于 python 规范库与 python 第三方库的解析教程,以及其余 python 的相干内容。挖掘更多原创文章,期待您的关注。