引用文章: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. [Swift]LeetCode86. 分隔链表 | Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. [Swift]LeetCode553. 最优除法 | Optimal Division

    Given a list of positive integers, the adjacent integers will perform the float division. For exampl ...

  3. 是程序员,就用python导出pdf

    这两天一直在做课件,我个人一直不太喜欢PPT这个东西--能不用就不用,我个人特别崇尚极简风. 谁让我们是程序员呢,所以就爱上了Jupyter写课件,讲道理markdown也是个非常不错的写书格式啊. ...

  4. React中的通讯组件

    1.父传子:     传递:当子组件在父组件中当做标签使用的时候,给当前子组件绑定一个自定义属性,值为需要传递的数据     接收:在子组件内部通过this.props进行接收 2.子传父     传 ...

  5. Java连接数据库之SQLServer

    工具: eclipse Microsoft SQL Server SQL Server连接驱动:mssql-jdbc-6.4.0.jre8.jar SQL script代码 CREATE DATABA ...

  6. Zara带你快速入门WPF(1)---开篇

    一.引言 我们时常可以看到园友们在讨论WPF与WinForm!它们两个的激情对决,看到大家热情洋溢的评论,搞技术的我也是深受感动. 二.走势 但抱歉的是,我无法预测未来WPF会怎么样.乔布斯说过这么一 ...

  7. 『玩具装箱TOY 斜率优化DP』

    玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  8. 什么样的IT业务适合外包?

    很多公司都应该遇到过这样的问题,什么样的IT业务才适合外包呢? 百度大家都可以百度的到一些信息,比如: 针对这样的推荐答案,是否也需要认真思考一下,我需要外包的业务是什么样的业务?是不是真的适合外包? ...

  9. 使用ML.NET和Azure Function进行机器学习 - 第1部分

    介绍 一提到机器学习,总是让人望而生畏.幸运的是,Azure正在想方设法让开发人员更容易进入机器学习.ML.NET是Microsoft Research专为.NET开发人员开发的机器学习框架,因此您可 ...

  10. WebAssembly完全入门——了解wasm的前世今身

    前言 接触WebAssembly之后,在google上看了很多资料.感觉对WebAssembly的使用.介绍.意义都说的比较模糊和笼统.感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成 ...