2021年12月10日 星期五

Python:利用 operator 及 functools 模組輔助 functional programming

 首先先介紹 operator 模組中的幾個函數:

  • itemgetter
  • attrgetter
  • methodcaller

itemgetter 會呼叫 __getitem__,與 lambda fields: fields[$X]有類似的效果。attrgetter 可以直接用名字取得物件的 attributes。以下為一個例子:

from collections import namedtuple
from operator import attrgetter, itemgetter
data = [
    ('San Francisco', 'US'),
    ('Paris', 'FR'),
]
City = namedtuple('City', 'name cc')
cities = [City(name, cc) for name, cc in data]
# itemgetter & attrgetter
items_itemgetter = itemgetter(1, 0)
items_attrgetter = attrgetter('cc', 'name')
for city in cities:
    # Same results
    print(items_itemgetter(city))
    print(items_attrgetter(city))

methodcaller 會創造一個函數 (method),並且直接代入其引數:

from operator import methodcaller
s = 'hello world!'
fn = methodcaller('replace', '!', '++')
print(fn(s)) # hello world++

上面的例子中 s 為一個字串,而 replace 為字串類別的函數 (method)。這個用法與 partial 很類似,差別是 partial 的第一個參數為一個函數 (function),而不是一個類別的 method。以下為一個例子:

from functools import partial
from operator import mul
double = partial(mul, 2)
print(double(7)) # 14

沒有留言:

張貼留言