Python 高级特性 (1)- 闭包
1. 閉包的概念
在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。閉包可以用來在一個函數與一組“私有”變量之間創建關聯關系。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。—— 維基百科
用比較通俗的話說就是,內部函數使用了外部函數的變量。或者說內部函數的局部作用域中可以訪問外部函數局部作用域中變量的行為,我們稱為: 閉包。舉個例子:
In [1]: def out(msg):...: def inner():...: print msg # 內部函數使用了外部函數的變量 msg...: return inner # 返回的是內部函數...: In [2]: fun = out("hello")In [3]: fun()
hello
2. 閉包的理解
閉包存在的意義就是它使用了外部變量,如果它不使用外部變量,它和普通的函數就沒有任何區別。同一個的函數使用不同的外部變量,就實現了不同的功能。舉個例子:
In [5]: def tag(tag_name):...: def add_content(content):...: return "<{0}>{1}</{0}>".format(tag_name, content)...: return add_content...: In [6]: content = "Hello world"In [7]: fun = tag('a')In [8]: fun(content)
Out[8]: '<a>Hello world</a>'In [9]: fun = tag('b')In [10]: fun(content)
Out[10]: '<b>Hello world</b>'
所有函數都有一個 __closure__屬性,如果這個函數是一個閉包的話,那么它返回的是一個由 cell 對象 組成的元組對象。cell 對象的cell_contents 屬性就是閉包中的自由變量。
In [16]: add_tag.__closure__
Out[16]: (<cell at 0x0000000003AFA5B8: str object at 0x0000000001CEEB48>,)In [17]: add_tag.__closure__[0].cell_contents
Out[17]: 'b'
參考鏈接
https://mp.weixin.qq.com/s?__biz=MzAwOTQ4MzY1Nw==&mid=2247485660&idx=1&sn=584d9a6035add6216ede7d05ed607774&chksm=9b5fac3aac28252cfee323bd52257b3465677eea1a9459726824afae9b1c9593cf287d895cff&mpshare=1&scene=23&srcid=0512s6cVah1breDwmj5NXfOa#rd
https://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652566413&idx=1&sn=0a45da48e1b926cf1019fb975b03596f&chksm=8464dbc7b31352d145e4b9c626527ab3516d13fbc52a89dbc51960967104e3c5554506f0350f&mpshare=1&scene=23&srcid=0406u1OlC8bcCj8qMVeQ9PiQ#rd
https://mp.weixin.qq.com/s?__biz=MzA5ODUzOTA0OQ==&mid=2651688002&idx=1&sn=29cb99b9b907daf4e9bf7f3b4b0efce7#rd
https://segmentfault.com/a/1190000007510013
https://segmentfault.com/a/1190000007321972
https://www.jianshu.com/p/bee66bab4eeb
https://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650366929&idx=1&sn=5bba7ccef04dc39f81b628429ddd08db&chksm=be9cd88589eb5193cce49a1ec3365325176fd884ac3e1cd9363786a40967b180cf54b0046922&mpshare=1&scene=23&srcid=06087b72irR1gWMhsDHToVLQ#rd
總結
以上是生活随笔為你收集整理的Python 高级特性 (1)- 闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 生成器总结
- 下一篇: Python 类—类属性(私有属性、公有