本文示例檔案已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
我們在使用Python
完成日常任務時,經常會遇到一些很小的輔助性的需求,又不想花費時間去搜尋是否已有現成的庫實現了這些功能,往往則需要自己臨時編寫一些邏輯或函式。
而事實上已經有勤勞偉大的開發者編寫了整合眾多小功能於一身的第三方庫,本文要給大家介紹的funcy
就是其中非常實用的一個,它彙集了數量驚人的實用函式及裝飾器,幫助我們使用Python
更好的踐行函數語言程式設計理念。
2 funcy中的實用API
funcy
的設計宗旨就是彙集一系列花哨的實用函式,其在不斷地迭代過程中,已經積累下相當多的功能,下面我們就來學習其中代表性的一些。
使用pip install funcy
完成安裝後,推薦大家按照如下方式進行匯入:
import funcy as fc
- 無限計數器
funcy
中的count()
可以生成一個可指定起點和步長的無限迭代器,預設引數start=0
,step=1
,我們可以用它來替代常規的while
迴圈+自增變數的邏輯:
for i in fc.count():
print(i, end='\r')
# 當i大於等於1000時停止迭代,否則繼續
if i >= 1000:
break
- 展平巢狀陣列
funcy
中的flatten()
可以用來展平任意的巢狀陣列:
- 在指定陣列中插空
funcy
中的interpose()
可以用來將指定元素插入到對應陣列的兩兩元素之間:
- 批量刪除滿足指定條件的元素
在funcy
中有兩種從原始列表中刪除指定元素的方法,方式1是使用remove()
來傳入條件判斷函式來刪除滿足條件的元素,類似filter()
的方式:
第二種方式是利用funcy
中的without()
,它可以幫我們從原始陣列中排除指定的1個或多個元素,譬如下面我們把2、5、7、9排除掉:
- 按照制定條件分組劃分原始陣列
funcy
中提供了group_by()
函式,幫助我們傳入函式,作用於指定陣列的每個元素上,並自動按照返回的結果進行分組輸出,就像下面的例子那樣:
- 等長度拆分陣列,丟棄末尾長度不足的部分
funcy
中的partition()
幫助我們對輸入的陣列做指定長度的切片劃分,譬如下面的例子,我們對列表[0, 1, ..., 10]進行長度為3的切片拆分,剩餘不足長度3的部分就會被丟棄:
- 等長度拆分陣列,並保留長度不足的部分
與partition()
功能相似,funcy
中的chunks()
會在等長度拆分陣列的同時,保留末尾長度不足的部分單獨輸出:
- 輸出相鄰成對元素二元組
利用funcy
中的pairwise()
,我們可以對輸入陣列從頭開始,將相鄰的成對元素以二元組的形式輸出:
- 合併多個同型別物件
利用merge()
,我們可以將傳入的多個同型別資料結構拼成一個完整的,這在合併集合或字典時尤其受用:
- 阻止函式遇到錯誤時的常規報錯方式
有些情況下我們執行某些函式時,由於某些原因導致報錯,但如果我們並不希望遇到錯誤就中斷的話,就需要自己寫額外的try...except...
邏輯,而funcy
中的silent()
則可以讓這個過程變得很省事:
- 阻止函式遇到指定錯誤時的常規報錯方式
上面介紹的silent()
會幫助傳入函式遇到任意錯誤時返回None,而funcy
中的ignore()
則賦予我們指定錯誤型別,以及報錯時設定返回值的能力:
- 裝飾指定函式,使其記憶歷史執行記錄值
下面要介紹的方法非常的實用,想象一下這樣的場景:你書寫的某個函式接受輸入,然後經過一段耗時不菲的計算過程輸出結果,但在函式實際呼叫過程中經常遇到重複的傳入引數。
這種時候你肯定希望自己的函式可以“記憶”下執行過的引數與輸出結果,省得大量重複計算,而funcy
中的memoize
裝飾器就可以幫助我們快速改造自己的函式:
而函式的快取記錄可查詢,可自定義新增,也可以手動清空:
- 以標籤:值的方式輔助debug
很多情況下,print()
迴圈過程變數變化情況的debug
方式雖然很粗糙,但有些時候下卻很方便,但在一些諸如列表推導等情況下卻不太方便注入print()
程式碼。
而利用funcy
中的tap()
函式,我們可以將迭代變數傳入,並填寫對應說明標籤,即可快速檢視執行過程,tap()
的邏輯其實很簡單,相當於把輸入值列印一下再原封不動地返回,但既然有現成的API,何樂而不為~
- 約束某個函式的可執行次數
有些情況下,我們希望程式中的某個函式在整個程式的生命週期中只執行一次,譬如建立資料庫連線等操作時,而funcy
中提供的裝飾器once
就可以幫助我們快速實現這個功能,並且保證了執行緒安全:
除了以上介紹的這些功能之外,funcy
還擁有其他眾多的實用API,你可以進入其官方文件進行檢視( https://funcy.readthedocs.io/en/stable/ )。
以上就是本文的全部內容,歡迎在評論區與我進行討論~