Python——阶段性总结(二)

十四. 序列

1.类型分类

根据序列中存储的是值还是引用,序列可以分为扁平序列和容器序列。

根据序列是否可以被修改,分为可变序列和不可变序列。

a. 容器序列(存储的不是值,而是对象的引用,正因为如此,容器中可以容纳任何数据类型):list,tuple, deque

b. 扁平序列(存储的都是值,而不是引用,且基础数据类型相同):str, bytes, byearray, array.array

c. 可变序列(指可以在原内存地址上对数据进行修改的序列):list, deque, bytearray, array

d. 不可变序列(不可变序列指的是不可以在原内存地址上对序列进行修改;一旦修改,就会创建新的对象):str, tuple, bytes

注:不可变指的是容器中每一个元素的引用不可变,而不是每一个元素的值不可变。

2. 序列类型的协议

Python内置块collections.abc中,为可变序列和不可变序列提供了两个基类Sequence和MutableSequence,都是抽象基类。

根据抽象基类的定义我们可以知道,抽象基类可以限定子类,通过声明对应的方法,限定子类的实例化对象。

3.鸭子类型

什么是鸭子类型?

以序列来讲,即使一个类没有直接继承自Sequence,但是内部却实现了相应的几个方法,那么就可以称之为序列。即如果一个东西看起来像鸭子,走起来像鸭子,叫起来像鸭子,那他就是鸭子。

十五. 对象的切片

基础中我们提到对象的切片的时候,可以对列表进行切片。[start, stop, step],可以通过这个方式对一个列表进行切片,拿到我们指定的部分,也可以对列表的元素进行赋值。其实实现这些操作也是通过类的方法,生成列表类的基类中有方法getitem和setitem,当我们对列表进行操作的时候,实际上是实现类中的这两个方法。

Python——阶段性总结(二)_第1张图片

 # 如图所示,我们自定义了一个类A来模拟,方法A生成实例后,通过这两个方法接收键值和相应的值,生成或修改列表。

Python——阶段性总结(二)_第2张图片

 

但是要通过这两个方法实现切片,还需要引入一个slice类的对象。这个类有start,stop,step三个属性,还有一个indices是成员函数,缺省的部分为None。

其中indices接收一个整数参数length,返回一个整数三元组,分别代表start,stop,step,但是与原来slice中的三个参数不同的是,这三个元素不再有None,且一定是[0, length]范围的有效索引。

自定义切片类: Python——阶段性总结(二)_第3张图片

十六. bisect维护已排序序列

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只能存放指定的数据类型

Python——阶段性总结(二)_第4张图片

import array

my_array = array.array('i')

以上为指定数据类型

其余可以到类型中去查找其它array的方法。

你可能感兴趣的:(自学系列,Python,开发语言,python,学习,pycharm,数据结构)