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的Django框架部署的一些建议
Apr 09 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
python3.6的venv模块使用详解
Aug 01 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
python中68个内置函数的总结与介绍
Feb 24 Python
python实现程序重启和系统重启方式
Apr 16 Python
基于python实现操作redis及消息队列
Aug 27 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
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
python encode和decode的妙用
2009/09/02 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
Python中%是什么意思?python中百分号如何使用?
2018/03/20 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Python实现括号匹配方法详解
2020/02/10 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
django创建css文件夹的具体方法
2020/07/31 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
党员公开承诺书和承诺事项
2014/03/25 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
走进毛泽东观后感
2015/06/04 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android