流畅的Python - 第2章-序列构成的数组
Contents
内置序列类型
Python标准库用C实现了丰富的序列类型。
- 容器序列: list、tuple和collections.deque能存放不同类型的数据。
- 扁平序列: str、bytearray、memoryview和array.array,这类序列只能容纳一种类型。
容器序列 存放的是他们所包含的任意类型的对象的引用,而 扁平序列 存放的是值而不是引用。另一种说法是,扁平序列 是一段连续的内存空间,类似于c/c++中堆栈内存的分配。
按照能否被修改来分类:
- 可变序列: list、bytearray、array.array、collections.deque和memoryview。
- 不可变序列:tuple、str和bytes。
列表推导与生成器表达式
Python 中最赞的一个使用方式是 列表推导与生成器表达式。
一般的 for循化语句 很长,通过 列表推导或生成器表达式 的方式可以缩短程序语句的长度,另外还能有效的提升程序的执行效率。
列表推导式 和 生成器表达式 的区别:
- 使用的符号不同,列表推导式使用
[表达式]
,生成器表达式使用(表达式)
。 - 列表推导式返回的是 列表类型,生成器表达式返回的是 生成器,需要迭代了,才能产生真正的值。
PS:字典推导,和上面两者相同,不过产生的结果为字典类型。
使用 {key: value}
形式的是字典,而 {key}
形式的是集合。
元组
在python中 元组(tuple) 一般用来存放不可变列表,类似于C/C++中的 const变量。
但在Python中,元组不一定是不可变的!!!
可以看到,当存入的变量为 可变序列 时,云组实际上存放的是引用,改变原始的值时,元组内的值也跟着改变。
另外在模块 collections 中还存在 具名元组(namedtuple)。可以利用其作为一个简单的类使用。
切片
在Python中,像list、tuple、str这类序列类型都支持切片操作。切片选择的范围是 左闭右开,最左边的索引为零,当然 索引也可以为负数!!表示的是从最末尾开始倒数的位置索引。
其他的自定义对象也能实现切片的功能,只需要在对象中实现特殊方法 __getitem__
,在使用时,Python会对 obj[start:stop:step]
调用 obj.__getitem__(slice(start, stop, step))
。
list.sort 和 内置函数sorted
两者都是将目标列表进行排序,不过使用 列表的sort函数 会将列表本身进行排序,而 内置的sorted函数 则会新生成一个列表返回。
memoryview
memoryview 是python中的一个内置类,功能是在内存上操作对象。
上面是将转化为无符号字符类型的内存视图中的第6个元素改变成4,内存视图中由 0000 0000 -> 0000 0100
,大小端转换一下,就是 1024的二进制形式。