這個(gè)庫(kù)堪稱Python編程的瑞士軍刀

1 簡(jiǎn)介

我們?cè)谑褂肞ython完成日常任務(wù)時(shí)土辩,經(jīng)常會(huì)遇到一些很小的輔助性的需求靴跛,又不想花費(fèi)時(shí)間去搜索是否已有現(xiàn)成的庫(kù)實(shí)現(xiàn)了這些功能幢泼,往往則需要自己臨時(shí)編寫一些邏輯或函數(shù)。

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

圖1

2 funcy中的實(shí)用API

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

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

importfuncyasfc

「無(wú)限計(jì)數(shù)器」

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

foriinfc.count():

print(i, end='\r')

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

ifi >=1000:

break

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

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

圖2

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

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

圖3

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

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

圖4

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

圖5

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

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

圖6

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

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

圖7

「等長(zhǎng)度拆分?jǐn)?shù)組辛馆,并保留長(zhǎng)度不足的部分」

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

圖8

「輸出相鄰成對(duì)元素二元組」

利用funcy中的pairwise()昙篙,我們可以對(duì)輸入數(shù)組從頭開(kāi)始腊状,將相鄰的成對(duì)元素以二元組的形式輸出:

圖9

「合并多個(gè)同類型對(duì)象」

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

圖10

「阻止函數(shù)遇到錯(cuò)誤時(shí)的常規(guī)報(bào)錯(cuò)方式」

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

圖11

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

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

圖12

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

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

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

圖13

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

圖14

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

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

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

圖15

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

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

圖16

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末键科,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萝嘁,老刑警劉巖梆掸,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牙言,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)怪得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門咱枉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徒恋,你說(shuō)我怎么就攤上這事蚕断。” “怎么了入挣?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵亿乳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我径筏,道長(zhǎng)葛假,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任滋恬,我火速辦了婚禮聊训,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恢氯。我一直安慰自己带斑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布勋拟。 她就那樣靜靜地躺著勋磕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敢靡。 梳的紋絲不亂的頭發(fā)上挂滓,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音醋安,去河邊找鬼杂彭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吓揪,可吹牛的內(nèi)容都是我干的亲怠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柠辞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后党饮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出学密,到底是詐尸還是另有隱情彤守,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布抡草,位于F島的核電站康震,受9級(jí)特大地震影響腿短,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钝诚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垫蛆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)继找。三九已至遂跟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婴渡,已是汗流浹背幻锁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留边臼,地道東北人哄尔。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柠并,于是被迫代替她去往敵國(guó)和親岭接。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容