python标准库之函数式编程(3)

operator模块输出一系列对应Python内部操作符的函数。

一、常见的函数操作

操作 语法 函数
加法 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
求幂 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)

二、序列相关操作

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
# 返回a + b,a与b都为序列
operator.concat(a, b)
operator.__concat__(a, b)

# 返回测试b in a的结果。请注意反转操作数
operator.contains(a, b)
operator.__contains__(a, b)

# 返回b在a中出现的次数
operator. countof(a, b)

# 删除a索引b的值
operator.delitem(a, b)
operator.__delitem__(a, b)

# 返回a索引b的值
operator.getitem(a, b)
operator.__getitem__(a, b)

# 返回b在a中第一次出现时的索引
operator.indexof(a, b)

# a中索引b的位置上的值设置为c
operator.setitem(a, b, c)
operator.__setitem__(a, b, c)

# 返回对象obj的估算长度
operator.length_hint(obj, default=0)

三、高级操作

不管是attrgetter()还是itemgetter(),它们跟sorted、map这些高阶函数结合起来使用,可以发挥出比lambda表达式更加神奇的效果。

1、itemgetter()

1
2
3
4
5
6
from operator import itemgetter

print(itemgetter(1)('ABCDEFG'))
# B
print(itemgetter(1,3,4)('ABCDEFG'))
# ('B', 'D', 'E')

2、attrgetter()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding:utf-8
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))

student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]

print(sorted(student_objects, key=lambda student: student.age)) # 传统的lambda做法
#[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

from operator import itemgetter, attrgetter
print(sorted(student_objects, key=attrgetter('age')))
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
# 如果像下面这样接受双重比较,Python脆弱的lambda就不适用了
print(sorted(student_objects, key=attrgetter('grade', 'age')))
# [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]