上QQ阅读APP看书,第一时间看更新
3.6 命名切片
在编码技能不熟练时,我们很容易写出大量无法直视的硬编码切片,以至于在不久后可能需要回头做一遍代码清理。
比如,从一个记录(比如文件或其他类似格式)中的某些固定位置提取字段,示例如下:
record_str = '......##............20 ....#..1513.5 ........##' total_cost = int(record_str[20:22]) * float(record_str[30:36]) print(f'total cost is:{total_cost}')
这样编写的代码会给日后的维护带来很多不便,这里可以对命名进行切片操作,改进如下:
NUMBERS = slice(20, 22) PRICE = slice(30, 36) total_cost = int(record_str[NUMBERS]) * float(record_str[PRICE]) print(f'total cost is:{total_cost}')
在改进代码中,用有具体意义的切片名替代使用大量难以理解的硬编码下标,这使得代码更加清晰、可读。
一般来讲,如果代码中出现大量硬编码下标,会使得代码的可读性和可维护性大大降低。使用切片命名的方式可以更加清晰地表达代码。
内置的slice()函数创建了一个切片对象。在所有使用切片的地方,我们都可以使用切片对象。
如果定义了一个切片对象,我们可以分别调用该切片对象的start、stop、step属性来获取更多信息,示例如下:
split_obj = slice(3, 20, 2) print(split_obj.start) print(split_obj.stop) print(split_obj.step)
我们还可以通过调用切片的indices(size)方法将切片对象映射到一个已知大小的序列上。indices(size)方法返回一个三元组(start,stop,step),切片对象的所有值都会被自动调整,直到达到适合这个已知序列的边界为止。这样,调用切片时就不会出现IndexError异常,示例如下:
str_obj = 'HelloWorld' split_obj = slice(3, 20, 2) for i in range(*split_obj.indices(len(str_obj))): print(str_obj[i])