切片是python中列表(list)、元組(tuple)、字符串(str)等序列類型都支持的一種操做,但實際上切片的功能比人們所想象的要強大的多。python
對seq[start, stop, step]進行求值的時候,python會調用seq.__getitem__( slice(start, stop, step))。咱們還能夠給切片進行命名,有名字的切片,顯然更具備可讀性。以下例:ssh
invoice = """ 0.....6........15.....21 1001 prod_1 $17.5 3 1002 prod_2 $4.5 2 1003 prod_3 $10 1 1004 prod_4 $12 1 1005 prod_5 $8 1 """ prod_id = slice(0, 6) prod_desc = slice(6, 15) prod_price = slice(15, 21) prod_quantity = slice(21, None) line_items = invoice.split('\n')[2:] for item in line_items: print(item[prod_price], item[prod_desc], item[prod_quantity])
運行結果以下:ide
若是把切片放在賦值符號的左邊,或者將切片做爲del操做的對象,咱們就能夠對序列進行嫁接、切除或者修改等操做,十分快捷方便。spa
>>> dir(slice) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'indices', 'start', 'step', 'stop']
slice 是python的內置類型,類型所具備的indices方法能夠幫助咱們實現序列的切片操做。code
S.indices(len) -> (start, stop, stride) 給定長度爲len的序列,計算S表示的擴展切片的起始和結尾索引,以及步幅。超出邊界的索引會被截掉。
如上圖兩個例子,假如如今有一個長度爲5的序列seq,那麼對於該序列而言,orm
seq[0, 10, 2] == seq[0, 5, 2] seq[-3, 0, 0] == seq[2, 5, 1]
若是可以善用slice類型中Indices方法,則能夠更加快捷實現自定義類型數據的切片操做。對象
注: 以上內容主體來自於《流暢的python》一書中 「2.4 切片」 和 「10.4.1 切片原理」 索引