突破舊思維
兩則Python方面的例子。
第一則。看了不少別人的代碼,發現大量Python程序員習慣這麼取List里的數據:
lst = [[張三丰, 太極拳, 武當派, [男, 60]], [越阿青, 越女劍, 無門派, [女, 15]], [凌未風, 大須彌, 天山派, [男, 48]], [張無忌, 九陽功, 武當派, [男, 28]], [鐵摩勒, 八仙劍, 崑崙派, [男, 35]]]for l in lst: # 處理l print(l[0], l[1], l[2], l[3][0], l[3][1])
這種涉及位置的處理方式,一旦邏輯複雜起來,或則數據多了,代碼就變得難以閱讀,甚至久而久之自己再看都費勁。
我們可以換一種方式:
for name, kf, pai, (s, age) in lst: # 處理l print(name, kf, pai, s, age)
這裡利用了解構特性,方法更一目了然了。如果要操作原lst列表,則可以這樣做(藉助enumerate()):
for idx, (name, kf, pai, (s, age)) in enumerate(lst): # 處理l if pai == 無門派: lst[idx][2] = 越女派
或者使用列表解析(List Comprehension,當然也可以藉助filter、map等函數):
lst = [[name, kf, 越女派 if pai == 無門派 else pai, [s, age]] for name, kf, pai, (s, age) in lst]
事情感覺是一步步變好。但是不是還有繼續改進的空間呢?比如lst數據列表?可能很多人會喜歡設計一個數據類/數據集合類,舉個例子(第二則):
class Data: def __init__(self, name, kf, pai, props): self.name = name self.kf = kf self.pai = pai self.props = propsclass DataSet: def __init__(self): self.dataSet = [] def append(self, item): self.dataSet.append(item)d1 = Data(張三丰, 太極拳, 武當派, [男, 60])ds = DataSet()ds.append(d1)ds.dataSet[0].name
但如果只是一個數據模型,而且數據生成好後只用於查詢,則大可使用collections.namedtuple函數,這是一個工廠方法,能夠生成一個tuple的增強子類:
from collections import namedtupleDM = namedtuple(DataModel, name, kf, pai, props)d1 = DM(張三丰, 太極拳, 武當派, [男, 60])ds.append(d1)ds.dataSet[0].name
這不是更方便嗎?
上面只是大概舉兩個例子,還可以繼續根據現實所需優化結構:如果需要各種複雜數據操作,則可繼續豐富Data類的方法;如果只是涉及簡單的操作,則可以考慮Map。但希望能體現出充分藉助語言特性進行代碼良好構造的重要性。
Python發展到今天,已不能簡單理解早十幾年提出的「統一一種方式」的理念了,找出最優方式而堅持並形成約定,應該是這個理念的深入含義。
現在市面上的Python書籍琳琅滿目,但如果只是裹足於常規使用,確實很容易陷入所謂「Python容易」的感覺中。但其實Python並不容易,什麼語言都不容易,要嫻熟掌握都是要不斷磨練。
這一段常看到「給語言排難易度」、「這個語言好還是那個語言好」、「誰又取代了誰」之類的話題,其實靜下心來充實自己就好了。
很多的思維,不僅僅是編程方式,還有看問題的角度,我們都需要不時提醒自己:要不斷嘗試突破舊思維,突破思維禁錮,讓自己的頭腦中始終存在著一條清晰的主軸。這樣才能把握好方向。
我是程序員2gua,現在寫Python,願意結交Python同好:我的微博,我的網站,我的知乎專欄。
推薦閱讀:
※2017就要結束了,再學點什麼呢?
※優秀的項目管理與糟糕的項目管理
※人生已經過了 29565 天,敲代碼還來得及嗎?
※Make it run, make it right, make it fast
※那些所謂的微軟軟體服務外包人才培訓基地跟微軟到底什麼關係?