IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]5.6 array--高效的数值类型数组

    caimouse发表于 2016-01-23 11:18:25
    love 0

    本模块定义高效的数值类型数组,主要包括类型有:字符、整数、浮点数。数值类型数组与列表比较相似,主要区别在于列表可以放入不同类型的元素,而类型数组只能放入一种类型的元素。类型数组只支持下面的类型:

    类型字符

    C类型

    Python类型

    占用最小的字节

    备注

    'b'

    signed char

    int

    1

     

    'B' 

    unsigned char

    int

    1

     

    'u'

    Py_UNICODE

    Unicode haracter

    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

     

    实际以上类型的大小,是基于架构上的实现,更具体一点就是取决C语言的实现。

     

    class array.array(typecode[, initializer]) 

    使用类型码typecode创建一个新的数组。参数initializer是提供初始化的值,可以是一个列表,一个字节数组,或者是一个可迭代的对象。如果是一个列表或字符串,会使用fromlist()、frombytes()、fromunicode()函数来分解相关内容,并插入到数组里。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(a)

    结果输出如下:

    array('l', [1, 2, 3, 4, 5])

     

    array.typecodes 

    返回array支持所有的类型代码。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(array.typecodes)

    结果输出如下:

    bBuhHiIlLqQfd

     

    array.typecode 

    返回创建此数组的类型代码。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(a.typecode)

    print(a[0], a[1])

    结果输出如下:

    l

    1 2

     

    array.itemsize 

    内部表示一项占用字节的大小。比如32位的整数是占用4字节。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(a.itemsize)

    print(a[0:3])

    结果输出如下:

    4

    array('l', [1, 2, 3])

     

    array.append(x) 

    添加一项x到数组后面。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(a.itemsize)

    a.append(8)

    print(a)

    结果输出如下:

    4

    array('l', [1, 2, 3, 4, 5, 8])

     

    array.buffer_info() 

    返回一个元组(内存地址, 长度)。主要为了兼容旧的C代码而使用的,新的代码需要使用buffer protocol协议。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    print(a.itemsize)

    print(a.buffer_info())

    结果输出如下:

    4

    (2729208, 5)

     

    array.byteswap() 

    把数组里所有元素进行字节顺序变换“Byteswap”。仅支持1,2,4,8个字节大小。主要用来变换不同机器之间的字节顺序。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    a.byteswap()

    print(a)

    结果输出如下:

    array('l', [16777216, 33554432, 50331648, 67108864, 83886080])

     

    array.count(x) 

    返回指定元素x在数组里出现的次数。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5, 3, 3, 3])

    print(a.count(8))

    print(a.count(3))

    结果输出如下:

    0

    4

     

    array.extend(iterable)

    把迭代器iterable对象里的元素添加到数组里。如果iterable是数组,要保持类型一致,否则会抛出异常TypeError。如果不是数组类型对象,则需要可以把类型转换为一致。

    例子:

    #python 3.4

    import array

     

    a = array.array('l', [1, 2, 3, 4, 5])

    b = array.array('l', [1, 9, 3])

    a.extend(a)

    print(a)

    结果输出如下:

    array('l', [1, 2, 3, 4, 5, 1, 2, 3, 4, 5])

     

    array.frombytes(s) 

    从字符串s添加到数组里面。

     

    array.fromfile(f, n) 

    从文件对象f里读取n项,并添加在数组后面。如果文件里少于n项则会抛出异常EOFError,但那些可用的项仍会添加到数组里面。

    例子:

    #python 3.4

    import array

    import binascii

    import tempfile

     

    a = array.array('i', range(5))

    print('A1: ', a)

    output = tempfile.NamedTemporaryFile(delete=False)

    a.tofile(output.file)

    output.flush()

    name = output.name

    print(name)

    output.close()

     

    b = array.array('i')

    with open(name, 'rb') as input:

        b.fromfile(input, len(a))

        print(b)

    结果输出如下:

    A1:  array('i', [0, 1, 2, 3, 4])

    C:\Users\xxxx\AppData\Local\Temp\tmp_o3px5vs

    array('i', [0, 1, 2, 3, 4])

     

    array.fromlist(list) 

    从列表里添加数组项。等同于:for x in list: a.append(x)。如果类型不相同,数组内容不会改变。

    例子:

    #python 3.4

    import array

    import binascii

    import tempfile

     

    a = array.array('i')

    l = [3, 6, 8, 9]

    a.fromlist(l)

    print(a)

    结果输出如下:

    array('i', [3, 6, 8, 9])

     

    array.fromstring() 

    本函数的功能已经失效。可以使用frombytes()函数。

     

    array.fromunicode(s) 

    从一个Unicode字符串扩展数组。数组类型必须是unicode的类型,否则抛出ValueError异常。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', 'ddd')

    a.fromunicode('abc')

    print(a)

    结果输出如下:

    array('u', 'dddabc')

     

    array.index(x) 

    返回在数组里最早出现元素x的最小的索引值。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    print(a.index('d'))

    结果输出如下:

    4

     

    array.insert(i, x) 

    插入一个元素x在位置i之前。如果i是负值表示从数组后面计算开始。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    a.insert(3, 'a')

    print(a)

    结果输出如下:

    array('u', '567a8ddd')

     

    array.pop([i]) 

    删除指定位置i的元素,缺省的值为-1,表示删除数组最后一个元素。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    a.pop()

    a.pop(1)

    print(a)

    结果输出如下:

    array('u', '578dd')

     

    array.remove(x) 

    从数组里删除第一次出现元素x相同的值。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    a.remove('8')

    print(a)

    结果输出如下:

    array('u', '567ddd')

     

    array.reverse() 

    把数组的元素反序排列。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    print(a)

    a.reverse()

    print(a)

    结果输出如下:

    array('u', '5678ddd')

    array('u', 'ddd8765')

     

    array.tobytes() 

    把数组转换为电脑内部表示,并返回bytes类型数组。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    print(a.tobytes())

    输出结果如下:

    b'5\x006\x007\x008\x00d\x00d\x00d\x00'

     

    array.tofile(f) 

    把所有项的值(作为内部表示的值)写到文件对象f。

    例子:

    #python 3.4

    import array

    import binascii

    import tempfile

     

    a = array.array('i', range(5))

    print('A1: ', a)

    output = tempfile.NamedTemporaryFile(delete=False)

    a.tofile(output.file)

    output.flush()

    name = output.name

    print(name)

    output.close()

     

    b = array.array('i')

    with open(name, 'rb') as input:

        b.fromfile(input, len(a))

        print(b)

    结果输出如下:

    A1:  array('i', [0, 1, 2, 3, 4])

    C:\Users\xxxx\AppData\Local\Temp\tmp_o3px5vs

    array('i', [0, 1, 2, 3, 4])

     

    array.tolist() 

    把数组转换为列表表示。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    print(a.tolist())

    结果输出如下:

    ['5', '6', '7', '8', 'd', 'd', 'd']

     

    array.tostring() 

    转换为字符串。此函数将要丢弃,应使用tobytes()函数。

     

    array.tounicode() 

    转换数组为unicode字符串。

    例子:

    #python 3.4

    import array

     

    a = array.array('u', '5678ddd')

    print(a.tounicode())

    结果输出如下:

    5678ddd

     

    蔡军生 QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接