Python closure闭包解释及其注意点详解


Posted in Python onAugust 28, 2019

一、闭包

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())

Python closure闭包解释及其注意点详解

不是我们预期的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())

Python closure闭包解释及其注意点详解

二、装饰器

def hello():
  print("我是一个程序")
f = hello
f()
hello()
#用id来证明f和hello是一个函数
print(id(f),id(hello))

Python closure闭包解释及其注意点详解

三、源码:

d20_2_closure_interpretation

地址:https://github.com/ruigege66/Python_learning/blob/master/d20_2_closure_interpretation

,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值

Python 相关文章推荐
python调用短信猫控件实现发短信功能实例
Jul 04 Python
python使用win32com库播放mp3文件的方法
May 30 Python
python中的字典使用分享
Jul 31 Python
python微信公众号之关键词自动回复
Jun 15 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python 梯度法求解函数极值的实例
Jul 10 Python
Python paramiko模块使用解析(实现ssh)
Aug 30 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python之字典对象的几种创建方法
Sep 30 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 Python
python opencv调用笔记本摄像头
Aug 28 #Python
Python threading的使用方法解析
Aug 28 #Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 #Python
Python logging设置和logger解析
Aug 28 #Python
Python shelve模块实现解析
Aug 28 #Python
解决python明明pip安装成功却找不到包的问题
Aug 28 #Python
Python 函数list&read&seek详解
Aug 28 #Python
You might like
中篇:安装及配置PHP
2006/12/13 PHP
PHP XML操作类DOMDocument
2009/12/16 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
django框架如何集成celery进行开发
2017/05/24 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
python 实现矩阵按对角线打印
2019/11/29 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
参观考察邀请函范文
2014/01/29 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
出差报告范文
2014/11/06 职场文书
道德模范事迹材料
2014/12/20 职场文书
离婚案件上诉状
2015/05/23 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android