【python】閉包和裝飾器

前置知識:

  1. 函數的本質就是變量名
  2. 可以把函數作為參數傳遞,例如:
def func():print("我是func")# 接收的fn是個函數
def handle(fn):
# 調用函數fn()handle(func)
  1. 可以把函數作為返回值返回,例如
def func():def func2():print("我是func2")# func2函數作為返回值return func2fn = func()
fn()

閉包

閉包:內層函數對外層函數的變量的使用
作用1:讓一個變量被外部訪問,但是不能修改
作用2:讓一個變量常駐內存

def func():a = 10def inner():print(a)return areturn inner# 函數外部訪問到了變量a
fn = func()
fn()

裝飾器

本質: 裝飾器的本質就是一個函數,該函數的參數是被裝飾的函數,返回值是裝飾后的函數
作用: 裝飾器可以在不改變原有代碼的基礎上,給函數添加新的功能

一、裝飾器雛形(理解)

裝飾器雛形

def wrapper(fn):def inner():print("執行被裝飾函數之前")fn()print("執行被裝飾函數之后")return innerdef add():print("我是add")# 向wrapper函數傳入了add函數,返回的函數命名為add
add = wrapper(add) # 裝飾器的關鍵語句!!!
add() # 這里執行add()相當于執行inner(),因為wrapper返回的是inner函數

裝飾器雛形用語法糖的形式寫

def wrapper(fn):def inner():print("執行被裝飾函數之前")fn()print("執行被裝飾函數之后")return inner@wrapper    # 用語法糖/裝飾器的寫法應該這么寫,等價于執行add = wrapper(add)
def add():print("我是add")add() # 這里執行add()相當于執行inner(),因為wrapper返回的是inner函數

二 、通用裝飾器(重點記住)

通用裝飾器的固定寫法如下:
(wrapper、inner、fn都是可以隨意命名的,并非固定的)

def wrapper(fn):# *args和**kwargs用于接受被裝飾函數的參數def inner(*args, **kwargs):"""在被裝飾函數之前執行的操作"""# 注意:這里的*和**是將args和**kwargs打散傳遞給fn函數ret = fn(*args, **kwargs) # 被裝飾函數"""在被裝飾函數之后執行的操作"""return ret   # 處理被裝飾函數的返回值return inner

三、高階裝飾器(理解)

即同一個函數被多個裝飾器裝飾

四、帶參數的裝飾器(理解)

舉例:

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

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

相關文章

CPU的三大調度

計算機系統中的調度可以分為不同層次,包括作業調度、內存調度和進程調度。這三種調度分別負責管理和優化計算機系統中不同層次的資源分配和執行順序。 高級調度:作業調度(Job Scheduling): 作業調度是指對提交到計算…

了解c++11中的新增

一,統一的初始化列表 在引入c11后,我們得出計劃都可以用初始化列表進行初始化。 C11 擴大了用大括號括起的列表 ( 初始化列表 ) 的使用范圍,使其可用于所有的內置類型和用戶自 定義的類型, 使用初始化列表時,可添加等…

Vue學習計劃-Vue2--VueCLi(二)vuecli腳手架創建的項目內部主要文件分析

1. 文件分析 1. 補充: 什么叫單文件組件? 一個文件中只有一個組件 vue-cli創建的項目中,.vue的文件都是單文件組件,例如App.vue 2. 進入分析 1. package.json: 項目依賴配置文件: 如圖,我們說主要的屬性…

性能測試經典面試題(帶答案)!

概述一下性能測試流程? 1.分析性能需求。挑選用戶使用最頻繁的場景來測試。確定性能指標,比如:事務通過率 為100%,TOP99%是5秒,最大并發用戶為1000人,CPU和內存的使用率在70%以下2.制定性能測試計劃&…

Ubuntu20.04使用cephadm部署ceph集群

文章目錄 Requirements環境安裝Cephadm部署Ceph單機集群引導(bootstrap)建立新集群 管理OSD列出可用的OSD設備部署OSD刪除OSD 管理主機列出主機信息添加主機到集群從集群中刪除主機 部署Ceph集群 Cephadm通過在單個主機上創建一個Ceph單機集群&#xff0…

游戲開發庫

整理了38個Python游戲開發庫 https://zhuanlan.zhihu.com/p/505095419 https://zhuanlan.zhihu.com/p/262012936 2023 年最佳游戲引擎推薦 https://zhuanlan.zhihu.com/p/624771157 十大開源游戲引擎深入比較之美 https://blog.51cto.com/u_15273495/2915535 panda3d https:…

【EI會議征稿中】第三屆網絡安全、人工智能與數字經濟國際學術會議(CSAIDE 2024)

