python的闭包要素_Python的闭包
我的理解,Python中的閉包和其他語言中的閉包一樣,都是在一個函數中返回另一個函數。def out_fun(num):
print('------1-----')
def in_fun(in_num):
print('---------2--------')
print('in_num=%d' % in_num)
return num + in_num
print('-------3--------')
return in_fun
of = out_fun(11)
print(of)
print('####################')
print(of(10))
in_fun就是函數內部函數,在函數內部再定義一個函數,并且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包。
運行的結果是:------1-----
-------3--------
.in_fun at 0xb706ed64>
####################
---------2--------
in_num=10
21
[Finished in 3.4s]內部函數對外部函數作用域里變量的引用def counter1(start=0):
count = [start]
def incr():
count[0] += 1
return count[0]
return incr
c1 = counter1(1)
print(c1())
print(c1())
print(c1())
結果:2
3
4
對于可變類型變量內部函數可以直接更改其值,但是對于不可變類型,比如int,就要用到nonlocal關鍵字用來在函數或其他作用域中使用外層(非全局)變量。def counter(start=0):
def incr():
nonlocal start
start += 1
return start
return incr
c1 = counter(5)
print(c1())
print(c1())
c2 = counter(50)
print(c2())
print(c2())6
7
51
52
一個閉包的實際例子:def line_fun(a, b):
def line(x):
return a * x + b
return line
lf1 = line_fun(2, 3)
lf2 = line_fun(5, 2)
print(lf1(3))
print(lf2(8))
這個例子中,函數line與變量a,b構成閉包。在創建閉包的時候,我們通過line_fun的參數a,b說明了這兩個變量的取值,這樣,我們就確定了函數的最終形式(y = 2x + 3和y = 5x + 2)。我們只需要變換參數a,b,就可以獲得不同的直線表達函數。由此,我們可以看到,閉包也具有提高代碼可復用性的作用。
如果沒有閉包,我們需要每次創建直線函數的時候同時說明a,b,x。這樣,我們就需要更多的參數傳遞,也減少了代碼的可移植性。
但是由于閉包引用了外部函數的局部變量,則外部函數的局部變量沒有及時釋放,消耗內存
總結
以上是生活随笔為你收集整理的python的闭包要素_Python的闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1099. Build A Binary
- 下一篇: ubuntu升级python_Ubunt