Python连载18-closure闭包解释及其注意点
2024-08-31 16:09:20
一、闭包
1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。
2.例子:连载17中的myF4就是一个典型的例子。
3.闭包常见的坑
def count(): #定义列表 fs = [] for i in range(1,4): def f(): return i*i fs.append(f) #按照我们的预期,应该是fs=[f,f,f].其中f中一次包含1,4,9,这样才对,但实际结果不是,我么接着看 return fs f1,f2,f3 = count() print(f1(),f2(),f3())
不是我们预期的1 4 9。
(1)原因分析:返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.
(2)总结:返回闭包的时候,返回函数不能引用任何循环变量了
(3)解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不变。
改进代码:
def count2(): def f(j): def g(): return j*j return g fs = [] for i in range(1,4): fs.append(f(i)) #我们进行了传参,因此j就固定下来,它就执行了j return fs f4,f5,f6 = count2() print(f4(),f5(),f6())
二、装饰器
def hello(): print("我是一个程序") f = hello f() hello() #用id来证明f和hello是一个函数 print(id(f),id(hello))
三、源码:
d20_2_closure_interpretation
地址:https://github.com/ruigege66/Python_learning/blob/master/d20_2_closure_interpretation
2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)
3.博客园:https://www.cnblogs.com/ruigege0000/
4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料。
最新文章
- BZOJ1093 [ZJOI2007]最大半连通子图
- [daily] 宇宙终极shell之zsh
- Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
- Ubuntu 安装 “宋体,微软雅黑,WPS Office的symbol、wingdings、wingdings 2、wingdings 3、webding字体,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体(转)
- jQuery_pager.js分页
- [Google Code Jam (Qualification Round 2014) ] B. Cookie Clicker Alpha
- 设计模式C++达到 1.辛格尔顿
- IT职场经纬 |阿里web前端面试考题,你能答出来几个?
- Scala 令人着迷的类设计
- Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装
- ssm框架找不到mysql驱动类WARN DriverManagerDataSource:107 - Could not load driverClass com.mysql.jdbc.Driver
- AVIER Racing Drone App Privacy Policy
- babel分析
- Gin 路由解析树详解
- vue 项目实战 (入门)
- 编码(2)从字节理解Unicode(UTF8/UTF16)
- 天哪又要搬家啦qvq
- 利用JavaCSV API来读写csv文件
- EWS 邮件提醒
- ios真机调试步骤
热门文章
- 要想精通Mybatis?从手写Mybatis框架开始吧!
- 为什么 Java 不是纯面向对象语言?
- 实验:用Unity抓取指定url网页中的所有图片并下载保存
- PHP 扩展与 ZEND 引擎的整合
- 使用XShell工具 linux 常用命令
- javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题
- pandas 学习 第8篇:Index 对象 - (创建、转换、排序)
- DbgUiConnectToDbg(ntdll.dll)函数逆向
- vue-品牌管理案例
- Django---SETTINGS配置(***)