閉包函式:在函式a內部定義另外乙個函式b,之後b作為a的返回值直接被返回。此時函式b稱為a的閉包函式。在閉包函式b中如果使用a函式中定義的變數,此時a函式中被定義的變數會被臨時儲存,直到b函式呼叫結束時該變數才會被系統收回,從而實現a中變數延遲釋放
例如global:宣告的變數屬於全域性變數,此時在使用該變數時,計算機直接到函式的最外層尋找該變數是否存在
nonlocal:宣告變數屬於非本地變數,此時計算機不會在當前變數使用的函式中尋找該變數,而是到該函式的外層尋找離該函式比較近的對應變數進行宣告
裝飾器:通過@語法直接使用定義好的函式修飾之前已經存在的函式,從而實現對原函式功能的擴充
優點:不需要修改原**,即可實現對原函式功能的擴充;利於後期**的維護
**(裝飾器本質上是乙個python函式,他可以讓其他函式在不需要做任何**變動的前提下增加額外的功能,裝飾器也是乙個函式物件。他經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同**並繼續重用)
importtime獲取絕對值:print(abs(-4))importfunctools
deflog_time(fun):
@functools.wraps(fun)
defjj(*args1,**kb):
print(time.strftime("%y-%m-%d %h:%m:%s",time.localtime()))
returnfun(*args1,**kb)
returnjj
@log_time #
now = log_time(now)
defnow(*a):
print(a)
now(19,20)
#定義乙個自帶引數的裝飾器
對應時間是:')#
等價於max_num = log('對應時間是:')fun(max_num)
defmax_num(num1,num2):
print(max(num1,num2))
max_num(2,43)
列表遍歷:
def callback(num):6.列表過濾:num **= 2
return num
list1 = [x for x in range(10)]
result = map(callback,list1)
print(list(result))#map(fun,list):map用來對列表list的遍歷操作,每一次遍歷都會自動呼叫fun函式完成對本次遍歷所得到的元素的計算,當遍歷結束後返回乙個map物件
list2 = [1,3,4,54,5,4,3,35,"sdf","dsf"]7.#偏函式li = filter(lambda x:isinstance(x,int),list2)
print(list(li))#列表過濾:filter(fun,list)用來遍歷列表list,按照給定的過濾條件,完成對滿足條件的資料儲存,不滿足條件的進行過濾(刪除)的操作。其中fun是**函式,充當過濾的條件
import functoolsint2 = functools.partial(int,base = 2)#將指定的函式和函式中預設值的引數進行繫結,生成乙個新的函式,比如吧int函式和int的預設引數base繫結生成乙個新函式int2,int2此時進行資料轉換時按二進位制進行轉換
result = int2("10101000010100")
print(result)
Python 裝飾器 ,閉包
1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...
python基礎 閉包函式和裝飾器
首先我們應該知道一件事 函式的定義域跟定義位置有關係,而跟呼叫位置沒有關係。閉包函式 定義 內層函式對外層函式而非全域性變數的引用,就叫做閉包函式 閉包會一直存在在記憶體中,不會因為函式執行結束而被釋放 先看個例子 def outer num 1 definner nonlocal num num ...
函式裝飾器和閉包
裝飾器是可呼叫的物件,其引數是另乙個函式 被裝飾的函式 裝飾器可能會處理被裝飾的函式,然後把它返回,或者將其替換成另乙個函式或可呼叫物件。裝飾器通常把函式替換成另乙個函式 defdeco func definner print running inner return inner deco def ...