operator

operator — Standard operators as functions

operator模块导出一组对应于Python内部运算符的高效函数。例如,operator.add(x, y)相当于表达式x+y。函数名称是用于特殊类方法的函数名称; __为方便起见,还提供了无前导和尾随的变体。

函数分为执行对象比较,逻辑运算,数学运算,序列运算和抽象类型测试的类别。

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

operator.lt(a, b)operator.le(a, b)operator.eq(a, b)operator.ne(a, b)operator.ge(a, b)operator.gt(a, b)operator.__lt__(a, b)operator.__le__(a, b)operator.__eq__(a, b)operator.__ne__(a, b)operator.__ge__(a, b)operator.__gt__(a, b)

在a和b之间执行“丰富的比较” 。具体而言,lt(a, b)就相当于a < b,le(a, b)等同于a <= b,eq(a, b)相当于a == b,ne(a, b)等同于a != b,gt(a, b)相当于a > b和ge(a, b)相当于a >= b。请注意,与内置cmp()函数不同,这些函数可以返回任何值,这些值可以或不可以被解释为布尔值。有关富比较的更多信息,请参阅比较。

2.2版本中的新功能。

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

operator.not_(obj)operator.__not__(obj)

返回obj的结果。(注意对象实例没有方法;只有解释器内核定义了这个操作,结果受到和方法的影响。)not __not__()__nonzero__()__len__()

operator.truth(obj)

True如果obj为真,False则返回,否则返回。这相当于使用bool构造函数。

operator.is_(a, b)

返回a is b。测试对象标识。

2.3版本的新功能。

operator.is_not(a, b)

返回a is not b。测试对象标识。

2.3版本的新功能。

数学和位运算是最多的:

operator.abs(obj)operator.__abs__(obj)

返回obj的绝对值。

operator.add(a, b)operator.__add__(a, b)

返回a + b,用于一个b的数字。

operator.and_(a, b)operator.__and__(a, b)

返回按位和ab

operator.div(a, b)operator.__div__(a, b)

无效a / b时返回__future__.division。这也被称为“经典”分工。

operator.floordiv(a, b)operator.__floordiv__(a, b)

返回a // b

2.2版本中的新功能。

operator.index(a)operator.__index__(a)

返回一个转换为整数。相当于a.__index__()

2.5版本中的新功能。

operator.inv(obj)operator.invert(obj)operator.__inv__(obj)operator.__invert__(obj)

返回数字obj的按位倒数。这相当于~obj

版本2.0中的新功能:名称invert()__invert__()

operator.lshift(a, b)operator.__lshift__(a, b)

返回一个左移b

operator.mod(a, b)operator.__mod__(a, b)

返回a % b

operator.mul(a, b)operator.__mul__(a, b)

返回a * b,用于一个b的数字。

operator.neg(obj)operator.__neg__(obj)

返回obj否定(-obj)。

operator.or_(a, b)operator.__or__(a, b)

按位或返回ab

operator.pos(obj)operator.__pos__(obj)

返回obj positive(+obj)。

operator.pow(a, b)operator.__pow__(a, b)

返回a ** b,用于一个b的数字。

2.3版本的新功能。

operator.rshift(a, b)operator.__rshift__(a, b)

返回一个由右移b

operator.sub(a, b)operator.__sub__(a, b)

返回a - b

operator.truediv(a, b)operator.__truediv__(a, b)

返回a / b__future__.division生效。这也被称为“真实”部门。

2.2版本中的新功能。

operator.xor(a, b)operator.__xor__(a, b)

返回按位独占或ab

与序列一起工作的操作(其中一些与映射也一样)包括:

operator.concat(a, b)operator.__concat__(a, b)

返回a + b一个b序列。

operator.contains(a, b)operator.__contains__(a, b)

返回测试的结果b in a。请注意颠倒的操作数。

版本2.0中的新功能:名称__contains__()

operator.countOf(a, b)

返回的出现次数b中的一个

operator.delitem(a, b)operator.__delitem__(a, b)

除去的值一个索引b

operator.delslice(a, b, c)operator.__delslice__(a, b, c)

删除的切片一个从索引b到索引C-1

自2.6版弃用:此功能在Python 3.x中被删除。使用delitem()与切片指数。

operator.getitem(a, b)operator.__getitem__(a, b)

返回的值一个索引b

operator.getslice(a, b, c)operator.__getslice__(a, b, c)

返回的切片一个从索引b到索引C-1

自2.6版弃用:此功能在Python 3.x中被删除。使用getitem()与切片指数。

operator.indexOf(a, b)

返回第一个的发生的索引b一个

operator.repeat(a, b)operator.__repeat__(a, b)

自2.7版弃用:__mul__()改为使用。

返回a * b,其中一个一个序列和b是整数。

operator.sequenceIncludes(...)

自2.0版弃用:contains()改为使用。

别名contains()

operator.setitem(a, b, c)operator.__setitem__(a, b, c)

设定的值一个索引bÇ

operator.setslice(a, b, c, v)operator.__setslice__(a, b, c, v)

的切片设定一个从索引b到索引C-1到序列v

自2.6版弃用:此功能在Python 3.x中被删除。使用setitem()与切片指数。

操作员功能的使用示例:

>>> # Elementwise multiplication >>> map(mul, [0, 1, 2, 3], [10, 20, 30, 40]) [0, 20, 60, 120] >>> # Dot product >>> sum(map(mul, [0, 1, 2, 3], [10, 20, 30, 40])) 200

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

operator.iadd(a, b)operator.__iadd__(a, b)

a = iadd(a, b) is equivalent to a += b.

2.5版本中的新功能。

