引用文章: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. iOS URL Schemes与漏洞的碰撞组合

    iOS URL Schemes与漏洞的碰撞组合 前言 iOS URL Schemes,这个单词对于大多数人来说可能有些陌生,但是类似下面这张图的提示大部分人应该都经常看见: 今天要探究的就是:了解iO ...

  2. [Swift]LeetCode119. 杨辉三角 II | Pascal's Triangle II

    Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...

  3. [Swift]LeetCode556. 下一个更大元素 III | Next Greater Element III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  4. [Swift]LeetCode847. 访问所有节点的最短路径 | Shortest Path Visiting All Nodes

    An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...

  5. 【原创】一文掌握 Linux 性能分析之 I/O 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Li ...

  6. iOS学习——Quartz2D学习之UIKit绘制

    iOS学习——Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...

  7. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  8. AspNetCore 文件上传(模型绑定、Ajax) 两种方式 get到了吗?

    就目前来说,ASP.NET Core2.1了,已经相当成熟了,希望下个项目争取使用吧!! 上传文件的三种方式("我会的,说不定还有其他方式") 模型绑定 Ajax WebUploa ...

  9. bootstrap4的出现(或这篇文章可以叫做bs4与bs3的区别)

    前言:在bootstrap4出现之后修改了bootstrap3的不方便之处,让使用框架的前端开发者更加便捷..(bootstrap下文中简称为bs) 一.栅格系统 相对于原来的bs3,bs4具有了范围 ...

  10. Python爬虫入门教程 22-100 CSDN学院课程数据抓取

    1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net/ ...