官术网_书友最值得收藏!

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

主站蜘蛛池模板: 鹤山市| 庆城县| 尖扎县| 东兴市| 明光市| 佛冈县| 阳曲县| 长沙县| 鹤峰县| 西昌市| 长丰县| 同心县| 泾川县| 定结县| 贵南县| 陇南市| 张掖市| 伊宁市| 沾化县| 蒙阴县| 射阳县| 饶河县| 中阳县| 含山县| 扶余县| 林甸县| 迭部县| 大化| 博乐市| 浦东新区| 吉木萨尔县| 哈尔滨市| 金华市| 安康市| 谷城县| 西吉县| 任丘市| 峨眉山市| 陈巴尔虎旗| 永善县| 广灵县|