Python - operator 模块 - 实现内部运算符的高级函数

目录

一、简单介绍及学习参考

二、运算符的相关函数

三、逻辑运算符的相关函数

四、四则运算和位运算

五、基于序列的操作

六、通用属性和项目的查找工具 

6-1 attrgetter(attr)  从操作数中获取attr,若请求多个属性,则返回元组

6-1-1 基于 attrgetter() + sorted() 实现对同类实例们的排序,基于属性值

6-2 itemgetter(item)  返回可调用对象,调用她的__getitem__()方法,若有多个则返回元组

6-2-1 itemgetter() + sorted 排序应用

6-3 methodcaller(name[, args...])


一、简单介绍及学习参考

官方文档

该 operator 模块导出一组与Python的内部运算符相对应的高效函数。例如,operator.add(x,y)等同于x+y。许多函数名称是用于特殊方法的函数名称,没有双下划线。为了向后兼容,其中许多都有一个带有双下划线的变体。为清楚起见,优选没有双下划线的变体。

这些函数属于执行对象比较,逻辑运算,数学运算和序列运算的类别。

二、运算符的相关函数

请注意,这些函数可以返回任何值,这些值可能会或可能不会被解释为布尔值。

  • a<b
    • operator.lta
    • operator.__lt__a
  • a<=b
    • operator.lea
    • operator.__le__a
  • a == b
    • operator.eqa
    • operator.__eq__a
  • a > b
    • operator.nea
    • operator.__ne__a
  • a >= b
    • operator.gea
    • operator.__ge__a
  • a != b
    • operator.gta
    • operator.__gt__a

三、逻辑运算符的相关函数

 逻辑操作通常也适用于所有对象,并支持真值测试,身份测试和布尔操作

  • 非运算
    • operator.not_(obj)
    • operator.__not__(obj)
  •  如果obj为真,则返回True,否则返回False。这相当于使用bool构造函数。
    • operator.truth(obj)
  • 返回 a is b
    • operator.is_(ab)
  • 返回 a is not b
    • operator.is_not(ab)

四、四则运算和位运算

  • operator.abs(obj)
  • operator.__abs__(obj)
    • 返回obj的绝对值
  • operator.add(ab)
  • operator.__add__(ab)
    • a+b
  • operator.and_(ab)
  • operator.__and__(ab)
    • 返回与运算,a and b
  • operator.floordiv(ab)
  • operator.__floordiv__(ab)
    • a // b
  • operator.index(a)
  • operator.__index__(a)
    • a.__index__()
  • operator.inv(obj)
  • operator.invert(obj)
  • operator.__inv__(obj)
  • operator.__invert__(obj)
    • 返回数字obj的按位反转。这相当于~obj
  • operator.lshift(ab)
  • operator.__lshift__(ab)
    • 返回一个左移b
  • operator.mod(ab)
  • operator.__mod__(ab)
    • 返回。a % b
  • operator.mul(ab)
  • operator.__mul__(ab)
    • 返回,ab数字。a * b
  • operator.matmul(ab)
  • operator.__matmul__(ab)
    • 返回。a @ b
  • New in version 3.5.
  • operator.neg(obj)
  • operator.__neg__(obj)
    • 返回obj negated(-obj)。
  • operator.or_(ab)
  • operator.__or__(ab)
    • 返回按位或ab
  • operator.pos(obj)
  • operator.__pos__(obj)
    • 返回obj positive(+obj)。
  • operator.pow(ab)
  • operator.__pow__(ab)
    • Return a ** b, for a and b numbers.
  • operator.rshift(ab)
  • operator.__rshift__(ab)
    • Return a shifted right by b.
  • operator.sub(ab)
  • operator.__sub__(ab)
    • Return a - b.
  • operator.truediv(ab)
  • operator.__truediv__(ab)
    • Return a / b where 2/3 is .66 rather than 0. This is also known as “true” division.
  • operator.xor(ab)
  • operator.__xor__(ab)
    • Return the bitwise exclusive or of a and b.

