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操作CouchDB数据库简单示例
Mar 10 Python
python之Character string(实例讲解)
Sep 25 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python的debug实用工具 pdb详解
Jul 12 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
如何利用python给图片添加半透明水印
Sep 06 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
python连接mysql数据库并读取数据的实现
Sep 25 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
python 基于selectors库实现文件上传与下载
Dec 31 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
php4的session功能评述(一)
2006/10/09 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
百思买美国官网:Best Buy
2016/07/28 全球购物
COS美国官网:知名服装品牌
2019/04/08 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
几道Java和数据库的面试题
2013/05/30 面试题
一封普通求职者的求职信
2013/11/20 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
药学职务聘任书
2014/03/29 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS