operator模块输出一系列对应Python内部操作符的函数。例如:operator.add(x, y)等价于表达式x+y。许多函数的名称都被一些特定的方法使用,没有下划线加持。为了向下兼容,它们中的许多都保留着由双下划线的变体。那些不具备双下划线的变体是为了使表达更清晰。

这些函数在各种函数目录里扮演者对相比较、逻辑操作、数学运算以及序列操作等角色。

对于所有对象来讲对象比较函数是十分有用的,并且这些函数以它们支持的丰富的比较操作命名。

最近遇到一个像这样的问题,搜索框以下拉框的形式展开,下拉框里包含着三级菜单,无论点哪级菜单,都会筛选出这级菜单下的数据来,是这样,前端保存的时候传的是一个数组。对于菜单其实是建了一个字段来存菜单id,现在查询,前端传一个菜单id,就可以查到,因为我们有一张单独的表来维护菜单,所以每级菜单的索引都是不同的,最重要的问题怎么用一个数组和另一个数字比较,用递归,也可以。我是这样做的,把前端传过来的id放到一个列表里,然后用高阶函数reduc配合operator来实现,让两个列表内的元素依次做比较,最终筛选出比较之后的数据。起初我是没有思路的,因为我是真的忘了,python还有这么一个模块,不得不说,实在是奇特。

代码示例:

1
2
3
if user_source:
new_list.append(user_source)
get_data = get_data.filter(reduce(operator.and_,(Q(user_source__contains=x) for x in new_list)))

以下是关于operator的用法,先码后看,我怕以后想看又找不到了。

operator. lt(a, b) //less than小于

operator. le(a, b) //lessthan or equal to小于等于

operator. eq(a, b) //equal to等于

operator. ne(a, b) //not equalto不等于

operator. ge(a, b) //greaterand equal to大于等于

operator. gt(a, b) //greater大于

operator. le(a, b)

operator. lt(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__()方法;只有解释器代码定义了这个操作。它的结果受__bool__()和__len__()方法影响)。

operator. truth(obj)

如果obj是真的,就返回True,否则返回False。等价于使用布尔构造器。

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。(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. nge(obj)

operator. neg(obj)

返回obj的负值(-obj)。

operator. or(a, b)

operator. or(a, b)

a与b按位求或,并返回结果值。

operator. pos(obj)

operator. pow(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是0.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)

删除a索引b的值。

operator. getitem(a, b)

operator. getitem(a, b)

返回a索引b的值。

operator. indexof(a, b)

返回b在a中第一次出现时的索引。

operator. setitem(a, b, c)

operator. setitem(a, b, c)

a中索引b的位置上的值设置为c。

operator. length_hint(obj, default=0)

返回对象obj的估算长度。首先试图返回真实的长度,不行的话使用obj.length_hint()估算长度,再不行的话返回默认值规定的长度。

operator模块也定义了一些广义属性和项目查找的工具。它们常用于为诸如map()、sorted()、itertools. groupby()或其他需要函数作为参数的函数提供参数,该参数为一个高速的字段提取器。

operator. attrgetter(attr)

operator. attrgetter(*attrs)

返回一个可点用对象,该对象能从其操作中捕获attr。如果提供了多个属性,返回一个属性构成的元组。属性名也可以包含符号点。例如:

•••运行 f = attrgetter(‘name’)之后,调用f(b),返回b.name。

•运行 f = attregetter(‘name’,’date’)之后,调用f(b),返回(b. name, b,date)。

•运行f =attregetter(‘name.first’, ‘name. last’)之后,调用f(b),返回(b. name. first, b. name. last)。

等价于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
defattrgetter(*items):

ifany(notisinstance(item, str) for item in items):

raiseTypeError('attribute namemust be a string')

iflen(items) ==1:

attr = items[0]

defg(obj):

return resolve_attr(obj, attr)

else:

defg(obj):

returntuple(resolve_attr(obj, attr) for attr in items)

return g



defresolve_attr(obj, attr):

for name in attr.split("."):

obj =getattr(obj, name)

return obj

operator. itemgetter(item)

operator. itemgetter(*items)

返回一个可调用对象,该对象可以使用操作__getitem__()方法从自身的操作中捕获item。如果制定了多个items,返回一个由查询值组成的元组。例如:

•运行f =itemgetter(2),然后调用f(r),返回r[2]。

•运行g =itemgetter(2, 5, 3),然后调用g(r),返回(r[2], r[5], r[3])。

等价于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def  itemgetter(*items):

iflen(items) ==1:

item = items[0]

defg(obj):

return obj[item]

else:

defg(obj):

returntuple(obj[item] for item in items)

return g

Items可以是任何类型,只要该类型可以接受__getitem__()方法的操作。字典结合搜任何可哈希的值。列表、元组和字符串接受索引或者片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
>>>itemgetter(1)('ABCDEFG')

'B'

>>>itemgetter(1,3,5)('ABCDEFG')

('B', 'D','F')

>>>itemgetter(slice(2,None))('ABCDEFG')

'CDEFG'

例如使用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…])

返回一个可调用的对象,该对象可以在其操作内调用名为name的方法。如果额外的参数或者关键字参数被给出,它们也会被传递给方法。例如:

•运行 f = methodcaller(‘name’),调用f(b),返回b. name()。

•运行 f = methodcaller(‘name’, ‘foo’, bar=1),调用f(b),返回b. name(‘foo’, bar=1)。

等价于:

1
2
3
4
5
6
7
8
9
defmethodcaller(name, *args, **kwargs):

defcaller(obj):

returngetattr(obj, name)(*args, **kwargs)

return caller


1. 函数的映射操作

操作 语法 函数
加法 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))
得到片段 swq[i : j] getitme(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 ge(a, b)

2.原址操作

许多操作都有其原地操作版本。以下列出的函数提供了比普通语法操作更原始的原址操作。例如:语句x += y等价于x = operator. iadd(x, y)。其它方法提出说z = operatgor.iadd(x, y)等价于复合语句 z= x; z += y。

在其他例子中,注意,当一个原址操作被调用,计算和分配在讲个分割开来的步骤里进行。以下列出的原址函数值做了第一步,调用原址方法。第二步,分配却没有被操作。

对于不变的目标李如意字符串、数组和元组,被更新的值是需要计算的,但是不回配输入变量:

**>>>**a =’hello’

**>>>**iadd(a, ‘ world’)

‘helloworld’

**>>>**a

‘hello

对于可变对象例如列表和字典,预案之操作将会运行更新,因此不需要后续分配。

**>>>**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 = land(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 = imud(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。

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. sub(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。