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