介绍
operator 模块提供了一套与Python的内置运算符对应的高效率函数 . 许多函数名与特殊方法名相同,只是没有双下划线。为了向后兼容性,也保留了许多包含双下划线的函数。函数包含的种类有:对象的比较运算、逻辑运算、数学运算以及序列运算。这个模块提供了很多和Python 一样的操作符, 这里只是封装一个函数进行调用
operator 模块 封装了很多操作相关的函数, 比如 加,减 乘除 ,比较运算 ,逻辑运算 ,矩阵相乘. 还有一些封装好的类, 用起来 效率 比较高效.
常用方法
操作 | 句法 | 功能 |
---|---|---|
加 | a+b | add(a,b) |
串联 | seq1 + seq2 | concat(seq1,seq2) |
除 | 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 % b | mod(a,b) |
乘 | a * b | mul(a,b) |
减 | a - b | sub(a,b) |
小于 | 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) |
三大类
attrgetter
通过attrgetter可以获取对象的属性,然后进行排序操作
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
operator 中 可以使用 attrgetter 获取 对象的 属性
attrgetter('xxx') 来获取对象的属性 .
'''
from operator import attrgetter
class Student:
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
def __str__(self):
return '%s(name=%r,age=%r,score=%r)' % (self.__class__.__name__,self.name,self.age,self.score)
__repr__ = __str__ #重写类的实例输出
if __name__=='__main__':
std1 = Student('A',11,23)
std2 = Student('B',12,24)
std3 = Student('C',23,18)
std4 = Student('D',10,30)
students = [std1,std2,std3,std4]
#按照分数升序排列
new_students_score = sorted(students,key=lambda stu:stu.score,reverse=False)
#按照年龄升序排列
new_students_age = sorted(students,key=attrgetter('age'),reverse=False)
print(new_students_score)
print(new_students_age)
>>>>
[Student(name='C',age=23,score=18), Student(name='A',age=11,score=23), Student(name='B',age=12,score=24), Student(name='D',age=10,score=30)]
[Student(name='D',age=10,score=30), Student(name='A',age=11,score=23), Student(name='B',age=12,score=24), Student(name='C',age=23,score=18)]
itemgetter
这个 类会返回一个可调用对象 ,它会从它的操作数里面取值,会调用操作数的getitem() 方法获取值,如果传入了多个 item , 那么结果就会返回一个元祖
from operator import itemgetter
a = 'abcedfsgs'
itemgetter(1)(a)
>>'b'
itemgetter(1,2,3,4)(a)
>>('b','c','e','d')
进行排序
from operator import itemgetter
def one example():
data = [
("frank", 10),
("frank1", 15),
("frank2", 19),
("frank3", 12),
("frank4", 17),
("frank5", 11),
("frank6", 18),
]
data.sort(key=itemgetter(1),reverse=True)
print(data)
>>[('frank2', 19), ('frank6', 18), ('frank4', 17), ('frank1', 15), ('frank3', 12), ('frank5', 11), ('frank', 10)]
methodcaller
你有一个字符串形式的方法名称,想通过它调用某个对象的对应方法
import math
from operator import methodcaller
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
def __str__(self):
return 'Point({0},{1})'.format(self.x,self.y)
def distance(self,x,y):
return math.hypot(self.x-x,self.y-y)
points = [Point(x,y) for x,y in zip([3,2,1,0,0.2],[0.1,-1,5,3,1,8])]
#离原点的距离
sorted(points,key=methodcaller('distance',0,0))
for p in points:
print(p)
>>Point(3,0.1)
>>Point(2,-1)
>>Point(1,5)
>>Point(0,3)
>>Point(0.2,1)