最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中functools 模塊的使用小結

 更新時間:2026年07月05日 14:48:10   作者:Csvn  
functools是 Python 標準庫中專門為高階函數(shù)服務的模塊,內(nèi)置了一系列用于函數(shù)式編程和裝飾器開發(fā)的實用工具,本文就來詳細的介紹一下functools 模塊,感興趣的可以了解一下

知識點簡介

functools 是 Python 標準庫中專門為高階函數(shù)服務的模塊,內(nèi)置了一系列用于函數(shù)式編程和裝飾器開發(fā)的實用工具。掌握 functools 能讓你寫出更簡潔、更 Pythonic、性能更好的代碼。本文覆蓋最常用的 4 個工具:@wraps、@lru_cache、partial@singledispatch。

核心工具詳解

1. @functools.wraps — 保留元信息的裝飾器

寫裝飾器時,被裝飾的函數(shù)會丟失原名、文檔字符串、注解等信息。@wraps 負責把這些元信息拷貝回來。

import functools

def log_call(func):
    @functools.wraps(func)  # 保留 func 的 __name__, __doc__ 等
    def wrapper(*args, **kwargs):
        print(f"調(diào)用 {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_call
def greet(name: str) -> str:
    """向某人打招呼"""
    return f"你好, {name}"

print(greet.__name__)  # greet(沒有 @wraps 會返回 wrapper)
print(greet.__doc__)   # 向某人打招呼
print(greet.__annotations__)  # {'name': <class 'str'>, 'return': <class 'str'>}

2. @functools.lru_cache — 記憶化緩存

自動緩存函數(shù)的返回值,相同參數(shù)再次調(diào)用直接返回緩存結果。適合純函數(shù)和無副作用的遞歸或計算密集型操作。

import functools
import time

@functools.lru_cache(maxsize=128)
def fib(n: int) -> int:
    """帶緩存的斐波那契數(shù)列"""
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

start = time.time()
print(fib(100))  # 354224848179261915075
print(f"耗時: {time.time() - start:.6f}s")  # 瞬間完成

# 查看緩存統(tǒng)計
print(fib.cache_info())  # CacheInfo(hits=98, misses=101, maxsize=128, currsize=101)

注意:@lru_cache 的參數(shù)必須是可哈希的。如果參數(shù)是 list、dict 等可變類型,需要先轉(zhuǎn)成 tuple 或使用 @cache(Python 3.9+)。

3. functools.partial — 偏函數(shù)凍結

固定一個函數(shù)的某些參數(shù),生成一個新函數(shù)。適用于回調(diào)、配置化場景。

import functools

def power(base: float, exp: float) -> float:
    return base ** exp

# 創(chuàng)建平方和立方偏函數(shù)
square = functools.partial(power, exp=2)
cube = functools.partial(power, exp=3)

print(square(5))   # 25
print(cube(5))     # 125

# 在排序中固定 key 函數(shù)
data = [(1, "z"), (3, "a"), (2, "m")]
sorted(data, key=functools.partial(lambda k, i: k[i], i=1))
# 按第二個元素排序: [(3, 'a'), (2, 'm'), (1, 'z')]

4. @functools.singledispatch — 單分派泛函數(shù)

根據(jù)第一個參數(shù)的類型執(zhí)行不同的函數(shù)體。替代大量 if/elif isinstance(...) 的鏈式判斷。

import functools

@functools.singledispatch
def serialize(obj):
    """將對象序列化為字符串"""
    raise TypeError(f"不支持的類型: {type(obj)}")

@serialize.register(int)
def _(obj: int) -> str:
    return f"數(shù)字: {obj}"

@serialize.register(str)
def _(obj: str) -> str:
    return f"字符串: '{obj}'"

@serialize.register(list)
def _(obj: list) -> str:
    return f"列表: {[serialize(x) for x in obj]}"

@serialize.register(dict)
def _(obj: dict) -> str:
    return f"字典: {{{', '.join(f'{k!r}: {v}' for k, v in obj.items())}}}"

# 測試
print(serialize(42))         # 數(shù)字: 42
print(serialize("hello"))    # 字符串: 'hello'
print(serialize([1, "a"]))   # 列表: ['數(shù)字: 1', "字符串: 'a'"]

綜合使用示例

import functools
import time
from typing import Any

def timer_and_cache(func=None, *, maxsize: int = 128):
    """組合了計時和緩存的裝飾器工廠"""
    def decorator(f):
        @functools.wraps(f)
        @functools.lru_cache(maxsize=maxsize)
        def wrapper(*args, **kwargs):
            start = time.perf_counter()
            result = f(*args, **kwargs)
            elapsed = time.perf_counter() - start
            print(f"{f.__name__} 耗時 {elapsed:.6f}s")
            return result
        wrapper.original = f  # 保留原始函數(shù)引用
        return wrapper
    return decorator(func) if func else decorator

@timer_and_cache
def compute(n: int) -> int:
    """模擬復雜計算"""
    time.sleep(0.5)
    return n * n

print(compute(10))   # 首次 500ms+
print(compute(10))   # 緩存命中,瞬間返回
print(compute.cache_info())  # CacheInfo(hits=1, misses=1, ...)

注意事項 / 避坑指南

  • @lru_cache 不要裝飾有副作用的方法:如果函數(shù)依賴外部狀態(tài)(文件、數(shù)據(jù)庫、全局變量),緩存會導致返回過期結果。
  • @wraps 不是萬能的:它僅拷貝 __module__、__name__、__qualname__、__annotations__、__doc__ 和 __dict__。簽名信息(inspect.signature)不會自動恢復,如需保留完整簽名配合 @decorator 庫或 inspect 手動處理。
  • partial 對象不是普通函數(shù):functools.partial 返回的對象沒有 __name__ 屬性(除非手動設置),也不支持注解。檢查類型時用 callable() 而非 isfunction()。
  • singledispatch 只對第一個參數(shù)生效:如果需要根據(jù)多個參數(shù)分派,考慮 functools.singledispatchmethod(Python 3.8+)或使用類型模式匹配(Python 3.10+)。
  • 緩存泄漏內(nèi)存:@lru_cache(maxsize=None) 會無限增長,慎用。對于預期大量不同參數(shù)調(diào)用的場景,設置合理的 maxsize 或考慮 @cache + 手動清除策略。

到此這篇關于Python中functools 模塊的使用小結的文章就介紹到這了,更多相關Python functools 模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • django中使用事務及接入支付寶支付功能

    django中使用事務及接入支付寶支付功能

    這篇文章主要介紹了django中使用事務以及接入支付寶支付功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 用matplotlib畫等高線圖詳解

    用matplotlib畫等高線圖詳解

    這篇文章主要介紹了用matplotlib畫等高線圖詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Python word2vec訓練詞向量實例分析講解

    Python word2vec訓練詞向量實例分析講解

    這篇文章主要介紹了Python word2vec訓練詞向量實例分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • PyQt彈出式對話框的常用方法及標準按鈕類型

    PyQt彈出式對話框的常用方法及標準按鈕類型

    這篇文章主要為大家詳細介紹了PyQt彈出式對話框的常用方法及標準按鈕類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python圖像增強imgaug詳解

    Python圖像增強imgaug詳解

    Imgaug 是一個開源 python 包,可讓你在機器學習實驗中增強圖像,它適用于各種增強技術,它有一個簡單而強大的界面,可以增強圖像、地標、邊界框、熱圖和分割圖,這篇文章主要介紹了Python圖像增強imgaug,需要的朋友可以參考下
    2022-11-11
  • Python進程間通信之共享內(nèi)存詳解

    Python進程間通信之共享內(nèi)存詳解

    這篇文章主要為大家詳細介紹了Python進程間通信之共享內(nèi)存的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • python dict 相同key 合并value的實例

    python dict 相同key 合并value的實例

    今天小編就為大家分享一篇python dict 相同key 合并value的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python牛刀小試密碼爆破

    Python牛刀小試密碼爆破

    用Python與vbs分別實現(xiàn)的爆破bbs論壇賬號的代碼,學習python或vbs的朋友可以參考下。
    2011-02-02
  • python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    這篇文章主要介紹了python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • python sorted()函數(shù)的key參數(shù)使用說明

    python sorted()函數(shù)的key參數(shù)使用說明

    文章介紹了Python中的sort()和sorted()方法的區(qū)別及其用法,sort()是list的方法,不能對所有可迭代對象進行排序,且在原地對列表排序,無返回值,sorted()是內(nèi)置函數(shù),可以對所有可迭代對象進行排序,并返回一個新的排序后的列表,文章還提供了sorted()的用法示例
    2025-11-11

最新評論

邹平县| 南开区| 克什克腾旗| 获嘉县| 津市市| 黑山县| 星子县| 乌苏市| 长兴县| 汤阴县| 万宁市| 永宁县| 秦皇岛市| 孝昌县| 鹤庆县| 武山县| 闸北区| 苏尼特左旗| 桂东县| 武胜县| 建昌县| 平泉县| 石嘴山市| 巴马| 甘肃省| 芒康县| 聊城市| 马山县| 古田县| 海城市| 叶城县| 浠水县| 信丰县| 交城县| 定边县| 临高县| 平凉市| 丰顺县| 中阳县| 山东省| 阳谷县|