The operator module exports a set of efficient functions corresponding to the intrinsic operators of Python
1. mul
# 使用reduce韩式和一个匿名函数计算阶乘
from functools import reduce
def fact(n):
return reduce(lambda a, b: a*b, range(1,n+1)
operator模块为多个算术运算符提供了对应的函数, 避免匿名函数
# 使用reduce和operator.mul函数计算阶乘
from functools import reduce
from operator import mul
def fact(n):
return reduce(mul, range(1, n+1))
2.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)),
]
from operator import itemgetter
sorted(metro_data, key=itemgetter(1))
结果:
[
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386))
]
# itemgetter使用[]运算符,因此支持序列,映射和任何实现了__getitem__方法的类
sorted(metro_data, key=itemgetter(1)) 比较的是metro_data[i][1]. 其中i是metro_data的索引。也就是排序比较的是‘JP’那一列对应的值
3. attrgetter
from collections import namdtuple
LatLong=namedtuple('LatLong', 'lat long')
Metropolis = namedtuple('Metropolis', 'name cc pop coord')
metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data]
from operator import attrgetter
sorted(metro_areas, key=attrgetter('coord.lat)
# 结果
[
Metropolis(name='Sao Paulo', cc='BR', pop=19.649, coord=LatLong(lat=-23.547778, long=-46.635833)),
Metropolis(name='Mexico City', cc='MX', pop=20.142, coord=LatLong(lat=19.433333, long=-99.133333)),
Metropolis(name='Delhi NCR', cc='IN', pop=21.935, coord=LatLong(lat=28.613889, long=77.208889)),
Metropolis(name='Tokyo', cc='JP', pop=36.933, coord=LatLong(lat=35.689722, long=139.691667)),
Metropolis(name='New York-Newark', cc='US', pop=20.104, coord=LatLong(lat=40.808611, long=-74.020386))
]
# attrgetter使用符号".", 属性运算符。所以sorted(metro_areas, key=attrgetter('coord.lat)比较的是metro_areas[i].coord.lat对象。
4. methodcaller
>>> from operator import methodcaller
>>> s = 'The time has come'
>>> upcase = methodcaller('upper')
>>> upcase(s)
'THE TIME HAS COME'
>>> hiphenate = methodcaller('replace', ' ', '-')
>>> hiphenate(s)
'The-time-has-come'