閉包和萬能裝飾器

1.閉包
# 外層參數來自與函數名一致的調用(實參),可同時傳遞閉包外的函數的引用和其它參數多個參數(形參)

# 內層參數來自外層函數調用對象的調用(實參),同時傳遞給閉包外的對應函數以及它的調用(形參)

# 通過外層傳遞的只初始化一次,通過內層傳遞的初始化次數與調用次數一致。就跟變量在while true外面和裏面一樣


def set_func(b):
    def call_func():
        print(b)
        # f()
    return call_func


def test():
    print("t")
t = set_func("外層函數裏面的變量內層直接使用,但是是在外層函數有參數的情況下,不然閉包就失去了存在的意義")
t()
def test2():
    print("t2")
t = set_func("外層函數裏面的變量內層直接使用")
t()

2.閉包與函數的區別
# 格式上:閉包是兩層函數的嵌套
# 作用:閉包的外層一定要有參數,傳遞給內層使用(否則閉包就沒存在的意義,還不如用一層函數),外層函數返回內層函數的引用。

# 閉包:簡化函數,多次使用的抽取成外層函數的參數。


def sum1(a, b, rate):
    print((a + b)*rate)

sum1(1000, 2000, 0.6)

sum1(2000, 3000, 0.6)

sum1(500, 200, 0.6)


def set_sum(rate):
    def sum2(a, b):
        print((a + b)*rate)
    return sum2

sum2 = set_sum(0.6)
sum2(1000, 2000)

sum2(2000, 3000)

sum2(500, 200)

3.萬能裝飾器
# 萬能裝飾器,有不定長參數,有返回值
def set_fun(func):
    def call_fun(*args, **kwargs):
        check()
        return func(*args, **kwargs)
    return call_fun


@set_fun
def deco_func(*args, **kwargs):
    print("deco_func")
    print(args,kwargs)
    return "萬能裝飾器"


def check():
    print("權限認證")


print(deco_func("yeah", a=3))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章