9.9. operator — 标准运算符替代函数¶
The operator module exports a set of efficient functions corresponding to
the intrinsic operators of Python. For example, operator.add(x, y) is
equivalent to the expression x+y. The function names are those used for
special class methods; variants without leading and trailing __ are also
provided for convenience.
The functions fall into categories that perform object comparisons, logical operations, mathematical operations, sequence operations, and abstract type tests.
对象比较函数适用于所有的对象,函数名根据它们对应的比较运算符命名。
-
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)¶ Perform “rich comparisons” between a and b. Specifically,
lt(a, b)is equivalent toa < b,le(a, b)is equivalent toa <= b,eq(a, b)is equivalent toa == b,ne(a, b)is equivalent toa != b,gt(a, b)is equivalent toa > bandge(a, b)is equivalent toa >= b. Note that unlike the built-incmp(), these functions can return any value, which may or may not be interpretable as a Boolean value. See 比较运算 for more information about rich comparisons.2.2 新版功能.
逻辑运算通常也适用于所有对象,并且支持真值检测、标识检测和布尔运算:
-
operator.not_(obj)¶ -
operator.__not__(obj)¶ Return the outcome of
notobj. (Note that there is no__not__()method for object instances; only the interpreter core defines this operation. The result is affected by the__nonzero__()and__len__()methods.)
-
operator.is_(a, b)¶ 返回
a is b. 测试对象标识。2.3 新版功能.
-
operator.is_not(a, b)¶ 返回
a is not b. 测试对象标识。2.3 新版功能.
数学和按位运算的种类是最多的:
-
operator.div(a, b)¶ -
operator.__div__(a, b)¶ Return
a / bwhen__future__.divisionis not in effect. This is also known as “classic” division.
-
operator.inv(obj)¶ -
operator.invert(obj)¶ -
operator.__inv__(obj)¶ -
operator.__invert__(obj)¶ 返回数字 obj 按位取反的结果。 这等价于
~obj。2.0 新版功能: The names
invert()and__invert__().
-
operator.truediv(a, b)¶ -
operator.__truediv__(a, b)¶ Return
a / bwhen__future__.divisionis in effect. This is also known as “true” division.2.2 新版功能.
适用于序列的操作(其中一些也适用于映射)包括:
-
operator.contains(a, b)¶ -
operator.__contains__(a, b)¶ 返回
b in a检测的结果。 请注意操作数是反序的。2.0 新版功能: The name
__contains__().
-
operator.countOf(a, b)¶ 返回 b 在 a 中的出现次数。
-
operator.delslice(a, b, c)¶ -
operator.__delslice__(a, b, c)¶ Delete the slice of a from index b to index c-1.
2.6 版后已移除: This function is removed in Python 3.x. Use
delitem()with a slice index.
-
operator.getslice(a, b, c)¶ -
operator.__getslice__(a, b, c)¶ Return the slice of a from index b to index c-1.
2.6 版后已移除: This function is removed in Python 3.x. Use
getitem()with a slice index.
-
operator.indexOf(a, b)¶ 返回 b 在 a 中首次出现所在的索引号。
-
operator.repeat(a, b)¶ -
operator.__repeat__(a, b)¶ 2.7 版后已移除: Use
__mul__()instead.Return
a * bwhere a is a sequence and b is an integer.
-
operator.sequenceIncludes(...)¶ 2.0 版后已移除: Use
contains()instead.Alias for
contains().
-
operator.setslice(a, b, c, v)¶ -
operator.__setslice__(a, b, c, v)¶ Set the slice of a from index b to index c-1 to the sequence v.
2.6 版后已移除: This function is removed in Python 3.x. Use
setitem()with a slice index.
Example use of operator functions:
>>> # 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
Many operations have an “in-place” version. The following functions provide a
more primitive access to in-place operators than the usual syntax does; for
example, the statement x += y is equivalent to
x = operator.iadd(x, y). Another way to put it is to say that
z = operator.iadd(x, y) is equivalent to the compound statement
z = x; z += y.
-
operator.iconcat(a, b)¶ -
operator.__iconcat__(a, b)¶ a = iconcat(a, b)等价于a += b其中 a 和 b 为序列。2.5 新版功能.
-
operator.idiv(a, b)¶ -
operator.__idiv__(a, b)¶ a = idiv(a, b)is equivalent toa /= bwhen__future__.divisionis not in effect.2.5 新版功能.
-
operator.irepeat(a, b)¶ -
operator.__irepeat__(a, b)¶ 2.7 版后已移除: Use
__imul__()instead.a = irepeat(a, b)is equivalent toa *= bwhere a is a sequence and b is an integer.2.5 新版功能.
-
operator.itruediv(a, b)¶ -
operator.__itruediv__(a, b)¶ a = itruediv(a, b)is equivalent toa /= bwhen__future__.divisionis in effect.2.5 新版功能.
The operator module also defines a few predicates to test the type of
objects; however, these are not all reliable. It is preferable to test
abstract base classes instead (see collections and
numbers for details).
-
operator.isCallable(obj)¶ 2.0 版后已移除: Use
isinstance(x, collections.Callable)instead.Returns true if the object obj can be called like a function, otherwise it returns false. True is returned for functions, bound and unbound methods, class objects, and instance objects which support the
__call__()method.
-
operator.isMappingType(obj)¶ 2.7 版后已移除: Use
isinstance(x, collections.Mapping)instead.Returns true if the object obj supports the mapping interface. This is true for dictionaries and all instance objects defining
__getitem__().
-
operator.isNumberType(obj)¶ 2.7 版后已移除: Use
isinstance(x, numbers.Number)instead.Returns true if the object obj represents a number. This is true for all numeric types implemented in C.
-
operator.isSequenceType(obj)¶ 2.7 版后已移除: Use
isinstance(x, collections.Sequence)instead.Returns true if the object obj supports the sequence protocol. This returns true for all objects which define sequence methods in C, and for all instance objects defining
__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 版更改: Added support for multiple attributes.
在 2.6 版更改: Added support for dotted attributes.
-
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])。
等价于:
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__()所接受的任何类型。 字典接受任意可哈希的值。 列表、元组和字符串接受 index 或 slice 对象:>>> itemgetter(1)('ABCDEFG') 'B' >>> itemgetter(1,3,5)('ABCDEFG') ('B', 'D', 'F') >>> itemgetter(slice(2,None))('ABCDEFG') 'CDEFG'
2.4 新版功能.
在 2.5 版更改: Added support for multiple item extraction.
使用
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...])¶ 返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:
在
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 新版功能.
9.9.1. 将运算符映射到函数¶
以下表格显示了抽象运算是如何对应于 Python 语法中的运算符和 operator 模块中的函数的。
运算 |
语法 |
函数 |
|---|---|---|
加法 |
|
|
字符串拼接 |
|
|
包含测试 |
|
|
除法 |
|
|
除法 |
|
|
除法 |
|
|
按位与 |
|
|
按位异或 |
|
|
按位取反 |
|
|
按位或 |
|
|
取幂 |
|
|
一致 |
|
|
一致 |
|
|
索引赋值 |
|
|
索引删除 |
|
|
索引取值 |
|
|
左移 |
|
|
取模 |
|
|
乘法 |
|
|
否定(算术) |
|
|
否定(逻辑) |
|
|
正数 |
|
|
右移 |
|
|
Sequence Repetition |
|
|
切片赋值 |
|
|
切片删除 |
|
|
切片取值 |
|
|
字符串格式化 |
|
|
减法 |
|
|
真值测试 |
|
|
比较 |
|
|
比较 |
|
|
相等 |
|
|
不等 |
|
|
比较 |
|
|
比较 |
|
|
