一、閉包
1、函數(shù)嵌套
f1函數(shù)內(nèi)又定義了一個(gè)f2函數(shù),我們調(diào)用f1函數(shù),f1函數(shù)內(nèi)部又調(diào)用了f2函數(shù),這就叫函數(shù)的嵌套
def f1():
print("f1外層函數(shù)")
def f2():
print("f2內(nèi)層函數(shù)")
return f2()
f1()
'''
f1外層函數(shù)
f2內(nèi)層函數(shù)
'''
函數(shù)名即變量(一個(gè)名字對(duì)應(yīng)一個(gè)內(nèi)存地址)
函數(shù)名: 即變量名
函數(shù)名(): 即函數(shù)執(zhí)行
2、閉包
函數(shù)嵌套時(shí)。外層函數(shù)返回內(nèi)層函數(shù)的函數(shù)名,這種情況叫閉包
def f1():
print("f1外層函數(shù)")
def f2():
return 5
return f2
a = f1() # a==>f2
print("a的執(zhí)行結(jié)果:", a())
'''
運(yùn)行結(jié)果:
f1外層函數(shù)
a的執(zhí)行結(jié)果: 5
'''
3、帶參數(shù)的情況
def f1(num1):
print(num1)
def f2(num2):
res = num1 + num2
print(res)
return f2
a = f1(6) # 6
a(8) # 14
4、總結(jié)
- 函數(shù)內(nèi)的變量,函數(shù)外部訪問(wèn)不了
- 閉包是概念,不是某種函數(shù)類型,這是一種特殊的函數(shù)調(diào)用
- 閉包可以得到外層函數(shù)的局部變量,是函數(shù)內(nèi)部和外部溝通的橋梁
二、裝飾器
裝飾器其實(shí)就是一個(gè)閉包,把一個(gè)函數(shù)當(dāng)做參數(shù)然后返回一個(gè)替代版函數(shù)
1、不帶參數(shù)的單層裝飾器
def outer(func):
def inner():
print("在原有功能前增加新功能")
r = func()
print("在原有功能后增加新功能")
return r
return inner()
# @outer表示
# 1、執(zhí)行outer函數(shù),并將下方的函數(shù)名作為參數(shù)賦值給outer函數(shù)
# 2、將outer函數(shù)的返回值重新賦值給下方的函數(shù)
@outer
def f1():
print("原功能模塊")
def f2():
print("f2")
#.......
def fn():
print("fn")
運(yùn)行結(jié)果:

運(yùn)行結(jié)果
2、多層裝飾同一個(gè)函數(shù)
def outer_1(func):
def inner(*args, **kwargs):
print("在原有功能前增加新功能1")
r = func(*args, **kwargs)
print("在原有功能后增加新功能1")
return r
return inner
def outer(func):
def inner(*args, **kwargs):
print("在原有功能前增加新功能")
r = func(*args, **kwargs)
print("在原有功能后增加新功能")
return r
return inner
@outer_1
@outer
def fn(a, b, c):
print(a + b + c)
fn(1, 2, 3)
運(yùn)行結(jié)果:

運(yùn)行結(jié)果
3、練習(xí)
定義一個(gè)函數(shù),能夠輸入字典和元組,函數(shù)返回一個(gè)字典和元組,字典的value值和元組的值交換。
- 面向過(guò)程編程
tu = {"vae", 32, 180}
di = {"name":"hh", "age":18, "height":190}
print(tuple(di.values())) # ('hh', 18, 190)
# 配對(duì)
print(dict(zip(di.keys(), tu))) # {'name': 'vae', 'age': 32, 'height': 180}
- 函數(shù)式編程:便于我們隨時(shí)調(diào)用,減少代碼的重復(fù)性
def func(a, b):
print(tuple(b.values())) # ('hh', 18, 190)
# 配對(duì)
print(dict(zip(b.keys(), a))) # {'name': 'vae', 'age': 32, 'height': 180}
func(tu, di)