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

Python开发实用教程

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

操作符函数

操作符表达式含义
operator.lt(ab)a<b
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<<b
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值