《编写高质量Python代码的59个有效方法》——第5条:了解切割序列的办法

简介:

本节书摘来自华章社区《编写高质量Python代码的59个有效方法》一书中的第5条:了解切割序列的办法,作者[美]布雷特·斯拉特金(Brett Slatkin),更多章节内容可以访问云栖社区“华章社区”公众号查看

第5条:了解切割序列的办法
Python提供了一种把序列切成小块的写法。这种切片(slice)操作,使得开发者能够轻易地访问由序列中的某些元素所构成的子集。最简单的用法,就是对内置的list、str和bytes进行切割。切割操作还可以延伸到实现了__getitem__和__setitem__这两个特殊方法的Python类上(参见本书第28条)。
切割操作的基本写法是somelist[start:end],其中start(起始索引)所指的元素涵盖在切割后的范围内,而end(结束索引)所指的元素则不包括在切割结果之中。

如果从列表开头获取切片,那就不要在start那里写上0,而是应该把它留空,这样代码看起来会清爽一些。

如果切片一直要取到列表末尾,那就应该把end留空,因为即便写了,也是多余。

在指定切片起止索引时,若要从列表尾部向前算,则可使用负值来表示相关偏移量。如果采用下面这些写法来切割列表,那么即便是刚刚接触代码的人也能立刻明白程序的意图。由于这些写法都不会令人惊讶,所以笔者推荐大家在代码中放心地使用。

切割列表时,即便start或end索引越界也不会出问题。利用这一特性,我们可以限定输入序列的最大长度。

反之,访问列表中的单个元素时,下标不能越界,否则会导致异常。

请注意,如果使用负变量作为start索引来切割列表,那么在极个别情况下,可能会导致奇怪的结果。例如,somelist[-n:]这个表达式,在n大于1时可以正常运作,如当n为3时,somelist[-3:]的结果是正常的。然而,当n为0时,表达式somelist[-0:]则成了原列表的一份拷贝。
对原列表进行切割之后,会产生另外一份全新的列表。系统依然维护着指向原列表中各个对象的引用。在切割后得到的新列表上进行修改,不会影响原列表。

在赋值时对左侧列表使用切割操作,会把该列表中处在指定范围内的对象替换为新值。与元组(tuple)的赋值(如a, b = c[:2])不同,此切片的长度无需新值的个数相等。位于切片范围之前及之后的那些值都保留不变。列表会根据新值的个数相应地扩张或收缩。

如果对赋值操作右侧的列表使用切片,而把切片的起止索引都留空,那就会产生一份原列表的拷贝。

如果对赋值操作左侧的列表使用切片,而又没有指定起止索引,那么系统会把右侧的新值复制一份,并用这份拷贝来替换左侧列表的全部内容,而不会重新分配新的列表。

要点
不要写多余的代码:当start索引为0,或end索引为序列长度时,应该将其省略。
切片操作不会计较start与end索引是否越界,这使得我们很容易就能从序列的前端或后端开始,对其进行范围固定的切片操作(如a[:20]或a[-20:])。
对list赋值的时候,如果使用切片操作,就会把原列表中处在相关范围内的值替换成新值,即便它们的长度不同也依然可以替换。

相关文章
|
2月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
185 26
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
323 1
|
2月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
174 1
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
236 100
|
1月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
370 95
|
2月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
237 104
|
2月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
432 99
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
153 88
|
2月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
265 102
|
2月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
388 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