在 Python中,函数即可以作为参数,也可以作为返回值。例如我们的sorted排序,max,min比较都需要传递一个函数作为参数。
data = [1, 10, '4', '8', 9]
# 对data排序
data.sort(key=int)
print(data) # [1, '4', '8', 9, 10]
在上述列表排序中,我们传入int,将字符串转化为整数然后进行排序。
一、为什么需要使用函数代替`标准运算符
想象这样一个场景,你需要传递一个函数参数来处理两个元素的乘积。
你可以传入这样一个函数
def my_mul(a, b):
return a * b
因为Python没有内置的乘法函数,所以我们需要自己实现,但是这种实现是效率非常低的,我们可以直接传入运算符*吗?
答案是不行的,针对这些问题,operator模块中就C实现了标准运算符的一些函数供我们使用。
class Test:
def __init__(self):
self.data = [(1, 3), (2, 4), (5, 8)]
def clear(self, key) -> list:
"""传入 key 函数,对数据进行整理"""
ret = []
for v1, v2 in self.data:
ret.append(key(v1, v2))
return ret
使用operator模块
import operator
if __name__ == '__main__':
ret = Test().clear(operator.mul)
print(ret) # [3, 8, 40]
二、itemgetter与attrgetter
在下面的场景中
将Student对象排序
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name + ':' + str(self.age)
def __repr__(self):
return self.__str__()
if __name__ == '__main__':
def sort_key(student):
return student.age
ss = [
Student('黎明', 23),
Student('刘德华', 22),
Student('张学友', 24),
Student('郭富城', 25),
]
ss.sort(key=sort_key)
print(ss) # [刘德华:22, 黎明:23, 张学友:24, 郭富城:25]
在上述的例子中,从对象中获取指定属性,可以使用itemgetter与attrgetter来完成,分别表示按照下标,属性名获取值
if __name__ == '__main__':
import operator
ss = [
Student('黎明', 23),
Student('刘德华', 22),
Student('张学友', 24),
Student('郭富城', 25),
]
ss.sort(key=operator.attrgetter('age'))
print(ss) # [刘德华:22, 黎明:23, 张学友:24, 郭富城:25]
结果一致。