闭包和回调
閉包可以理解為用于裝飾器? 函數(shù)是寫(xiě)在函數(shù)里面的 并不是傳進(jìn)去的
回調(diào) 是作為參數(shù)傳入的 在適當(dāng)?shù)臅r(shí)候 再運(yùn)行
一、回調(diào)函數(shù)回調(diào)函數(shù)就是把函數(shù)A作為參數(shù)傳遞給另外一個(gè)函數(shù)B,并且函數(shù)b的參數(shù)能在函數(shù)A中使用。def get_min(a,b,func): #來(lái):傳來(lái)的函數(shù)func;回:我把參數(shù)回傳給你---funcresult = a if a < b else bfunc(a,b,result) #回調(diào)是用到函數(shù)的參數(shù)f() #普通調(diào)用def f():pass#回調(diào)函數(shù)一def call_back_print_en(a,b,_min):print(f"compare{a}and{b},min={_min}")#回調(diào)函數(shù)二def call_back_print_zh(a,b,_min):print(f"比較{a}and{b},min={_min}")if __name__ == '__main__':get_min(1,2,call_back_print_en)二、閉包閉包就是函數(shù)里面嵌套函數(shù),并且外層函數(shù)返回值是里面函數(shù),并且內(nèi)層函數(shù)可以使用到外層函數(shù)的變量import logging"""閉包也是一個(gè)函數(shù)需求:檢測(cè)任意函數(shù)的參數(shù)"""#用閉包實(shí)現(xiàn)def logger(func):def log_func(*args):print('ddddddd')logging.basicConfig(filename="demo.log",level=logging.INFO)logging.info(f"{func.__name__} is running,arguments is {args}")func(*args)#返回log_func 不加括號(hào)return log_func #把log_func函數(shù)的引用傳給調(diào)用logger的調(diào)用者def f1(a,b):print('aaaaa')passdef f2(x,y):print('bbbbbbb')passf1_logger = logger(f1)f2_logger = logger(f2)f1_logger(1,2)f2_logger(10,20)def outer_function(n):num = ndef inner_function():# nonlocal 一般用在嵌套函數(shù)中nonlocal num #global(全局) local(局部) nonlocal(不在本局部)num -= 1print(num)#不加括號(hào),返回inner_function()函數(shù)的函數(shù)名(即引用)return inner_function#一般情況下,函數(shù)結(jié)束,函數(shù)里面的所有局部變量都會(huì)被銷(xiāo)毀#問(wèn):函數(shù)調(diào)用結(jié)束后,我怎么才能獲得函數(shù)里面的局部變量?#答:在函數(shù)里面再定義一個(gè)函數(shù),把局部變量暴露路給外部my_func = outer_function(3)my_func()
總結(jié)
- 上一篇: python打包成exe可执行文件指定进
- 下一篇: Apriori算法通俗详解_fpgrow