python中的slice對象
slice是python的內建類型,主要用於構建靈活的切片,或者通過__getitem__實現更好的自建類型。
以一維切片為例,seq[]里面既可以傳整數,也可以傳slice對象,即
seq = 'abcdef'
seq[1]
seq[1:3]
s = slice(1, 3)
seq[s]
多維對象支持整數和slice對象的組合,實際內部__getitem__得到的是一個元組,里面的元素要么是整數,要么是slice對象。
seq[start:stop:end]其效果就是seq._getitem_ (slice(start, stop, end))。
以下是一個從fluent python中摘出的例子:
>>> class Myseq:
def __getitem__(self, index):
return index
>>> s = Myseq()
>>> s[1]
1
>>> s[1:4]
slice(1, 4, None)
>>> s[1:4:2]
slice(1, 4, 2)
>>> s[1:4:2, 9]
(slice(1, 4, 2), 9)
>>> s[1:4:2, 7:9]
(slice(1, 4, 2), slice(7, 9, None))
dir(slice)得到其中比較有用的屬性有start, stop, end和方法indices。
start, stop, end非常好理解就是切片的開端、末端和步長。
indices是一個可以啟發slice對象如何作用切片的方法,其調用形式如下:
S.indices(len) -> (start, stop, stride)
下面繼續用fluent python中的例子:
>>> slice(None, 10, 2).indices(5)
(0, 5, 2)
>>> slice(-3, None, None).indices(5)
(2, 5, 1)
假設有一序列seq = 'ABCDE', len(seq) = 5
'ABCDE'[:10:2]等價於'ABCDE'[0:5:2]
'ABCDE'[::-3]等價於'ABCDE'[2:5:1]
從上面就可以看出indices的作用,返回元組形式的標准化的切片。