没有合适的资源?快使用搜索试试~ 我知道了~
序列构成的数组内置序列类型概览Python 标准库用 C 实现了丰富的序列类型按存放数据类型分类容器序列list、tuple 和 collections.deq
资源详情
资源评论
资源推荐
序构成的数组
内置序类型概览
Python 标准库 C 实现丰富
的序类型
按存放数据类型分类
容序
list、tuple 和 collections.deque
这些序能存放同类型的数
据。
存放的是它们所包含的任意类型
的对象的引
扁平序
str、bytes、bytearray、
memoryview 和 array.array,这
类序只能容纳种类型。
存放的是值是引
扁平序其实是段连续的内存
空间
扁平序其实加紧凑
但是它只能存放诸如字符、
字节和数值这种基础类型。
按照能否被修改来分类
可变序
list、bytearray、array.array、
collections.deque 和
memoryview
可变序 tuple、str 和 bytes
可变序从可变序那继承
些法
表推导和成表达式
表推导是构建表(list)的快
捷式,成表达式则可以
来创建其他任何类型的序。
表推导和可读性
通常的原则是,只表推导来
创建新的表,并且尽保持简
短。
推导的代码超过两,你可能
就要考虑是是得 for 循环重
写。
表推导可以帮助我们把个序
或是其他可迭代类型中的元素
过滤或是加,然后再新建个
表。
表推导同filter和map的较
filter 和 map 合起来能做的事
情,表推导也可以做,且还
需要借助难以解和阅读的
lambda 表达式。
map/filter 组合定表推
导快
笛卡积
表推导可以成两个或以上的
可迭代类型的笛卡积。
得到的结果排和循环的嵌套顺
序致
成表达式
成表达式是好的选择。这
是因为成表达式背后遵守
迭代协议,可以逐个地产出元
素,是先建个完整的
表,然后再把这个表传递到某
个构造函数。
成表达式节省内存
成表达式的语法跟表推导
差多,只过把括号换成圆
括号已。
元组仅仅是可变的表
除作可变的表,它还可
以于没有字段名的记录。
元组和记录
元组其实是对数据的记录:元组
中的每个元素都存放记录中
个字段的数据,外加这个字段的
位置。正是这个位置信息给数据
赋予意义。
但是如果把元组当作些字段的
集合,那么数和位置信息就变
得常重要。
元组拆包
元组拆包可以应到任何可迭代
对象上,唯的硬性要求是,被
可迭代对象中的元素数必须要
跟接受这些元素的元组的空档数
致。
除我们 * 来表示忽多余的
元素
最好辨认的元组拆包形式就是平
赋值,也就是说把个可迭代
对象的元素,并赋值到由对
应的变组成的元组中。
>>> lax_coordinates =
(33.9425, -118.408056) >>>
latitude, longitude =
lax_coordinates # 元组拆包
另外个很优雅的写法当属使
中间变交换两个变的值
>>> b, a = a, b
还可以 * 运算符把个可迭代
对象拆开作为函数的参数
>>> t = (20, 8) >>> divmod(*t)
(2, 4)
个函数可以元组的形式返回
多个值,然后调函数的代码就
能轻松地接受这些返回值。
_, filename = os.path.split('/
home/luciano/.ssh/idrsa.pub')
*来处剩下的元素
函数 *args 来获取确定数
的参数
在平赋值中,* 前缀只能在
个变名前,但是这个变
可以出现在赋值表达式的任意位
置
嵌套元组拆包
接受表达式的元组可以是嵌套式
的,如 (a, b, (c, d))。
只要这个接受元组的嵌套结构符
合表达式本身的嵌套结构,
Python 就可以作出正确的对
应。
具名元组
collections.namedtuple 是个
函数,它可以来构建个
带字段名的元组和个有名字的
类——这个带名字的类对调试程
序有很帮助。
namedtuple 构建的类的实
所消耗的内存跟元组是样的,
因为字段名都被存在对应的类
。
这个实跟普通的对象实起
来也要些,因为Python
会 __dict__ 来存放这些实的
属性。
除从普通元组那继承来的属
性之外,具名元组还有些
专有的属性。
_fields 类属性
个包含这个类所有字段名称的
元组
类法 _make(iterable)
_make() 通过接受个可迭代
对象来成这个类的个实,
它的作跟City(*delhi_data) 是
样的。
实法 _asdict()
_asdict() 把具名元组以
collections.OrderedDict 的形式
返回,我们可以它来把元组
的信息友好地呈现出来。
作为可变表的元组
除跟增减元素相关的法之
外,元组持表的其他所有
法。
元组没有 __reversed__ 法,
但是这个法只是个优化已,
reversed(my_tuple) 这个法在
没有 __reversed__ 的情况下也
是合法的。
切
为么切和区间会忽最后
个元素
当只有最后个位置信息时,我
们也可以快速看出切和区间
有个元素
当起位置信息都可时,我们
可以快速计算出切和区间的
度,后个数减去第个下标
(stop - start)即可。
这样做也让我们可以任意
个下标来把序分割成重叠的
两部分,只要写成 my_ list[:x]
和 my_list[x:] 就可以
对对象进切
我们还可以 s[a:b:c] 的形式对
s 在 a 和 b 之间以 c 为间隔取
值。c 的值还可以为负,负值意
味着反向取值。
对 seq[start:stop:step] 进求
值的时候,Python 会调 seq.
__getitem__(slice(start, stop,
step))。
可以给切命名,就像电表格
软件给单元格区域取名字
样。
>>> DESCRIPTION = slice(6,
40) >>> UNIT_PRICE =
slice(40, 52)
print(item[UNIT_PRICE],
item[DESCRIPTION])
多维切和省
[] 运算符还可以使以逗号分
开的多个索引或者是切
维的 numpy.ndarray 就可以
a[i, j] 这种形式来获取,抑或是
a[m:n, k:l] 的式来得到维
切
要正确处这种 [] 运算符的话,
对象的特殊法 __getitem__ 和
__setitem__ 需要以元组的形式
来接收 a[i, j] 中的索引。
Python 内置的序类型都是
维的,因此它们只持单的索
引,成对出现的索引是没有
的。
省在 Python 解析眼是
个符号,实际上它是 Ellipsis
对象的别名, Ellipsis 对象
是 ellipsis 类的单实。
给切赋值
如果把切放在赋值语的左
边,或把它作为 del 操作的对
象,我们就可以对序进嫁
接、切除或就地修改操作。
如果赋值的对象是个切,那
么赋值语的右侧必须是个可迭
代对象。即只有单独个值,
也要把它转换成可迭代的序。
l = list(range(10))
l[2:5] = 100 # TypeError
对序使+和*
在拼接的过程中,两个被操作的
序都会被修改,Python 会
新建个包含同样类型数据的序
来作为拼接的结果。
如果想要把个序复制份然
后再拼接起来,快捷的做法是
把这个序乘以个整数。同
样,这个操作会产个新序
如果在 a * n 这个语中,序
a 的元素是对其他可变对象的
引的话,你就需要格外注意
建由表组成的表
有时我们会需要初始化个嵌套
着个表的表
最好的选择是使表推导
👍 board = [['_'] * 3 for i in
range(3)]
👎 weird_board = [['_'] * 3] * 3
weird_board[1][2] = 'O'
[['_', '_', 'O'], ['_', '_', 'O'], ['_',
'_', 'O']]
序的增赋值
增赋值运算符 += 和 *= 的表
现取决于它们的第个操作对
象。
+= 背后的特殊法是
__iadd__(于“就地加
法” ) 。但是如果个类没有实
现这个法的话,Python 会退
步调 __add__。
a += b 如 果 a 实 现
__iadd__ 法, 就 会 调 这
个 法。 同 时 对 可 变 序
( 如 list、bytearray 和
array.array)来说,a 会就地改
动,就像调 a.extend(b)
样。
如果 a 没有实现 __iadd__ 的
话,a += b 这个表达式的效果就
变得跟 a = a + b 样
变名会会被关联到新的对
象,完全取决于这个类型有没有
实现 __iadd__ 这个法。
总体来讲,可变序般都实现
__iadd__ 法,因此 += 是
就地加法。可变序根本就
持这个操作,对这个法的
实现也就从谈起。
对可变序进重复拼接操作
的话,效率会很低,因为每次都
有个新对象,解释需要把
原来对象中的元素先复制到新的
对象,然后再追加新的元素。
str 是个外,因为对字符
做 += 实在是太普遍,所以
CPython 对它做优化。
教训
要把可变对象放在元组。
增赋值是个原操作。 我
们刚才也看到, 它虽然抛出
异常, 但还是完成操作。
查看 Python 的字节码并难,
且它对我们解代码背后的运
机制很有帮助。
list.sort法和内置函数sorted
list.sort 法会就地排序表,
也就是说会把原表复制
份。
与 list.sort 相反的是内置函数
sorted,它会新建个表作为
返回值。
这个法可以接受任何形式的可
迭代对象作为参数,甚包括
可变序或成
管sorted 接受的是怎样的参
数,它最后都会返回个表。
bisect来管已排序的序
bisect 模块包含两个主要函数,
bisect 和 insort,两个函数都
分查找算法来在有序序中
查找或插元素。
bisect来搜索
bisect(haystack, needle) 在
haystack(草垛)搜索
needle(针)的位置,该位置满
的条件是,把 needle 插这
个位置之后,haystack 还能保持
升序。
bisect 函数其实是 bisect_right
函数的别名,后者还有个姊妹函
数叫 bisect_left。
bisect_left 返回的插位置是原
序中跟被插元素相等的元素
的位置,也就是新元素会被放置
于它相等的元素的前
bisect_right 返回的则是跟它相
等的元素之后的位置。
bisect.insort插新元素
排序很耗时,因此在得到个有
序序之后,我们最好能够保持
它的有序。
insort(seq, item) 把变 item
插到序 seq 中,并能保持
seq 的升序顺序。
insort 跟 bisect 样,有 lo 和
hi 两个可选参数来控制查找的
范围。它也有个变体叫
insort_left,这个变体在背后
的是 bisect_left。
当表是选时
虽然表既灵活简单,但对
各类需求时,我们可能会有好
的选择。
数组
如果我们需要个只包含数字的
表,那么 array.array list
效。
持所有跟可变序有关的操
作,包括 .pop、.insert
和 .extend。
还提供从件读取和存件的
快的法,如 .frombytes
和 .tofile。
Python 3.4 开始,数组类型
再持诸如 list.sort() 这种就地
排序法。
要给数组排序的话,得 sorted
函数新建个数组
a = array.array(a.typecode,
sorted(a))
内存视图
memoryview 是个内置类,它
能让户在复制内容的情况下
操作同个数组的同切。
memoryview.cast 的概念跟数组
模块类似,能同的式读写
同块内存数据,且内容字节
会随意移动。
memoryview.cast 会把同块内
存的内容打包成个全新的
memoryview 对象给你。
双向队和其他形式的队
collections.deque 类(双向队
)是个线程安全、可以快速
从两端添加或者删除元素的数据
类型。
双向队实现部分表所拥
有的法,也有些额外的符合
身设计的法
popleft 和 rotate
从队中间删除元素的操作会慢
些,因为它只对在头尾的操作
进优化。
append 和 popleft 都是原操
作,也就说是 deque 可以在多
线程程序中安全地当作先进先出
的栈使,使者需要担
资源锁的问题。
普通网友
- 粉丝: 17
- 资源: 314
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 4399GameSem_116_13955_207551_6.apk
- python 3.9.19源码编译包
- php-8.2.18-Win32-vs16-x64.rar
- 字节跳动青训营-抖音项目
- SQL资料手册,语句教程,高级查询语句语法
- 上位机和串口建立 Modbus 协议进行数据传输,并使用 Mysql 数据库存储,能够实现实时温湿度显示和动态变化曲线,历史数据
- Attachment 1_chazhi.xlsx
- 安卓项目,实现虚拟摇杆通过wifi串口发送nema-0183协议实现小吊舱方向控制
- 基于modbus协议的大屏数据监控,使用modbus slave模拟数据,串口服务器获取温湿度
- 下载资源.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0