中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中為我們提供解決方案的方法特性有哪些

發布時間:2021-11-02 17:40:28 來源:億速云 閱讀:171 作者:柒染 欄目:web開發

Python中為我們提供解決方案的方法特性有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

實際上,在日常的工作中,我們很多需求,無論是常見的、還是不常見的,Python 都為我們提供了一些獨特的解決方案,既不需要自己造輪子,也不需要引入新的依賴(引入新的依賴勢必會增加項目的復雜度)。

但是 Python 有太多功能和特性被我們忽略了,導致我們在遇到問題的時候,沒法第一時間作出良好的決策。

所以,干脆來一起掃清這些被我們忽略的 Python 死角。

裝飾器的妙用

我們經常會想完成一些注冊&調用的功能,比如我們有四個函數:

Python中為我們提供解決方案的方法特性有哪些

現在我們想將這四個函數和 +、-、*、/ 四個操作符綁定,那么我們該怎么做?

可能我們第一反應是這樣:

Python中為我們提供解決方案的方法特性有哪些

但這樣寫起來,有一個很大的問題就是太不美觀了。因為直接對于 dict 的操作從實際上來講可維護性是很差的,那么我們這個地方應該怎么做?

在改進這段代碼之前,我們首先要明確 Python 中一個很重要的概念,即:函數/方法是:First Class Member 。用不精確的話來講,就是函數/方法可以作為參數被傳遞、被使用。

舉個例子:

Python中為我們提供解決方案的方法特性有哪些

大家可以看到我們將 print_func 這個函數作為參數傳遞給 execute 函數并被調用。

那么我們來改造下之前的代碼:

Python中為我們提供解決方案的方法特性有哪些

好了,大家看看,目前整體代碼的可讀性以及可維護性是不是改了很多?

但是我們現在的問題在于,每次都需要在單獨調用一次 register_operator 函數,這樣也太煩了吧!要不要再改進一下?要得。我們可以用裝飾器來改進一下。

首先,看一個最簡單的裝飾器例子:

Python中為我們提供解決方案的方法特性有哪些

我們能看到這段函數的意義是計算函數的執行時間。那么這個原理是什么?

實際上裝飾器是一個語法糖,具體可以參見 PEP318 Decorators for Functions and Methods。

簡而言之,實際上是 Python 替我們做了一個替換過程。以上面的例子為例,這個替換過程就是 add=execute(add) 。

好了,我們就用這個知識點來改進下之前的代碼:

Python中為我們提供解決方案的方法特性有哪些

這樣我們這段代碼的注冊過程是不是就顯得更優雅了?

嗯,是的!實際上 Python 中有很多特性會幫助我們的代碼更簡潔,更優美。

接下來這個例子很可能幫我們減輕工作量。

聊聊 OrderedDict

dict 是我們經常使用的一種數據解構。但是在 Python 3.6 之前 dict 都是無序的,即我插入的順序,和數據在 dict 中存放的順序并無關聯(筆者注:Python 3.6 dict 有序只是新版實現的順帶產物,Python 3.7 正式作為 feature 被固定下來)。

但是很多時候,比如在驗簽等場景,我們需要保證 dict 數據存放順序,和我們插入順序是一致的。那么我們該怎么辦?

老板有需求下來了,我們肯定不能告訴老板這個需求沒法做。那我們就自己實現一個 ordereddict 吧。于是,想了想,寫了如下的代碼:

Python中為我們提供解決方案的方法特性有哪些

通過額外維護一個 list 來維護 key 插入的順序。這段代碼,看似完成了我們的需求,但是實則存在很大問題。大家可以猜猜問題在哪?

3,2,1!

揭曉答案,這段代碼利用 list 來保證 key 的有序性,在刪除的時候, list 的刪除操作,是一個時間復雜度 O(n) 的操作。換句話說,我們的刪除操作隨著內部數據的增多,所需的刪除時間也變得越長。這對于某些性能敏感的場景是無法接受的。

那要怎么辦呢?事實上,Python 在很早之前就已經內置了有序字典,即很多人可能都用過的 collections.OrderedDict 。

在 OrderedDict 中, Python 維護了一個雙向鏈表解構,來保證插入的有序性,如下圖所示:

Python中為我們提供解決方案的方法特性有哪些

在最左側維護一個衛兵節點,衛兵節點的 next 指針恒指向于數據中最后插入的節點。那么插入新的數據時,我們將新的數據插入到衛兵節點之后,從而達成維護插入順序的目的。

在刪除的時候,通過額外維護的一個字典找到待刪除的 key 所對應的節點。這個操作是 O(1) 的復雜度,然后大家都知道,雙向鏈表刪除一個節點的時間復雜度也是 O(1) 。通過這樣保證我們在即便有大量數據的情況下,也能保證相應的性能。

好了,我們按照這個思路來做一個最簡單的實現:

Python中為我們提供解決方案的方法特性有哪些

這只是一個 OrderedDict 的簡化版,如果想完成一個完整的 OrderedDict 還有很多很多的 corner case 要去處理。不過現在,我們可以使用內置的數據結構去完成我們需求。怎么樣,是不是有了一種幸福的感覺?

隨意聊聊

通過今天的兩個例子,我們發現 Python 提供了相當多的功能去幫助我們完成日常的工作與學習任務。同時通過去深入地了解 Python 內部的一些功能實現,以便我們能更好地去學習一些知識。

看完上述內容,你們掌握Python中為我們提供解決方案的方法特性有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海阳市| 迁西县| 五莲县| 湄潭县| 宜兰市| 田阳县| 藁城市| 彰化市| 彩票| 桃源县| 滁州市| 巍山| 蓬莱市| 林口县| 山西省| 托克托县| 延吉市| 宁阳县| 新乡市| 项城市| 凌云县| 邓州市| 丽水市| 牙克石市| 邯郸县| 县级市| 沙坪坝区| 武平县| 鞍山市| 宣威市| 勃利县| 陇川县| 出国| 邹城市| 威信县| 顺昌县| 澄城县| 沧州市| 郎溪县| 南溪县| 格尔木市|