一、函數(shù)名
? 函數(shù)名是?個(gè)變量, 但它是?個(gè)特殊的變量, 與括號(hào)配合可以執(zhí)?函數(shù)的變量。
1. 函數(shù)名的內(nèi)存地址
def func(): print("呵呵") print(func) 結(jié)果: <function func at 0x1101e4ea0>
2. 函數(shù)名可以賦值給其他變量
def func(): print("呵呵") print(func) # 把函數(shù)當(dāng)成?個(gè)變量賦值給另?個(gè)變量 a = func # 函數(shù)調(diào)? func()
a()
3. 函數(shù)名可以當(dāng)做函數(shù)的參數(shù)
def func(): print("吃了么") def func2(fn): print("我是func2") fn() print("我是func2")
# 把函數(shù)func當(dāng)成參數(shù)傳遞給func2的參數(shù)fn. func2(func)
4. 函數(shù)名可以作為函數(shù)的返回值
def func_1(): print("這?是函數(shù)1") def func_2(): print("這?是函數(shù)2") print("這?是函數(shù)1")
return func_2 # 執(zhí)?函數(shù)1. 函數(shù)1返回的是函數(shù)2, 這時(shí)fn指向的就是上?函數(shù)2 fn = func_1() # 執(zhí)?上?返回的函數(shù) fn()
二、閉包
1. 定義
? 如果在一個(gè)內(nèi)部函數(shù)里,對(duì)在外部作用于(但不是在全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被認(rèn)為是閉包。
? 閉包(Closure)是詞法閉包(Lexical
Closure)的簡稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。所以,閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。
?
通俗的講就是:如果在一個(gè)內(nèi)部函數(shù)里,對(duì)在外部作用域(但不是在全局作用域)的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被認(rèn)為是閉包(closure)。它只不過是個(gè)“內(nèi)層”的函數(shù),由一個(gè)名字(變量)來指代,而這個(gè)名字(變量)對(duì)于“外層”包含它的函數(shù)而言,是本地變量。
? 閉包的主要用途:實(shí)現(xiàn)裝飾器
2. 閉包運(yùn)用
* 閉包函數(shù)必須有內(nèi)嵌函數(shù)
* 內(nèi)嵌函數(shù)需要引用該嵌套函數(shù)上一級(jí)namespace中的變量
* 閉包函數(shù)必須返回內(nèi)嵌函數(shù)
(1) 普通閉包
def func(a, b): def line(x): return a * x - b return line line = func(2, 3)
print(line(5))
(2) 修改值閉包
def func(a, b): def line(x): nonlocal a a = 3 return a * x - b return line
line = func(2, 3) print(line(5))
熱門工具 換一換