您的位置:  首页 » Python » operator-标准运算符作为函数详解(3)Python语言的功能编程模块(必读进阶学习教程)(参考资料)

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

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

对象比较函数对所有对象都很有用,并以它们支持的丰富比较运算符命名:

operator.lta
operator.lea
operator.eqa
operator.nea
operator.gea
operator.gta
operator.__lt__a
operator.__le__a
operator.__eq__a
operator.__ne__a
operator.__ge__a
operator.__gt__a
ab之间执行“丰富的比较” 。具体而言,就相当于,等同于,相当于,等同于, 相当于和相当于。请注意,这些函数可以返回任何值,这些值可能会或可能不会被解释为布尔值。有关丰富比较的更多信息,请参阅比较lt(a, b)a < ble(a, b)a <= beq(a, b)a == bne(a, b)a != bgt(a, b)a > bge(a, b)a >= b

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

operator.not_obj 
operator.__not__obj 
返回obj的结果。(请注意,对象实例没有 方法;只有解释器核心定义了此操作。结果受到和 方法的影响。)not __not__()__bool__()__len__()
operator.truthobj 
True如果obj为真,False则返回,否则返回。这相当于使用bool构造函数。
operator.is_a
返回。测试对象标识。a is b
operator.is_nota
返回。测试对象标识。a is not b

数学和按位运算是最多的:

operator.absobj 
operator.__abs__obj 
返回obj的绝对值。
operator.adda
operator.__add__a
返回,ab数字。a + b
operator.and_a
operator.__and__a
返回按位和ab
operator.floordiva
operator.__floordiv__a
返回。a // b
operator.index
operator.__index__
返回一个转换为整数。相当于a.__index__()
operator.invobj 
operator.invertobj 
operator.__inv__obj 
operator.__invert__obj 
返回数字obj的按位反转。这相当于~obj
operator.lshifta
operator.__lshift__a
返回一个左移b
operator.moda
operator.__mod__a
返回。a % b
operator.mula
operator.__mul__a
返回,ab数字。a * b
operator.matmula
operator.__matmul__a
返回。a @ b

版本3.5中的新功能。

operator.negobj 
operator.__neg__obj 
返回obj negated(-obj)。
operator.or_a
operator.__or__a
返回按位或ab
operator.posobj 
operator.__pos__obj 
返回obj positive(+obj)。
operator.powa
operator.__pow__a
返回,ab数字。a ** b
operator.rshifta
operator.__rshift__a
返回一个由右移b
operator.suba
operator.__sub__a
返回。a - b
operator.truediva
operator.__truediv__a
返回2/3是.66而不是0.这也称为“真正的”除法。a / b
operator.xora
operator.__xor__a
返回按位异或ab

使用序列的操作(其中一些也带有映射)包括:

operator.concata
operator.__concat__a
返回为一个b序列。a + b
operator.containsa
operator.__contains__a
返回测试结果。注意反转的操作数。b in a
operator.countOfa
返回的出现次数b中的一个
operator.delitema
operator.__delitem__a
除去的值一个索引b
operator.getitema
operator.__getitem__a
返回的值一个索引b
operator.indexOfa
返回第一个的发生的索引b一个
operator.setitemab
operator.__setitem__ab
设定的值一个索引bÇ
operator.length_hintobj默认= 0 
返回对象o的估计长度。首先尝试返回其实际长度,然后使用估计值object.__length_hint__(),最后返回默认值。

版本3.4中的新功能。

operator模块还定义了用于通用属性和项目查找的工具。这些是使现场快速提取作为参数都非常有用 map()sorted()itertools.groupby(),或期望的功能参数等功能。

operator.attrgetterattr 
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)

相当于:

def attrgetter(*items):
    if any(not isinstance(item, str) for item in items):
        raise TypeError('attribute name must be a string')
    if len(items) == 1:
        attr = items[0]
        def g(obj):
            return resolve_attr(obj, attr)
    else:
        def g(obj):
            return tuple(resolve_attr(obj, attr) for attr in items)
    return g

def resolve_attr(obj, attr):
    for name in attr.split("."):
        obj = getattr(obj, name)
    return obj

 

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

  • 之后,呼叫返回。f = itemgetter(2)f(r)r[2]
  • 之后,呼叫返回 。g = itemgetter(2, 5, 3)g(r)(r[2], r[5], r[3])

相当于:

def itemgetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj):
            return obj[item]
    else:
        def g(obj):
            return tuple(obj[item] for item in items)
    return g

 

这些项可以是操作数__getitem__() 方法接受的任何类型。字典接受任何可混合的值。列表,元组和字符串接受索引或切片:

>>> 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)]

 

operator.methodcallername [args … 
返回一个可调用对象,该对象在其操作数上调用方法名称。如果给出了额外的参数和/或关键字参数,它们也将被赋予该方法。例如:

  • 之后,呼叫返回。f = methodcaller('name')f(b)b.name()
  • 之后,呼叫 返回。f = methodcaller('name', 'foo', bar=1)f(b)b.name('foo', bar=1)

相当于:

def methodcaller(name, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller

 

将运算符映射到函数

此表显示抽象操作如何与Python语法中的运算符符号以及operator模块中的函数相对应。

手术 句法 功能
加成 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)

就地操作员

许多操作都有“就地”版本。下面列出的函数提供了比通常语法更原始的就地运算符访问; 例如,该陈述 相当于 。另一种说法就是说它 等同于复合语句 。x += yx = operator.iadd(x, y)z = operator.iadd(x, y)z = x; z += y

在这些示例中,请注意,当调用就地方法时,计算和分配将在两个单独的步骤中执行。下面列出的就地功能仅执行第一步,调用就地方法。第二步,分配,不处理。

对于不可变目标(如字符串,数字和元组),将计算更新后的值,但不会将其分配回输入变量:

>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'

 

对于诸如列表和字典之类的可变目标,inplace方法将执行更新,因此不需要后续分配:

>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

 

operator.iadda
operator.__iadd__a
a = iadd(a, b)相当于。a += b
operator.ianda
operator.__iand__a
a = iand(a, b)相当于。a &= b
operator.iconcata
operator.__iconcat__a
a = iconcat(a, b)等同于ab序列。a += b
operator.ifloordiva
operator.__ifloordiv__a
a = ifloordiv(a, b)相当于。a //= b
operator.ilshifta
operator.__ilshift__a
a = ilshift(a, b)相当于。a <<= b
operator.imoda
operator.__imod__a
a = imod(a, b)相当于。a %= b
operator.imula
operator.__imul__a
a = imul(a, b)相当于。a *= b
operator.imatmula
operator.__imatmul__a
a = imatmul(a, b)相当于。a @= b

版本3.5中的新功能。

operator.iora
operator.__ior__a
a = ior(a, b)相当于。a |= b
operator.ipowa
operator.__ipow__a
a = ipow(a, b)相当于。a **= b
operator.irshifta
operator.__irshift__a
a = irshift(a, b)相当于。a >>= b
operator.isuba
operator.__isub__a
a = isub(a, b)相当于。a -= b
operator.itruediva
operator.__itruediv__a
a = itruediv(a, b)相当于。a /= b
operator.ixora
operator.__ixor__a
a = ixor(a, b)相当于。a ^= b