官方入口:https://docs.python.org/3.7/library/operator.html#module-operator
operator.itemgetter(item)
operator.itemgetter(*items)
返回callable对象,调用被操作对象的 __getitem__() 方法:
-
After
f = itemgetter(2), the callf(r)returnsr[2]. -
After
g = itemgetter(2, 5, 3), the callg(r)returns(r[2], r[5], r[3])
之所以用 itemgetter(2, 5, 3) 而不用(r[2], r[5], r[3]),是因为itemgetter的方式要更快一些,可提升效率。
应用(常用于key参数处,代替lambda):
itemgetter(1)('ABCDEFG')
#'B'
itemgetter(1,3,5)('ABCDEFG')
#('B', 'D', 'F')
itemgetter(slice(2,None))('ABCDEFG')
#'CDEFG'
soldier = dict(rank='captain', name='dotterbart')
itemgetter('rank')(soldier)
#'captain'
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
#等价于如下,但itemgeter更快
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))
operator.attrgetter(attr)
operator.attrgetter(*attrs)
类似itemgetter,取field值,也是可提高效率。
-
After
f = attrgetter('name'), the callf(b)returnsb.name. -
After
f = attrgetter('name', 'date'), the callf(b)returns(b.name, b.date). -
After
f = attrgetter('name.first', 'name.last'), the callf(b)returns(b.name.first, b.name.last).
class User:
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return 'User({})'.format(self.user_id)
users = [User(23), User(3), User(99)]
sorted(users, key=attrgetter('user_id'))
#[User(3), User(23), User(99)]
#等价于如下,但更高效
sorted(users, key=lambda u: u.user_id)
operator.methodcaller(name[, args...])
取方法。
-
After
f = methodcaller('name'), the callf(b)returnsb.name(). -
After
f = methodcaller('name', 'foo', bar=1), the callf(b)returnsb.name('foo', bar=1).
等价于:
def caller(obj):
return getattr(obj, name)(*args, **kwargs)
return caller
本文深入解析Python的Operator模块,介绍itemgetter、attrgetter和methodcaller函数的使用方法及效率优势,通过实例展示如何利用这些函数进行高效的数据处理和对象属性获取。
375

被折叠的 条评论
为什么被折叠?



