說說 Python 中的 Operator 模塊

Python 中的 Operator 模塊可以讓它支持函數(shù)式編程运敢。

1 計算函數(shù)

假設(shè)我們需要一個計算階乘的函數(shù)邑遏,一般做法是使用遞歸。如果使用函數(shù)式編程困曙,可以有兩種方式表伦,一種 lambda谦去,另一種使用 Operator 模塊中的算術(shù)函數(shù)。我們做個比較绑榴。

首先使用 lambda 方式來實現(xiàn):

from functools import reduce
def fact(n):
    return reduce(lambda a, b: a * b, range(1, n + 1))

這里用到了 reduce 方法哪轿,reduce() 函數(shù)語法:reduce(function, iterable[, initializer])。其中的 function 函數(shù)有兩個參數(shù)翔怎。reduce() 函數(shù)會先對集合中的第 1、2 個元素進行 function 函數(shù)處理杨耙,得到的結(jié)果再與第三個元素進行 function 函數(shù)處理赤套,最后得到一個結(jié)果1

reduce() 函數(shù)中的 function 使用 lambda 表達式珊膜。第二個入?yún)?iterable 使用 range() 方法來生成容握。

接著使用 Operator 模塊中的 mul 函數(shù)來實現(xiàn)階乘:

from operator import mul
def factWithMul(n):
    return reduce(mul, range(1, n + 1))

相對來說,使用 Operator 模塊中的計算函數(shù)车柠,代碼更加簡潔剔氏。

從源碼上分析,mul 函數(shù)就是計算兩個入?yún)⒌某朔e:

def mul(a, b):
    "Same as a * b."
    return a * b

Operator 模塊內(nèi)部還定義了很多類似的計算函數(shù)竹祷,比如:


2 過濾函數(shù)

operator 模塊中還有一類函數(shù)能夠起到條件過濾的作用谈跛。

首先介紹 itemgetter 函數(shù)。假設(shè)定義了一個 f 函數(shù)塑陵,f = itemgetter(2)感憾,那么如果調(diào)用 f(r),實際會返回 r[2]令花。也就是說阻桅,傳入的入?yún)?r,最終返回的只是 r 的索引值為 2 (從 1 開始計算)那一部分兼都。

itemgetter 函數(shù)應(yīng)用場景是:根據(jù)元組的某個字段對元組列表進行排序嫂沉。比如我們有一段 JSON 格式的城市數(shù)據(jù),需要對其簡稱進行排序:

from operator import itemgetter

metro_areas = [('Tokyo', 'JP', 36.933, (35.689722, 139.691667)), ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
               ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
               ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
               ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
               ]
for city in sorted(metro_areas, key=itemgetter(1)):
    logging.info('city -> %s', city)

運行結(jié)果:

INFO - city -> ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833))
INFO - city -> ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889))
INFO - city -> ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
INFO - city -> ('Mexico City', 'MX', 20.142, (19.433333, -99.133333))
INFO - city -> ('New York-Newark', 'US', 20.104, (40.808611, -74.020386))

城市數(shù)據(jù)數(shù)組中的每一個元素扮碧,拆分來看趟章,就是元組形式。 itemgetter 函數(shù)取出元組的第二個值作為 sorted 函數(shù)的排序依據(jù)芬萍。

如果傳入 itemgetter 的入?yún)⒉恢挂粋€尤揣,那么它就是一個過濾函數(shù),只把需要的列過濾出來柬祠。

比如我們只需要城市數(shù)組中的城市簡稱與所在坐標北戏,就可以這么做:

cc_name = itemgetter(1, 3)
for city in metro_areas:
logging.info('city -> %s', cc_name(city))

運行結(jié)果:

INFO - city -> ('JP', (35.689722, 139.691667))
INFO - city -> ('IN', (28.613889, 77.208889))
INFO - city -> ('MX', (19.433333, -99.133333))
INFO - city -> ('US', (40.808611, -74.020386))
INFO - city -> ('BR', (-23.547778, -46.635833))

  1. 說說 Python 中的高階函數(shù).
  2. Luciano Ramalho (作者),安道漫蛔,吳珂 (譯者).流暢的Python[M].人民郵電出版社嗜愈,2017:265-269.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旧蛾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蠕嫁,更是在濱河造成了極大的恐慌锨天,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃毒,死亡現(xiàn)場離奇詭異病袄,居然都是意外死亡,警方通過查閱死者的電腦和手機赘阀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門益缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人基公,你說我怎么就攤上這事幅慌。” “怎么了轰豆?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵胰伍,是天一觀的道長。 經(jīng)常有香客問我酸休,道長骂租,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任雨席,我火速辦了婚禮菩咨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陡厘。我一直安慰自己抽米,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布糙置。 她就那樣靜靜地躺著云茸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谤饭。 梳的紋絲不亂的頭發(fā)上标捺,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音揉抵,去河邊找鬼亡容。 笑死,一個胖子當著我的面吹牛冤今,可吹牛的內(nèi)容都是我干的闺兢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼戏罢,長吁一口氣:“原來是場噩夢啊……” “哼屋谭!你這毒婦竟也來了脚囊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤桐磁,失蹤者是張志新(化名)和其女友劉穎悔耘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體我擂,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡衬以,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了校摩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泄鹏。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秧耗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舶治,我是刑警寧澤分井,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站霉猛,受9級特大地震影響尺锚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惜浅,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一瘫辩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坛悉,春花似錦伐厌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轩猩,卻和暖如春卷扮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背均践。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工晤锹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彤委。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓鞭铆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親葫慎。 傳聞我的和親對象是個殘疾皇子衔彻,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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