Python 切片分析

在 Python 中,除了使用索引来访问单个元素外,还可使用切片来访问特定范围内的元素。执行切片操作时,我们可以显式或隐式地指定起点、终点位置和步长,但有时候一不小心就会掉进陷阱里,如果我们知道切片背后发生了什么,就可以有效避免错误了。

1. slice 对象

切片 start:stop:step 的这种用法,作为索引或者下标用在 [] 时,其实返回一个切片对象:slice(start, stop, step):

1:5 返回 slice(1, 5, None)
::2 返回 slice(None, None, 2)

是不是真的这样呢?

class Seq:
    def __getitem__(self, index):
        return index

在 Python shell 中:

>>> s = Seq()
>>> s[2]
2
>>> s[1:5]
slice(1, 5, None)
>>> s[::2]
slice(None, None, 2)

2. slice.indices

slice 对象有一个 indices 属性(dir(slice ) 可知),help(slice.indices) 给出如下的信息:

>>> help(slice.indices)
Help on method_descriptor:

indices(...)
    S.indices(len) -> (start, stop, stride)
    
    Assuming a sequence of length len, calculate the start and stop
    indices, and the stride length of the extended slice described by
    S. Out of bounds indices are clipped in a manner consistent with the
    handling of normal slices.

也就是说给定长度为 len 的序列,S.indices(len) 会计算出切片的起始(start)和终点(stop)位置,以及步长(stride)。

有了这信息,我们在使用切片时,就可以很方便的计算出切片的起始、终点位置和步长了。

举个例子:

>>> s = 'ABCDE' # 字符串
>>> slice(None, None, 2).indices(5)
(0, 5, 2)
>>> s[::2]
'ACE'

所以 s[::2] 等同于 s[0:5:2]

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注