在 Python 里,像列表(list)、元組(tuple)和字符串(str)這類序列類型都支持切片操作,但是實際上切片操作比人們所想象的要強大很多。
在切片和區(qū)間操作里不包含區(qū)間范圍的最后一個元素是 Python 的風格,這個習慣符合 Python、C 和其他語言里以 0 作為起始下標的傳統(tǒng)。這樣做帶來的好處如下。
- 當只有最后一個位置信息時,我們也可以快速看出切片和區(qū)間里有幾個元素:range(3) 和 my_list[:3] 都返回 3 個元素。
- 當起止位置信息都可見時,我們可以快速計算出切片和區(qū)間的長度,用后一個數減去第一個下標(stop - start)即可。
- 這樣做也讓我們可以利用任意一個下標來把序列分割成不重疊的兩部分,只要寫成 my_list[:x] 和 my_list[x:] 就可以了,如下所示。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-625878.html
對對象進行切片
一個眾所周知的秘密是,我們還可以用 s[a:b:c] 的形式對 s 在 a 和 b 之間以 c 為間隔取值。c 的值還可以為負,負值意味著反向取值。下面的例子更直觀些:
>>> s = 'bicycle'
>>> s[::3]
'bye'
>>> s[::-1]
'elcycib'
>>> s[::-2]
'eccb”
a:b:c 這種用法只能作為索引或者下標用在 [] 中來返回一個切片對象:slice(a, b, c)。對 seq[start:stop:step] 進行求值的時候,Python 會調用 seq.__getitem__(slice(start, stop, step))。就算你還不會自定義序列類型,了解一下切片對象也是有好處的。例如你可以給切片命名,就像電子表格軟件里給單元格區(qū)域取名字一樣。
多維切片和省略
[] 運算符里還可以使用以逗號分開的多個索引或者是切片,外部庫 NumPy 里就用到了這個特性,二維的 numpy.ndarray 就可以用 a[i, j] 這種形式來獲取,抑或是用 a[m:n, k:l] 的方式來得到二維切片。要正確處理這種 [] 運算符的話,對象的特殊方法 __getitem__ 和 __setitem__ 需要以元組的形式來接收 a[i, j] 中的索引。也就是說,如果要得到 a[i, j] 的值,Python 會調用 a.__getitem__((i, j))。
Python 內置的序列類型都是一維的,因此它們只支持單一的索引,成對出現(xiàn)的索引是沒有用的。省略(ellipsis)的正確書寫方法是三個英語句號(...),而不是 Unicdoe 碼位 U+2026 表示的半個省略號(...)。省略在 Python 解析器眼里是一個符號,而實際上它是 Ellipsis 對象的別名,而 Ellipsis 對象又是 ellipsis 類的單一實例。它可以當作切片規(guī)范的一部分,也可以用在函數的參數清單中,比如 f(a, ..., z),或 a[i:...]。在 NumPy 中,... 用作多維數組切片的快捷方式。如果 x 是四維數組,那么 x[i, ...] 就是 x[i, :, :, :] 的縮寫。
給切片賦值
如果把切片放在賦值語句的左邊,或把它作為 del 操作的對象,我們就可以對序列進行嫁接、切除或就地修改操作。通過下面這幾個例子,你應該就能體會到這些操作的強大功能:
>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2:5] = [20, 30]
>>> l
[0, 1, 20, 30, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 20, 30, 5, 8, 9]
>>> l[3::2] = [11, 22]
>>> l
[0, 1, 20, 11, 5, 22, 9]
>>> l[2:5] = 100 ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 22, 9]
? 如果賦值的對象是一個切片,那么賦值語句的右側必須是個可迭代對象。即便只有單獨一個值,也要把它轉換成可迭代的序列。
?文章來源:http://www.zghlxwxcb.cn/news/detail-625878.html
?
到了這里,關于Python冷知識-為什么切片和區(qū)間會忽略最后一個元素的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!