问题描述
你的程序已经出现一大堆无法直视的硬编码切片下标,然后你想清理下代码。
解决方案
假定你有一段代码要从一个记录字符串中固定位置提取出特定的数据字段:
record = '....................100 .......513.25 ..........'
cost = int(record[20:23]) * float(record[31:37])
其实可以使用命名切片,避免出现大量无法理解的硬编码下标,可以使代码更加清晰可读。
SHARES = slice(20, 23)
PRICE = slice(31, 37)
cost = int(record[SHARES]) * float(record[PRICE])
讨论
一般来讲,代码中如果出现大量的硬编码下标会使得代码可读性和可维护性大大下降。命名切片是一个很好的方法让你更清楚的表达代码想要做什么。
内置的函数slice()
函数创建了一个切片对象,可以被使用在任何切片允许使用的地方。比如:
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] # item = [0, 1, 4, 5, 6]
如果你有一个切片对象a
,你可以分别调用它的a.start
,a.stop
,a.step
属性来获取更多的信息。比如:
a = slice(5, 50, 2)
a.start # 5
a.stop # 50
a.step # 2
另外,你还能通过调用切片的indices(size)
方法将它映射到一个确定大小的序列上,这个方法返回一个三元组(start, stop, step),所有值都会被合适的缩小以满足边界限制,从而避免出现IndexError
异常。比如:
s = 'HelloWorld'
a = slice(5, 10, 2)
d = a.indices(len(s))
"""
d = (5, 10, 2)
"""
for i in range(*d):
print(s[i])
"""输出结果
W
r
d
"""