Functools模塊:讓Python編程更高效
不知道小伙伴們?cè)赑ython編程中,我們經(jīng)常會(huì)遇到一些需要反復(fù)使用的代碼片段,例如裝飾器、高階函數(shù)等。為了提高代碼的復(fù)用性和可讀性,Python提供了functools模塊。functools模塊包含了許多實(shí)用的功能,可以幫助我們更好地編寫(xiě)和優(yōu)化Python代碼。本文將詳細(xì)介紹functools模塊的主要功能,并通過(guò)實(shí)例演示如何使用這些功能來(lái)提高我們的編程效率。
functools 是 Python 的一個(gè)內(nèi)置模塊,提供了一些方便的函數(shù)工具。下面是 functools 模塊中其中一些常用函數(shù)的詳細(xì)使用:
functools.partial
用于給一個(gè)已有函數(shù)設(shè)定默認(rèn)參數(shù),返回一個(gè)新函數(shù)。新函數(shù)的調(diào)用方式與原有函數(shù)調(diào)用方式相同,所以它非常適合做一些常規(guī)參數(shù)設(shè)置,來(lái)減少代碼中的重復(fù)部分。舉例來(lái)說(shuō),假設(shè)我們有一個(gè)計(jì)算平方的函數(shù),我們想設(shè)定它的默認(rèn)參數(shù)為 2,可以使用如下代碼:
import functools
def square(base, power):
return base ** power
square_2 = `functools.partial(square, power=2)
print(square_2(4))
# 輸出16
functools.reduce
該函數(shù)用于對(duì)一個(gè)序列中的項(xiàng)進(jìn)行使用累計(jì)函數(shù)進(jìn)行合并,最終得到一個(gè)單一的結(jié)果。例如,我們要對(duì)一個(gè)序列中的所有數(shù)字進(jìn)行求和,可以使用下面的代碼:
import functools
def addition(a, b):
return a+b
numbers = [1, 2, 3, 4, 5]
print(`functools`.reduce(addition, numbers)) # 輸出 15
functools.lru_cache:
該函數(shù)可以為函數(shù)添加一個(gè) LRU 緩存,最近最少使用緩存,以提高函數(shù)調(diào)用效率。所以在需要重復(fù)調(diào)用、計(jì)算,但返回值較為穩(wěn)定的函數(shù)中使用該裝飾器后,可大幅提高程序執(zhí)行效率。
import functools
@functools.lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
functools.wraps:
該函數(shù)可以將一個(gè)函數(shù)的元數(shù)據(jù),如 docstring, name, module, annotations 等,拷貝到被裝飾函數(shù)中。
import functools
def my_decorator(func):
@`functools`.wraps(func)
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__}")
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""Greet someone by name."""
print(f"Hello, {name}!")
print(greet.__name__) # 輸出 greet
print(greet.__doc__) # 輸出 Greet someone by name.
functools.cached_property
緩存一個(gè)對(duì)象的屬性值。當(dāng)屬性訪問(wèn)時(shí),如果值不存在,則調(diào)用指定的方法獲取該值,并將其存儲(chǔ)在對(duì)象實(shí)例中,下一次訪問(wèn)時(shí)可以直接返回存儲(chǔ)在對(duì)象中的值,而不需要重新計(jì)算。
import functools
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
@functools.cached_property
def my_property(self):
print("Calculating my_property")
return self.x + self.y
obj = MyClass(1, 2)
print(obj.my_property) # 輸出 3
print(obj.my_property) # 輸出 3,不再計(jì)算
functools.singledispatch
實(shí)現(xiàn)基于參數(shù)類型的多態(tài)功能。可以使用 singledispatch 修飾默認(rèn)方法,從而實(shí)現(xiàn)函數(shù)在不同參數(shù)下的不同行為。
import functools
@functools.singledispatch
def calculate_area(shape):
raise NotImplementedError(f"Unsupported shape: {shape!r}")
@calculate_area.register
def _(rectangle):
return rectangle.width * rectangle.height
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
rec = Rectangle(3, 4)
print(calculate_area(rec)) # 輸出 12
除了上述常用函數(shù)外,還有其他一些有用的函數(shù),如 functools.partialmethod、``functools.total_ordering等,它們均可以幫助開(kāi)發(fā)者更加方便地編寫(xiě)出更高效、更易維護(hù)的Python` 代碼。
總結(jié)
通過(guò)本文的學(xué)習(xí),我們了解了functools模塊的主要功能,包括偏函數(shù)、裝飾器、緩存、組合等。這些功能可以幫助我們更好地編寫(xiě)和優(yōu)化Python代碼,提高編程效率。作為Python開(kāi)發(fā)者,我們應(yīng)該充分利用functools模塊,將其融入到我們的編程實(shí)踐中,從而編寫(xiě)出更加簡(jiǎn)潔、高效的代碼。