0%

python的operator模块

模块简介

operator提供了和算术运算符一样高效的方法。
PS:该模块存粹是为了写C语言这种纯函数编程的代码,实用性仅仅在与map(),sorted()这些函数里面。实际没什么用

常用方法

比较运算

运算 函数 语法
小于 lt(a, b) a < b
小于等于 le(a, b) a <= b
大于 gt(a, b) a > b
大于等于 ge(a, b) a >= b
等于 eq(a, b) a == b
不等于 ne(a, b) a != b

逻辑运算

运算 函数 语法
and_(a, b) a & b
or_(a, b) a
异或 xor(a, b) a ^ b
取反 invert(a, b) ~ a
对象是否相等 is_(a, b) a is b
对象是否不相等 is_not(a, b) a is not b
真值 truth(obj) obj

数学运算

运算 函数 语法
add(a ,b) a + b
truediv(a, b) a / b
mul(a, b) a * b
sub(a, b) a - b
pow(a, b) a ** b
负数 neg(a) - a
正数 pos(a) + a
取模 mod(a, b) a % b

序列运算

运算 函数 语法
字符串拼接 concat(seq1, seq2) seq1 + seq2
包含 contains(seq, obj) obj in seq
索引赋值 setitem(obj, i, v) obj[i] = v
索引删除 delitem(obj, i) del obj[i]
索引取值 getitem(obj, i) obj[i]
切片赋值 setitem(seq, slice(i, j), values) seq[i:j] = values
切片删除 delitem(seq, slice(i, j)) del seq[i:j]
切片取值 getitem(seq, slice(i, j)) seq[i:j]
格式化 mod(s, obj) s % obj

itemgetter类

itemgetter类会返回一个可调用对象,传入多个索引参数则返回按照索引参数顺序提取的值构成的元组。可用于map(),sorted()操作

1
__init__(self, item, *items)
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
from operator import itemgetter

metro_data = [
('Tokyo', 'JP', 36.933, (35.689, 139.691)),
('Delhi NCR', 'IN', 21.935, (28.613, 77.208)),
('New York', 'US', 20.104, (40.808, -74.020)),
]

# 根据metro_data当中每个元组的第0列(即城市名)进行排序
for city in sorted(metro_data, key=itemgetter(0)):
print(city)
# 根据第0列,即Tokyo,Delhi NCR,New York进行的排序
# ('Delhi NCR', 'IN', 21.935, (28.613, 77.208))
# ('New York', 'US', 20.104, (40.808, -74.02))
# ('Tokyo', 'JP', 36.933, (35.689, 139.691))

# 创建一个itemgetter对象,分别用于访问metro_data下标为1和下标为0的值
# 返回的是一个元组,按照itemgetter对象的下标顺序排序
cc_name = itemgetter(1, 0)
for city in metro_data:
print(cc_name(city))

# 按照下标1和0访问元素,并将结果按照顺序放入元组中
# ('JP', 'Tokyo')
# ('IN', 'Delhi NCR')
# ('US', 'New York')

attrgetter类

attrgetter类会根据名称来提取对象的属性。如果参数名中包含.(点号),那么attrgetter会深入嵌套对象访问属性。可用于map(),sorted()操作

1
__init__(self, attr, *attrs)
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
from operator import attrgetter
from collections import namedtuple

metro_data = [
('Tokyo', 'JP', 36.933, (35.689, 139.691)),
('Delhi NCR', 'IN', 21.935, (28.613, 77.208)),
('New York', 'US', 20.104, (40.808, -74.020)),
]

# 创建一个以经纬度为值的具名元组对象
LatLon = namedtuple('LatLon', 'lat lon')
# 创建一个以城市名,国家,人口,坐标为值的具名元组对象
Metropolis = namedtuple('Metropolis', 'name,cc,pop,coord')
# 生成一个列表,列表的每一项值为Metropolis对象,其中Metropolis对象的值为LatLon对象
metro_areas = [Metropolis(name, cc, pop, LatLon(lat, lon))
for name, cc, pop, (lat, lon) in metro_data]

print(metro_areas[0])
# 可以看出Metropolis的各个属性的值
# Metropolis(name='Tokyo', cc='JP', pop=36.933, coord=LatLon(lat=35.689, lon=139.691))

# 创建一个attrgetter对象,该对象用于访问传入的Metropolis对象的name属性
# 以及Metropolis对象的coord属性的lat属性
name_lat = attrgetter('name', 'coord.lat')
for city in sorted(metro_areas, key=attrgetter('coord.lat')):
print(name_lat(city))
# ('Delhi NCR', 28.613)
# ('Tokyo', 35.689)
# ('New York', 40.808)

methodcaller类

methodcaller类会调用参数指定的方法。

1
__init__(self, name, /, *args, **kwargs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from operator import methodcaller

s = "The time has come"
# 创建一个methodcaller对象,用于访问字符串的upper()方法
# 等同于str.upper()
up_case = methodcaller('upper')
print(up_case(s))
# THE TIME HAS COME

# 创建一个methodcaller,用于访问字符串的replace('', '-')方法
# 等同于str.replace('', '-')
hyphenate = methodcaller('replace', ' ', '-')
print(hyphenate(s))
# The-time-has-come