Python operator 標準運算符替代函數

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]

二、itemgetterattrgetter

在下面的場景中
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]

在上述的例子中,從對象中獲取指定屬性,可以使用itemgetterattrgetter來完成,分別表示按照下標,屬性名獲取值

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]

結果一致。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。