(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱

費弗裡發表於2020-12-29

本文示例檔案已上傳至我的Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  我們在使用Python完成日常任務時,經常會遇到一些很小的輔助性的需求,又不想花費時間去搜尋是否已有現成的庫實現了這些功能,往往則需要自己臨時編寫一些邏輯或函式。

  而事實上已經有勤勞偉大的開發者編寫了整合眾多小功能於一身的第三方庫,本文要給大家介紹的funcy就是其中非常實用的一個,它彙集了數量驚人的實用函式及裝飾器,幫助我們使用Python更好的踐行函數語言程式設計理念。

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖1

2 funcy中的實用API

  funcy的設計宗旨就是彙集一系列花哨的實用函式,其在不斷地迭代過程中,已經積累下相當多的功能,下面我們就來學習其中代表性的一些。

  使用pip install funcy完成安裝後,推薦大家按照如下方式進行匯入:

import funcy as fc
  • 無限計數器

  funcy中的count()可以生成一個可指定起點和步長的無限迭代器,預設引數start=0step=1,我們可以用它來替代常規的while迴圈+自增變數的邏輯:

for i in fc.count():
    print(i, end='\r')
    
    # 當i大於等於1000時停止迭代,否則繼續
    if i >= 1000:
        break
  • 展平巢狀陣列

  funcy中的flatten()可以用來展平任意的巢狀陣列:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖2
  • 在指定陣列中插空

  funcy中的interpose()可以用來將指定元素插入到對應陣列的兩兩元素之間:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖3
  • 批量刪除滿足指定條件的元素

  在funcy中有兩種從原始列表中刪除指定元素的方法,方式1是使用remove()來傳入條件判斷函式來刪除滿足條件的元素,類似filter()的方式:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖4

  第二種方式是利用funcy中的without(),它可以幫我們從原始陣列中排除指定的1個或多個元素,譬如下面我們把2、5、7、9排除掉:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖5
  • 按照制定條件分組劃分原始陣列

  funcy中提供了group_by()函式,幫助我們傳入函式,作用於指定陣列的每個元素上,並自動按照返回的結果進行分組輸出,就像下面的例子那樣:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖6
  • 等長度拆分陣列,丟棄末尾長度不足的部分

  funcy中的partition()幫助我們對輸入的陣列做指定長度的切片劃分,譬如下面的例子,我們對列表[0, 1, ..., 10]進行長度為3的切片拆分,剩餘不足長度3的部分就會被丟棄:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖7
  • 等長度拆分陣列,並保留長度不足的部分

  與partition()功能相似,funcy中的chunks()會在等長度拆分陣列的同時,保留末尾長度不足的部分單獨輸出:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖8
  • 輸出相鄰成對元素二元組

  利用funcy中的pairwise(),我們可以對輸入陣列從頭開始,將相鄰的成對元素以二元組的形式輸出:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖9
  • 合併多個同型別物件

  利用merge(),我們可以將傳入的多個同型別資料結構拼成一個完整的,這在合併集合或字典時尤其受用:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖10
  • 阻止函式遇到錯誤時的常規報錯方式

  有些情況下我們執行某些函式時,由於某些原因導致報錯,但如果我們並不希望遇到錯誤就中斷的話,就需要自己寫額外的try...except...邏輯,而funcy中的silent()則可以讓這個過程變得很省事:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖11
  • 阻止函式遇到指定錯誤時的常規報錯方式

  上面介紹的silent()會幫助傳入函式遇到任意錯誤時返回None,而funcy中的ignore()則賦予我們指定錯誤型別,以及報錯時設定返回值的能力:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖12
  • 裝飾指定函式,使其記憶歷史執行記錄值

  下面要介紹的方法非常的實用,想象一下這樣的場景:你書寫的某個函式接受輸入,然後經過一段耗時不菲的計算過程輸出結果,但在函式實際呼叫過程中經常遇到重複的傳入引數。

  這種時候你肯定希望自己的函式可以“記憶”下執行過的引數與輸出結果,省得大量重複計算,而funcy中的memoize裝飾器就可以幫助我們快速改造自己的函式:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖13

  而函式的快取記錄可查詢,可自定義新增,也可以手動清空:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖14
  • 以標籤:值的方式輔助debug

  很多情況下,print()迴圈過程變數變化情況的debug方式雖然很粗糙,但有些時候下卻很方便,但在一些諸如列表推導等情況下卻不太方便注入print()程式碼。

  而利用funcy中的tap()函式,我們可以將迭代變數傳入,並填寫對應說明標籤,即可快速檢視執行過程,tap()的邏輯其實很簡單,相當於把輸入值列印一下再原封不動地返回,但既然有現成的API,何樂而不為~

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖15
  • 約束某個函式的可執行次數

  有些情況下,我們希望程式中的某個函式在整個程式的生命週期中只執行一次,譬如建立資料庫連線等操作時,而funcy中提供的裝飾器once就可以幫助我們快速實現這個功能,並且保證了執行緒安全:

(資料科學學習手札101)funcy:Python中的函數語言程式設計百寶箱
圖16

  除了以上介紹的這些功能之外,funcy還擁有其他眾多的實用API,你可以進入其官方文件進行檢視( https://funcy.readthedocs.io/en/stable/ )。


  以上就是本文的全部內容,歡迎在評論區與我進行討論~

相關文章