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数据库详细介绍
Mar 27 Python
Python判断直线和矩形是否相交的方法
Jul 14 Python
Python正则抓取网易新闻的方法示例
Apr 21 Python
TensorFlow损失函数专题详解
Apr 26 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
实例介绍Python中整型
Feb 11 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
python 如何实现遗传算法
Sep 22 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 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 如何利用phpexcel导入数据库
2013/08/24 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
python3获取当前文件的上一级目录实例
2018/04/26 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
keras之权重初始化方式
2020/05/21 Python
python matplotlib库的基本使用
2020/09/23 Python
python温度转换华氏温度实现代码
2020/12/06 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
EJB的几种类型
2012/08/15 面试题
电大物流学生的自我评价
2013/10/25 职场文书
校园自助餐厅的创业计划书
2013/12/26 职场文书
超市5.1促销活动
2014/01/15 职场文书
同学聚会策划方案
2014/06/06 职场文书
教师个人事迹材料
2014/12/17 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
党校个人总结
2015/03/04 职场文书
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL