您好,登錄后才能下訂單哦!
如何在Python中使用Operator模塊?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1 計算函數
假設我們需要一個計算階乘的函數,一般做法是使用遞歸。如果使用函數式編程,可以有兩種方式,一種 lambda,另一種使用 Operator 模塊中的算術函數。我們做個比較。
首先使用 lambda 方式來實現:
from functools import reduce def fact(n): return reduce(lambda a, b: a * b, range(1, n + 1))
這里用到了 reduce 方法,reduce() 函數語法:reduce(function, iterable[, initializer])
。其中的 function 函數有兩個參數。reduce() 函數會先對集合中的第 1、2 個元素進行 function 函數處理,得到的結果再與第三個元素進行 function 函數處理,最后得到一個結果1。
reduce() 函數中的 function 使用 lambda 表達式。第二個入參 iterable 使用 range() 方法來生成。
接著使用 Operator 模塊中的 mul 函數來實現階乘:
from operator import mul def factWithMul(n): return reduce(mul, range(1, n + 1))
相對來說,使用 Operator 模塊中的計算函數,代碼更加簡潔。
從源碼上分析,mul 函數就是計算兩個入參的乘積:
def mul(a, b): "Same as a * b." return a * b
Operator 模塊內部還定義了很多類似的計算函數,比如:
operator 模塊中還有一類函數能夠起到條件過濾的作用。
首先介紹 itemgetter 函數。假設定義了一個 f 函數,f = itemgetter(2),那么如果調用 f(r),實際會返回 r[2]。也就是說,傳入的入參 r,最終返回的只是 r 的索引值為 2 (從 1 開始計算)那一部分。
itemgetter 函數應用場景是:根據元組的某個字段對元組列表進行排序。比如我們有一段 JSON 格式的城市數據,需要對其簡稱進行排序:
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)
運行結果:
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))
城市數據數組中的每一個元素,拆分來看,就是元組形式。 itemgetter 函數取出元組的第二個值作為 sorted 函數的排序依據。
如果傳入 itemgetter 的入參不止一個,那么它就是一個過濾函數,只把需要的列過濾出來。
比如我們只需要城市數組中的城市簡稱與所在坐標,就可以這么做:
cc_name = itemgetter(1, 3) for city in metro_areas: logging.info('city -> %s', cc_name(city))
運行結果:
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))
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。