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实现通过shelve修改对象实例
Sep 26 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
基于python中theano库的线性回归
Aug 31 Python
Django学习笔记之为Model添加Action
Apr 30 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
Python实现直播推流效果
Nov 26 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
python解决12306登录验证码的实现
Apr 18 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
基于jquery的放大镜效果
2012/05/30 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
Python性能优化的20条建议
2014/10/25 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python中web框架的自定义创建
2019/09/08 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
js实现弹框效果
2021/03/24 Javascript
个人收入证明范本
2014/01/12 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
法人授权委托书
2014/09/16 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
业务内勤岗位职责
2015/04/13 职场文书
复兴之路观后感
2015/06/02 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers