你的程序变成了没法阅读的脏乱不堪的硬编码切片片段,而你想梳理干净它。
假设你有些从记录的字符串中读取特定field数据的代码(比如,flat文件或者类似结构的):
###### 0123456789012345678901234567890123456789012345678901234567890'
record = '....................100 .......513.25 ..........'
cost = int(record[20:32]) * float(record[40:48])
为神马不这么做呢,为这两个slice命名:
SHARES = slice(20,32)
PRICE = slice(40,48)
cost = int(record[SHARES]) * float(record[PRICE])
随后的编码中,你将不会再为这样硬编码而烦恼了,代码更干净了。
作为一般准则,写有大量硬编码索引值的代码,导致可读性和维护性狗屎一样的差。虽然是你自己写的代码但是过上1年只有上帝知道你为神马写这坨狗屎。而使用slice能简单的道出你写代码的意图。
一般说,内建的slice()
创建的slice对象可用在任何允许slice使用的地方,e.g:
>>> items = [0, 1, 2, 3, 4, 5, 6]
>>> a = slice(2, 4)
>>> items[2:4]
[2, 3]
>>> items[a]
[2, 3]
>>> items[a] = [10,11]
>>> items
[0, 1, 10, 11, 4, 5, 6]
>>> del items[a]
>>> items
[0, 1, 4, 5, 6]
假如有slice对象s,还能使用s.start
、s.stop
和s.step
得到更多信息,e.g:
>>> a = slice(10, 50, 2)
>>> a.start
10
>>> a.stop
50
>>> a.step
2
>>>
另外,可以通过indices(size)
映射到一个序列指定大小上,它会返回一个元组(start, stop, step)
,刚好处在指定的序列区域(可以在索引时避免IndexError
异常)e.g:
>>> a = slice(5, 50, 2)
>>> s = 'HelloWorld'
>>> a.indices(len(s))
(5, 10, 2)
>>> for i in range(*a.indices(len(s))):
... print(s[i])
...
W
r
d
>>>