国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中的閉包函數

2020-02-22 23:11:09
字體:
來源:轉載
供稿:網友

閉包函數初探

通常我們定義函數都是這樣定義的

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的值

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 自贡市| 遵化市| 西充县| 兴山县| 彰武县| 海伦市| 石渠县| 竹溪县| 登封市| 沂源县| 呈贡县| 江永县| 望都县| 大同市| 吴桥县| 始兴县| 精河县| 昂仁县| 壤塘县| 汽车| 赣榆县| 克拉玛依市| 乐山市| 黔南| 萍乡市| 和林格尔县| 灵璧县| 凉山| 社会| 铁力市| 辽阳县| 鄂伦春自治旗| 宁武县| 旬阳县| 蓬安县| 盐亭县| 错那县| 北海市| 吉水县| 民县| 石林|