python 标准库 operator
今天的关键词: trouble
trouble
[英] [ˈtrʌbl]
[美] [ˈtrʌbəl]
n.麻烦; 烦恼; 故障; 动乱;
vi.费心; 烦恼;
vt.麻烦; 使烦恼; 折磨;

python 标准库学习 operator
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*)
逻辑运算
operator.not_(*obj*)`operator.__not__(*obj*)返回
not*obj* 的结果。 (请注意对象实例并没有 [not()](https://docs.python.org/zh-cn/3.8/library/operator.html#operator.__not__) 方法;只有解释器核心可定义此操作。 结果会受 [bool()](https://docs.python.org/zh-cn/3.8/reference/datamodel.html#object.__bool__) 和 [len()`](https://docs.python.org/zh-cn/3.8/reference/datamodel.html#object.__len__) 方法影响。)`operator.truth(obj)
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*)返回 x 和 y 按位与的结果。
operator.floordiv(*a*, *b*)operator.__floordiv__(*a*, *b*)返回
a // b。operator.index(*a*)operator.__index__(*a*)返回 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*)返回 a 左移 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。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 取正的结果 (
+obj)`。operator.pow(*a*, *b*)operator.__pow__(*a*, *b*)对于数字 a 和 b,返回
a ** b。operator.rshift(*a*, *b*)operator.__rshift__(*a*, *b*)返回 a 右移 b 位的结果。
operator.sub(*a*, *b*)operator.__sub__(*a*, *b*)返回
a - b。operator.truediv(*a*, *b*)operator.__truediv__(*a*, *b*)返回
a / b例如 2/3 将等于 .66 而不是 0。 这也被称为“真”除法。operator.xor(*a*, *b*)operator.__xor__(*a*, *b*)返回 a 和 b 按位异或的结果。
适用于序列的操作(其中一些也适用于映射)包括:
operator.concat(*a*, *b*)operator.__concat__(*a*, *b*)对于序列 a 和 b,返回
a + b。operator.contains(*a*, *b*)operator.__contains__(*a*, *b*)返回
b in a检测的结果。 请注意操作数是反序的。operator.countOf(*a*, *b*)返回 b 在 a 中的出现次数。
operator.delitem(*a*, *b*)operator.__delitem__(*a*, *b*)移除索引号 b 上的值 a。
operator.getitem(*a*, *b*)operator.__getitem__(*a*, *b*)返回索引号 b 上的值 a。
operator.indexOf(*a*, *b*)返回 b 在 a 中首次出现所在的索引号。
operator.setitem(*a*, *b*, *c*)operator.__setitem__(*a*, *b*, *c*)将索引号 b 上的值 a 设为 c。
operator.length_hint(*obj*, *default=0*)返回对象 o 的估计长度。 首先尝试返回其实际长度,再使用
object.__length_hint__()得出估计值,最后返回默认值。
工具
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)`。
`operator.itemgetter(item)
`operator.itemgetter(*items)
返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:
- 在
f = itemgetter(2)之后,调用f(r)将返回r[2]。 - 在
g = itemgetter(2, 5, 3)之后,调用g(r)将返回 (r[2], r[5], r[3])`。
将运算符映射到函数
| 运算 | 语法 | 函数 | |
|---|---|---|---|
| 加法 | 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) |
原地运算符
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。
实例
朋友建议我说,别光说标准库的基本使用,最好有一些实际的例子,接下来我会在每一篇博客的最后给大家一些实际应用的例子,欢迎大家批评指正。
稍后我会在对应的文章下面开通gitalk,大家可以及时给我留言。
实现一个简单的计算器,不使用if else
1 | from operator import * |