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)
返回按位和a
和b
。
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)
按位或返回a
和b
。
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)
返回按位独占或a
和b
。
与序列一起工作的操作(其中一些与映射也一样)包括:
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
模块还定义了几个谓词来测试对象的类型; 然而,这些并不都是可靠的。优选的是,测试抽象基类代替(见collections
和numbers
细节)。
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
模块中的函数中如何对应运算符。
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 | div(a, b) (without __future__.division) |
Division | a / b | truediv(a, b) (with __future__.division) |
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 | objk = v | setitem(obj, k, v) |
Indexed Deletion | del objk | delitem(obj, k) |
Indexing | objk | getitem(obj, k) |
Left Shift | a << b | lshift(a, b) |
Modulo | a % b | mod(a, b) |
Multiplication | a * b | mul(a, b) |
Negation (Arithmetic) | a | neg(a) |
Negation (Logical) | not a | not_(a) |
Positive | a | pos(a) |
Right Shift | a >> b | rshift(a, b) |
Sequence Repetition | seq * i | repeat(seq, i) |
Slice Assignment | seqi:j = values | setitem(seq, slice(i, j), values) |
Slice Deletion | del seqi:j | delitem(seq, slice(i, j)) |
Slicing | seqi: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) |