1. 程式人生 > >python 閉包

python 閉包

python3 style pre 最終 變參 ng- con 結果 pan

閉包概念

在函數內部再定義一個函數,並且這個函數用到了外邊函數的變量,那麽將這個函數以及用到的一些變量稱之為閉包,最終外部函數返回的結果為內部函數
In [33]: def te(number):
    ...:     def te_in(number_in):
    ...:         return number + number_in
    ...:     return te_in
    ...:

In [34]: ret = te(20)

In [35]: print(ret)
<function te.<locals>.te_in at 0x04563738>

In [
36]: ret(100) Out[36]: 120 In [37]: te(20)(500) Out[37]: 520

閉包優缺點

1.閉包似優化了變量,原來需要類對象完成的工作,閉包也可以完成
2.由於閉包引用了外部函數的局部變量,則外部函數的局部變量沒有及時釋放,消耗內存

python3 內部函數改變外部參數值

In [38]: def cont(start=0):
    ...:     def incr():
    ...:         nonlocal start
    ...:         start += 1
    ...:         return start
    ...:     return incr
    ...:

In [40]: cont(5)
Out[40]: <function __main__.cont.<locals>.incr>

In [41]: c1 =cont(5)

In [42]: print(c1)
<function cont.<locals>.incr at 0x04576CD8>

In [43]: print(c1())
6  

python2 中要想在閉包中改變參數的值,要借助於可變類型的列表,將參數放在列表的中,對列表內部元素執行改變操作

def counter(start=0):
    count=[start]
    def incr():
        count[0] += 1
        return count[0]
    return incr

c1 = counter(5)
print(c1())#6
print(c1())#7
c2 = counter(100)
print(c2())#101
print(c2())#102

python 閉包