根据序列中存储的是值还是引用,序列可以分为扁平序列和容器序列。
根据序列是否可以被修改,分为可变序列和不可变序列。
a. 容器序列(存储的不是值,而是对象的引用,正因为如此,容器中可以容纳任何数据类型):list,tuple, deque
b. 扁平序列(存储的都是值,而不是引用,且基础数据类型相同):str, bytes, byearray, array.array
c. 可变序列(指可以在原内存地址上对数据进行修改的序列):list, deque, bytearray, array
d. 不可变序列(不可变序列指的是不可以在原内存地址上对序列进行修改;一旦修改,就会创建新的对象):str, tuple, bytes
注:不可变指的是容器中每一个元素的引用不可变,而不是每一个元素的值不可变。
Python内置块collections.abc中,为可变序列和不可变序列提供了两个基类Sequence和MutableSequence,都是抽象基类。
根据抽象基类的定义我们可以知道,抽象基类可以限定子类,通过声明对应的方法,限定子类的实例化对象。
什么是鸭子类型?
以序列来讲,即使一个类没有直接继承自Sequence,但是内部却实现了相应的几个方法,那么就可以称之为序列。即如果一个东西看起来像鸭子,走起来像鸭子,叫起来像鸭子,那他就是鸭子。
基础中我们提到对象的切片的时候,可以对列表进行切片。[start, stop, step],可以通过这个方式对一个列表进行切片,拿到我们指定的部分,也可以对列表的元素进行赋值。其实实现这些操作也是通过类的方法,生成列表类的基类中有方法getitem和setitem,当我们对列表进行操作的时候,实际上是实现类中的这两个方法。
# 如图所示,我们自定义了一个类A来模拟,方法A生成实例后,通过这两个方法接收键值和相应的值,生成或修改列表。
但是要通过这两个方法实现切片,还需要引入一个slice类的对象。这个类有start,stop,step三个属性,还有一个indices是成员函数,缺省的部分为None。
其中indices接收一个整数参数length,返回一个整数三元组,分别代表start,stop,step,但是与原来slice中的三个参数不同的是,这三个元素不再有None,且一定是[0, length]范围的有效索引。
1.定义:用来处理已排序的序列,用来维持已排序的序列。
2.分类
bisect模块主要有两类重要的函数:bisect和insort
A. bisect_left(L, x):在L中查找x,x存在时返回x左侧的位置,x不存在的时候返回应该插入的位置。
B. bisect_right(L, x):在L中查找x,x存在时返回x右侧的位置,x不存在的时候返回应该插入的位置
insort:利用二分查找算法在有序序列中插入元素
C. insort_left(L, x):将x插入到列表L中,x存在时插入右侧
D. insort_right(L, x):将x插入到列表L中,x存在时插入右侧
bisect:利用二分查找算法在有序序列中查找元素。
先介绍两个其它数据类型:array,deque
array和list的区别:array只能存放指定的数据类型
import array
my_array = array.array('i')
以上为指定数据类型
其余可以到类型中去查找其它array的方法。