operator.iand(a, b)operator.__iand__(a, b)

a = iand(a, b)相当于a &= b

2.5版本中的新功能。

operator.iconcat(a, b)operator.__iconcat__(a, b)

a = iconcat(a, b)相当于a += b用于一个b序列。

2.5版本中的新功能。

operator.idiv(a, b)operator.__idiv__(a, b)

a = idiv(a, b)相当于a /= b什么时候__future__.division不生效。

2.5版本中的新功能。

operator.ifloordiv(a, b)operator.__ifloordiv__(a, b)

a = ifloordiv(a, b)相当于a //= b

2.5版本中的新功能。

operator.ilshift(a, b)operator.__ilshift__(a, b)

a = ilshift(a, b)相当于a <<= b。

2.5版本中的新功能。

operator.imod(a, b)operator.__imod__(a, b)

a = imod(a, b)相当于a %= b

2.5版本中的新功能。

operator.imul(a, b)operator.__imul__(a, b)

a = imul(a, b)相当于a *= b

2.5版本中的新功能。

operator.ior(a, b)operator.__ior__(a, b)

a = ior(a, b)相当于a |= b

2.5版本中的新功能。

operator.ipow(a, b)operator.__ipow__(a, b)

a = ipow(a, b)相当于a **= b

2.5版本中的新功能。

operator.irepeat(a, b)operator.__irepeat__(a, b)

自2.7版弃用:__imul__()改为使用。

a = irepeat(a, b)等同于a *= b其中a是序列并且b是整数。

2.5版本中的新功能。

operator.irshift(a, b)operator.__irshift__(a, b)

a = irshift(a, b)相当于a >>= b。

2.5版本中的新功能。

operator.isub(a, b)operator.__isub__(a, b)

a = isub(a, b)相当于a -= b

2.5版本中的新功能。

operator.itruediv(a, b)operator.__itruediv__(a, b)

a = itruediv(a, b)相当于a /= b何时__future__.division生效。

2.5版本中的新功能。

operator.ixor(a, b)operator.__ixor__(a, b)

a = ixor(a, b)相当于a ^= b

2.5版本中的新功能。

operator模块还定义了几个谓词来测试对象的类型; 然而,这些并不都是可靠的。优选的是,测试抽象基类代替(见collectionsnumbers细节)。

operator.isCallable(obj)

自2.0版弃用:isinstance(x, collections.Callable)改为使用。

如果对象obj可以像函数一样调用,则返回true,否则返回false。True返回函数,绑定和未绑定的方法,类对象和支持该__call__()方法的实例对象。

operator.isMappingType(obj)

自2.7版弃用:isinstance(x, collections.Mapping)改为使用。

如果对象obj支持映射接口,则返回true 。对于字典和所有实例对象的定义都是如此__getitem__()

operator.isNumberType(obj)

自2.7版弃用:isinstance(x, numbers.Number)改为使用。

如果对象obj表示一个数字,则返回true 。对于在C中实现的所有数字类型都是如此。

operator.isSequenceType(obj)

自2.7版弃用:isinstance(x, collections.Sequence)改为使用。

如果对象obj支持序列协议,则返回true 。对于定义C中序列方法的所有对象以及所有定义的实例对象,这都会返回true __getitem__()

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

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)

相当于:

def attrgetter(*items): 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

2.4版本中的新功能。

在版本2.5中进行了更改:增加了对多个属性的支持。

在版本2.6中更改:添加了对虚线属性的支持。

operator.itemgetter(item)operator.itemgetter(*items)

返回一个可调用的对象,使用操作数的方法从其操作数中获取项目__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'

2.4版本中的新功能。

在版本2.5中进行了更改:增加了对多项提取的支持。

使用itemgetter()从元组记录中检索特定字段的示例:

>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> map(getcount, inventory) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]

operator.methodcaller(name[, 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

2.6版本中的新功能。

1.将运算符映射到函数

此表显示了抽象操作在Python语法和operator模块中的函数中如何对应运算符。

OperationSyntaxFunction
Additiona + badd(a, b)
Concatenationseq1 + seq2concat(seq1, seq2)
Containment Testobj in seqcontains(seq, obj)
Divisiona / bdiv(a, b) (without __future__.division)
Divisiona / btruediv(a, b) (with __future__.division)
Divisiona // bfloordiv(a, b)
Bitwise Anda & band_(a, b)
Bitwise Exclusive Ora ^ bxor(a, b)
Bitwise Inversion~ ainvert(a)
Bitwise Ora | bor_(a, b)
Exponentiationa ** bpow(a, b)
Identitya is bis_(a, b)
Identitya is not bis_not(a, b)
Indexed Assignmentobjk = vsetitem(obj, k, v)
Indexed Deletiondel objkdelitem(obj, k)
Indexingobjkgetitem(obj, k)
Left Shifta << blshift(a, b)
Moduloa % bmod(a, b)
Multiplicationa * bmul(a, b)
Negation (Arithmetic)aneg(a)
Negation (Logical)not anot_(a)
Positiveapos(a)
Right Shifta >> brshift(a, b)
Sequence Repetitionseq * irepeat(seq, i)
Slice Assignmentseqi:j = valuessetitem(seq, slice(i, j), values)
Slice Deletiondel seqi:jdelitem(seq, slice(i, j))
Slicingseqi:jgetitem(seq, slice(i, j))
String Formattings % objmod(s, obj)
Subtractiona - bsub(a, b)
Truth Testobjtruth(obj)
Orderinga < blt(a, b)
Orderinga <= ble(a, b)
Equalitya == beq(a, b)
Differencea != bne(a, b)
Orderinga >= bge(a, b)
Orderinga > bgt(a, b)