• 【Python】operator模块


    Python中operator模块提供了一套与 Python 的内置运算符对应的高效率函数。

    不仅对应内置运算符,还可以获取方法。可优化涉及回调函数的运算性能,比lambda、Python函数的开销小、速度快。

    1. import operator
    2. [x for x in dir(operator) if not x.startswith('_')]
    3. # 结果:
    4. ['abs', 'add', 'and_', 'attrgetter', 'call', 'concat', 'contains', 'countOf',
    5. 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat',
    6. 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv',
    7. 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter',
    8. 'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller',
    9. 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem',
    10. 'sub', 'truediv', 'truth', 'xor']

    from operator import *

    1、数学运算

    注意:数字不可变。因此,原地运算符,会被计算,但不会被赋值,不改变原变量的数字。

    函数对应运算符描述举例
    add(a,b)a + b 相加add(2,3)  结果:5
    iadd(a,b)a += b相加,原地运算符

    a = 5

    iadd(a,3)    结果:8
    a     结果:5

    sub(a,b)a - b 相减sub(2,3)  结果:-1
    isub(a,b)a -= b相减,原地运算符
    mul(a,b)a * b 相乘mul(2,3)  结果:6
    imul(a,b)a *= b相乘,原地运算符
    truediv(a,b)a / b 相除truediv(2,3)  结果:0.6666666666666666
    itruediv(a,b)a /= b相除,原地运算符
    floordiv(a,b)a // b 相除取整数floordiv(2,3)  结果:0
    ifloordiv(a,b)a //= b相除取整数,原地运算符
    mod(a,b)a % b 相除取余数mod(2,3)  结果:2
    imod(a,b)a %= b相除取余数,原地运算符
    pow(a,b)a ** b 幂,a^{b}pow(2,3)  结果:8
    ipow(a,b)a **= b幂,原地运算符
    matmul(a,b)a @ b 矩阵乘法
    imatmul(a,b)a @= b矩阵乘法,原地运算符
    neg(a)- a 算术取反neg(1)   结果:-1
    pos(a)+ a 取正pos(-1)  结果:-1
    abs(a)绝对值abs(-1)   结果:1
    函数对应运算符描述举例
    inv(a),  invert(a)按位取反,等价于 ~ a inv(2)   结果:-3
    invert(2)   结果:-3
    lshift(a,b)a << b 左移 lshift(2,3)  结果:16
    ilshift(a,b)a <<= b左移,原地运算符
    rshift(a,b)a >> b 右移rshift(2,3)  结果:0
    irshift(a,b)a >>= b右移,原地运算符
    and_(a,b)a & b 按位与 and_(2,3)   结果:2
    iand(a,b)a &= b按位与,原地运算符
    or_(a,b)a | b 按位或or_(2,3)   结果:3
    ior(a,b)即 a |= b按位或,原地运算符
    xor(a,b)a ^ b 按位异或xor(2,3)  结果:1
    ixor(a,b)a ^= b按位异或,原地运算符

    注解:(假设8位二进制,最高位为符号位,负数用补码形式存储)

    ① 按位取反。inv(2)   结果:-3

    2(二进制:00000010):按位取反,则11111101(原码10000011,十进制:-3)。

    ② 左移。lshift(2,3)  结果:16

    2(二进制:00000010):左移3位,则00010000(十进制:16)。

    ③ 按位与。and_(2,3)   结果:2

    2(二进制:00000010),3(二进制:00000011):按位与,则00000010(十进制:2)。

    按位与:1 & 1 = 1,1 & 0 = 0,0 & 0 = 0

    按位或:1 | 1 = 1,1 | 0 = 1,0 | 0 = 0

    按位异或:1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 0 = 0

    2、比较运算

    函数对应运算符描述举例
    lt(a,b)a < b 小于lt(2,3)   结果:True
    le(a,b)a <= b 小于等于le(2,3)  结果:True
    gt(a,b)a > b 大于gt(2,3)  结果:False
    ge(a,b)a >= b 大于等于ge(2,3)  结果:False
    eq(a,b)a == b 等于eq(2,3)   结果:False
    ne(a,b)a  != b 不等于ne(2,3)  结果:True

    lt:less than   小于

    le:less than or equal to   小于等于

    gt:greater than   大于

    ge:greater than or equal to   大于等于

    eq:equal to   等于

    ne:not equal to   不等于​​​​​​​

    3、逻辑运算

    函数对应运算符描述举例
    truth(a)a真值测试。a 为真,返回True,否则返回Falsetruth(0)  结果:False
    not_(a)not a逻辑取反not_(0)  结果:True
    is_(a,b)a is ba 是 b
    is_not(a,b)a is not ba 不是 b

    4、序列运算

    注意:原地运算符中被赋值的序列需是可变的。若不可变的序列(字符串、元组),会计算但不会赋值,即不改变原序列。

    函数对应运算符描述举例
    concat(a,b)a + b 序列a、b,拼接concat([1],[2,3])  结果:[1, 2, 3]
    iconcat(a,b)a += b序列a、b,拼接,原地运算符
    contains(a,b)b in a序列a 中包含元素bcontains("hello","e")   结果:True
    countOf(a,b)序列a 中元素b出现的次数countOf("hello","l")   结果:2
    indexOf(a,b)序列a 中元素b第一次出现的位置。若不存在,则报错indexOf("hello","o")   结果:4
    getitem(a,b)a[b] 序列a 中获取下标/切片b对应的元素getitem("hello",1)   结果:'e'
    getitem("hello",slice(1,3))   结果:'el'
    setitem(a,b,c)a[b]=c可变序列a 中赋值下标/切片b对应的元素为ca = [1,2,3]; setitem(a,2,"w"); a   结果:[1, 2, 'w']
    a = [1,2,3]; setitem(a,slice(1,3),["w","y"]); a   结果:[1, 'w', 'y']
    delitem(a,b)del a[b]可变序列a 中删除下标/切片b对应的元素a = [1,2,3]; delitem(a,1); a    结果:[1, 3]
    a = [1,2,3]; delitem(a,slice(1,3)); a    结果:[1]
    length_hint(a)len(a)序列a的长度length_hint("hello")    结果:5

    add 和 iadd 也可以拼接序列,和concat结果相同。

    函数对应运算符描述举例
    add(a,b)a + b 序列a、b,拼接add([1],[2,3])   结果:[1, 2, 3]
    iadd(a,b)a += b序列a、b,拼接,原地运算符

    5、3.11 新版功能

    提供了快速访问对象的属性、获取序列元素、方法调用。

    适合作为快速提取器(map, sorted, itertools.groupby等)的参数。

    (5-1)attrgetter  【访问对象的属性】

    • attrgetter(属性)(对象):对象.属性,即获取对象的属性。
    • attrgetter(属性1, 属性2 ...)(对象):(对象.属性1, 对象.属性2,...),即获取对象的多个属性,返回元组形式。
    1. from operator import *
    2. class People(object):
    3. def __init__(self,name,age):
    4. self.name = name
    5. self.age = age
    6. p1 = People("Tom",18)
    7. p2 = People("Jack",25)
    8. get_age = attrgetter("age")
    9. get_age(p1) # 结果:18
    10. get_age(p2) # 结果:25
    11. # 相当于
    12. p1.age # 结果:18
    13. p2.age # 结果:25
    14. get_all = attrgetter("name","age")
    15. get_all(p1) # 结果:('Tom', 18)
    16. get_all(p2) # 结果:('Jack', 25)
    17. # 相当于
    18. p1.name,p1.age # 结果:('Tom', 18)
    19. p2.name,p2.age # 结果:('Jack', 25)
    20. # attrgetter 比 lambda 速度快
    21. list(map(get_age,[p1,p2])) # 结果:[18, 25]
    22. # 相当于
    23. list(map(lambda x:x.age,[p1,p2])) # 结果:[18, 25]
    24. list(map(get_all,[p1,p2])) # 结果:[('Tom', 18), ('Jack', 25)]
    25. # 相当于
    26. list(map(lambda x:(x.name,x.age),[p1,p2])) # 结果:[('Tom', 18), ('Jack', 25)]

    (5-2)itemgetter  【获取序列的元素】

    • itemgetter(下标)(序列) :序列[下标],即获取序列中下标对应的元素。
    • itemgetter(slice(起始下标, 结束下标))(序列):序列[起始下标:结束下标],通过切片获取序列中的元素。
    • itemgetter(下标1, 下标2, ...)(序列) :(序列[下标1],序列[下标2],...),即获取序列中多个下标对应的元素,返回元组形式。
    1. from operator import *
    2. a = "hello"
    3. itemgetter(1)(a) # 结果:'e'
    4. itemgetter(slice(1,4))(a) # 结果:'ell'
    5. itemgetter(1,2,4)(a) # 结果:('e', 'l', 'o')
    •  itemgetter(键)(字典) :字典[键],通过键获取字典中的值。
    •  itemgetter(键1, 键2,...)(字典) :(字典[键1], 字典[键2], ...),通过多个键获取字典中的值,返回元组形式。
    1. from operator import *
    2. d = {'一季度':20,'二季度':50,'三季度':15,'四季度':35}
    3. itemgetter('二季度')(d) # 结果:50
    4. itemgetter('二季度','四季度')(d) # 结果:(50, 35)

    在sorted、map等使用时,itemgetter 比 lambda 速度快。

    1. from operator import *
    2. b = [("一季度",20),("二季度",50),("三季度",15),("四季度",35)]
    3. # 按元组中下标为1的元素大小排序
    4. sorted(b,key=itemgetter(1)) # 结果:[('三季度', 15), ('一季度', 20), ('四季度', 35), ('二季度', 50)]
    5. # 相当于
    6. sorted(b,key=lambda x:x[1]) # 结果:[('三季度', 15), ('一季度', 20), ('四季度', 35), ('二季度', 50)]
    7. # 获取元组中下标为1的元素
    8. list(map(itemgetter(1),b)) # 结果:[20, 50, 15, 35]
    9. # 相当于
    10. list(map(lambda x:x[1],b)) # 结果:[20, 50, 15, 35]

    (5-3)methodcaller  【调用对象的方法】

    • methodcaller(方法)(对象):对象.方法(),即调用对象的方法。
    • methodcaller(方法, 参数1, 参数2 ...)(对象):对象.方法(参数1, 参数2,...),即调用对象的方法,并传递参数。
    1. from operator import *
    2. class People(object):
    3. def __init__(self,name,age):
    4. self.name = name
    5. self.age = age
    6. def introduce(self):
    7. return f"我是{self.name}"
    8. p1 = People("Tom",18)
    9. intro = methodcaller("introduce")
    10. intro(p1) # 结果:'我是Tom'
    11. # 相当于
    12. p1.introduce() # 结果:'我是Tom'

  • 相关阅读:
    2022年33个最佳WordPress健康与医疗主题
    全球产业链:脑机接口产业链
    6.vue知识点:vue-directive自定义指令
    KiKi知道了什么是质数,他现在想知道所有三位整数中,有多少个质数
    man手册查不到pthread_cond_signal
    Lightsail VPS 实例在哪些方面胜过 EC2 实例?
    打印数组的所有子集
    3D 生成重建005-NeRF席卷3D的表达形式
    go语言的基本数据类型
    Cython 笔记 (Python/Jython)
  • 原文地址:https://blog.csdn.net/yannan20190313/article/details/134404041