Python 高级特性 (1)- 闭包
1. 閉包的概念
在一些語言中,在函數(shù)中可以(嵌套)定義另一個(gè)函數(shù)時(shí),如果內(nèi)部的函數(shù)引用了外部的函數(shù)的變量,則可能產(chǎn)生閉包。閉包可以用來在一個(gè)函數(shù)與一組“私有”變量之間創(chuàng)建關(guān)聯(lián)關(guān)系。在給定函數(shù)被多次調(diào)用的過程中,這些私有變量能夠保持其持久性。—— 維基百科
用比較通俗的話說就是,內(nèi)部函數(shù)使用了外部函數(shù)的變量。或者說內(nèi)部函數(shù)的局部作用域中可以訪問外部函數(shù)局部作用域中變量的行為,我們稱為: 閉包。舉個(gè)例子:
In [1]: def out(msg):...: def inner():...: print msg # 內(nèi)部函數(shù)使用了外部函數(shù)的變量 msg...: return inner # 返回的是內(nèi)部函數(shù)...: In [2]: fun = out("hello")In [3]: fun()
hello
2. 閉包的理解
閉包存在的意義就是它使用了外部變量,如果它不使用外部變量,它和普通的函數(shù)就沒有任何區(qū)別。同一個(gè)的函數(shù)使用不同的外部變量,就實(shí)現(xiàn)了不同的功能。舉個(gè)例子:
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>'
所有函數(shù)都有一個(gè) __closure__屬性,如果這個(gè)函數(shù)是一個(gè)閉包的話,那么它返回的是一個(gè)由 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
總結(jié)
以上是生活随笔為你收集整理的Python 高级特性 (1)- 闭包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 生成器总结
- 下一篇: Python 类—类属性(私有属性、公有