内置序列类型

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循化语句 很长,通过 列表推导或生成器表达式 的方式可以缩短程序语句的长度,另外还能有效的提升程序的执行效率。

list_comps

列表推导式生成器表达式 的区别:

  • 使用的符号不同,列表推导式使用 [表达式],生成器表达式使用 (表达式)
  • 列表推导式返回的是 列表类型,生成器表达式返回的是 生成器,需要迭代了,才能产生真正的值。

PS:字典推导,和上面两者相同,不过产生的结果为字典类型。

list_comps_2

使用 {key: value} 形式的是字典,而 {key} 形式的是集合。

元组

在python中 元组(tuple) 一般用来存放不可变列表,类似于C/C++中的 const变量

但在Python中,元组不一定是不可变的!!!

2_tuple_change_value

可以看到,当存入的变量为 可变序列 时,云组实际上存放的是引用,改变原始的值时,元组内的值也跟着改变。

另外在模块 collections 中还存在 具名元组(namedtuple)。可以利用其作为一个简单的类使用。

2_namedtuple

切片

在Python中,像list、tuple、str这类序列类型都支持切片操作。切片选择的范围是 左闭右开,最左边的索引为零,当然 索引也可以为负数!!表示的是从最末尾开始倒数的位置索引。

2_list_slice

其他的自定义对象也能实现切片的功能,只需要在对象中实现特殊方法 __getitem__,在使用时,Python会对 obj[start:stop:step] 调用 obj.__getitem__(slice(start, stop, step))

list.sort 和 内置函数sorted

两者都是将目标列表进行排序,不过使用 列表的sort函数 会将列表本身进行排序,而 内置的sorted函数 则会新生成一个列表返回。

2_list_sort_and_sorted

memoryview

memoryview 是python中的一个内置类,功能是在内存上操作对象。

2_memoryview

上面是将转化为无符号字符类型的内存视图中的第6个元素改变成4,内存视图中由 0000 0000 -> 0000 0100,大小端转换一下,就是 1024的二进制形式