第三屆網絡安全、人工智能與數字經濟國際學術會議(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二屆網絡安全、人工智能與數字經濟國際學術會議(CSAIDE 2023&…

Verilog基礎:寄存器輸出的兩種風格

相關文章 Verilog基礎https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 Verilog中的寄存器操作一般指的是那些對時鐘沿敏感而且使用非阻塞賦值的操作。例如狀態機中的狀態轉移,實際上就是一種寄存器操作,因為這相…

聽GPT 講Rust源代碼--src/tools(10)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs 在Rust源代碼中,rust-analyzer是一個Rust語言的IDE插件和代碼分析器。其中,generate_is_empty_from_len.rs是rust-analyzer中的一個處理程序&#x…

終于有人把tcp、http、rpc和grpc總結完整了

隨著微服務的迅速發展,各大互聯網企業也投入到微服務的?使用種。微服務最大的特點是,跨進程、跨服務、跨語言之間的調用,使得我們能夠像調用本地類、函數一樣。當微服務具備該特點,將我們復雜的業務拆分成不同的服務,…

CentOS7安裝Docker,DockerCompose

安裝docker 1、卸載docker 查看是否有舊版本docker docker info首先檢測我們虛擬機是否已經安裝過Docker,如果安裝則需卸載。代碼中“\”符號為換行符,相當于一行內容分為多行,這是檢測docker的各種組件 yum remove docker \docker-clien…

VGG模型

概念: CNN感受野 在卷積神經網絡中,決定某一層輸出結果中的一個元素所對應的輸入層的區域大小,被稱作感受野(receptive field)。通俗的解釋是,輸出feature map上的一個單元對應輸入層上的區域大小。 VGG…

協同過濾算法springboot+java+ssm高校圖書館圖書借閱管理系統k32vr

課題主要分為四大模塊:即管理員模塊,員工模塊,教師模塊和學生模塊,主要功能包括:首頁,個人中心,員工管理,學生管理,教師管理,圖書分類管理,圖書信…

wsl2 ubuntu上搭建OpenIM

文檔 踩坑 版本要選擇好,不要直接main來跑,目前版本OpenIMServer 有release-v3.3和release-v3.4,對應Chat版本的release-v1.4和release-v1.4。但我跑3.4是有問題的,切到3.3可以跑通。export OPENIM_IP"http://ip:10002"…

HNU計算機結構體系-實驗2:CPU動態指令調度Tomasulo

文章目錄 實驗2 CPU動態指令調度Tomasulo一、實驗目的二、實驗說明三、實驗內容問題1:問題2:問題3:問題4:問題5: 四、思考題問題1:問題2: 五、實驗總結 實驗2 CPU動態指令調度Tomasulo 一、實驗…

【數據挖掘】國科大蘇桂平老師數據庫新技術課程作業 —— 第三次作業

part 1 設計一個學籍管理小系統。系統包含以下信息: 學號、學生姓名、性別、出生日、學生所在系名、學生所在系號、課程名、課程號、課程類型(必修、選修、任選)、學分、任課教師姓名、教師編號、教師職稱、教師所屬系名、系號、學生所選課…

汽車網絡安全--ISO\SAE 21434解析(一)

目錄 1.標準總覽 2.示例分析 2015年美國黑帽大會,知名網絡安全專家Charlie Miller和Chris Valasek詳細描述了他們是如何在有限距離下通過WiFI入侵到Jeep大切諾基的中控系統,從此關于汽車網絡安全的討論拉開了序幕。 2016 年,ISO 道路車輛技術委員會與 SAE 聯合成立 SC32/…

【算法每日一練]-結構優化(保姆級教程 篇5 樹狀數組)POJ3067日本 #POJ3321蘋果樹 #POJ2352星星

目錄 今天知識點 求交點轉化求逆序對,每次操作都維護一個y點的前綴和 樹的變動轉化成一維數組的變動,利用時間戳將節點轉化成區間 先將y排序,然后每加入一個就點更新求一次前綴和 POJ3067:日本 思路: POJ3321蘋…

案例063:基于微信小程序的傳染病防控宣傳系統

文末獲取源碼 開發語言:Java 框架:springboot JDK版本:JDK1.8 數據庫:mysql 5.7 開發軟件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序開發軟件:HBuilder …

leetcode系列:反轉鏈表的形象表示

反轉鏈表是一道比較簡單的題,主要考察的是對鏈表數據結構的理解和雙指針應用,比較容易出錯的地方是指針的移動順序。在練習的過程中想到了一個比較形象的表示方法,于是記錄下來。 # Definition for singly-linked list. # class ListNode: #…