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:]

切片高级法则:

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

 1 #: 切片返回新的序列,占用新的内存地址
 2 In[2]: li = [1,2,3,4]
 3 In[3]: lo=li[::]
 4 In[4]: id(li)
 5 Out[4]: 2316742428488
 6 In[5]: id(lo)
 7 Out[5]: 2316740137416
 8
 9 #: 切片属于浅拷贝
10 In[6]: lii = [1, [2,3,4], 3, 4]
11 In[7]: loo = lii[:2]
12 In[8]: id(lii[1])
13 Out[8]: 2316742399880
14 In[9]: id(loo[1])
15 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]

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

 1 In[2]: li = [1, 2, 3, 4]
 2
 3 #: 头部替换
 4 In[3]: li[:3] = [7, 8, 9]
 5 In[4]: li
 6 Out[4]: [7, 8, 9, 4]
 7
 8 #: 尾部替换
 9 In[5]: li[3:] = [5, 6, 7]
10 In[6]: li
11 Out[6]: [7, 8, 9, 5, 6, 7]
12
13 #: 中部替换
14 In[7]: li[2:4] = [‘a‘, ‘b‘]
15 In[8]: li
16 Out[8]: [7, 8, ‘a‘, ‘b‘, 6, 7]
17
18 #: 非等长替换
19 In[9]: li[2:4] = [1, 2, 3, 4]
20 In[10]: li
21 Out[10]: [7, 8, 1, 2, 3, 4, 6, 7]
22
23 In[11]: li[2:6] = [‘a‘]
24 In[12]: li
25 Out[12]: [7, 8, ‘a‘, 6, 7]
26
27 del li[2:3]  # [7, 8, 6, 7]

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

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

1 hasattr(‘abc‘, ‘__getitem__‘)

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

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

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

迭代器:

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

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

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

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

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

原文地址:https://www.cnblogs.com/1fengchen1/p/10271157.html

时间: 2024-08-30 06:34:37

Python切片功能剖析的相关文章

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

Python进阶:自定义对象实现切片功能 切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),在<Python进阶:切片的误区与高级用法>中,我介绍了切片的基础用法.高级用法以及一些使用误区.这些内容都是基于原生的序列类型(如字符串.列表.元组......),那么,我们是否可以定义自己的序列类型并让它支持切片语法呢?更进一步,我们是否可以自定义其它对象(如字典)并让它支持切片呢? 1.魔术方法:__getitem__() 想要使自定义对象支持切片语法并不难,只需

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下:

python之路-利用索引切片功能做一个简易的两个未知数的加法计算器,代码如下: #content = input('请输入内容:'),如用户输入:5 +9或 5 + 9 等,然后进行分割再进行计算. content = input('>>>').strip() #content 等于所输入的内容,strip:删除字符串左右两边的空格. index = content.find('+') ''' content内容中的两边的空格都删除了,但中间还有,现在我们只需要定位已知内容是加法,两边

Python切片详解

先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递的键是一个特殊的slice对象.该对象拥有可描述所请求切片方位的属性,例如: 1 a = [ 1, 2, 3, 4, 5, 6 ] 2 x = a [ 1 : 5 ] # x = a.__getitem__( slice ( 1, 5, None ) ) 3 a [ 1 : 3 ] = [10, 1

Python源码剖析笔记6-函数机制

Python的函数机制是很重要的部分,很多时候用python写脚本,就是几个函数简单解决问题,不需要像java那样必须弄个class什么的. 本文简书地址:http://www.jianshu.com/p/d00108741a18 1 函数对象PyFunctionObject PyFunctionObject对象的定义如下: typedef struct { PyObject_HEAD PyObject *func_code; /* A code object */ PyObject *func

Python源码剖析笔记2-Python整数对象

Python源码剖析笔记2-Python整数对象 本文简书地址: http://www.jianshu.com/p/0136ed90cd46 千里之行始于足下,从简单的类别开始分析,由浅入深也不至于自己丧失信心.先来看看Python整数对象,也就是python中的PyIntObject对象,对应的类型对象是PyInt_Type. 1 Python整数对象概览 为了性能考虑,python中对小整数有专门的缓存池,这样就不需要每次使用小整数对象时去用malloc分配内存以及free释放内存.pyth

Python数据功能转义以及运算符总结-ten day

一.赋值运算符 赋值运算把a的值,经过运算,把运算结果赋值给b. 二.比较运算符 比较运算的结果返回的值是bool值,为True和False,一般用来控制程序执行的流程,比如说下面的代码: 1 if a == b: 2 3 执行print(......) 4 5 else: 6 7 执行print(----) 三.逻辑运算 逻辑运算返回结果为布尔值,控制程序计算:x and c :and为真时后面都为真; a and b or c :and为假时计算or是否为真,为真继续运算,为假为False;

精密解析Python切片的用法

众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组-)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象.通常来说,切片的作用就是截取序列对象,然而,对于非序列对象,我们是否有办法做到切片操作呢?在使用切片的过程中,有什么要点值得重视,又有什么底层原理值得关注呢?本文将主要跟大家一起来探讨这些内容,希望我能与你共同学习进步. 学习Python中有不明白推荐加入交流

从Python切片[::-1]可实现序列逆序引出的思考

初学Python,相较于之前所学的C/C++,其序列的索引和切片功能是第一个给人以幸福感的特性 既可以正向索引,0,1,2..., 也可以逆向索引,-1, -2, -3... 支持切片,其格式为[start : end: step],表示从start以step为步长直到end,但不包括end,start默认值为0,end默认值为到结束,step默认为1 然后,有一些初级小结论,比如:对于序列a = [1, 2, 3],  a[ : : -1]可实现逆序,即[3, 2, 1] 这里我产生了一个疑惑

《python源码剖析》笔记 Python虚拟机框架

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1. Python虚拟机会从编译得到的PyCodeObject对象中依次读入每一条字节码指令, 并在当前的上下文环境中执行这条字节码指令. Python虚拟机实际上是在模拟操作中执行文件的过程 PyCodeObject对象中包含了字节码指令以及程序的所有静态信息,但没有包含 程序运行时的动态信息--执行环境(PyFrameObject) 2.Python源码中的PyFrameObject