Pyhton中序列类型支持切片功能,比如list:

>>> numbers = [1, 2, 3, 4, 5]>>> numbers[1:3]

[2, 3]

tuple也是序列类型,同样支持切片。

(一)我们是否可以使自定义类型支持切片呢?

在Python中创建功能完善的序列类型不需要使用继承,只要实现符合序列协议的方法就可以,Python的序列协议需要__len__, __getitem__两个方法,比如如下的Vector类:

from array importarrayclassVector:

type_code= 'd'

def __init__(self, compoments):

self.__components =array(self.type_code, compoments)def __len__(self):return len(self.__components)def __getitem__(self, index):return self.__components[index]

我们在控制台查看下切片功能:

>>> v1 = Vector([1, 2, 3])>>> v1[1]2.0

>>> v1[1:2]

array('d', [2.0])

在这里我们将序列协议委托给self.__compoments(array的实例),只需要实现__len__和__getitem__,就可以支持切片功能了。

(二)那么Python的切片工作原理又是怎样的呢?

我们通过一个简单的例子来查看slice的行为:

classMySequence:def __getitem__(self, index):return index

>>> s1 =MySequence()>>> s1[1]1

>>> s1[1:4]

slice(1, 4, None)>>> s1[1:4:2]

slice(1, 4, 2)>>> s1[1:4:2, 7:9]

(slice(1, 4, 2), slice(7, 9, None))

我们看到:

(1)输入整数时,__getitem__返回的是整数

(2)输入1:4表示法时,返回的slice(1, 4, None)

(3)输入1:4:2表示法,返回slice(1, 4, 2)

(4)[]中有逗号,__getitem__收到的是元组

现在我们来仔细看看slice本身:

>>>slice

>>>dir(slice)

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge

__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr_

_','__setattr__','__sizeof__','__str__','__subclasshook__','indices', 'star

t', 'step', 'stop']

我们看到了熟悉的start, stop, step属性,还有一个不熟悉的indices,用help查看下(Pyhon的控制台是很有价值的工具,我们常常使用dir,help命令获得帮助):

Help on method_descriptor:

indices(...)

S.indices(len)->(start, stop, stride)

Assuming a sequence of length len, calculate the startandstop

indices,andthe stride length of the extended slice described by

S. Out of bounds indices are clippedina manner consistent with the

handling of normal slices.

这里的indices能用于优雅的处理缺失索引和负数索引,以及长度超过目标序列长度的切片,这个方法会整顿输入的slice元组,把start, stop, step都变成非负数,且落在指定长度序列的边界内:

比如:

>>> slice(None, 10, 2).indices(5) #目标序列长度为5,自动将stop整顿为5

(0, 5, 2)>>> slice(-1, None, None).indices(5) #将start = -1, stop = None , step = None 整顿为(4, 5, 1)

(4, 5, 1)

如果没有底层序列作为代理,使用这个方法能节省大量时间

上面了解了slice的工作原理,我们使用它重新实现Vector类的__getitem__方法:

from array importarrayfrom numbers importIntegralclassVector:

type_code= 'd'

def __init__(self, compoments):

self.__components =array(self.type_code, compoments)def __len__(self):return len(self.__components)def __getitem__(self, index):

cls=type(self)ifisinstance(slice, index):return cls(self.__components[index]) #使用cls的构造方法返回Vector的实例

elifisinstance(Integral, index):return self.__components[index]else:raise TypeError("{} indices must be integers or slices".format(cls))

fluent python 2nd edition_Fluent Python: Slice相关推荐

  1. fluent python 2nd edition_fluent python读书笔记2.2节

    列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列. 可以写出可读性更好更高效的代码 2.2.1 列表推导和可读性 可读性对比 例1: >>> ...

  2. 成功解决tensorflow.python.framework.errors_impl.InvalidArgumentError: slice index 1 of dimension 0 out o

    成功解决tensorflow.python.framework.errors_impl.InvalidArgumentError: slice index 1 of dimension 0 out o ...

  3. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(2)Scapy实现ARP缓存投毒

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(2)Scapy实现ARP缓存投毒 文章目录 黑帽python第二版(Bl ...

  4. python内置函数slice()

    python内置函数slice() 一.简介 slice() 函数实现切片对象,主要用在切片操作函数里的参数传递.可以用在任何可以被切片的地方 二.详解 返回一个切片对象,表示由 range(star ...

  5. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...

  6. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(3)暴力破解目录与文件位置

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(3)暴力破解目录与文件位置 文章目录 黑帽python第二版(Black Hat P ...

  7. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(4)暴力破解HTML表单身份验证

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第五章 WEB黑客(4)暴力破解HTML表单身份验证 文章目录 黑帽python第二版(Black Ha ...

  8. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第八章 Windows常见特洛伊木马任务(1)有趣的键盘记录器

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第八章 Windows常见特洛伊木马任务(1)有趣的键盘记录器 文章目录 黑帽python第二版(Bla ...

  9. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第八章 Windows常见特洛伊木马任务(4)沙箱检测

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第八章 Windows常见特洛伊木马任务(4)沙箱检测 文章目录 黑帽python第二版(Black H ...

最新文章

  1. 手把手教你在Python中实现文本分类(附代码、数据集)
  2. boost信号量 boost::interprocess::interprocess_semaphore的用法
  3. CSDN的Markdown编辑器常用语句
  4. ML之LiRLasso:基于datasets糖尿病数据集利用LiR和Lasso算法进行(9→1)回归预测(三维图散点图可视化)
  5. c:forEach循环的List为String时的写法
  6. Python map, reduce, filter和sorted
  7. Spring的AOP理解
  8. 解决eclipse无法解析导入org.eclipse.swt库
  9. 二维数组作为形参,传递二维数组的值
  10. 小算法小心情:背包问题就是陪你看花开向阳
  11. Flask cookie API(response.set_cookie,request.cookies)
  12. 阿里云服务器是如何计费的?有哪些计费方式
  13. 绿盾加密导致Visual Stdio无法使用
  14. 电信光猫dns服务器修改,电信光猫自动获取的DNS被修改,肿么改回来?
  15. c语言迷宫问题程序流程图,c语言程序设计 迷宫问题
  16. Mutual Graph Learning for Camouflaged Object Detection阅读笔记
  17. 计算机的命令用英语怎么说,计算机外部和内部命令的英语及词汇
  18. 【前端学习】前端学习第十九天:浏览器对象模型(BOM)中的对象
  19. IDEA设置背景和定时更换背景
  20. 三维电影特效动画制作软件——Houdini 17.5

热门文章

  1. 银内胆保温杯的功效和作用
  2. mac 设置为允许来自任何来源都可以
  3. 美团面试全流程详解(一面 + 二面)
  4. ES6学习笔记:箭头函数
  5. 1229:电池的寿命
  6. matlab mcr调用,mcr环境下,vs调用matlab,报错access violation
  7. 如何将STP文件转换为CAD文件
  8. Vue ElementUI 实现 Table 多列数据 checkBox选择框
  9. 【Unity3D】 物体始终朝向目标物体的实现
  10. HDU - 最大报销额(01背包|贪心)