盡管 Python 不是為函數(shù)式編程而構(gòu)建的,但它確實(shí)支持函數(shù)式編程的一些非常棒的特性。如果您希望您的程序更優(yōu)雅、更可靠和無狀態(tài),那么函數(shù)式編程可能是您的考慮因素。
本文將介紹 Python 中的 3 個(gè)工具/函數(shù),它們可以為您提供強(qiáng)大的函數(shù)和優(yōu)雅地重構(gòu)程序的能力。
雖然Python不是為函數(shù)式編程而構(gòu)建的,但它確實(shí)支持函數(shù)式編程的一些非常棒的特性。如果您希望您的程序更加優(yōu)雅、可靠和無狀態(tài),那么函數(shù)式編程可能是您的考慮因素。
1. Map
什么是map函數(shù)?map函數(shù)有兩個(gè)參數(shù),第一個(gè)是您要應(yīng)用的函數(shù),第二個(gè)或多個(gè)后續(xù)參數(shù)是您希望該函數(shù)應(yīng)用到的可迭代對(duì)象。讓我們看下一個(gè)個(gè)例子:
在這里,我們想要對(duì)列表中的數(shù)字進(jìn)行平方。方法是定義一個(gè)函數(shù),然后使用map(function_you_want_to_apply, your_list). 請(qǐng)注意,您當(dāng)然可以將您的函數(shù)應(yīng)用于列表之外的任何可迭代對(duì)象。此外,該map函數(shù)將返回一個(gè)迭代器,您需要迭代返回的迭代器以獲取所有結(jié)果。
另一種用法是您可以將該函數(shù)應(yīng)用于多個(gè)可迭代對(duì)象。然而,在這種情況下,你必須讓你的函數(shù)接受多個(gè)參數(shù)——每個(gè)可迭代的參數(shù)。
如果你仍然像以前一樣使用單參數(shù)函數(shù)square,Python 會(huì)抱怨的。
另一個(gè)技巧是經(jīng)常將 lambda 表達(dá)式與map函數(shù)結(jié)合使用,以使您的代碼簡潔。Python 中的 lambda 表達(dá)式采用lambda your_arguments_to_take_in : expression_to_return. 例如,對(duì)于上述 2 個(gè)示例,我們可以將它們轉(zhuǎn)換為:
2. Reduce
該reduce函數(shù)的工作原理類似于 map-reduce 中的 reduce 概念。它接受一個(gè)數(shù)據(jù)流,或者在 Python 語言中,一個(gè)可迭代對(duì)象,并將函數(shù)從左到右應(yīng)用于迭代器。使用reduce關(guān)鍵字可以像map關(guān)鍵字一樣創(chuàng)建簡潔的語句。reduce和之間的一個(gè)關(guān)鍵區(qū)別map是reduce將函數(shù)累積地應(yīng)用于您的可迭代對(duì)象。這意味著它首先從可迭代對(duì)象中獲取 n 個(gè)參數(shù),然后返回 1 個(gè)結(jié)果,然后從可迭代對(duì)象中獲取下一個(gè) n-1 個(gè)參數(shù),并與之前的 1 個(gè)結(jié)果結(jié)合形成下一個(gè) n 個(gè)參數(shù)以傳遞給您的函數(shù)。換句話說,reduce關(guān)鍵字旨在將您的可迭代結(jié)果減少到 1 個(gè)。
在上面的代碼中,我們從maptoreduce關(guān)鍵字變?yōu)槲覀兊慕Y(jié)果從一個(gè)迭代器變?yōu)橐粋€(gè) int。
要了解它是如何工作的,我們可以參考關(guān)于 reduce 的官方 Python 文檔。根據(jù)它,reduce關(guān)鍵字的作用大致相當(dāng)于以下函數(shù):
您會(huì)看到reduce最終返回一個(gè)值,而不是 map可迭代對(duì)象。當(dāng)然,你總是可以將map和reduce組合在一起產(chǎn)生一個(gè)強(qiáng)有力的聲明。例如,以下代碼片段可以在一行內(nèi)計(jì)算列表的歐幾里得范數(shù):
map和在reducePython 和一般編程中超級(jí)有用和強(qiáng)大,請(qǐng)隨意使用它!
3. Filter
在上面的兩個(gè)討論中,我們學(xué)習(xí)了如何將函數(shù)應(yīng)用于一個(gè)可迭代的和輸出具有相同長度的結(jié)果和一個(gè)值。怎么樣:我們想過濾數(shù)組的所有奇數(shù)值,并在可迭代對(duì)象中留下偶數(shù)。在這種情況下,mapand都不能reduce正常工作,這就是filter關(guān)鍵字的用武之地?;菊Z法仍然與 map 和 reduce相同,只是除了filter的函數(shù)參數(shù)必須返回一個(gè)布爾值,在 Python 中稱為謂詞?,F(xiàn)在,讓我們輸入代碼:
另外,請(qǐng)注意,filter關(guān)鍵字返回一個(gè)可迭代的,就像map,而不是一個(gè)值。當(dāng)然,在Python中,將filter, map, reduce結(jié)合起來創(chuàng)建更復(fù)雜的一行程序是很自然的。例如,假設(shè)我們要計(jì)算所有偶數(shù)的平方和:
現(xiàn)在,您已經(jīng)從Python學(xué)習(xí)了這3個(gè)強(qiáng)大的關(guān)鍵字。在程序中適當(dāng)?shù)厥褂盟鼈兛梢宰尨a看起來很優(yōu)雅?,F(xiàn)在,輪到你應(yīng)用它們了!快樂學(xué)習(xí)和快樂編碼吧!
審核編輯:湯梓紅
?
評(píng)論
查看更多