若是看完這篇文章,你仍是弄不明白閉包;
你來找我,我保證不打你,我給你發100的大紅包。閉包
閉包要點:ide
函數內部定義函數
內部函數引用外部變量
函數返回值爲內置函數函數
例如:定義兩個函數實現10進制與16進制轉換code
基本代碼實現:ip
def strToHex(s): return int(s, 16) def strToInt(s): return int(s, 10) print(strToHex('10')) print(strToInt('20'))
結果:16,20字符串
def strToHex(s): s = s.strip() return int(s, 16) def strToInt(s): s = s.strip() return int(s, 10) print(strToHex(' 10')) print(strToInt('20 '))
結果:16.20it
若是還有其餘需求,咱們須要改屢次,換個思路。class
def strToN(n): def func(s): s = s.strip() return int(s, n) return func strToInt = strToN(10) strToHex = strToN(16) print(strToInt(' 10 ')) print(strToInt(' 16 '))
分析:基礎
1.strToN(n):返回內置函數func;
2.strToInt指向func函數;
3.內置函數func中的n是外部變量,爲10,16等值;
4.strToInt調用就是對func調用變量
n對於strToN是局部變量,當strToN調用結束後,理論上就會被釋放;
n對於func是外部變量,strToInt指向func函數,因此func函數不會釋放,n就被做爲外部半兩存儲到了func中
來驗證:
def strToN(n): def func(s): s = s.strip() print('in func locals():',locals()) return int(s, n) return func strToInt = strToN(10) strToHex = strToN(16) print(strToInt(' 10 '))
結果:
in func locals(): {'s': '10', 'n': 10} 10
函數有一個屬性:closure,用於存放外置變量
def strToN(n): def func(s): s = s.strip() #地址,16進製表示 print('id(n):0x%X'%id(n)) print('in func locals():',locals()) return int(s, n) return func strToInt = strToN(10) print(strToInt(' 10 ')) print(strToInt.__closure__)
結果:
id(n):0x7FFE9CB6A2B0 in func locals(): {'s': '10', 'n': 10} 10 (<cell at 0x0000014F5935ED98: int object at 0x00007FFE9CB6A2B0>,)
能夠看到:id(n)與strToInt.closure相同:0x7FFE9CB6A2B0
閉包要點:
1.函數內部定義函數2.函數返回值爲函數3.內置函數引用外部變量