python筆記23_閉包

主要內容:

  • 小目標:理解閉包
  • 主要內容:閉包原理,閉包應用

若是看完這篇文章,你仍是弄不明白閉包;
你來找我,我保證不打你,我給你發100的大紅包。閉包

1. 閉包

  • 閉包:函數內部定義函數,內部函數使用外部變量
  • 閉包要點:ide

    函數內部定義函數
    內部函數引用外部變量
    函數返回值爲內置函數函數

  • 閉包場景:代碼封裝複用,裝飾器基礎

2. 案例:將數字字符串轉成N進制:

例如:定義兩個函數實現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

3. 閉包實現

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調用變量

4 一個問題:func函數中的n?

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

5. closure屬性

函數有一個屬性: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.內置函數引用外部變量

相關文章
相關標籤/搜索