operator-标准运算符作为函数详解(3)Python语言的功能编程模块(必读进阶学习教程)(参考资料)
该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
逻辑操作通常也适用于所有对象,并支持真值测试,身份测试和布尔操作:
operator.
not_
(obj )operator.
__not__
(obj )- 返回obj的结果。(请注意,对象实例没有 方法;只有解释器核心定义了此操作。结果受到和 方法的影响。)
not
__not__()
__bool__()
__len__()
operator.
truth
(obj )True
如果obj为真,False
则返回,否则返回。这相当于使用bool
构造函数。
operator.
is_
(a,b )- 返回。测试对象标识。
a is b
operator.
is_not
(a,b )- 返回。测试对象标识。
a is not b
数学和按位运算是最多的:
operator.
abs
(obj )operator.
__abs__
(obj )- 返回obj的绝对值。
operator.
add
(a,b )operator.
__add__
(a,b )- 返回,a和b数字。
a + b
operator.
and_
(a,b )operator.
__and__
(a,b )- 返回按位和a和b。
operator.
floordiv
(a,b )operator.
__floordiv__
(a,b )- 返回。
a // b
operator.
index
(a )operator.
__index__
(a )- 返回一个转换为整数。相当于
a.__index__()
。
operator.
inv
(obj )operator.
invert
(obj )operator.
__inv__
(obj )operator.
__invert__
(obj )- 返回数字obj的按位反转。这相当于
~obj
。
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数字。
a * b
operator.
matmul
(a,b )operator.
__matmul__
(a,b )- 返回。
a @ b
版本3.5中的新功能。
operator.
neg
(obj )operator.
__neg__
(obj )- 返回obj negated(
-obj
)。
operator.
or_
(a,b )operator.
__or__
(a,b )- 返回按位或a和b。
operator.
pos
(obj )operator.
__pos__
(obj )- 返回obj positive(
+obj
)。
operator.
pow
(a,b )operator.
__pow__
(a,b )- 返回,a和b数字。
a ** b
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 )- 返回2/3是.66而不是0.这也称为“真正的”除法。
a / b
operator.
xor
(a,b )operator.
__xor__
(a,b )- 返回按位异或a和b。
使用序列的操作(其中一些也带有映射)包括:
operator.
concat
(a,b )operator.
__concat__
(a,b )- 返回为一个和b序列。
a + b
operator.
contains
(a,b )operator.
__contains__
(a,b )- 返回测试结果。注意反转的操作数。
b in a
operator.
countOf
(a,b )- 返回的出现次数b中的一个。
operator.
delitem
(a,b )operator.
__delitem__
(a,b )- 除去的值一个索引b。
operator.
getitem
(a,b )operator.
__getitem__
(a,b )- 返回的值一个索引b。
operator.
indexOf
(a,b )- 返回第一个的发生的索引b中一个。
operator.
setitem
(a,b,c )operator.
__setitem__
(a,b,c )- 设定的值一个索引b到Ç。
operator.
length_hint
(obj,默认= 0 )- 返回对象o的估计长度。首先尝试返回其实际长度,然后使用估计值
object.__length_hint__()
,最后返回默认值。版本3.4中的新功能。
该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 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.
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
- 之后,呼叫返回。
将运算符映射到函数
此表显示抽象操作如何与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 += y
x = 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.
iadd
(a,b )operator.
__iadd__
(a,b )a = iadd(a, b)
相当于。a += b
operator.
iand
(a,b )operator.
__iand__
(a,b )a = iand(a, b)
相当于。a &= b
operator.
iconcat
(a,b )operator.
__iconcat__
(a,b )a = iconcat(a, b)
等同于a和b序列。a += b
operator.
ifloordiv
(a,b )operator.
__ifloordiv__
(a,b )a = ifloordiv(a, b)
相当于。a //= b
operator.
ilshift
(a,b )operator.
__ilshift__
(a,b )a = ilshift(a, b)
相当于。a <<= b
operator.
imod
(a,b )operator.
__imod__
(a,b )a = imod(a, b)
相当于。a %= b
operator.
imul
(a,b )operator.
__imul__
(a,b )a = imul(a, b)
相当于。a *= b
operator.
imatmul
(a,b )operator.
__imatmul__
(a,b )a = imatmul(a, b)
相当于。a @= b
版本3.5中的新功能。
operator.
ior
(a,b )operator.
__ior__
(a,b )a = ior(a, b)
相当于。a |= b
operator.
ipow
(a,b )operator.
__ipow__
(a,b )a = ipow(a, b)
相当于。a **= b
operator.
irshift
(a,b )operator.
__irshift__
(a,b )a = irshift(a, b)
相当于。a >>= b
operator.
isub
(a,b )operator.
__isub__
(a,b )a = isub(a, b)
相当于。a -= b
operator.
itruediv
(a,b )operator.
__itruediv__
(a,b )a = itruediv(a, b)
相当于。a /= b
operator.
ixor
(a,b )operator.
__ixor__
(a,b )a = ixor(a, b)
相当于。a ^= b