笔记:Fluent python 第二章 数组
-
按存储类型分类
- 容器序列 储存不同类型数据:list、tuple、collections.deque
- 扁平序列 储存相同类型数据:str、bytes、bytearray、memoryview、array.array
-
按可变与否分类
- 可变 :list、bytearray、array.array、collections.deque、memoryview
- 不可变:tuple、str、bytes
列表推导和生成器
列表推导式
- python3中不会出现2.x中出现的列表推导变量泄露
|
|
|
|
- 列表推导能够达到filter、map组合起来的效果
|
|
- 生成笛卡尔积 外层的循环在列表推导式中靠前
|
|
元组
元组特点
- 不可变
- 位置信息是对多个数据的记录
拆包
-
平行赋值
12a, b = (1, 2)a, b = b, a -
*号运算符
- 把一个可迭代对象拆开作为函数的参数
1234567820, 8)divmod((2, 4)20, 8))divmod((Traceback (most recent call last):File "<stdin>", line 1, in <module>TypeError: divmod expected 2 arguments, got 120, 8))divmod(*((2, 4)
- 把一个可迭代对象拆开作为函数的参数
-
_ * 占位符号
- _ 可替代不关心的变量
- * 可获取不确定数量的参数(only in python3)
|
|
- 嵌套拆包
1231, 2, (3, 4), (5, 6, 7))a, b, (c, d), e = (a, b, c, d, e(1, 2, 3, 4, (5, 6, 7))
具名元组
- 位于collections.nametuple
- 类的实例和元组消耗内存相同,因为字段名在对应的类里
- 初始化
City = nametuple('City', 'name country plpulation')
- 第一个参数为类名
- 第二个为包含数个字符串的可迭代对象 或 一个整个字符串以空格为分隔
- 方法
- _fields 返回所有字段名
- _asdict 返回所有键值对
不可变性
- 元组支持 s + s2拼接,不支持s += s2就地拼接
- 只支持读操作类别的方法,比如包含、统计数量、取值、迭代、取长度
切片
- 切片和区间会忽略最后一个元素
- seq[start:end:step] 会调用 seq.__getitem__(slice(start, end, step))
- 切片对象
seq[slice(0, 6, 2)] = seq[0:6:2]
name = slice(0, 6); print seq[name] 获得更好的可读性
- 多维切片见numpy中矩阵的 a[m:n, i:j]
- 给切片进行切除、修改
1234567891011121314151620))l = list(range(l[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]# 删除切片del(l[::2])l[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]# 修改切片# 前后数量不必一致2:6] = [100]l[l[1, 3, 100, 13, 15, 17, 19]# 前后数量需一致1::2] = [1000, 2000, 3000]l[l[1, 1000, 100, 2000, 15, 3000, 19]
序列的* 和 +
- 两个操作都不会修改原有的操作对象,而是构建全新的序列
- 如果序列内为某些变量的引用,*后可能只是得到几个相同变量的引用
1234567'_']*3 ] * 3a = [ [a[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]0][0] = 'o'a[a[['o', '_', '_'], ['o', '_', '_'], ['o', '_', '_']]]
序列的增量赋值
- 如果序列存在
__iadd__
方法,会调用他进行就地加法 - 如果不存在iadd,或序列不可变,会先调用
__add__
创建新的对象然后赋值给变量 - 乘法对应的是
__imul__
和__mul__
+=的迷题
|
|
- 增值操作不是原子操作,尽管抛出异常仍完成了操作
- 不要將可变对象放在元组里
排序
- list.sort 就地排序,返回None
- sorted 函数可传入可变不可变对象,新建一个列表作为返回值
- sorted的key参数在max min itertools.groupby heapq.nlargest 也有体现#
修改列表并保持有序
- biscet库可使用二分法查找某个元素应该插入有序列表的位置
biscet.biscet
- 也可以直接查找位置并插入
biscet.insort
- sortedcollection集成了biscet的功能,且更为强大
近期评论