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 json模块使用实例
Apr 11 Python
简单谈谈python中的多进程
Nov 06 Python
Python之py2exe打包工具详解
Jun 14 Python
Python中scatter函数参数及用法详解
Nov 08 Python
通过Pandas读取大文件的实例
Jun 07 Python
python3爬虫之设计签名小程序
Jun 19 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
Python魔术方法专题
Jun 19 Python
Flask缓存静态文件的具体方法
Aug 02 Python
降低python版本的操作方法
Sep 11 Python
yolov5返回坐标的方法实例
Mar 17 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
Javascript var变量隐式声明方法
2009/10/19 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
python django model联合主键的例子
2019/08/06 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
教师求职推荐信范文
2013/11/20 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js