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操作MySQL数据库具体方法
Oct 28 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
Mar 29 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python 列表降维的实例讲解
Jun 28 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
OpenCV 图像梯度的实现方法
Jul 25 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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定时执行任务设置详解
2015/02/06 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
奇妙的js
2007/09/24 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Python  连接字符串(join %)
2008/09/06 Python
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
Python实现验证码识别
2020/06/15 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
运动会方阵解说词
2014/02/12 职场文书
教师求职自荐信
2014/03/09 职场文书
小学生期末评语
2014/04/21 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
重温入党誓词主持词
2015/06/29 职场文书
个人欠条范本
2015/07/03 职场文书