1. 程式人生 > >【筆記】Python基礎五

【筆記】Python基礎五

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))
        return
res 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基礎五