1.11 命名切片

2018-02-24 15:26 更新

問(wèn)題

你的程序已經(jīng)出現(xiàn)一大堆已無(wú)法直視的硬編碼切片下標(biāo),然后你想清理下代碼。

解決方案

假定你有一段代碼要從一個(gè)記錄字符串中幾個(gè)固定位置提取出特定的數(shù)據(jù)字段(比如文件或類似格式):

###### 0123456789012345678901234567890123456789012345678901234567890'
record = '....................100 .......513.25 ..........'
cost = int(record[20:23]) * float(record[31:37])

與其那樣寫(xiě),為什么不想這樣命名切片呢:

SHARES = slice(20, 23)
PRICE = slice(31, 37)
cost = int(record[SHARES]) * float(record[PRICE])

第二種版本中,你避免了大量無(wú)法理解的硬編碼下標(biāo),使得你的代碼更加清晰可讀了。

討論

一般來(lái)講,代碼中如果出現(xiàn)大量的硬編碼下標(biāo)值會(huì)使得可讀性和可維護(hù)性大大降低。比如,如果你回過(guò)來(lái)看看一年前你寫(xiě)的代碼,你會(huì)摸著腦袋想那時(shí)候自己到底想干嘛啊。這里的解決方案是一個(gè)很簡(jiǎn)單的方法讓你更加清晰的表達(dá)代碼到底要做什么。

內(nèi)置的slice()函數(shù)創(chuàng)建了一個(gè)切片對(duì)象,可以被用在任何切片允許使用的地方。比如:

>>> 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]

如果你有一個(gè)切片對(duì)象s,你可以分別調(diào)用它的s.start, s.stop, s.step屬性來(lái)獲取更多的信息。比如:

>>> a = slice(5, 50, 2)
>>> a.start
5
>>> a.stop
50
>>> a.step
2
>>>

另外,你還能通過(guò)調(diào)用切片的indices(size)方法將它映射到一個(gè)確定大小的序列上,這個(gè)方法返回一個(gè)三元組(start,stop,step),所有值都會(huì)被合適的縮小以滿足邊界限制,從而使用的時(shí)候避免出現(xiàn)IndexError異常。比如:

>>> s = 'HelloWorld'
>>> a.indices(len(s))
(5, 10, 2)
>>> for i in range(*a.indices(len(s))):
... print(s[i])
...
W
r
d
>>>
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)