python中的閉包和裝飾器的使用示例
函數(shù)參數(shù)
在python中,函數(shù)可以當(dāng)作參數(shù)使用
def func01(): print("func01 is show ......") # func01() # 函數(shù)名存放的是函數(shù)所在空間的地址 # print(func01) # 函數(shù)名也可以像普通變量一樣賦值 # func02 = func01 # func02() def foo(func): func() foo(func01)
閉包的構(gòu)成條件
1.在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下
2.內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
3.外部函數(shù)返回了內(nèi)部函數(shù)
# 閉包的構(gòu)成條件: # 1在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下 def func_out(num1): def func_inner(num2): # 2內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù)) num = num1 + num2 print("num的值為", num2) # 3外部函數(shù)返回了內(nèi)部函數(shù) return func_inner # 創(chuàng)建閉包實(shí)例 f = func_out(10) # 執(zhí)行閉包 f(1) f(2)
基礎(chǔ)的閉包的使用
# 外部函數(shù) def config_name(name): # 內(nèi)部函數(shù) def say_info(info): print(name + ":" + info) return say_info tom = config_name("tom") tom("你好") tom("你在嗎") jerry = config_name("jerry") jerry("你好") jerry("我在呢") # 外部函數(shù) def config_name(name): # 內(nèi)部函數(shù) def say_info(info): print(name + ":" + info) return say_info tom = config_name("tom") tom("你好") tom("你在嗎") jerry = config_name("jerry") jerry("你好") jerry("我在呢")
nonloal關(guān)鍵字的使用
1.非局部聲明變量指代的已有標(biāo)識(shí)符是最近外面函數(shù)的已聲明變量,但是不包括全局變量。這個(gè)是很重要的,因?yàn)榻壎ǖ哪J(rèn)行為是首先搜索本地命名空間。nonlocal聲明的變量只對(duì)局部起作用,離開封裝函數(shù),那么該變量就無效。
2.非局部聲明不像全局聲明,我們必須在封裝函數(shù)前面事先聲明該變量
3.非局部聲明不能與局部范圍的聲明沖突
# 外部函數(shù) def func_out(num1): # 內(nèi)部函數(shù) # aaa = 10 def func_inner(num2): nonlocal num1 num1 = num2 + 10 print(num1) func_inner(10) print(num1) return func_inner # num1 = 10 # f = func_out(10) # 調(diào)用閉包 = 內(nèi)部函數(shù) num2 = 10 # f(10) func_out(10)
基礎(chǔ)代碼實(shí)現(xiàn)(裝飾器)
# 1.定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包) def check(fn): def inner(): print("登錄驗(yàn)證") fn() return inner # 需要被裝飾的函數(shù) def comment(): print("發(fā)表評(píng)論") # 2使用裝飾器裝飾函數(shù)(增加一個(gè)登錄功能) comment = check(comment) comment()
裝飾器的基本使用
# 1定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包) def check(fn): def inner(): print("請(qǐng)先登陸") fn() return inner # 2使用裝飾器裝飾函數(shù)(增加一個(gè)登陸功能) # 解釋器遇到@check 會(huì)立即執(zhí)行 comment = check(comment) @check def comment(): print("發(fā)表評(píng)論") comment()
裝飾器的使用
import time # 1 定義裝飾器 def get_time(fn): def inner(): start = time.time() fn() end = time.time() print("時(shí)間:", end - start) return inner # 2 裝飾函數(shù) # 要被裝飾的函數(shù) @get_time def func(): for i in range(100000): print(i) func()
有參數(shù)的裝飾器的使用
# 定義裝飾器 def logging(fn): # fn = sum_num def inner(a, b): fn(a, b) return inner # sum_num = inner # 使用裝飾器裝飾函數(shù) @logging def sum_num(a, b): result = a + b print(result) sum_num(1, 2)
帶有返回值的裝飾器
# 定義裝飾器 def logging(fn): # fn = sum_num def inner(a, b): result = fn(a, b) return result return inner # sum_num = inner # 使用裝飾器裝飾函數(shù) @logging def sum_num(a, b): result = a + b return result result = sum_num(1, 2) print(result)
帶有不定長參數(shù)的裝飾器
# 定義裝飾器 def logging(fn): # fn = sum_num def inner(*args, **kwargs): fn(*args, **kwargs) return inner # sum_num = inner # 使用裝飾器裝飾函數(shù) @logging def sum_num(*args, **kwargs): print(args, kwargs) sum_num(1, 2, 3, age="18")
帶有參數(shù)的裝飾器的使用
# 裝飾器 def logging(flag): # flag = "+" # 外部函數(shù) def decorator(fn): # 內(nèi)部函數(shù) def inner(num1, num2): # 判斷流程 if flag == "+": print("--正在努力加法計(jì)算--") elif flag == "-": print("--正在努力減法計(jì)算--") result = fn(num1, num2) return result return inner # 返回裝飾器 return decorator # 被帶有參數(shù)的裝飾器裝飾的函數(shù) @logging('+') # 1 logging("+") 2 @decorator起到裝飾器的功能了 def add(a, b): result = a + b return result # 執(zhí)行函數(shù) result = add(1, 3) print(result)
類裝飾器的使用
# 定義類裝飾器 class Check(object): def __init__(self, fn): self.__fn = fn def __call__(self, *args, **kwargs): print("登錄") self.__fn() @Check def comment(): print("發(fā)表評(píng)論") comment()
到此這篇關(guān)于python中的閉包和裝飾器的使用的文章就介紹到這了,更多相關(guān)python閉包和裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python requests爬取高德地圖數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇python requests爬取高德地圖數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11瘋狂上漲的Python 開發(fā)者應(yīng)從2.x還是3.x著手?
熱度瘋漲的 Python,開發(fā)者應(yīng)從 2.x 還是 3.x 著手?這篇文章就為大家分析一下了Python開發(fā)者應(yīng)從2.x還是3.x學(xué)起,感興趣的小伙伴們可以參考一下2017-11-11Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個(gè)隨機(jī)數(shù)的2種方法
這篇文章主要介紹了Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個(gè)隨機(jī)數(shù)的2種方法,涉及Python基于random生成隨機(jī)數(shù)的常見操作技巧,需要的朋友可以參考下2017-04-04Django實(shí)現(xiàn)在線無水印抖音視頻下載(附源碼及地址)
該項(xiàng)目功能簡單,完全復(fù)制SaveTweetVedio的項(xiàng)目。用戶觀看抖音視頻時(shí)選擇復(fù)制視頻鏈接,輸入到下載輸入欄,即可下載無水印視頻,還可掃描二維碼手機(jī)上預(yù)覽。親測成功。2021-05-05