在 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]
结果一致。