五、基于序列的操作

  • 使用序列的操作(其中一些也带有映射):
  • operator.concat(ab)
  • operator.__concat__(ab)
    • Return a + b for a and b sequences.
  • operator.contains(ab)
  • operator.__contains__(ab)
    • Return the outcome of the test b in a. Note the reversed operands.
  • operator.countOf(ab)
    • Return the number of occurrences of b in a.
  • operator.delitem(ab)
  • operator.__delitem__(ab)
    • Remove the value of a at index b.
  • operator.getitem(ab)
  • operator.__getitem__(ab)
    • Return the value of a at index b.
  • operator.indexOf(ab)
    • Return the index of the first of occurrence of b in a.
  • operator.setitem(abc)
  • operator.__setitem__(abc)
    • Set the value of a at index b to c.
  • operator.length_hint(objdefault=0)
    • Return an estimated length for the object o. First try to return its actual length, then an estimate using, object.__length_hint__()  and finally return the default value.

六、通用属性和项目的查找工具 

6-1 attrgetter(attr)  从操作数中获取attr,若请求多个属性,则返回元组

  • After f=attrgetter('name'), the call f(b) returns b.name.
  • After f=attrgetter('name','date'), the call f(b) returns (b.name,b.date).
  • After f=attrgetter('name.first','name.last'), the call f(b) returns (b.name.first,b.name.last).

6-1-1 基于 attrgetter() + sorted() 实现对同类实例们的排序,基于属性值

from operator import attrgetter


class User:
    def __init__(self, uid):
        self.uid = uid

    def __repr__(self):
        return 'User({})'.format(self.uid)


# 实例列表
users = [User(1), User(23), User(14), User(0)]
# sorted 基于key排序
sor_users = sorted(users, key=attrgetter('uid'))
print(sor_users) # [User(0), User(1), User(14), User(23)]

# 可以进行min 、max函数排序
min_users = min(users, key=attrgetter('uid'))
print(min_users) # User(0)
max_users = max(users, key=attrgetter('uid'))
print(max_users) # User(23)

6-2 itemgetter(item)  返回可调用对象,调用她的__getitem__()方法,若有多个则返回元组

  • After f=itemgetter(2), the call f(r) returns r[2].
  • After g=itemgetter(2,5,3), the call g(r) returns (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'

6-2-1 itemgetter() + sorted 排序应用


# 对元组列表,根据元组内值,进行排序
>>> 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)]

# 对字典列表,根据字典内值,进行排序
from operator import itemgetter

rows = [
    {'a': 'a', 'b': 'b', 'uid': 0},
    {'a': 'a4', 'b': 'b1', 'uid': 4},
    {'a': 'a2', 'b': 'b2', 'uid': 2},
    {'a': 'a1', 'b': 'b3', 'uid': 1},
    {'a': 'a3', 'b': 'b4', 'uid': 3},
]
rows_by_a = sorted(rows,key=itemgetter('a'))
rows_by_uid = sorted(rows,key=itemgetter('uid'))
print(rows_by_a)
print(rows_by_uid)
# [{'a': 'a', 'b': 'b', 'uid': 0}, {'a': 'a1', 'b': 'b3', 'uid': 1}, {'a': 'a2', 'b': 'b2', 'uid': 2}, {'a': 'a3', 'b': 'b4', 'uid': 3}, {'a': 'a4', 'b': 'b1', 'uid': 4}]
# itemgetter接受多个关键词,前主后副依次递减
row = sorted(rows,key=itemgetter('uid','a','b'))

# 同样适用于min max函数
row = min(rows,key=itemgetter('uid','a','b'))
row = max(rows,key=itemgetter('uid','a','b'))

6-3 methodcaller(name[, args...])

  • After f=methodcaller('name'), the call f(b) returns b.name().
  • After f=methodcaller('name','foo',bar=1), the call f(b) returns b.name('foo', bar=1).

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/89138471