python閉包和裝飾器(超詳解)

目錄

一、閉包的概念

1.概念

2.閉包的特征

?3.閉包的作用

二、裝飾器

1.什么是裝飾器

2.裝飾器的作用

1.統計代碼耗時

2.對代碼進行權限檢查

3.記錄日志

3.閉包和裝飾器的關系

4.注意事項:




一、閉包的概念

1.概念

閉包(Closure)指一個函數捕獲并保存了其外部作用域的變量,即使外部函數已經執行完畢。閉包允許函數訪問其定義時的上下文環境,而不僅限于當前作用域。

2.閉包的特征

  • 一個函數里嵌套另一個函數
  • 內部函數引用外部函數的變量
  • 外部函數返回內部函數本身,而不是調用結果
def outer_function(x):def inner_function(y):return x + y  # 引用了外部函數的變量xreturn inner_function  # 返回內部函數對象closure = outer_function(10)
print(closure(5))  # 輸出15(10 + 5)

?3.閉包的作用

  • ??? 保留狀態:外層函數的變量不會因為函數執行完而被銷毀;
  • ??? 實現工廠函數:比如創建多個帶不同參數的函數;
  • ??? 實現裝飾器(decorators)的基礎。

二、裝飾器

1.什么是裝飾器

裝飾器是一種在閉包的基礎上,在不修改原函數代碼的基礎上,可以給函數擴展一些特定的功能,裝飾器本質也是一個函數,是一個接受函數作為參數的高階函數

2.裝飾器的作用

1.統計代碼耗時

import time
def cost_time(fun):def clac(*args):start = time.time()r = fun(*args)print(f"{fun.__name__}是{r}")end = time.time()print(f"耗時是{end - start}")return rreturn clacdef FB(i):if i == 1 or i == 2:return 1else:return FB(i-1) + FB(i - 2)def xh(n):a = 1b = 1for i in range(3,n + 1):c = a + ba = bb = cif i == n:return cdg = cost_time(xh)
FB = cost_time(FB)
FB(10)
dg(10)

2.對代碼進行權限檢查

from functools import wraps
user = None
def fun2(fun):@wraps(fun)def fun1():global userif user:fun()else:name = input("用戶名:")psd = input("密碼:")if name == 'admin' and psd == "123456":user = namefun()else:print("賬號或密碼輸入錯誤")return fun1
@fun2
def login():print("歡迎登錄")
@fun2
def shopping():print("歡迎來到購物車")def index():print("歡迎來到首頁")
login()
shopping()

3.記錄日志

from  datetime import time,datetime,date
def log(fun):def log1(*args,**kwargs):print(f"{date.today()}進行了{fun.__name__}操作,變量有{args},關鍵字有{kwargs}")result = fun(*args)print(f"{date.today()}結束了{fun.__name__}操作,返回值有{result}")return resultreturn log1
@log
def add(a,b,c):c = a + b + creturn c
add(2, 3, 4, )

3.閉包和裝飾器的關系

裝飾器依賴閉包實現,裝飾器一般用于高級應用場景,專門用于函數增強

4.注意事項:

1.多層裝飾器是按照從上到下的順序執行

2.裝飾器會覆蓋原來函數名稱,可以用function.wraps來修復

3.閉包修改外部變量需要用nonlocal聲明變量

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89289.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89289.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決hadoop常用到的問題

