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转码问题的解决方法
Oct 07 Python
python计算N天之后日期的方法
Mar 31 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
python ChainMap 合并字典的实现步骤
Jun 11 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
简单了解Python write writelines区别
Feb 27 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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
thinkphp实现图片上传功能分享
2014/03/04 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
载入进度条 效果
2006/07/08 Javascript
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
Python3.2模拟实现webqq登录
2016/02/15 Python
django中模板的html自动转意方法
2018/05/27 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
UNIX文件系统分类
2014/11/11 面试题
小学数学教学经验交流材料
2014/05/22 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
自主招生学校推荐信
2014/09/26 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
兴趣班停课通知
2015/04/24 职场文书
公积金具结保证书
2015/05/11 职场文书
党小组意见范文
2015/06/08 职场文书
师范生教育见习总结
2015/06/23 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
Python 多线程处理任务实例
2021/11/07 Python