4Python切片功能剖析

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

 

切片基础法则:

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

2i, 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] vue怎么实现强制刷新组件?

[vue] vue怎么实现强制刷新组件&#xff1f; 强制重新渲染this.$forceUpdate()强制重新刷新某组件//模版上绑定key <SomeComponent :key"theKey"/> //选项里绑定data data(){return{theKey:0} } //刷新key达到刷新组件的目的 theKey;个人简介 我是歌谣&#x…

Success Rate CodeForces - 807C (数学+二分)

You are an experienced Codeforces user. Today you found out that during your activity on Codeforces you have made y submissions, out of which x have been successful. Thus, your current success rate on Codeforces is equal to x / y. Your favorite rational …

[vue] 实际工作中,你总结的vue最佳实践有哪些?

[vue] 实际工作中&#xff0c;你总结的vue最佳实践有哪些&#xff1f; .babelrc 是目前 babel-polyfill 的最佳实践 { "presets": [ [ "babel/preset-env", { "corejs": "3", "modules": false, "useBuiltIns": …

Epson打印机连接wifi

环境 Epson L3153 打印机联通无线光猫 背景 最近家里的联通宽带不太稳定&#xff0c;经常断网。今天打了联通客服电话&#xff0c;师傅上门来&#xff0c;说可能是光猫用的时间太长了&#xff0c;换了一个新的联通光猫&#xff0c;问题解决。 wifi的名称是 CU_Y3ft 和 CU_Y3…

[vue] vue给组件绑定自定义事件无效怎么解决?

[vue] vue给组件绑定自定义事件无效怎么解决&#xff1f; 两种方式 1、组件外部加修饰符.navtive 2、组件内部声明$emit(自定义事件)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一…

ES6笔记 -- 变量/语句声明

关于变量声明 let的作用是声明一个作用域为某个代码块({})的变量(称为块级作用域)let不允许变量提升(注: 变量的使用在声明之前)块级作用域里的let命令之前的区域称之为暂时性死区, 这意味着死区内即使是typeof操作也会出错let不允许在相同的作用域内重复声明同一个变量, 值得一…

[vue] vue的属性名称与method的方法名称一样时会发生什么问题?

[vue] vue的属性名称与method的方法名称一样时会发生什么问题&#xff1f; 键名优先级&#xff1a;props > data > methods个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起…

括号序列

题目描述 一个由小括号组成的字符串可以被称为一个括号序列。但一个括号序列可能并不满足括号匹配的要求。因此&#xff0c;我们可以进一步将满足括号匹配的括号序列成为“标准的括号序列。例如字符串")((())"是一个括号序列但不是标准的括号序列&#xff0c;而字符串…

[vue] vue变量名如果以_、$开头的属性会发生什么问题?怎么访问到它们的值?

[vue] vue变量名如果以_、$开头的属性会发生什么问题&#xff1f;怎么访问到它们的值&#xff1f; 报错 变量未定义 以 _ 或 $ 开头的属性 不会 被 Vue 实例代理&#xff0c;因为它们可能和 Vue 内置的属性、API 方法冲突。 你可以使用例如 $data.xxx或者_data.xxx 的方式访问…

[vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?

[vue] vue使用v-for遍历对象时&#xff0c;是按什么顺序遍历的&#xff1f;如何保证顺序&#xff1f; image 1、会先判断是否有iterator接口&#xff0c;如果有循环执行next()方法 2、没有iterator的情况下&#xff0c;会调用Object.keys()方法&#xff0c;在不同浏览器中&…

[vue] vue如果想扩展某个现有的组件时,怎么做呢?

[vue] vue如果想扩展某个现有的组件时&#xff0c;怎么做呢&#xff1f; 不对原组件进行更改的&#xff1a;使用Vue.extend直接扩展使用Vue.mixin全局混入HOC封装个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大…

typescript在ES3(IE7)环境下使用async、await

因为公司产品需要搞个Web App&#xff0c;但是又需要兼容IE7&#xff0c;这时候整个应用会非常复杂&#xff0c;尤其是在处理异步的时候&#xff0c;在我的选择中有两个方案 callback方案async/await经过衡量以后&#xff0c;决定使用async/await方案 配置typescript环境 $ mkd…

与歌谣通关前端面试题【CSS篇汇总目录】

我是歌谣 放弃很容易 但坚持一定很酷 欢迎 关注公众号小歌谣一起讨论前后端知识 CSS汇总 【CSS】 [css] 圣杯布局和双飞翼布局的理解和区别&#xff0c;并用代码实现 [css] CSS3有哪些新增的特性&#xff1f; [css] 在页面上隐藏元素的方法有哪些&#xff1f; [css] CSS选…

【LeetCode】按 tag 分类索引 (900题以下)

链表&#xff1a;https://www.cnblogs.com/zhangwanying/p/9797184.html &#xff08;共34题&#xff09; 数组&#xff1a;https://www.cnblogs.com/zhangwanying/p/9610923.html &#xff08;共139题&#xff09; 树&#xff1a;https://www.cnblogs.com/zhangwanying/p/67…

一个下载Google code源码的 绿色、迷你工具 MiniSVN v1.0

一个下载Google code源码的 绿色、迷你工具 MiniSVN v1.0 想下载Google code中的源码 不需要装各种软件&#xff0c;只需要一个小工具即可&#xff01; 如何使用&#xff1f; 访问一个谷歌开源项目网站&#xff0c;比如&#xff1a;https://code.google.com/p/deguang-ticke…

[vue] v-on可以绑定多个方法吗?

[vue] v-on可以绑定多个方法吗&#xff1f; <input type"text" :value"name" input"onInput" focus"onFocus" blur"onBlur" />个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c;…

[NOI2018]你的名字

SAM写的太不熟练了~~SAM上的线段树合并也不熟练~~~ 调了半天样例 题目大意&#xff1a; 给定一个S&#xff0c;Q次询问&#xff0c;每次给出T&#xff0c;l,r, 求对于S[l,r]&#xff0c;属于T的子串却不属于S[l,r]的子串有多少个 看上去挺简洁的一个问题。。。 暴力68pts 对于S…

Visual.Assist.X.V10.7.1940的汉化破解补丁

Visual Assist X V10.7.1940的汉化破解补丁&#xff0c;方便各位朋友。 从该版本开始&#xff0c;本博客会跟踪升级&#xff0c;请留意。 关于菜单的汉化请看&#xff1a;http://blog.csdn.net/afu45/article/details/9145293 汉化方法 先安装英文原版软件。下载地址&#…

此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址随便造成的。请稍候重试。 .

vs提示“此时无足够的可用内存&#xff0c;无法满足操作的预期要求&#xff0c;可能是由于虚拟地址随便造成的。请稍候重试。” 下载下面的补丁就可以了 . 下载地址&#xff1a; http://download.csdn.net/detail/afu45/4053280

java目录

阅读目录&#xff1a; 0.Java下载安装1.HelloWorld2.Java语言基础&#xff1a;关键字3.Java语言基础&#xff1a;表示符4.Java语言基础&#xff1a;注释5.Java语言基础&#xff1a;常量和变量6.Java语言基础&#xff1a;运算符7.Java语言基础&#xff1a;语句8.Java语言基础&am…