1.namenode無法啟動問題 報錯1. ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. 原因:不能用 root 用戶直接啟動 Hadoop 的 HDFS 組件(NameNode / DataNode / SecondaryNameNode&#xff0…

深度學習G3周:CGAN入門(生成手勢圖像)

🍨 本文為🔗365天深度學習訓練營中的學習記錄博客🍖 原作者:K同學啊 基礎任務: 1.條件生成對抗網絡(CGAN)的基本原理 2.CGAN是如何實現條件控制的 3.學習本文CGAN代碼,并跑通代碼…

流式數據處理實戰:用狀態機 + scan 優雅過濾 AI 響應中的 `<think>` 標簽

流式數據處理實戰&#xff1a;用狀態機 scan 優雅過濾 AI 響應中的 <think> 標簽 1. 引言&#xff1a;流式數據處理的挑戰 在現代 AI 應用開發中&#xff0c;流式 API&#xff08;如 OpenAI、Claude 等&#xff09;能實時返回分塊數據&#xff0c;提升用戶體驗。但流式…

【實時Linux實戰系列】硬件中斷與實時性

在實時系統中&#xff0c;硬件中斷是系統響應外部事件的關鍵機制之一。硬件中斷允許系統在執行任務時被外部事件打斷&#xff0c;從而快速響應這些事件。然而&#xff0c;中斷處理不當可能會導致系統延遲增加&#xff0c;影響系統的實時性。因此&#xff0c;優化中斷處理對于提…

基于DTLC-AEC與DTLN的輕量級實時語音降噪系統設計與實現

基于DTLC-AEC與DTLN的輕量級實時語音降噪系統設計與實現 1. 引言 在當今的實時通信應用中,語音質量是影響用戶體驗的關鍵因素之一。環境噪聲和回聲會嚴重降低語音清晰度,特別是在移動設備和嵌入式系統上。本文將詳細介紹如何將兩種先進的開源模型——DTLC-AEC(深度學習回聲…

基于Hadoop與LightFM的美妝推薦系統設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 本項目旨在基于大數據Hadoop平臺和機器學習技術&#xff0c;構建一套面向美妝…

notepad++ 多行復制拼接

如何將中文一 一復制到英文后面按住 ALT ,鼠標左鍵拖動多行選中中文Ctrl C 復制 在英文的第一行結尾處 Ctrl v 粘貼

【前沿技術動態】【AI總結】Spring Boot 4.0 預覽版深度解析:云原生時代的新里程碑

Spring Boot 4.0 預覽版深度解析&#xff1a;云原生時代的新里程碑 最低 Java 17&#xff0c;原生支持虛擬線程&#xff0c;性能提升最高800%&#xff0c;Spring Boot 4.0 帶來開發體驗與運行時性能的全面飛躍 Spring Boot 4.0 的預覽版在2025年5月底悄然上線&#xff0c;標志著…

OkHttp 框架封裝一個 HTTP 客戶端,用于調用外部服務接口

? 背景與需求 需要基于 OkHttp 框架封裝一個 HTTP 客戶端&#xff0c;用于調用外部服務接口&#xff08;如拼團回調&#xff09;&#xff0c;實現以下功能&#xff1a; 動態傳入請求地址&#xff08;URL&#xff09;支持 JSON 請求體實現類放在 infrastructure 層的 gateway…

使用Collections.max比較Map<String, Integer>中的最大值

文章目錄使用Collections.max比較Map<String, Integer>中的最大值基本方法1. 比較Map的值2. 比較Map的鍵自定義比較器1. 按值降序排列2. 復雜比較邏輯完整示例代碼性能考慮替代方案1. 使用Stream API (Java 8)2. 手動遍歷實際應用場景注意事項總結使用Collections.max比較…

鴻蒙狀態欄操作

1.鴻蒙設備基礎信息 1.1圖解 1.1窗口內容規避區域 AvoidArea7 窗口內容規避區域。 窗口內容規避區域。如系統欄區域、劉海屏區域、手勢區域、軟鍵盤區域等與窗口內容重疊時&#xff0c;需要窗口內容避讓的區域。在規避區無法響應用戶點擊事件。 除此之外還需注意規避區域的如…

Product Hunt 每日熱榜 | 2025-07-17

1. Brain MAX by ClickUp 標語&#xff1a;一款AI應用統治一切&#xff1a;你的知識 語音轉文字 介紹&#xff1a;Brain MAX 是 ClickUp 完全原生的桌面應用&#xff0c;旨在提升生產力&#xff0c;幫助你擺脫 AI 的雜亂無章。只需每月 9 美元&#xff0c;就可以使用所有的 …

如何使用VScode使用ssh連接遠程服務器不需要輸入密碼直接登錄

ssh-keygen 之后一直默認 回車 確認即可結果 (base) amaxamax:/data/std$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/amax/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:…

vue實現el-table-column中自定義label

vue實現el-table-column中自定義label<el-table-columnlabel"操作"align"left"width"50"><template #header><div><el-buttonsize"mini"type"primary"icon"el-icon-plus"circle></el-…

Vue 常用的 ESLint 規則集

對Vue項目來說&#xff0c;Vue 官方通過 eslint-plugin-vue 提供了多個規則集&#xff08;Rule Sets&#xff09;&#xff0c;適用于不同嚴格度和 Vue 版本。以下是主要的規則集及其對應的 ESLint 插件和用途&#xff1a; 1. Vue 2.x 規則集 適用于 Vue 2 項目&#xff0c;規則…

AbMole小課堂 | Angiotensin II(血管緊張素Ⅱ)在心血管研究中的多元應用

Angiotensin II&#xff08;血管緊張素Ⅱ&#xff0c;AbMole&#xff0c;M6240&#xff09;是一種血管收縮劑&#xff0c;也是腎素-血管緊張素系統 (RAS) 的主要效應肽。Angiotensin II參與動物的血壓調節、水電解質平衡等經典生理過程在科研中Angiotensin II被廣泛用于動物心血…

【Unity】Mono相關理論知識學習

一種編譯技術。優點&#xff1a;支持JIT編譯&#xff1a;在運行時將IL編譯成機器碼。首次執行稍慢&#xff0c;好處在于運行更快&#xff0c;迭代更高效。構建速度快&#xff1a;無需將IL轉成C&#xff0c;構建過程省去了IL2CPP的轉換和原生編譯步驟&#xff0c;適合開發階段快…

React源碼4 三大核心模塊之一:Schedule,scheduleUpdateOnFiber函數

scheduler工作階段在React內部被稱為schedule階段。在《React源碼3》&#xff0c;我們已經將update加入隊列并返回到了根容器節點root。function updateContainer(element, container, parentComponent, callback) {//前面略過var root enqueueUpdate(current$1, update, lane…

Unity3D + VS2022連接雷電模擬器調試

本文參考了Unity3D Profiler 連接真機和模擬器_unity 連接雷電模擬器-CSDN博客 具體步驟&#xff1a; 1、cmd打開命令窗口&#xff0c;輸入adb devices&#xff0c;確認能檢測到模擬器 示例&#xff1a;List of devices attached emulator-5554 device 2、…

學習軟件測試的第十五天

1.會寫測試用例嗎&#xff1f;測試用例有什么要素“會的&#xff0c;我寫過多個功能測試和接口測試的測試用例。我寫用例的時候會根據需求文檔或原型圖分析測試點&#xff0c;然后從正常流程、異常流程、邊界情況等方面設計測試場景。每條用例我都會包含&#xff1a;用例編號、…