突破舊思維

兩則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
那些所謂的微軟軟體服務外包人才培訓基地跟微軟到底什麼關係?

TAG:Python | 编程 | 软件开发 |