Python学习笔记(12) -- (关键词:返回函数/闭包)
来源:互联网 发布:js 通过class获取元素 编辑:程序博客网 时间:2024/06/06 03:12
原文链接:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431835236741e42daf5af6514f1a8917b8aaadff31bf000
闭包
注意到返回的函数在其定义内部引用了局部变量args
,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()
才执行。我们来看一个例子:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fsf1, f2, f3 = count()
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
你可能认为调用f1()
,f2()
和f3()
结果应该是1
,4
,9
,但实际结果是:
>>> f1()9>>> f2()9>>> f3()9
全部都是9
!原因就在于返回的函数引用了变量i
,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i
已经变成了3
,因此最终结果为9
。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
再看看结果:
>>> f1, f2, f3 = count()>>> f1()1>>> f2()4>>> f3()9
缺点是代码较长,可利用lambda函数缩短代码。
小结
一个函数可以返回一个计算结果,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
阅读全文
0 0
- Python学习笔记(12) -- (关键词:返回函数/闭包)
- python 学习笔记 ---返回值为函数 闭包
- Python进阶学习笔记——函数式编程之返回函数&闭包
- Python教程学习简记9--Python 返回函数 闭包
- Python学习笔记之函数作为返回值、闭包的解释
- Python学习笔记之函数作为返回值、闭包的解释
- Python学习笔记-返回函数
- Python学习笔记-返回函数
- python学习笔记 返回函数
- python返回函数闭包
- Python 返回函数 闭包
- python学习笔记(六)函数返回值
- 《Python学习手册》学习笔记(16)之第16章函数基础(关键词:编程语言/Python)
- python闭包—返回函数
- 《Python学习手册》学习笔记(23)之第23章模块包(关键词:编程语言/Python/模块/模块包)
- 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
- 《Python学习手册》学习笔记(19)之第19章函数的高级话题(关键词:编程语言/Python/函数/递归函数/匿名函数)
- Python返回函数_函数闭包_lambda匿名函数
- sqrt函数实现
- 儒教与文化专制·《厚黑学全书》
- angularjs路由跳转页面后刷新报404错误
- Android开发细节——开发实战过程中遇到的细节问题与解决方案汇总
- RESTful API设计技巧经验总结
- Python学习笔记(12) -- (关键词:返回函数/闭包)
- smtp服务认证过程
- Vue.js 图片不显示 | 图片资引用 | img src 路径出错
- Kotlin: if表达式、类和继承
- 面向对象的 Javascript 编程(Udacity)
- 微信公众号接口配置信息失败 tp3.2
- SMTP错误码/建议解决方法
- 前端开发——jquery之事件委托和绑定
- 快速幂(整数)