【筆記】Python基礎五
阿新 • • 發佈:2019-01-26
python基礎 嵌套 from 目標 定義 timer 增加 合格 高階函數
一,什麽是裝飾器
本質就是函數,功能是為其他函數添加附加功能
原則:
1,不修改被修飾函數的源代碼
2,不修改被修飾函數的調用方式
例子:
import time def timmer(func): def wapper(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) stop_time = time.time() print(‘函數的運行時間 %s‘ % (stop_time - start_time)) returnres return wapper @timmer #加裝飾器 def cal(l): #原函數 res = 0 time.sleep(1) for i in l: res += i return res t1 = cal(range(100)) print(t1) ‘‘‘輸出: 函數的運行時間 1.0000572204589844 4950 ‘‘‘
二,裝飾器的知識儲備
裝飾器 = 高階函數 + 函數嵌套 + 閉包
(一)高階函數
定義:
1,函數接受的參數是一個函數名
2,函數的返回值是一個函數名
3,滿足上述條件任意一個,都可稱之為高階函數
例子:高階函數
def foo(): print(‘你好啊林師傅‘) def test(func): print(func) #打印內存地址 func() #執行函數foo test(foo) #test是高階 ‘‘‘輸出: <function foo at 0x00000000022F22F0> 你好啊林師傅 ‘‘‘
例子:函數接受的參數是一個函數名,就能實現給函數增加功能的目標
def foo(): time.sleep(3) print(‘你好啊林師傅‘) def test(func): start_time = time.time() func()#執行函數foo stop_time = time.time() print(‘函數的運行時間 %s‘ % (stop_time - start_time)) test(foo) #修改了函數原來的調用方式,原來是foo() ‘‘‘輸出: 你好啊林師傅 函數的運行時間 3.000171661376953 ‘‘‘
例子:如果再加上返回值是一個函數,則能實現“不修改被修飾函數的調用方式”這一個條件
def foo(): print(‘from the foo‘) def test(func): return func # res = test(foo) # print(res) #res得到的是foo的內存地址 # res() #實際是運行foo foo = test(foo) #如果把函數的執行結果重新賦值給foo函數名 foo() #就能實現“不修改被修飾函數的調用方式”這一個條件 ‘‘‘輸出: from the foo ‘‘‘
例子:多運行一次例子,並不合格(高階函數並不能全部滿足裝飾器的需要) 1,不修改foo源代碼,2,不修改foo調用方式
def foo(): time.sleep(3) print(‘from the foo‘) def timer(func): start_time = time.time() func() #執行函數foo stop_time = time.time() print(‘函數的運行時間 %s‘ % (stop_time - start_time)) return func foo = timer(foo) foo() #又執行了一次函數foo ‘‘‘輸出: from the foo 函數的運行時間 3.007171869277954 from the foo ‘‘‘
【筆記】Python基礎五