Python函数式编程(三)操作符函数(operator)

operator 模块提供了一套与Python的内置运算符对应的高效率函数。例如,operator.add(x, y) 与表达式 x+y 相同。 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。为了表述清楚,建议使用没有双下划线的函数。
函数包含的种类有:对象的比较运算、逻辑运算、数学运算以及序列运算。
对象比较函数适用于所有的对象,函数名根据它们对应的比较运算符命名。

操作符函数

操作符表达式 含义
operator.lt(ab) a
operator.le(ab) a<=b
operator.eq(ab) a==b
operator.ne(ab) a!=b
operator.gt(ab) a>b
operator.ge(ab) a>=b
operator.not_(obj) not obj
operator.truth(obj) bool(obj)
operator.is_(ab) a is b
operator.is_not(ab) a is not b
operator.abs(obj) abs(obj)
operator.pos(obj) +obj
operator.neg(obj) -obj
operator.add(ab) a+b
operator.sub(ab) a-b
operator.mul(ab) a*b
operator.truediv(ab) a/b
operator.floordiv(ab) a//b
operator.mod(ab) a%b
operator.pow(ab) a**b
operator.and_(ab) a&b
operator.or_(ab) a|b
operator.xor(ab) a^b
operator.matmul(ab) a@b

operator.inv(obj)

operator.invert(obj)

~obj
operator.lshift(ab) a<
operator.rshift(ab) a>>b
operator.index(a) index(a)
operator.concat(ab) a+b
operator.contains(ab) b in a
operator.countOf(ab) count(a,b)返回 b 在 a 中的出现次数
operator.delitem(ab) del a[b]
operator.getitem(ab) a[b]
operator.indexOf(ab) 返回 b 在 a 中首次出现所在的索引号。
operator.setitem(abc) a[b]=c
operator.length_hint(objdefault=0) len(obj)
operator.call(obj/*args**kwargs) obj(*args, **kwargs)

operator.attrgetter(attr)

operator.attrgetter(*attrs)

返回一个可从操作数中获取 attr 的可调用对象。 如果请求了一个以上的属性,则返回一个属性元组。 属性名称还可包含点号。 例如:

在 f = attrgetter('name') 之后,调用 f(b) 将返回 b.name

在 f = attrgetter('name', 'date') 之后,调用 f(b) 将返回 (b.name, b.date)

在 f = attrgetter('name.first', 'name.last') 之后,调用 f(b) 将返回 (b.name.first, b.name.last)

operator.itemgetter(item)

operator.itemgetter(*items)

返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:

在 f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]

在 g = itemgetter(2, 5, 3) 之后,调用 g(r) 将返回 (r[2], r[5], r[3])

operator.methodcaller(name/*args**kwargs) 返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:

在 f = methodcaller('name') 之后,调用 f(b) 将返回 b.name()

在 f = methodcaller('name', 'foo', bar=1) 之后,调用 f(b) 将返回 b.name('foo', bar=1)

operator.iadd(ab) a += b
operator.isub(ab) a -= b
operator.imul(ab) a *= b
operator.itruediv(ab) a /= b
operator.ifloordiv(ab) a //= b
operator.imod(ab) a %= b
operator.ipow(ab) a **= b
operator.iconcat(ab) a += b
operator.ilshift(ab) a <<= b
operator.irshift(ab) a >>= b
operator.imatmul(ab) a @= b
operator.iand(ab) a &= b
operator.ior(ab) a |= b
operator.ixor(ab) a ^= b
import operator
import functools

print(operator.le(10, 20)) #True
print(operator.add(10, 20)) #30

numlist = [1,2,3,4,5,6,7,8]
result = map(operator.add, numlist, numlist)
print(list(result)) #[2, 4, 6, 8, 10, 12, 14, 16]
result = functools.reduce(operator.mul, numlist)
print(result) #40320

对象属性提取attrgetter

attrgetter 类可以获取对象的属性用于 map(), stored()等高阶函数 操作

import operator
import functools

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'({self.name=}, {self.age=})'

slist = [Student('Alice', 15), Student('Bibe', 16), Student('Chen', 12), Student('Jack', 13)]

#按年龄排序
print(sorted(slist, key=operator.attrgetter('age')))
#按姓名排序
print(sorted(slist, key=operator.attrgetter('name')))

‘’'
[(self.name='Chen', self.age=12), (self.name='Jack', self.age=13), (self.name='Alice', self.age=15), (self.name='Bibe', self.age=16)]
[(self.name='Alice', self.age=15), (self.name='Bibe', self.age=16), (self.name='Chen', self.age=12), (self.name='Jack', self.age=13)]
‘''

对象方法提取methodcaller

operator.methodcaller(name/*args**kwargs)

返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:

  • 在 f = methodcaller('name') 之后,调用 f(b) 将返回 b.name()
  • 在 f = methodcaller('name', 'foo', bar=1) 之后,调用 f(b) 将返回 b.name('foo', bar=1)

import operator
import functools

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'({self.name=}, {self.age=})'

    def isPupil(self):
        if self.age >=6 and self.age < 12:
            return True

        return False

slist = [Student('Alice', 6), Student('Bibe', 8), Student('Chen', 12), Student('Jack', 9)]

print(list(filter(operator.methodcaller('isPupil'), slist)))
#[(self.name='Alice', self.age=6), (self.name='Bibe', self.age=8), (self.name='Jack', self.age=9)]

下标获取itemgetter

operator.itemgetter(item)

operator.itemgetter(*items)

返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:
在 f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]。
在 g = itemgetter(2, 5, 3) 之后,调用 g(r) 将返回 (r[2], r[5], r[3])。

>>>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'

使用 itemgetter() 从元组的记录中提取特定字段的例子:

>>>inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>>getcount = itemgetter(1)
>>>list(map(getcount, inventory))
[3, 2, 5, 1]
>>>sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]

 

 

将运算符映射到函数

运算

语法

函数

加法

a + b

add(a, b)

字符串拼接

seq1 + seq2

concat(seq1, seq2)

包含测试

obj in seq

contains(seq, obj)

除法

a / b

truediv(a, b)

除法

a // b

floordiv(a, b)

按位与

a & b

and_(a, b)

按位异或

a ^ b

xor(a, b)

按位取反

~ a

invert(a)

按位或

a | b

or_(a, b)

取幂

a ** b

pow(a, b)

标识

a is b

is_(a, b)

标识

a is not b

is_not(a, b)

索引赋值

obj[k] = v

setitem(obj, k, v)

索引删除

del obj[k]

delitem(obj, k)

索引取值

obj[k]

getitem(obj, k)

左移

a << b

lshift(a, b)

取模

a % b

mod(a, b)

乘法

a * b

mul(a, b)

矩阵乘法

a @ b

matmul(a, b)

取反(算术)

- a

neg(a)

取反(逻辑)

not a

not_(a)

正数

+ a

pos(a)

右移

a >> b

rshift(a, b)

切片赋值

seq[i:j] = values

setitem(seq, slice(i, j), values)

切片删除

del seq[i:j]

delitem(seq, slice(i, j))

切片取值

seq[i:j]

getitem(seq, slice(i, j))

字符串格式化

s % obj

mod(s, obj)

减法

a - b

sub(a, b)

真值测试

obj

truth(obj)

比较

a < b

lt(a, b)

比较

a <= b

le(a, b)

相等

a == b

eq(a, b)

不等

a != b

ne(a, b)

比较

a >= b

ge(a, b)

比较

a > b

gt(a, b)

你可能感兴趣的:(python,开发语言)