Python进阶编程:编写更高效、优雅的Python代码
上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])