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


    Python开发实用教程

    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
    1. import operator
    2. import functools
    3. print(operator.le(10, 20)) #True
    4. print(operator.add(10, 20)) #30
    5. numlist = [1,2,3,4,5,6,7,8]
    6. result = map(operator.add, numlist, numlist)
    7. print(list(result)) #[2, 4, 6, 8, 10, 12, 14, 16]
    8. result = functools.reduce(operator.mul, numlist)
    9. print(result) #40320

    对象属性提取attrgetter

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

    1. import operator
    2. import functools
    3. class Student:
    4. def __init__(self, name, age):
    5. self.name = name
    6. self.age = age
    7. def __repr__(self):
    8. return f'({self.name=}, {self.age=})'
    9. slist = [Student('Alice', 15), Student('Bibe', 16), Student('Chen', 12), Student('Jack', 13)]
    10. #按年龄排序
    11. print(sorted(slist, key=operator.attrgetter('age')))
    12. #按姓名排序
    13. print(sorted(slist, key=operator.attrgetter('name')))
    14. ‘’'
    15. [(self.name='Chen', self.age=12), (self.name='Jack', self.age=13), (self.name='Alice', self.age=15), (self.name='Bibe', self.age=16)]
    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)]
    17. ‘''

    对象方法提取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)

    1. import operator
    2. import functools
    3. class Student:
    4. def __init__(self, name, age):
    5. self.name = name
    6. self.age = age
    7. def __repr__(self):
    8. return f'({self.name=}, {self.age=})'
    9. def isPupil(self):
    10. if self.age >=6 and self.age < 12:
    11. return True
    12. return False
    13. slist = [Student('Alice', 6), Student('Bibe', 8), Student('Chen', 12), Student('Jack', 9)]
    14. print(list(filter(operator.methodcaller('isPupil'), slist)))
    15. #[(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])。

    1. >>>itemgetter(1)('ABCDEFG')
    2. 'B'
    3. >>>itemgetter(1, 3, 5)('ABCDEFG')
    4. ('B', 'D', 'F')
    5. >>>itemgetter(slice(2, None))('ABCDEFG')
    6. 'CDEFG'
    7. >>>soldier = dict(rank='captain', name='dotterbart')
    8. >>>itemgetter('rank')(soldier)
    9. 'captain'

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

    1. >>>inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
    2. >>>getcount = itemgetter(1)
    3. >>>list(map(getcount, inventory))
    4. [3, 2, 5, 1]
    5. >>>sorted(inventory, key=getcount)
    6. [('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)

  • 相关阅读:
    找不到mfc110.dll,无法执行代码
    Redis系列(二):Redis的分布式锁解析及应用
    linux 查看 io使用率iotop
    B. Neko Performs Cat Furrier Transform
    R语言与作物模型(以DSSAT模型为例)融合应用
    【蓝桥杯专项】动态规划_背包问题合集(Java)
    Windows net start mysql 启动MySQL服务报错 发生系统错误 5 解决方法
    Cilium v1.12 功能原理解读:ServiceMesh 令人期待
    【漏洞复现】短视频矩阵营销系统 ajax_uplaod接口处存在任意文件上传
    数字信号处理(MATLAB入门例子)
  • 原文地址:https://blog.csdn.net/spiritx/article/details/133393207