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中使用异步Socket编程性能测试
Jun 25 Python
python图片验证码生成代码
Jul 02 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
python实现连续图文识别
Dec 18 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
利用Python计算KS的实例详解
Mar 03 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
Python中第三方库Faker的使用详解
Apr 02 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 高级课程笔记 面向对象
2009/06/21 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
php curl基本操作详解
2013/07/23 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
详解python 发送邮件实例代码
2016/12/22 Python
python 删除非空文件夹的实例
2018/04/26 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
工厂会计员职责
2014/02/06 职场文书
网络编辑职责
2014/03/01 职场文书
安全负责人任命书
2014/06/06 职场文书
太行山上观后感
2015/06/05 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
Windows7下FTP搭建图文教程
2022/08/05 Servers