本节书摘来自异步社区《Python Cookbook(第3版)中文版》一书中的第1章,第1.11节,作者[美]David Beazley , Brian K.Jones,陈舸 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
我们的代码已经变得无法阅读,到处都是硬编码的切片索引,我们想将它们清理干净。
假设有一些代码用来从字符串的固定位置中取出具体的数据(比如从一个平面文件或类似的格式):
###### 0123456789012345678901234567890123456789012345678901234567890' record = '....................100 .......513.25 ..........' cost = int(record[20:32]) * float(record[40:48])与其这样做,为什么不对切片命名呢?
SHARES = slice(20,32) PRICE = slice(40,48) 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] >>> items [0, 1, 4, 5, 6]如果有一个slice对象的实例s,可以分别通过s.start、s.stop以及s.step属性来得到关于该对象的信息。例如:
>>> a = slice( >>> a.start 10 >>> a.stop 50 >>> a.step 2 >>>此外,可以通过使用indices(size)方法将切片映射到特定大小的序列上。这会返回一个(start, stop, step)元组,所有的值都已经恰当地限制在边界以内(当做索引操作时可避免出现IndexError异常)。例如:
>>> s = 'HelloWorld' >>> a.indices(len(s)) (5, 10, 2) >>> for i in range(*a.indices(len(s))): ... print(s[i]) ... w r d >>> 相关资源:python cookbook(第3版)