operator —- 标准运算符替代函数
源代码:Lib/operator.py
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
The logical operations are also generally applicable to all objects, and supporttruth tests, identity tests, and boolean operations:
operator.
not
(_obj)operator.
not
(obj)- Return the outcome of
not
obj. (Note that there is nonot()
method for object instances; only the interpreter core definesthis operation. The result is affected by thebool()
andlen()
methods.)
operator.
truth
(obj)- Return
True
if obj is true, andFalse
otherwise. This isequivalent to using thebool
constructor.
The mathematical and bitwise operations are the most numerous:
operator.
inv
(obj)operator.
invert
(obj)operator.
inv
(obj)operator.
invert
(obj)- Return the bitwise inverse of the number obj. This is equivalent to
~obj
.
3.5 新版功能.
operator.
truediv
(a, b)operator.
truediv
(a, b)- Return
a / b
where 2/3 is .66 rather than 0. This is also known as"true" division.
Operations which work with sequences (some of them with mappings too) include:
operator.
contains
(a, b)operator.
contains
(a, b)- Return the outcome of the test
b in a
. Note the reversed operands.
operator.
lengthhint
(_obj, default=0)- Return an estimated length for the object o. First try to return itsactual length, then an estimate using
object.length_hint()
, andfinally return the default value.
3.4 新版功能.
The operator
module also defines tools for generalized attribute and itemlookups. These are useful for making fast field extractors as arguments formap()
, sorted()
, itertools.groupby()
, or other functions thatexpect a function argument.
operator.
attrgetter
(attr)operator.
attrgetter
(*attrs)Return a callable object that fetches attr from its operand.If more than one attribute is requested, returns a tuple of attributes.The attribute names can also contain dots. For example:
After
f = attrgetter('name')
, the callf(b)
returnsb.name
.After
f = attrgetter('name', 'date')
, the callf(b)
returns(b.name, b.date)
.After
f = attrgetter('name.first', 'name.last')
, the callf(b)
returns(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
(item)operator.
itemgetter
(*items)Return a callable object that fetches item from its operand using theoperand's
getitem()
method. If multiple items are specified,returns a tuple of lookup values. For example:After
f = itemgetter(2)
, the callf(r)
returnsr[2]
.After
g = itemgetter(2, 5, 3)
, the callg(r)
returns(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
The items can be any type accepted by the operand's getitem()
method. Dictionaries accept any hashable value. Lists, tuples, andstrings accept an index or a slice:
- >>> 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'
Example of using itemgetter()
to retrieve specific fields from atuple record:
- >>> 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.
methodcaller
(name[, args…])Return a callable object that calls the method name on its operand. Ifadditional arguments and/or keyword arguments are given, they will be givento the method as well. For example:
After
f = methodcaller('name')
, the callf(b)
returnsb.name()
.After
f = methodcaller('name', 'foo', bar=1)
, the callf(b)
returnsb.name('foo', bar=1)
.
等价于:
- def methodcaller(name, *args, **kwargs):
- def caller(obj):
- return getattr(obj, name)(*args, **kwargs)
- return caller
Mapping Operators to Functions
This table shows how abstract operations correspond to operator symbols in thePython syntax and the functions in the operator
module.
运算 | 语法 | 函数 |
---|---|---|
加法 | 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) |
In-place Operators
Many operations have an "in-place" version. Listed below are functionsproviding a more primitive access to in-place operators than the usual syntaxdoes; for example, the statement x += y
is equivalent tox = operator.iadd(x, y)
. Another way to put it is to say thatz = operator.iadd(x, y)
is equivalent to the compound statementz = x; z += y
.
In those examples, note that when an in-place method is called, the computationand assignment are performed in two separate steps. The in-place functionslisted below only do the first step, calling the in-place method. The secondstep, assignment, is not handled.
For immutable targets such as strings, numbers, and tuples, the updatedvalue is computed, but not assigned back to the input variable:
- >>> a = 'hello'
- >>> iadd(a, ' world')
- 'hello world'
- >>> a
- 'hello'
For mutable targets such as lists and dictionaries, the in-place methodwill perform the update, so no subsequent assignment is necessary:
- >>> 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.
iconcat
(a, b)operator.
iconcat
(a, b)a = iconcat(a, b)
is equivalent toa += b
for a and b sequences.
3.5 新版功能.