函數(shù)對(duì)象和閉包
一、函數(shù)對(duì)象
函數(shù)對(duì)象指的是函數(shù)可以被當(dāng)做“數(shù)據(jù)”來(lái)處理蹂楣,具體可以分為四個(gè)方面的使用。
1.1函數(shù)可以被引用
def? add (x,y):
???????? return x+y
func = add
func(1,2)
1.2函數(shù)可以作為容器類型的元素
dic = {“add”:add,”max”:max}
dic[“add”](1,2)
1.3函數(shù)可以作為參數(shù)傳入另外一個(gè)函數(shù)
def? foo(x,y,func):
???????? return func(x,y)
foo(1,2.add)
1.4函數(shù)的返回值可以是一個(gè)函數(shù)
def bar():
???????? return add
func = bar()
func(1,2)
二、閉包函數(shù)
2.1閉與包
基于函數(shù)對(duì)象的概念揩懒,可以將函數(shù)返回到任意位置去調(diào)用,但作用域的關(guān)系是在定義完函數(shù)時(shí)就已經(jīng)被確定了的挽封,與函數(shù)的調(diào)用位置無(wú)關(guān)已球。
???????? x=1
???????? def? f1():
?????????????????? deff2 ():
?????????????????? ? print(x)
?????????????????? returnf2
???????? deff3():
???????? ?? x = 3
???????? ?? f2 = f1()
???????? ?? f2()??#調(diào)用f1()返回函數(shù)f2,
#需要按照函數(shù)定義時(shí)的作用關(guān)系去執(zhí)行辅愿,與調(diào)用位置無(wú)關(guān)
???????? 也就是說(shuō)函數(shù)被當(dāng)做數(shù)據(jù)處理時(shí)智亮,始終以自帶的作用域?yàn)闇?zhǔn)。若內(nèi)嵌函數(shù)包含對(duì)外部函數(shù)作用域(而非全局作用域)中變量的引用点待,那么該內(nèi)嵌函數(shù)就是閉包函數(shù)阔蛉。
X = 1
def outer():
???????? x=2
???????? def inner():
?????????????????? print(x)
???????? return inner
fuc = outer()
func()?? #結(jié)果為21
“閉”代表函數(shù)是內(nèi)部的,“包”代表函數(shù)外包裹著對(duì)外層作用域的引用癞埠。在而無(wú)論在何處調(diào)用閉包函數(shù)状原,使用的仍然是包裹在其外層的變量。
2.2閉包的用途
目前為止苗踪,我們得到了兩種為函數(shù)體傳值的方式颠区,一種是直接將值以參數(shù)的形式傳入,另一種就是將值包給函數(shù)通铲。
閉包函數(shù)的這種特性有時(shí)又稱為惰性計(jì)算毕莱。