引用文章:https://mp.weixin.qq.com/s/NZ371nKs_WXdYPCPiryocw

切片基础法则:

(1)公式[i : n : m],i为起始位置索引(当i为首位0可省略),i+n为结束位置索引(当n为长度len(li)可省略),m为步长,默认1,禁止0。

(2)i, n同号:从序列的第i位索引起,向右取n-i位,按m间隔过滤。

i, n异号:从序列的第i位索引起,向右取(len(list)-n)-i位,按m间隔过滤。

切片法则推导:

(1)当m>0,且 i>0 时:从第 i 位起,取 n-i 位元素(i, n同号)  |  取 (lenlist)-n)-i 位元素(i, n异号);

(2)当m>0,且 i<0 时:从倒数第 |i| 位起,取 n-i 位元素(i, n同号)  |  取 (n-len(list))-i 位元素(i, n异号);

(3)当m<0, 且 i>0 时:先翻转列表,从第 i 位起,取 n-i 位元素(i, n同号)  |  取 (lenlist)-n)-i 位元素(i, n异号);

(3)当m<0, 且 i<0 时:先翻转列表,从倒数第 |i| 位起,取 n-i 位元素(i, n同号)  |  取 (n-len(list))-i 位元素(i, n异号);

表示整个列表:其中 X >= len(li)

li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]

切片高级法则:

切片的返回结果:一个新的序列,占用新的内存地址,是属于浅拷贝

 #: 切片返回新的序列,占用新的内存地址
In[2]: li = [1,2,3,4]
In[3]: lo=li[::]
In[4]: id(li)
Out[4]: 2316742428488
In[5]: id(lo)
Out[5]: 2316740137416 #: 切片属于浅拷贝
In[6]: lii = [1, [2,3,4], 3, 4]
In[7]: loo = lii[:2]
In[8]: id(lii[1])
Out[8]: 2316742399880
In[9]: id(loo[1])
Out[9]: 2316742399880

给切片赋值可迭代对象,可以达到列表实现拼接、替换的操作

列表拼接:使用“纯占位符”将两个列表拼接成一个列表

In[2]: li = [1, 2, 3, 4]

#: 拼接到头部
In[3]: li[:0] = [0]
In[4]: li
Out[4]: [0, 1, 2, 3, 4] #: 拼接到尾部
In[5]: li[len(li):] = [5, 7]
In[6]: li
Out[6]: [0, 1, 2, 3, 4, 5, 7] #:拼接到中部
In[7]: li[6:6] = [6]
In[8]: li
Out[8]: [0, 1, 2, 3, 4, 5, 6, 7]

列表替换:使用“非纯占位符”将一个列表的部分内容替换为另一个列表内容

 In[2]: li = [1, 2, 3, 4]

 #: 头部替换
In[3]: li[:3] = [7, 8, 9]
In[4]: li
Out[4]: [7, 8, 9, 4] #: 尾部替换
In[5]: li[3:] = [5, 6, 7]
In[6]: li
Out[6]: [7, 8, 9, 5, 6, 7] #: 中部替换
In[7]: li[2:4] = ['a', 'b']
In[8]: li
Out[8]: [7, 8, 'a', 'b', 6, 7] #: 非等长替换
In[9]: li[2:4] = [1, 2, 3, 4]
In[10]: li
Out[10]: [7, 8, 1, 2, 3, 4, 6, 7] In[11]: li[2:6] = ['a']
In[12]: li
Out[12]: [7, 8, 'a', 6, 7] del li[2:3] # [7, 8, 6, 7]

自定义切片的功能:__getitem__() 方法用于切片功能

怎么判断一个对象是否实现了这个方法呢?

 hasattr('abc', '__getitem__')

迭代、迭代对象、迭代器?

迭代:是一种遍历容器类型对象(例如字符串、列表、字典等等)的方式。

迭代对象:实现__iter__() 魔术方法的对象都是可迭代对象。

迭代器:

  • 可迭代对象不等于迭代器
  • 可迭代对象可以变为迭代器

  “一同两不同”,两者都有__iter__(),迭代对象的__getitem__()变为__next__()就成为跌倒器

  可迭代对象只能被“它遍历”,迭代器却还可以“自遍历”。

要实现迭代器拥有切片的功能?添加__getitem__() 方法。

通过借助 itertools 模块 islice() 方法,我们能实现迭代器切片,将两者的优势相结合,其主要用途在于截取大型迭代器(如无限数列、超大文件等等)的片段,实现精准的处理,从而大大地提升性能与效率。

<4>Python切片功能剖析的更多相关文章

  1. Python进阶:自定义对象实现切片功能

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  2. Python开发【第二章】:Python深浅拷贝剖析

    Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...

  3. python切片详解

    先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递 ...

  4. 详解Python 切片语法

    Python的切片是特别常用的功能,主要用于对列表的元素取值.这篇文章主要介绍了详解Python 切片语法,需要的朋友可以参考下 Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片 ...

  5. NumSharp的数组切片功能

    NumSharp的数组切片功能 原文地址:https://medium.com/scisharp/slicing-in-numsharp-e56c46826630 翻译初稿(英文水平有限,请多包涵): ...

  6. 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

    使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...

  7. 关于javascript里面仿python切片操作数组的使用方法

    其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...

  8. 流畅的Python——切片

    2.4 切片 在 Python 里,像列表(list).元组(tuple)和字符串(str)这类序列类型都支持切片操作,但是实际上切片操作比人们所想象的要强大很多. 在我个人的使用经历来看,在算法实践 ...

  9. 笔记三:python乱码深度剖析一

    一:学习内容 python编码转换 python乱码原因深入解析 二:python编码转换 1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的. ...

随机推荐

  1. LeetCode题解41.First Missing Positive

    41. First Missing Positive Given an unsorted integer array, find the first missing positive integer. ...

  2. [Swift]LeetCode396. 旋转函数 | Rotate Function

    Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by rotati ...

  3. [Swift]LeetCode525. 连续数组 | Contiguous Array

    Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...

  4. Redis 设计与实现 (八)--排序、慢查询日志、监视器

    一.排序 SORT <key>  对一个数字值的key进行排序 1.alpha 对字符串类型的键进行排序 2.asc / desc redis 默认升序排序asc desc 与之相反 3. ...

  5. Docker 搭建pxc集群 + haproxy + keepalived 高可用(一)

    一.首先需要安装好docker,安装方法可以参考之前一篇博文Centos7安装docker [root@localhost ~]# systemctl start docker [root@local ...

  6. PyCharm无法激活

    如果你激活软件遇到问题 (Pycharm.GoLand.idea.phpstorm.webstorm.sublime.ultraEdit.win10等等) 比如: 激活框提示Key is invali ...

  7. javascript ES6 新特性之 Promise,ES7 async / await

    es6 一经推出,Promise 就一直被大家所关注.那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向 ...

  8. 死磕 java集合之WeakHashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 WeakHashMap是一种弱引用map,内部的key会存储为弱引用,当jvm gc的时 ...

  9. 抓包工具Charles的使用教程

    参考:https://zhubangbang.com/charlesproxy 如果您是您一次使用Charles,可能对下面的感兴趣. Charles破解版免费下载和安装教程 Charles手机抓包设 ...

  10. 2018年Fintech金融科技关键词和入行互金从业必懂知识

    2018年过去大半,诸多关键词进入眼帘: 5G,消费降级,数据裸奔,新零售,AI,物联网,云计算,合规监管,风控,割韭菜,区块链,生物识别,国民空闲时间以及金融科技. 这些词充斥着我们的生活和时间,而 ...