operator (Numeric & Mathematical) - 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。请注意,与内置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) |