如何在Python中使用Operator模塊?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)成都服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。1 計(jì)算函數(shù)
假設(shè)我們需要一個(gè)計(jì)算階乘的函數(shù),一般做法是使用遞歸。如果使用函數(shù)式編程,可以有兩種方式,一種 lambda,另一種使用 Operator 模塊中的算術(shù)函數(shù)。我們做個(gè)比較。
首先使用 lambda 方式來(lái)實(shí)現(xiàn):
from functools import reduce def fact(n): return reduce(lambda a, b: a * b, range(1, n + 1))
這里用到了 reduce 方法,reduce() 函數(shù)語(yǔ)法:reduce(function, iterable[, initializer])
。其中的 function 函數(shù)有兩個(gè)參數(shù)。reduce() 函數(shù)會(huì)先對(duì)集合中的第 1、2 個(gè)元素進(jìn)行 function 函數(shù)處理,得到的結(jié)果再與第三個(gè)元素進(jìn)行 function 函數(shù)處理,最后得到一個(gè)結(jié)果1。
reduce() 函數(shù)中的 function 使用 lambda 表達(dá)式。第二個(gè)入?yún)?iterable 使用 range() 方法來(lái)生成。
接著使用 Operator 模塊中的 mul 函數(shù)來(lái)實(shí)現(xiàn)階乘:
from operator import mul def factWithMul(n): return reduce(mul, range(1, n + 1))
相對(duì)來(lái)說(shuō),使用 Operator 模塊中的計(jì)算函數(shù),代碼更加簡(jiǎn)潔。
從源碼上分析,mul 函數(shù)就是計(jì)算兩個(gè)入?yún)⒌某朔e:
def mul(a, b): "Same as a * b." return a * b
Operator 模塊內(nèi)部還定義了很多類似的計(jì)算函數(shù),比如:
operator 模塊中還有一類函數(shù)能夠起到條件過(guò)濾的作用。
首先介紹 itemgetter 函數(shù)。假設(shè)定義了一個(gè) f 函數(shù),f = itemgetter(2),那么如果調(diào)用 f(r),實(shí)際會(huì)返回 r[2]。也就是說(shuō),傳入的入?yún)?r,最終返回的只是 r 的索引值為 2 (從 1 開(kāi)始計(jì)算)那一部分。
itemgetter 函數(shù)應(yīng)用場(chǎng)景是:根據(jù)元組的某個(gè)字段對(duì)元組列表進(jìn)行排序。比如我們有一段 JSON 格式的城市數(shù)據(jù),需要對(duì)其簡(jiǎn)稱進(jìn)行排序:
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)
運(yùn)行結(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ù)組中的每一個(gè)元素,拆分來(lái)看,就是元組形式。 itemgetter 函數(shù)取出元組的第二個(gè)值作為 sorted 函數(shù)的排序依據(jù)。
如果傳入 itemgetter 的入?yún)⒉恢挂粋€(gè),那么它就是一個(gè)過(guò)濾函數(shù),只把需要的列過(guò)濾出來(lái)。
比如我們只需要城市數(shù)組中的城市簡(jiǎn)稱與所在坐標(biāo),就可以這么做:
cc_name = itemgetter(1, 3) for city in metro_areas: logging.info('city -> %s', cc_name(city))
運(yùn)行結(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))
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。