切片,是一個比較生疏的名詞,這是現代計算機編程語言或者說Python里的一個概念,大致意思是從一個集合里切出一塊來,就像切一塊豆腐,一刀下去切出兩塊豆腐
先看一個函數range、返回值是列表,內容和傳入range的函數有關。
a = range(1, 21)
print a
?
結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
明白了,range可以產生從1到20共20個元素的列表,range的第二個參數不包含這個值,但包含第一個參數的值,每個元素值相差為1
切片是對有序的集合而言,意思從有序集合里提取數據構成子集集合,給定提取的起點start、終點end以及方向上的步長step,能否切出非空子集,起點start需能沿步長方向上到達終點。
字符串和列表、元組都是有序集合,均可實現切片操作,以列表為例給出切片的語法格式如下:
子集名 = 有序集合名[start : end : step]
上邊range(1, 21)和切片里的start、end是呼應一致的,含起點start對應的值而不含終點end所對應的值。
step = 1
子集的構成是從start開始每step取一個數據一至到end-1位置結束,step默認為1時,可以省略不寫。
s = "python"
a = list(s)
print a
b = a[2:5]
print b
?
程序的結果如下:
['p', 'y', 't', 'h', 'o', 'n']
['t', 'h', 'o']
0 | 1 | 2 | 3 | 4 | 5 |
'p' | 'y' | 't' | 'h' | 'o' | 'n' |
從print b這條語句的打印結果['t', 'h', 'o']可知,'t'在a列表的index為2,'n'字符的index為5,那么a[2:5]的step為1,從't'開始逐個取回字符't'、'h'、'o'組成新的列表的子集b,而字符'n'的index為5,5作為取切片操作a[2:5]里的終點,其字符'n'不取回。從例子可以看出step 為1可以理解為“逐個取”。
step > 1
step可以大于1,這個時候對于step的理解可以這樣認為,每step個取一個。
s = "python"
a = list(s)
print a
b = a[2:5:2]
print b
?
程序的結果如下:
['p', 'y', 't', 'h', 'o', 'n']
['t', 'o']
對于列表a取切片a[2 : 5 : 2], 從index為2開始,每2個元素為一組取每組的第一個數據值,一只到index為5結束,但不取index為5的數據。
a[2 : 5 : 2]具體操作是這樣的,從index為2的字符't'開始,到index為5的字符'n'之前,每2個為一組('t', 'h')、('o', 'n')取每組的第一個元素值't'、'o'即結果子集b的值。
再看一個例子:
a = range(12)
print a
b = a[1 : 10 : 3]
print b
?
結果是:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
[1, 4, 7]
?
從兩行輸出結果的第一行可以看出range函數可以產生一個從0開始到小于12的整數的列表,共12個數據。第二行的輸出[1, 4, 7]是怎么產生的呢?這個和對a列表的切片操作有關,a[1 : 10 : 3],這里a[1:10] = [1, 2, 3, 4, 5, 6, 7, 8, 9],每3個一組,從每組取第一個,即 [1, 2, 3],[4, 5, 6], [7, 8, 9]這三組,取每組第一個1、4、7構成b這個子集,最后得到的b = [1, 4, 7]。