轉(zhuǎn)載須注明出處:簡(jiǎn)書@Orca_J35 | GitHub@orca-j35色洞,所有筆記均托管于 python_notes 倉(cāng)庫(kù)
擴(kuò)展閱讀:
operator
— Standard operators as functions- operator — 內(nèi)置操作符接口
operator - Standard operators as functions
operater
模塊導(dǎo)出了一組與 Python 的內(nèi)部運(yùn)算符相對(duì)應(yīng)的函數(shù)桐早。例如 operator.add(x, y)
等價(jià)于表達(dá)式 x+y
。
在本模塊中床未,大多數(shù)函數(shù)名直接使用對(duì)應(yīng)的特殊方法名(但不帶下劃線)。為了向后兼容,本模塊中的許多方法還保留了具備雙下劃線方法名的變體船逮。為了使代碼易讀,請(qǐng)優(yōu)先使用沒(méi)有雙下劃線的版本粤铭。
本模塊中的方法可分為以下四類:
- 對(duì)象比較(object comparisons)
- 邏輯運(yùn)算(logical operations)
- 數(shù)學(xué)運(yùn)算(mathematical operations)和位運(yùn)算(bitwise operations)
- 序列操作(sequence operations)
運(yùn)算符和函數(shù)的映射關(guān)系
Mapping Operators to Functions
This table shows how abstract operations correspond to operator symbols in the Python syntax and the functions in the operator
module.
Operation | Syntax | Function | |
---|---|---|---|
Addition | a + b |
add(a, b) |
|
Concatenation | seq1 + seq2 |
concat(seq1, seq2) |
|
Containment Test | obj in seq |
contains(seq, obj) |
|
Division | a / b |
truediv(a, b) |
|
Division | a // b |
floordiv(a, b) |
|
Bitwise And | a & b |
and_(a, b) |
|
Bitwise Exclusive Or | a ^ b |
xor(a, b) |
|
Bitwise Inversion | ~ a |
invert(a) |
|
Bitwise Or | `a | b` | or_(a, b) |
Exponentiation | a ** b |
pow(a, b) |
|
Identity | a is b |
is_(a, b) |
|
Identity | a is not b |
is_not(a, b) |
|
Indexed Assignment | obj[k] = v |
setitem(obj, k, v) |
|
Indexed Deletion | del obj[k] |
delitem(obj, k) |
|
Indexing | obj[k] |
getitem(obj, k) |
|
Left Shift | a << b |
lshift(a, b) |
|
Modulo | a % b |
mod(a, b) |
|
Multiplication | a * b |
mul(a, b) |
|
Matrix Multiplication | a @ b |
matmul(a, b) |
|
Negation (Arithmetic) | - a |
neg(a) |
|
Negation (Logical) | not a |
not_(a) |
|
Positive | + a |
pos(a) |
|
Right Shift | a >> b |
rshift(a, b) |
|
Slice Assignment | seq[i:j] = values |
setitem(seq, slice(i, j), values) |
|
Slice Deletion | del seq[i:j] |
delitem(seq, slice(i, j)) |
|
Slicing | seq[i:j] |
getitem(seq, slice(i, j)) |
|
String Formatting | s % obj |
mod(s, obj) |
|
Subtraction | a - b |
sub(a, b) |
|
Truth Test | obj |
truth(obj) |
|
Ordering | a < b |
lt(a, b) |
|
Ordering | a <= b |
le(a, b) |
|
Equality | a == b |
eq(a, b) |
|
Difference | a != b |
ne(a, b) |
|
Ordering | a >= b |
ge(a, b) |
|
Ordering | a > b |
gt(a, b) |
對(duì)象比較
支持所有的富比較運(yùn)算符挖胃,并以對(duì)應(yīng)的豐富比較運(yùn)算符來(lái)命名:
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)
具體來(lái)說(shuō),當(dāng)在 a 和 b 之間執(zhí)行"富比較"時(shí):
-
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 > b
-
ge(a, b)
is equivalent toa >=b
.
注意:以上方法可以返回任意值,這些值可能會(huì)(也可能不會(huì))被解釋為布爾值酱鸭。有關(guān)豐富比較的詳細(xì)信息吗垮,請(qǐng)參閱 Comparisons 。
邏輯運(yùn)算
邏輯操作通常也適用于所有對(duì)象凹髓,并支持真值測(cè)試烁登,身份(identity)測(cè)試和布爾操作:
operator.not_(obj)
operator.__not__(obj)
# Return the outcome of not obj. (Note that there is no __not__() method for object instances; only the interpreter core defines this operation. The result is affected by the __bool__() and __len__() methods.)
operator.truth(obj)
# Return True if obj is true, and False otherwise. This is equivalent to using the bool constructor.
operator.is_(a, b)
# Return a is b. Tests object identity.
operator.is_not(a, b)
# Return a is not b. Tests object identity.
數(shù)學(xué)運(yùn)算和位運(yùn)算
數(shù)學(xué)運(yùn)算
operator.abs(obj)
operator.__abs__(obj)
# Return the absolute value of obj.
operator.add(a, b)
operator.__add__(a, b)
# Return a + b, for a and b numbers.
operator.floordiv(a, b)
operator.__floordiv__(a, b)
# Return a // b.
operator.index(a)
operator.__index__(a)
# Return a converted to an integer. Equivalent to a.__index__().
operator.mod(a, b)
operator.__mod__(a, b)
# Return a % b.
operator.mul(a, b)
operator.__mul__(a, b)
# Return a * b, for a and b numbers.
operator.matmul(a, b)
operator.__matmul__(a, b)
# Return a @ b.
# New in version 3.5.
operator.neg(obj)
operator.__neg__(obj)
# Return obj negated (-obj).
operator.pos(obj)
operator.__pos__(obj)
# Return obj positive (+obj).
operator.pow(a, b)
operator.__pow__(a, b)
# Return a ** b, for a and b numbers.
operator.sub(a, b)
operator.__sub__(a, b)
# Return a - b.
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.
位運(yùn)算
operator.and_(a, b)
operator.__and__(a, b)
# Return the bitwise and of a and b.
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.
operator.lshift(a, b)
operator.__lshift__(a, b)
# Return a shifted left by b.
operator.or_(a, b)
operator.__or__(a, b)
# Return the bitwise or of a and b.
operator.rshift(a, b)
operator.__rshift__(a, b)
# Return a shifted right by b.
operator.xor(a, b)
operator.__xor__(a, b)
# Return the bitwise exclusive or of a and b.
序列操作
以下操作工作于序列(部分也可用于映射)之上:
operator.concat(a, b)
operator.__concat__(a, b)
# Return a + b for a and b sequences.
operator.contains(a, b)
operator.__contains__(a, b)
# Return the outcome of the test b in a. Note the reversed operands.
operator.countOf(a, b)
# Return the number of occurrences of b in a.
operator.delitem(a, b)
operator.__delitem__(a, b)
# Remove the value of a at index b.
operator.getitem(a, b)
operator.__getitem__(a, b)
# Return the value of a at index b.
operator.indexOf(a, b)
# Return the index of the first of occurrence of b in a.
operator.setitem(a, b, c)
operator.__setitem__(a, b, c)
# Set the value of a at index b to c.
operator.length_hint(obj, default=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.
# New in version 3.4.
屬性和項(xiàng)獲取器
operator
模塊還定義了用于通用屬性和項(xiàng)查找的工具。這些工具可用于 map()
, sorted()
, itertools.groupby()
等函數(shù)的鍵函數(shù)蔚舀,以便快速提取相應(yīng)的字段饵沧。
獲取器(getter)的開銷比 lambda
(或普通函數(shù))小。
attrgetter
?? 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)
.
Equivalent to:
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
itemgetter
?? operator.itemgetter(item)
?? operator.itemgetter(*items)
Return a callable object that fetches item from its operand using the operand’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])
.
Equivalent to:
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, and strings 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 a tuple 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)]
methodcaller
?? operator.methodcaller(name[, args...])
Return a callable object that calls the method name on its operand. If additional arguments and/or keyword arguments are given, they will be given to 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)
.
Equivalent to:
def methodcaller(name, *args, **kwargs):
def caller(obj):
return getattr(obj, name)(*args, **kwargs)
return caller
Inplace Operators
大多數(shù)運(yùn)算符都有 “in-place” 版本赌躺。下面列出的函數(shù)提供了比常用語(yǔ)法更原始的訪問(wèn)方法狼牺。例如:
- the statement
x += y
is equivalent tox = operator.iadd(x, y)
. - Another way to put it is to say that
z = 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 computation and assignment are performed in two separate steps. The in-place functions listed below only do the first step, calling the in-place method. The second step, assignment, is not handled.
For immutable targets such as strings, numbers, and tuples, the updated value 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 inplace method will 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.iadd(a, b)
operator.__iadd__(a, b)
# a = iadd(a, b) is equivalent to a += b.
operator.iand(a, b)
operator.__iand__(a, b)
# a = iand(a, b) is equivalent to a &= b.
operator.iconcat(a, b)
operator.__iconcat__(a, b)
# a = iconcat(a, b) is equivalent to a += b for a and b sequences.
operator.ifloordiv(a, b)
operator.__ifloordiv__(a, b)
# a = ifloordiv(a, b) is equivalent to a //= b.
operator.ilshift(a, b)
operator.__ilshift__(a, b)
# a = ilshift(a, b) is equivalent to a <<= b.
operator.imod(a, b)
operator.__imod__(a, b)
# a = imod(a, b) is equivalent to a %= b.
operator.imul(a, b)
operator.__imul__(a, b)
# a = imul(a, b) is equivalent to a *= b.
operator.imatmul(a, b)
operator.__imatmul__(a, b)
# a = imatmul(a, b) is equivalent to a @= b.
# New in version 3.5.
operator.ior(a, b)
operator.__ior__(a, b)
# a = ior(a, b) is equivalent to a |= b.
operator.ipow(a, b)
operator.__ipow__(a, b)
# a = ipow(a, b) is equivalent to a **= b.
operator.irshift(a, b)
operator.__irshift__(a, b)
# a = irshift(a, b) is equivalent to a >>= b.
operator.isub(a, b)
operator.__isub__(a, b)
# a = isub(a, b) is equivalent to a -= b.
operator.itruediv(a, b)
operator.__itruediv__(a, b)
# a = itruediv(a, b) is equivalent to a /= b.
operator.ixor(a, b)
operator.__ixor__(a, b)
# a = ixor(a, b) is equivalent to a ^= b.