閉包函數初探
通常我們定義函數都是這樣定義的
def foo(): pass
其實在函數式編程中,函數里面還可以嵌套函數,如下面這樣
def foo(): print("hello world in foo") def bar(): print("hello world in bar")此時我們調用foo函數,執行結果會是什么樣子的呢??
hello world in foo
結果如上所示,只會執行foo函數的第一層函數,bar函數是不會被執行的。為什么呢
實際上來說,不管函數寫在哪個部分,那都只是定義了一個函數,只有這個函數被調用,函數內部的語句才會被執行
在上面的例子中,bar函數雖然在foo函數內部定義了,但是并沒有被執行,所以bar函數是不會被執行的這樣說來,定義在一個函數內部的函數就沒什么作用了嗎??其實不是這樣的。
來看下面的例子,把bar函數作為一個值返回給foo函數,來看執行過程
def foo(): print("hello world in foo") def bar(): print("hello world in bar") return barf1=foo()print(f1)此時,由于bar函數作為一個返回值被返回給了foo,所以foo函數執行結果是有返回值的
此時定義一個變量f1來接收foo函數的執行返回結果,然后打印f1
返回的結果如下
hello world in foo<function foo.<locals>.bar at 0x0000000002941A60>
可以看到首先打印了foo函數中定義的一個print語句,接著打印的是foo函數中包含的bar函數的內存地址
既然是一個函數的內存地址,當然可以加括號來執行這個函數
def foo(): print("hello world in foo") def bar(): print("hello world in bar") return barf1=foo()f1()此時,這段代碼的執行結果為:
hello world in foohello world in bar
兩個print語句都被打印出來了。
在上面的例子里,首先定義了一個函數foo,接著在foo函數內部又嵌套定義了一個函數bar,然后返回函數bar的函數名,這就是閉包函數的定義方式。
其實,閉包的定義就是一個函數內部又嵌套了一個函數
來看下面的這段代碼
def foo(): print("hello world in foo") name="python" def bar(): print(name) print("hello world in bar") return bar f1=foo() f1()在上面的例子里,在外層函數中定義了一個變量name,然后在內層函數中打印這個變量name
此時執行上面的代碼,在打印name這個變量的時候,會先在bar函數內部查找name這個變量,但是bar函數里面是沒有name這個變量的,
此時根據python查找變量的LEGB法則,會到bar函數的外面一層去繼續查找name這個變量,此時可以找到name這個變量
所以這里打印的foo函數中定義的name的值
新聞熱點
疑難解答