先從原理上分析切片運算:
list的切片,內部是調用__getitem__,__setitem__,__delitem__和slice函數。而slice函數又是和range()函數相關的。
給切片傳遞的鍵是一個特殊的slice對象。該對象擁有可描述所請求切片方位的屬性,例如:
|
1
2
3
4
|
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 的切片功能實際上比很多程序員認為的更強大。
|
1
|
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指向的位置的右邊,否則返回值為空
有一個經典應用是:翻轉字符串
比如:
|
1
2
|
>>>
str
=
'pythontab.com'
>>>
str
[::
-
1
]
|
結果為:
'moc.batnohtyp'
切片邊界問題
實例:
|
1
2
3
4
5
6
|
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版本。
