一:函數名解析閉包
首先,咱們定義一個函數,分別打印他們函數和變量名app
def func(): print(111) print(func()) print(func) print(())
打印結果:函數
解讀:首先打印111,是由於執行了func()這個函數。測試
其次打印的是空,none,是由於函數沒有返回值。spa
在次打印得是函數名內存地址,由於定義函數自己就是一個變量。內存
最後打印()是由於裏面沒有東西,放什麼打印什麼for循環
2 函數名能夠賦值。變量
def func(): print(111) def func1(): print(222) def func2(): print(333) f=func x=func1 y=func2 f() x() y() l1=[f(),x(),y()] for i in l1: print(i)
打印結果:循環
解讀:引用
第一次先打印111,222,333是由於函數調用結果
第二次打印此結果是由於for循環打開這個函數,上面分別調用而成。
第三次打印是none是由於函數沒有返回值,打印這個函數,就是none。
函數名練習2
def func2(): print(111) def func3(x): print(222) x() func3(func2)
執行結果:222,111
解讀:func3(fuc2)將func2傳值給x,打印222,x()執行上面func2函數,打印111
練習3
def func2(): print(222) def func3(x): print(a) # func2() return a a = 3 ret = func3(a) print(ret)
打印結果:3,3
解析:沒通過func2函數,因此不執行222
def func2(): print(222) def func3(x): # print(x) # func2() return x f = func2 f() ret = func3(func2) # x func2 ret() func3(func2)()
打印結果:222,222,222
第一個打印222,f()調用執行了一次。
第二次打印 return x給了fun3(fun2) 而x=func2 ret接收這個x ret()就是print222
第三次func3(func2)() 就至關於x() 也就是又打印了一遍222
二:閉包函數
內部函數引用外部函數(非全局變量)的變量
def func(): x=1 def func1(): print(x) func1() print( func1.__closure__) func()
測試是否是閉包函數的方法
函數名.__closure__,而後打印出來包含cell就是閉包
以下圖就不是一個閉包,由於是全局變量,打印結果是1,NONE,none就說明不是一個閉包。
閉包陷阱
# 在外層函數的內部,執行inner() # return inner def wrapper(): def inner(): print(666) return inner # wrapper() # inner wrapper()()
執行過程是什麼?
首先在內存開闢一個臨時空間將wrapper函數存儲裏面,而後wrapper()開始執行函數,返回inner,給最後,此時inner=wrapper(),後面加上(),開始執行inner裏面函數,打印666,此時結束。
爲何不是閉包,由於沒有傳值,返回值顯示none,內部不沒有調用外部的值,談什麼閉包。
def wrapper(): def i(): def inner(): print(666) print(inner.__closure__) return inner return i # wrapper() # inner wrapper()()