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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
python实现定时同步本机与北京时间的方法
Mar 24 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python Web编程之WSGI协议简介
Jul 18 Python
django的ORM模型的实现原理
Mar 04 Python
如何实现Django Rest framework版本控制
Jul 25 Python
python实现五子棋程序
Apr 24 Python
Python reduce函数作用及实例解析
May 08 Python
python获取百度热榜链接的实例方法
Aug 25 Python
python跨文件使用全局变量的实现
Nov 17 Python
Python并发编程实例教程之线程的玩法
Jun 20 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 insert语法详解
2008/06/07 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP异常处理浅析
2015/05/12 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
javascript基本算法汇总
2016/03/09 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
通过python3实现投票功能代码实例
2019/09/26 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
优秀员工自荐书范文
2013/12/08 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
公司停电通知
2015/04/15 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
Oracle使用别名的好处
2022/04/19 Oracle