1. 程式人生 > 其它 >MyBatis - PageHelper 分頁

MyBatis - PageHelper 分頁

閉包函式

1.特徵
閉:定義在函式的內部的函式
包:內部函式使用了外層函式數名空間中的名字
def outer():
    x = 99
    def inner():
        print('from outer>>>inner',x)
        
    return inner
x = 66
res =outer()
res()

閉包函式實際應用

# 閉包函式是給函式體傳參的另外一種方式
1.形參
def index(username):
    print(username)
# 函式體程式碼需要什麼就可以在形參中寫什麼 
index('jason')

2.閉包
def outer(username):
    username = 'jason'
    def index():
        print(username)
    return index
res = outer('kevin')  # 形參username與值kevin臨時繫結 >>>:outer區域性名稱空間中
res()
res1 = outer('jason')  # 形參username與值kevin臨時繫結 >>>:outer區域性名稱空間中
res1()

裝飾器簡介

"""
裝飾器並不是一個新的知識點 而是由前兩天所有集合產物
	名稱空間 函式名 閉包函式
"""
裝飾器的本質
	在不改變被裝飾物件原有的'呼叫方式'和'內部程式碼'
  的情況下給被裝飾物件新增新的功能
裝飾器的原則
	對擴充套件開放
  對修改封閉
import time
print(time.time())  # 1970年1月1日0:00開始到現在的秒數
time.sleep(3)  # 讓程式原地等待三秒
print('hello world')

import time
def index():
    time.sleep(3)
    print('from index')
'''給index函式增加了一個統計執行時間的功能'''
start_time = time.time()  # 函式執行之前獲取一個時間戳
index()
end_time = time.time()  # 函式執行之後獲取一個時間戳
print(end_time - start_time)  # 兩個時間戳的差值就是函式的執行時間

'''
1.思考:如果在很多地方都需要呼叫index 如何統計index執行時間
    在很多地方都需要執行統計index函式執行時間的程式碼
        在不同的地方需要執行相同的程式碼      >>>:       函式
    
    直接通過傳參的方式
    缺陷1:
        程式碼寫死了 無法統計其他函式的執行時間
        能否解決?
            可以!  將函式名通過形參的形式傳入
    缺陷2:
        封裝成函式之後 呼叫方式改變了 不符合裝飾器原則
        能否解決?
            不可以
'''
# def get_time(func):
#     start_time = time.time()  # 函式執行之前獲取一個時間戳
#     func()
#     end_time = time.time()  # 函式執行之後獲取一個時間戳
#     print(end_time - start_time)  # 兩個時間戳的差值就是函式的執行時間
# def home():
#     time.sleep(3)
#     print('from home')
# get_time(index)
# get_time(home)

import time
def index():
    time.sleep(1)
    print('from index')
def home():
    time.sleep(3)
    print('from home')
print(home)
def outer(func):  # 真正的index被outer區域性名稱空間儲存了
    def get_time():
        start_time = time.time()  # 函式執行之前獲取一個時間戳
        func()  # 呼叫了真正的index函式
        end_time = time.time()  # 函式執行之後獲取一個時間戳
        print(end_time - start_time)  # 兩個時間戳的差值就是函式的執行時間
    return get_time
home = outer(home)  # 狸貓換太子

進階版本裝飾器

def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func_name(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
     return get_time

完整版本裝飾器

# 解決的是返回值問題
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func_name(*args, **kwargs)  # 執行真正的index函式
        end_time = time.time()
        print(end_time - start_time)
        # return '不要急躁' # 如何在此處返回真正index函式的返回值
        return res
    return get_time

裝飾器模板

''''編寫裝飾器其實有一套固定的程式碼 不需要做任何理解'''
def outer(func_name):  # func_name用於接收被裝飾的物件(函式)
    def inner(*args, **kwargs):
        print('執行被裝飾函式之前 可以做的額外操作')
        res = func_name(*args, **kwargs)  # 執行真正的被裝飾函式
        print('執行被裝飾函式之後 可以做的額外操作')
        return res  # 返回真正函式的返回值
    return inner

裝飾器語法糖

def outer(func_name):
    def inner(*args, **kwargs):
        print('執行函式之前的操作')
        res = func_name(*args, **kwargs)
        # 額外操作
        return res
    return inner

@outer  # 等價於 index = outer(index)
def index(*args, **kwargs):
    print('from index')
# index = outer(index)  # 總感覺這一行程式碼有點low!!!

@outer  # 等價於 home = outer(home)
def home(*args,**kwargs):
    print('from home')


print(index)
print(home)

"""
語法糖內部原理
    1.使用的時候最好緊跟在被裝飾物件的上方
    2.語法糖會自動將下面緊挨著的函式名傳給@後面的函式呼叫

ps:針對之前的週末大作業 只需要單獨寫一個裝飾器 之後使用語法糖裝飾即可
"""