关于python3中的包operator(支持函数式编程的包)
文章目錄
- 1.functools
- 2.operator.itemgetter
- 3.operator.attrgetter
雖然 Guido 明確表明,Python 的目標(biāo)不是變成函數(shù)式編程語(yǔ)言,但是得益于 operator 和
 functools 等包的支持,函數(shù)式編程風(fēng)格也可以信手拈來(lái)。接下來(lái)的兩節(jié)分別介紹這兩
 個(gè)包。
1.functools
示例1 使用 reduce 函數(shù)和一個(gè)匿名函數(shù)計(jì)算階乘
from functools import reduce def fact(n): return reduce(lambda a, b: a*b, range(1, n+1))operator 模塊為多個(gè)算術(shù)運(yùn)算符提供了對(duì)應(yīng)的函數(shù),從而避免編寫(xiě) lambda a, b: a*b
 這種平凡的匿名函數(shù)。使用算術(shù)運(yùn)算符函數(shù),可以把示例 5-21 改寫(xiě)成示例 5-22 那樣。
 示例 2使用 reduce 和 operator.mul 函數(shù)計(jì)算階乘:
2.operator.itemgetter
operator 模塊中還有一類(lèi)函數(shù),能替代從序列中取出元素或讀取對(duì)象屬性的 lambda 表
 達(dá)式:因此,itemgetter 和 attrgetter 其實(shí)會(huì)自行構(gòu)建函數(shù)。
示例3 演示使用 itemgetter 排序一個(gè)元組列表
from operator import itemgetter metro_data = [('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_data, key=itemgetter(1)):print(city)itemgetter(1) 的作用與 lambda fields: fields[1] 一樣:創(chuàng)建一個(gè)接受集合
 的函數(shù),返回索引位 1 上的元素。
示例4 如果把多個(gè)參數(shù)傳給 itemgetter,它構(gòu)建的函數(shù)會(huì)返回提取的值構(gòu)成的元組:
from operator import itemgetter metro_data = [ ('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)), ] cc_name = itemgetter(1, 0, 1, 2) for city in metro_data:print(cc_name(city))''' ('JP', 'Tokyo', 'JP', 36.933)('IN', 'Delhi NCR', 'IN', 21.935)('MX', 'Mexico City', 'MX', 20.142)('US', 'New York-Newark', 'US', 20.104)('BR', 'Sao Paulo', 'BR', 19.649)'''itemgetter 使用 [] 運(yùn)算符,因此它不僅支持序列,還支持映射和任何實(shí)現(xiàn)__getitem__ 方法的類(lèi)。3.operator.attrgetter
attrgetter 與 itemgetter 作用類(lèi)似,它創(chuàng)建的函數(shù)根據(jù)名稱(chēng)提取對(duì)象的屬性。
 如果把多個(gè)屬性名傳給 attrgetter,它也會(huì)返回提取的值構(gòu)成的元組。此外,如果參數(shù)名中包
 含 .(點(diǎn)號(hào)),attrgetter 會(huì)深入嵌套對(duì)象,獲取指定的屬性。
下面是 operator 模塊中定義的部分函數(shù)(省略了以 _ 開(kāi)頭的名稱(chēng),因?yàn)樗鼈兓旧鲜菍?shí)
 現(xiàn)細(xì)節(jié))
以 i 開(kāi)頭、后面是另一個(gè)運(yùn)算符的那些名稱(chēng)(如iadd、iand 等),對(duì)應(yīng)的是增量賦值運(yùn)算符(如 +=、&= 等)。如果第一個(gè)參數(shù)是可變的,那么這些運(yùn)算符函數(shù)會(huì)就地修改它;否則,作用與不帶 i 的函數(shù)一樣,直接返回運(yùn)算結(jié)果。
在 operator 模塊余下的函數(shù)中,我們最后介紹一下 methodcaller。它的作用與attrgetter 和 itemgetter 類(lèi)似,它會(huì)自行創(chuàng)建函數(shù)。methodcaller 創(chuàng)建的函數(shù)會(huì)在對(duì)象上調(diào)用參數(shù)指定的方法,如下例子:
 示例 5methodcaller 使用示例:第二個(gè)測(cè)試展示綁定額外參數(shù)的方式:
functools 模塊提供了一系列高階函數(shù),其中最為人熟知的或許是 reduce,
 我們?cè)?5.2.1節(jié)已經(jīng)介紹過(guò)。余下的函數(shù)中,最有用的是 partial 及其變體,partialmethod。
 functools.partial 這個(gè)高階函數(shù)用于部分應(yīng)用一個(gè)函數(shù)。**部分應(yīng)用是指,基于一個(gè)函數(shù)創(chuàng)建一個(gè)新的可調(diào)用對(duì)象,把原函數(shù)的某些參數(shù)固定。**使用這個(gè)函數(shù)可以把接受一個(gè)或多個(gè)參數(shù)的函數(shù)改編成需要回調(diào)的 API,這樣參數(shù)更少。
 示例 5-26 做了簡(jiǎn)單的演示。
示例 5-28 在示例 5-10 中定義的 tag 函數(shù)上使用 partial,凍結(jié)一個(gè)定位參數(shù)和一個(gè)關(guān)鍵
 字參數(shù)。
 示例 5-28 把 partial 應(yīng)用到示例 5-10 中定義的 tag 函數(shù)上:
總結(jié)
以上是生活随笔為你收集整理的关于python3中的包operator(支持函数式编程的包)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 某酒店预定需求分析
- 下一篇: 前端学习(359):svn服务器配置金和
