-
序列(用 C 实现):
- 容器序列:list、tuple、collections.deque
存放的是引用,由于引用可以指向包括自身的任意类型,故可以嵌套 - 扁平序列:str、bytes、bytearray、memoryview、array.array
存放的是值,原子数据类型,不能嵌套
- 容器序列:list、tuple、collections.deque
通用操作:迭代、切片、排序、拼接
Python 忽略()、[]、{} 的换行,续行符\
内存泄漏
并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。ord():字符转Unicode码位
chr():Unicode码位转字符-
*可把可迭代对象拆包作为函数参数。获取不确定数量的参数
-
_占位符可以只元组拆包出只感兴趣的那部分(只对应一个变量,且是匿名)
-
namedtuple
类属性:_fields
类方法:_make(iterable)。作用相当 (*data)。把可迭代对象拆包作为函数参数
实例方法:_asdict()。collections.OrderedDict 友好形式返回
-
切片
有名字切片
切片赋值
-
+和 * 拼接
容器序列存放的是对象的引用,扁平序列存放的是对象的值
*用来拼接嵌套列表时才需要注意:
*拼接三个引用指向同一个列表,追加同一对象三次到列表,相当于:
正确做法:
-
增量赋值
- += 对应 iadd 方法;*= 对应 imul 方法
- i 代表就地,a +=b,不会产生新对象(所以不可变对象没有该方法,强行使用只会调用 add 方法);
类似 a.extend(b),也不会产生新对象 ; - a = a + b 则会产生新对象
-
特例:
由于对 str 做 += 太普遍,CPython 对它作了优化:初始化时预留额外可扩展空间,增量操作时直接放入扩展空间,就不必复制原 str 到新位置了
-
排序
-
Python 排序算法——Timsort 是稳定的,即:两元素比不出大小,但每次排序结果它们的相对位置和原列表一样
一个 Python 惯例:如果返回 None,那么方法对参数(对象)进行的是就地改动,没有新对象产生
如:random.shuffle()、list.sort()、list.reverse()。shuffle 意为洗牌。
缺点:不能形成连贯接口(fluent interface),也就是因为返回 None,所有不能嵌套到表达式中内置函数 sorted 则相反,接受任何形式可迭代对象,返回一个新对象列表
-
-
bisect 管理已排序序列
基于二分查找算法(binary select),可在很长序列中作为 index 的替代
插入新元素后仍保持有序
-
当列表不一定是首选
- 数组 array 背后是数字的机器翻译,即字节表述,更适合存放浮点数,而 list 存放的是 float 对象
- 双向队列 deque 更适合对序列做先进先出操作
- set 对包含操作(in)做过优化,但它不是序列,因为它是无序的
-
数组
- array.tofile(fp)、array.fromfile(fp, size)
array('d') 代表双精度浮点数组,h 代表有符号 shortint - 如果以浮点数形式将所有数字写到文本文件,慢7倍
如果用文本文件读取,则用 float 方法将文字转换为浮点数,慢60倍 -
array 不支持就地排序,所以
新建时:array.array(a.typecode, sorted(a))
添加新元素时:bisect.insort
- array.tofile(fp)、array.fromfile(fp, size)
-
内存视图
以不同方式读取同一块内存,即在不同数据结构之间共享内存
-
NumPy
-
deque