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