1 Python 闭包
今天, 聊下 python 的闭包. 在函数编程中经常用到闭包.
闭包是什么, 它是怎么产生的及用来解决什么问题呢. 给出字面的定义先: 闭包是由函数及其相关的引用环境组合而成的实体(即: 闭包 = 函数 + 引用环境)(想想 Erlang 的外层函数传入一个参数 a, 内层函数依旧传入一个参数 b, 内层函数使用 a 和 b, 最后返回内层函数).
结合实例代码进行解释.
在函数式编程语言中, 函数是一等公民, 函数可以作为另一个函数的参数或返回值, 可以赋给一个变量. 函数可以嵌套定义, 即在一个函数内部可以定义另一个函数.
- In [4]: def extfunc(n):
- ...: sum = n
- ...: def intfunc():
- ...: return sum+1
- ...: return intfunc
- ...:
- ...:
- In [5]: extfunc(20)
- Out[5]: <function __main__.extfunc.<locals>.intfunc()>
- In [6]: f = extfunc(20)
- In [7]: f()
- Out[7]: 21
我们注意到一个问题: 内嵌函数 intfunc 中引用到外层函数中的局部变量 sum, 当我们调用分别由不同的参数调用 extfunc 函数时, 返回的函数是隔离的吗 ?
- In [9]: f2 = extfunc(100)
- In [10]: f2()
- Out[10]: 101
是隔离的. 也就是说, 每次调用 extfunc 函数后都将生成并保存一个新的局部变量 sum, 其实这里 extfunc 函数返回的就是闭包.
按照我们熟悉的命令式语言的规则, extfunc 函数只是返回了内嵌函数 intfunc 的地址, 在执行 intfunc 函数时将会由于在其作用域内找不到 sum 变量而出错.
而在函数式语言中, 当内嵌函数体内引用到体外的变量时, 将会把定义时涉及到的引用环境和函数体打包成一个整体 (闭包) 返回.
2 闭包注意事项
闭包中是不能修改外部作用域的局部变量的
演示代码
- In [17]: def foo():
- ...: m = 0
- ...: def intfoo():
- ...: m = 1
- ...: print(m)
- ...: print(m)
- ...: intfoo()
- ...: print(m) #不会改变
- ...:
- In [18]: foo()
- 0
- 1
- 0
更多闭包使用问题, 欢迎留言.
注意事项
01
对 Python 开发技术感兴趣的同学, 欢迎加下方的交流群一起学习, 相互讨论.
02
python 交流学习扣扣群: 975188894, 多多交流问题, 互帮互助, 群里有不错的学习教程和开发工具. 学习 python 有任何问题(学习方法, 学习效率, 如何就业), 可以随时来咨询我!
来源: http://www.jianshu.com/p/11e43cd84fcb