Skip to content

Latest commit

 

History

History
80 lines (59 loc) · 1.86 KB

1.11.命名一个切片.md

File metadata and controls

80 lines (59 loc) · 1.86 KB

1.11.命名一个切片

问题

你的程序变成了没法阅读的脏乱不堪的硬编码切片片段,而你想梳理干净它。

解决方法

假设你有些从记录的字符串中读取特定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.starts.stops.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
>>>