Python基础教程:高阶函数和函数嵌套
1.高階函數(shù):
由于python中一切皆對(duì)象,變量是對(duì)象,函數(shù)也是對(duì)象,函數(shù)也能像變量那樣進(jìn)行傳遞。一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù)(若返回值為該函數(shù)本身,則為遞歸),滿足其一則為高階函數(shù)。
函數(shù)名是函數(shù)對(duì)象的引用,即函數(shù)名也是變量,函數(shù)名后面加上()就是表示執(zhí)行函數(shù)。
1)函數(shù)作為參數(shù)
def bar():print("in the bar..")def foo(func):func()print("in the foo..")foo(bar)2)返回值為函數(shù)
''' Python學(xué)習(xí)交流,免費(fèi)公開(kāi)課,免費(fèi)資料, 免費(fèi)答疑,系統(tǒng)學(xué)習(xí)加QQ群:579817333 ''' def bar():print("in the bar..")def foo(func):print("in the foo..")return barres = foo(bar) res()2.函數(shù)嵌套:
在一個(gè)函數(shù)中定義了另外一個(gè)函數(shù),當(dāng)外部函數(shù)被調(diào)用的時(shí)候,內(nèi)部函數(shù)都會(huì)被重新定義,如果內(nèi)部函數(shù)不被返回,則外部函數(shù)執(zhí)行結(jié)束后,內(nèi)部函數(shù)對(duì)象就會(huì)被銷毀。
下面舉一個(gè)簡(jiǎn)單的例子:
def test1():age = 10print(age)def test2():te = 5print(age)def test3():print(te)test3()test2()test1() # 10 10 5注:由于每次內(nèi)部嵌套函數(shù)都會(huì)重新定義,所以對(duì)于頻繁使用的函數(shù)是不建議其內(nèi)部定義嵌套函數(shù)的,否則效率低。
3.閉包:
在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包。
所以閉包是既符合高階函數(shù),又滿足嵌套函數(shù)。
一般情況下,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉,還給內(nèi)存,局部變量都會(huì)消失。但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來(lái)會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。
''' Python學(xué)習(xí)交流,免費(fèi)公開(kāi)課,免費(fèi)資料, 免費(fèi)答疑,系統(tǒng)學(xué)習(xí)加QQ群:579817333 ''' def outer(a):b = 10 # a 和 b 都是外函數(shù)的臨時(shí)變量def inner():a = a * 2print(a + b) # 在內(nèi)函數(shù)中用到了外函數(shù)的臨時(shí)變量return inner # 外函數(shù)的返回值是內(nèi)函數(shù)的引用# 調(diào)用外函數(shù)傳入?yún)?shù)5 # 此時(shí)外函數(shù)兩個(gè)臨時(shí)變量 a = 5 b = 10 ,并創(chuàng)建了內(nèi)函數(shù),然后把內(nèi)函數(shù)的引用返回存給了 demo # 外函數(shù)結(jié)束的時(shí)候發(fā)現(xiàn)內(nèi)部函數(shù)將會(huì)用到自己的臨時(shí)變量,這兩個(gè)臨時(shí)變量就不會(huì)釋放,會(huì)綁定給這個(gè)內(nèi)部函數(shù) demo = outer(5) demo() # 15 demo2 = outer(7) demo2() # 17閉包中內(nèi)函數(shù)修改外函數(shù)局部變量:
-
在閉包內(nèi)函數(shù)中,我們可以隨意使用外函數(shù)綁定來(lái)的臨時(shí)變量,但是如果我們想修改外函數(shù)臨時(shí)變量數(shù)值的時(shí)候發(fā)現(xiàn)出問(wèn)題了!
-
在基本的python語(yǔ)法當(dāng)中,一個(gè)函數(shù)可以隨意讀取全局?jǐn)?shù)據(jù),但是要修改全局?jǐn)?shù)據(jù)的時(shí)候有兩種方法:
1) global 聲明全局變量,否則賦值操作是重新定義一個(gè)變量
2)全局變量是可變類型數(shù)據(jù)的時(shí)候可以修改 -
在閉包內(nèi)函數(shù)也是類似的情況。在內(nèi)函數(shù)中想修改閉包變量(外函數(shù)綁定給內(nèi)函數(shù)的局部變量)的時(shí)候:
1)在python3中,可以用 nonlocal 關(guān)鍵字聲明一個(gè)變量, 表示這個(gè)變量不是局部變量空間的變量,需要向上一層變量空間找這個(gè)變量。
2)在python2中,沒(méi)有 nonlocal 這個(gè)關(guān)鍵字,我們可以把閉包變量改成可變類型數(shù)據(jù)進(jìn)行修改,比如列表。
總結(jié)
以上是生活随笔為你收集整理的Python基础教程:高阶函数和函数嵌套的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python基础教程:默认参数和可变参数
- 下一篇: Python基础教程:七种运算符