您好,登錄后才能下訂單哦!
Python中為我們提供解決方案的方法特性有哪些,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
實際上,在日常的工作中,我們很多需求,無論是常見的、還是不常見的,Python 都為我們提供了一些獨特的解決方案,既不需要自己造輪子,也不需要引入新的依賴(引入新的依賴勢必會增加項目的復雜度)。
但是 Python 有太多功能和特性被我們忽略了,導致我們在遇到問題的時候,沒法第一時間作出良好的決策。
所以,干脆來一起掃清這些被我們忽略的 Python 死角。
裝飾器的妙用
我們經(jīng)常會想完成一些注冊&調(diào)用的功能,比如我們有四個函數(shù):
現(xiàn)在我們想將這四個函數(shù)和 +、-、*、/ 四個操作符綁定,那么我們該怎么做?
可能我們第一反應是這樣:
但這樣寫起來,有一個很大的問題就是太不美觀了。因為直接對于 dict 的操作從實際上來講可維護性是很差的,那么我們這個地方應該怎么做?
在改進這段代碼之前,我們首先要明確 Python 中一個很重要的概念,即:函數(shù)/方法是:First Class Member 。用不精確的話來講,就是函數(shù)/方法可以作為參數(shù)被傳遞、被使用。
舉個例子:
大家可以看到我們將 print_func 這個函數(shù)作為參數(shù)傳遞給 execute 函數(shù)并被調(diào)用。
那么我們來改造下之前的代碼:
好了,大家看看,目前整體代碼的可讀性以及可維護性是不是改了很多?
但是我們現(xiàn)在的問題在于,每次都需要在單獨調(diào)用一次 register_operator 函數(shù),這樣也太煩了吧!要不要再改進一下?要得。我們可以用裝飾器來改進一下。
首先,看一個最簡單的裝飾器例子:
我們能看到這段函數(shù)的意義是計算函數(shù)的執(zhí)行時間。那么這個原理是什么?
實際上裝飾器是一個語法糖,具體可以參見 PEP318 Decorators for Functions and Methods。
簡而言之,實際上是 Python 替我們做了一個替換過程。以上面的例子為例,這個替換過程就是 add=execute(add) 。
好了,我們就用這個知識點來改進下之前的代碼:
這樣我們這段代碼的注冊過程是不是就顯得更優(yōu)雅了?
嗯,是的!實際上 Python 中有很多特性會幫助我們的代碼更簡潔,更優(yōu)美。
接下來這個例子很可能幫我們減輕工作量。
聊聊 OrderedDict
dict 是我們經(jīng)常使用的一種數(shù)據(jù)解構(gòu)。但是在 Python 3.6 之前 dict 都是無序的,即我插入的順序,和數(shù)據(jù)在 dict 中存放的順序并無關(guān)聯(lián)(筆者注:Python 3.6 dict 有序只是新版實現(xiàn)的順帶產(chǎn)物,Python 3.7 正式作為 feature 被固定下來)。
但是很多時候,比如在驗簽等場景,我們需要保證 dict 數(shù)據(jù)存放順序,和我們插入順序是一致的。那么我們該怎么辦?
老板有需求下來了,我們肯定不能告訴老板這個需求沒法做。那我們就自己實現(xiàn)一個 ordereddict 吧。于是,想了想,寫了如下的代碼:
通過額外維護一個 list 來維護 key 插入的順序。這段代碼,看似完成了我們的需求,但是實則存在很大問題。大家可以猜猜問題在哪?
3,2,1!
揭曉答案,這段代碼利用 list 來保證 key 的有序性,在刪除的時候, list 的刪除操作,是一個時間復雜度 O(n) 的操作。換句話說,我們的刪除操作隨著內(nèi)部數(shù)據(jù)的增多,所需的刪除時間也變得越長。這對于某些性能敏感的場景是無法接受的。
那要怎么辦呢?事實上,Python 在很早之前就已經(jīng)內(nèi)置了有序字典,即很多人可能都用過的 collections.OrderedDict 。
在 OrderedDict 中, Python 維護了一個雙向鏈表解構(gòu),來保證插入的有序性,如下圖所示:
在最左側(cè)維護一個衛(wèi)兵節(jié)點,衛(wèi)兵節(jié)點的 next 指針恒指向于數(shù)據(jù)中最后插入的節(jié)點。那么插入新的數(shù)據(jù)時,我們將新的數(shù)據(jù)插入到衛(wèi)兵節(jié)點之后,從而達成維護插入順序的目的。
在刪除的時候,通過額外維護的一個字典找到待刪除的 key 所對應的節(jié)點。這個操作是 O(1) 的復雜度,然后大家都知道,雙向鏈表刪除一個節(jié)點的時間復雜度也是 O(1) 。通過這樣保證我們在即便有大量數(shù)據(jù)的情況下,也能保證相應的性能。
好了,我們按照這個思路來做一個最簡單的實現(xiàn):
這只是一個 OrderedDict 的簡化版,如果想完成一個完整的 OrderedDict 還有很多很多的 corner case 要去處理。不過現(xiàn)在,我們可以使用內(nèi)置的數(shù)據(jù)結(jié)構(gòu)去完成我們需求。怎么樣,是不是有了一種幸福的感覺?
隨意聊聊
通過今天的兩個例子,我們發(fā)現(xiàn) Python 提供了相當多的功能去幫助我們完成日常的工作與學習任務(wù)。同時通過去深入地了解 Python 內(nèi)部的一些功能實現(xiàn),以便我們能更好地去學習一些知識。
看完上述內(nèi)容,你們掌握Python中為我們提供解決方案的方法特性有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。