python每周一库之operator

今天介绍下python中的operator库。

operator中提供了一些高效的方法表示数学运算,如:


# 加法
operator.add(1, 2)

# 减法
operator.sub(1, 2)

# 乘法
operator.mul(2, 3)

# a是否小于b
operator.lt(a, b)

等。今天不介绍上面数学运算相关的内容,而是介绍下几个有趣的函数:attrgetter,itemgetter,methodcaller。

attrgetter
该方法传入属性名称,返回值可以接收一个对象,从而获取该实例对象属性名称对应的值,
例子如下:


class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b


t = Test(1, 2)
f = operator.attrgetter('a', 'b')
f(t)  # 相当于返回(t.a, t.b)
# 或者
# operator.attrgetter('a', 'b')(t)

# output
(1, 2)

若传入的属性不在对象中,会抛出异常


AttributeError: 'Test' object has no attribute 'xxx'

itemgetter
该方法接收索引值,返回值可以接收一个可迭代对象,获取对象中对应索引的值


str = 'sdefdcdfr'
f = operator.itemgetter(1, 3, 5)
f(str)  # 实际返回(str[1], str[3], str[5])
# 或者
l1 = [1, 2, 3, 4, 5, 6]
f = operator.itemgetter(1, 3, 5)
f(l1)   # 实际返回(l1[1], l1[3], l1[5])

# output
('d', 'f', 'c')
# 或者
(2, 4, 6)

methodcaller
该方法接收某个类中函数名称和函数所需的参数,返回一个对象,该对象接收上面的类中一个实例作为参数,然后执行实例中的函数


class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def get_value(self):
        return self.a, self.b

t = Test(1, 2)
f = operator.methodcaller('get_value')
f(t)

# output
(1, 2)

还可以接收参数


class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def get_value(self, flag):
        if flag == 1:
            return self.a
        return self.b


t = Test(1, 2)
f = operator.methodcaller('get_value', flag=2)
f(t)

# output
2

上面三个方法的功能看上去有些相似,attrgetter是获取实例属性的值,itemgetter是获取可迭代对象的值,methodcaller是获取实例方法的执行结果。与常规的获取实例属性值,实例方法返回结果相比,这些方式给我们提供了更多选择。而且itemgetter对于我们获取可迭代对象指定索引的值提供了更方便的方式:


itemgetter(1, 2, 3)([1, 5, 2 ,67, 13])