Python高阶函数和函数嵌套
1.高階函數: 由于python中一切皆對象,變量是對象,函數也是對象,函數也能像變量那樣進行傳遞。一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數。
函數名是函數對象的引用,即函數名也是變量,函數名后面加上()就是表示執行函數。
1)函數作為參數
def bar():print("in the bar..")def foo(func):func()print("in the foo..")foo(bar)2)返回值為函數
def bar():print("in the bar..")def foo(func):print("in the foo..")return barres = foo(bar) res()2. 函數嵌套: 在一個函數中定義了另外一個函數,當外部函數被調用的時候,內部函數都會被重新定義,如果內部函數不被返回,則外部函數執行結束后,
內部函數對象就會被銷毀。下面舉一個簡單的例子:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def test1():age = 10print(age)def test2():te = 5print(age)def test3():print(te)test3()test2()test1() # 10 10 5注:由于每次內部嵌套函數都會重新定義,所以對于頻繁使用的函數是不建議其內部定義嵌套函數的,否則效率低。
3. 閉包:
在一個外函數中定義了一個內函數,內函數里運用了外函數的臨時變量,并且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
所以閉包是既符合高階函數,又滿足嵌套函數。
一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,
如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然后自己再結束。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def outer(a):b = 10 # a 和 b 都是外函數的臨時變量def inner():a = a * 2print(a + b) # 在內函數中用到了外函數的臨時變量return inner # 外函數的返回值是內函數的引用# 調用外函數傳入參數5 # 此時外函數兩個臨時變量 a = 5 b = 10 ,并創建了內函數,然后把內函數的引用返回存給了 demo # 外函數結束的時候發現內部函數將會用到自己的臨時變量,這兩個臨時變量就不會釋放,會綁定給這個內部函數 demo = outer(5) demo() # 15 demo2 = outer(7) demo2() # 17閉包中內函數修改外函數局部變量:
-
在閉包內函數中,我們可以隨意使用外函數綁定來的臨時變量,但是如果我們想修改外函數臨時變量數值的時候發現出問題了!
-
在基本的python語法當中,一個函數可以隨意讀取全局數據,但是要修改全局數據的時候有兩種方法:
1) global 聲明全局變量,否則賦值操作是重新定義一個變量
2)全局變量是可變類型數據的時候可以修改
- 在閉包內函數也是類似的情況。在內函數中想修改閉包變量(外函數綁定給內函數的局部變量)的時候:
1)在python3中,可以用 nonlocal 關鍵字聲明一個變量, 表示這個變量不是局部變量空間的變量,需要向上一層變量空間找這個變量。
2)在python2中,沒有 nonlocal 這個關鍵字,我們可以把閉包變量改成可變類型數據進行修改,比如列表。
def outer(a):b = 10c = [a]def inner():nonlocal b # 這樣就可以修改閉包變量 b 了b += 1c[0] += 1 # 通過可變類型對象也可以實現修改print(c[0])print(b)return innerdemo = outer(5) demo() # 6 11 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Python高阶函数和函数嵌套的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 逻辑运算符
- 下一篇: python教程:封装、多态、反射