先從原理上分析切片運算:
list
的切片,內部是調用__getitem__
,__setitem__
,__delitem__
和slice
函數。而slice
函數又是和range()
函數相關的。
給切片傳遞的鍵是一個特殊的slice
對象。該對象擁有可描述所請求切片方位的屬性,例如:
a = [ 1, 2, 3, 4, 5, 6 ]
x = a [ 1 : 5 ] # x = a.__getitem__( slice ( 1, 5, None ) )
a [ 1 : 3 ] = [10, 11, 12 ]# a.__setitem__( slice ( 1, 3, None ), [ 10, 11, 12 ] )
del a [ 1 : 4 ]# a.__delitem__( slice ( 1, 4, None ) )
Python 的切片功能實際上比很多程序員認為的更強大。
a = m [ 0 : 100 : 10 ] # 帶步進的切片(步進值=10)
注意:步進值為step
當step
> 0 時切片從 start
(含start
)處開始,到end
(不含end
)處結束,從左往右,每隔(step-1
)(索引之間的差仍為step
,但相隔的元素是step
-1個)個元素進行一次截取。
這時,start
指向的位置應該在end
指向的位置的左邊,否則返回值為空
當step < 0 時,切片從 start(含start)處開始,到end(不含end)處結束,從右往左,每隔(step-1)(索引之間的差仍為step,但相隔的元素是step-1個)個元素進行一次截取。
這時,start 指向的位置應該在end指向的位置的右邊,否則返回值為空
有一個經典應用是:翻轉字符串
比如:
s=[1,2,3,4] # S 上界為 0 下界為 4
s[-100:100] #返回 [1,2,3,4] -100超出了上界,100超出了下界:等價于 s[0:4]
s[-100:-200] #返回 [] -100,-200均超出了上界,自動取上界:等價于s[0:0]
s[100:200] #返回 [] 100,200均超出了下界,自動取下界值:等價于s[4:4]
s[:100] #返回 [1,2,3,4] 開始值省略表示從第0個開始
s[0:] #返回 [1,2,3,4] 結束值為空表示到最后一個結束
注意:我使用的python版本為python2.7,python的切片存在版本兼容問題。在python3中有更加高級的功能和用法,在使用時一定要注意自己的python版本。