這個庫堪稱Python編程的瑞士軍刀

1 簡介

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

而事實上已經(jīng)有勤勞偉大的開發(fā)者編寫了集成眾多小功能于一身的第三方庫,本文要給大家介紹的funcy就是其中非常實用的一個,它匯集了數(shù)量驚人的實用函數(shù)及裝飾器,幫助我們使用Python更好的踐行「函數(shù)式編程」理念。

圖1

2 funcy中的實用API

funcy的設(shè)計宗旨就是匯集一系列花哨的實用函數(shù),其在不斷地迭代過程中,已經(jīng)積累下相當(dāng)多的功能,下面我們就來學(xué)習(xí)其中代表性的一些。

使用pip install funcy完成安裝后,推薦大家按照如下方式進(jìn)行導(dǎo)入:

importfuncyasfc

「無限計數(shù)器」

funcy中的count()可以生成一個可指定起點和步長的無限迭代器,默認(rèn)參數(shù)start=0,step=1,我們可以用它來替代常規(guī)的while循環(huán)+自增變量的邏輯:

foriinfc.count():

print(i, end='\r')

當(dāng)i大于等于1000時停止迭代,否則繼續(xù)

ifi >=1000:

break

「展平嵌套數(shù)組」

funcy中的flatten()可以用來展平任意的嵌套數(shù)組:

圖2

「在指定數(shù)組中插空」

funcy中的interpose()可以用來將指定元素插入到對應(yīng)數(shù)組的兩兩元素之間:

圖3

「批量刪除滿足指定條件的元素」

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

圖4

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

圖5

「按照制定條件分組劃分原始數(shù)組」

funcy中提供了group_by()函數(shù),幫助我們傳入函數(shù),作用于指定數(shù)組的每個元素上,并自動按照返回的結(jié)果進(jìn)行分組輸出,就像下面的例子那樣:

圖6

「等長度拆分?jǐn)?shù)組,丟棄末尾長度不足的部分」

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

圖7

「等長度拆分?jǐn)?shù)組,并保留長度不足的部分」

與partition()功能相似,funcy中的chunks()會在等長度拆分?jǐn)?shù)組的同時,保留末尾長度不足的部分單獨輸出:

圖8

「輸出相鄰成對元素二元組」

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

圖9

「合并多個同類型對象」

利用merge(),我們可以將傳入的多個同類型數(shù)據(jù)結(jié)構(gòu)拼成一個完整的,這在合并集合或字典時尤其受用:

圖10

「阻止函數(shù)遇到錯誤時的常規(guī)報錯方式」

有些情況下我們執(zhí)行某些函數(shù)時,由于某些原因?qū)е聢箦e,但如果我們并不希望遇到錯誤就中斷的話,就需要自己寫額外的try...except...邏輯,而funcy中的silent()則可以讓這個過程變得很省事:

圖11

「阻止函數(shù)遇到指定錯誤時的常規(guī)報錯方式」

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

圖12

「裝飾指定函數(shù),使其記憶歷史執(zhí)行記錄值」

下面要介紹的方法非常的實用,想象一下這樣的場景:你書寫的某個函數(shù)接受輸入,然后經(jīng)過一段耗時不菲的計算過程輸出結(jié)果,但在函數(shù)實際調(diào)用過程中經(jīng)常遇到重復(fù)的傳入?yún)?shù)。

這種時候你肯定希望自己的函數(shù)可以“記憶”下執(zhí)行過的參數(shù)與輸出結(jié)果,省得大量重復(fù)計算,而funcy中的memoize裝飾器就可以幫助我們快速改造自己的函數(shù):

圖13

而函數(shù)的緩存記錄可查詢,可自定義添加,也可以手動清空:

圖14

「以標(biāo)簽:值的方式輔助debug」

很多情況下,print()循環(huán)過程變量變化情況的debug方式雖然很粗糙,但有些時候下卻很方便,但在一些諸如「列表推導(dǎo)」等情況下卻不太方便注入print()代碼。

而利用funcy中的tap()函數(shù),我們可以將迭代變量傳入,并填寫對應(yīng)說明標(biāo)簽,即可快速查看運行過程,tap()的邏輯其實很簡單,相當(dāng)于把輸入值打印一下再原封不動地返回,但既然有現(xiàn)成的API,何樂而不為~

圖15

「約束某個函數(shù)的可執(zhí)行次數(shù)」

有些情況下,我們希望程序中的某個函數(shù)在整個程序的生命周期中只執(zhí)行一次,譬如創(chuàng)建數(shù)據(jù)庫連接等操作時,而funcy中提供的裝飾器once就可以幫助我們快速實現(xiàn)這個功能,并且保證了線程安全:

圖16

除了以上介紹的這些功能之外,funcy還擁有其他眾多的實用API,你可以進(jìn)入其官方文檔進(jìn)行查看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容