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编程中JSON模块的使用
Oct 15 Python
深入解析Python中的上下文管理器
Jun 28 Python
详解python发送各类邮件的主要方法
Dec 22 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
快速排序的四种python实现(推荐)
Apr 03 Python
Python中断多重循环的几种方式详解
Feb 10 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
搭建pypi私有仓库实现过程详解
Nov 25 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 Mysql日期和时间函数集合
2007/11/16 PHP
写出高质量的PHP程序
2012/02/04 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
一个实用的php验证码类
2017/07/06 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
文本域中换行符的替换示例
2014/03/04 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
详解python算法之冒泡排序
2019/03/05 Python
python实现月食效果实例代码
2019/06/18 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
Weblogic的布署方式
2013/08/23 面试题
人事助理自荐信
2014/02/02 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
医学生自荐信范文
2015/03/05 职场文书
秋收起义观后感
2015/06/11 职场文书
《绝招》教学反思
2016/02/20 职场文书
详解Laravel制作API接口
2021/05/31 PHP
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android