<4>Python切片功能剖析
引用文章: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切片功能剖析的更多相关文章
- Python进阶:自定义对象实现切片功能
2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
- python切片详解
先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递 ...
- 详解Python 切片语法
Python的切片是特别常用的功能,主要用于对列表的元素取值.这篇文章主要介绍了详解Python 切片语法,需要的朋友可以参考下 Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片 ...
- NumSharp的数组切片功能
NumSharp的数组切片功能 原文地址:https://medium.com/scisharp/slicing-in-numsharp-e56c46826630 翻译初稿(英文水平有限,请多包涵): ...
- 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...
- 关于javascript里面仿python切片操作数组的使用方法
其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...
- 流畅的Python——切片
2.4 切片 在 Python 里,像列表(list).元组(tuple)和字符串(str)这类序列类型都支持切片操作,但是实际上切片操作比人们所想象的要强大很多. 在我个人的使用经历来看,在算法实践 ...
- 笔记三:python乱码深度剖析一
一:学习内容 python编码转换 python乱码原因深入解析 二:python编码转换 1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的. ...
随机推荐
- [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 ...
- [Swift]LeetCode553. 最优除法 | Optimal Division
Given a list of positive integers, the adjacent integers will perform the float division. For exampl ...
- 是程序员,就用python导出pdf
这两天一直在做课件,我个人一直不太喜欢PPT这个东西--能不用就不用,我个人特别崇尚极简风. 谁让我们是程序员呢,所以就爱上了Jupyter写课件,讲道理markdown也是个非常不错的写书格式啊. ...
- React中的通讯组件
1.父传子: 传递:当子组件在父组件中当做标签使用的时候,给当前子组件绑定一个自定义属性,值为需要传递的数据 接收:在子组件内部通过this.props进行接收 2.子传父 传 ...
- Java连接数据库之SQLServer
工具: eclipse Microsoft SQL Server SQL Server连接驱动:mssql-jdbc-6.4.0.jre8.jar SQL script代码 CREATE DATABA ...
- Zara带你快速入门WPF(1)---开篇
一.引言 我们时常可以看到园友们在讨论WPF与WinForm!它们两个的激情对决,看到大家热情洋溢的评论,搞技术的我也是深受感动. 二.走势 但抱歉的是,我无法预测未来WPF会怎么样.乔布斯说过这么一 ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- 什么样的IT业务适合外包?
很多公司都应该遇到过这样的问题,什么样的IT业务才适合外包呢? 百度大家都可以百度的到一些信息,比如: 针对这样的推荐答案,是否也需要认真思考一下,我需要外包的业务是什么样的业务?是不是真的适合外包? ...
- 使用ML.NET和Azure Function进行机器学习 - 第1部分
介绍 一提到机器学习,总是让人望而生畏.幸运的是,Azure正在想方设法让开发人员更容易进入机器学习.ML.NET是Microsoft Research专为.NET开发人员开发的机器学习框架,因此您可 ...
- WebAssembly完全入门——了解wasm的前世今身
前言 接触WebAssembly之后,在google上看了很多资料.感觉对WebAssembly的使用.介绍.意义都说的比较模糊和笼统.感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成 ...