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