Python 序列操作之切片

版权声明: https://blog.csdn.net/luoyayun361/article/details/82830063

前言

在Python所有序列中,有几种通用的操作,包括:索引、切片、相加、相乘和成员资格的检查。 其中切片算是 Python 的序列操作中比较特别的一种用法, 使用起来非常方便,并且功能也十分强大。今天主要总结关于切片的用法里面几个容易出错的点。

切片的简写

先来看个简答的示例:

>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> a[2:4]
[3, 4]
>>> a[1:5]
[2, 3, 4, 5]

如上所示,切片适合于提取序列的一部分,其中的编号非常重要:第一个索引是包含的第一个元素的编号,但第二个索引是切片后余下的第一个元素的编号。
简而言之就是,提供两个索引来指定切片的边界,其中第一个索引指定的元素包含在切片内,但是第二个索引指定的元素不包含在切片内。

如果要从列表末尾开始数,可使用负数索引,例如:

>>> a[-4:-1]
[7, 8, 9]

这样好像不能输出最后一个列表中最后一个数字。如果使用索引0,即到达列表末尾后再前进一步所处的位置,结果如下:

>>> a[-4:0]
[]

所以这里需要注意的是:在执行切片操作时,如果第一个索引指定的元素位于第二个索引指定的元素后面,那么结果就为空序列。
这里-4指定的元素为7,而0指定的元素为1,所以上面的语句返回为空序列。

那如果要输出序列的最后一个值,可以使用一种简写:如果切片结束于序列末尾,可省略第二个索引,如下:

>>> a[-4:]
[7, 8, 9, 10]

同样,如果切片始于序列开头,可省略第一个索引:

>>> a[:4]
[1, 2, 3, 4]

那如果要复制整个序列,可以两个索引都省略:

>>> a[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

更大的步长

切片操作时,我们通常显式或隐士地指定起点和终点,但通常省略另一个参数,即步长。在普通的切片中,步长为1。
示例:

>>> a[1:6:2]
[2, 4, 6]

上面代码显式指定了步长。如果步长大于1,将跳过一些元素,比如上面指定步长为2,那么将从七点和终点之间每隔一个元素提取一个元素。

使用步长时,前面两个指定也可以省略,如下:

>>> a[::3]
[1, 4, 7, 10]

注意:步长不能为0,否则无法移动。
示例:

>>> a[1:5:0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: slice step cannot be zero

如果步长为负数,将从右到做提取元素。
示例如下:

>>> a[6:1:-1]
[7, 6, 5, 4, 3]
>>> a[::-2]
[10, 8, 6, 4, 2]
>>> a[1:8:-2]
[]
>>> a[5::-2]
[6, 4, 2]
>>> a[:5:-2]
[10, 8]

如果是第一次接触切片,对于上面的输出结果,可能会有些意外,比如a[1:8:-2]输出为空序列,这里是有点不太好理解,总结为以下几点,实在不懂,那就只能死记硬背啦。

1.当步长为负数时,第一个索引必须比第二个索引大,否则输出为空序列;
2.当步长为负数时,可以省略起始或结束索引,省略索引后,就不存在一定要第一个索引必须比第二个索引大了
3.步长为正数时,索引从起点到终点,而步长为负数时,索引从终点到起点。

切片在序列中用得非常多,但是有很多小细节需要注意,要不然很容易出错,也正是因为这些特殊的语法,才体现了 Python 与其它语言的不同之处吧。

本文知识点来源于书籍《Python 基础教程》第三版。

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/82830063