切片是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 切片原理” 索引