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入门篇之字典
Oct 17 Python
Python中的进程分支fork和exec详解
Apr 11 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
python读取目录下最新的文件夹方法
Dec 24 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python opencv将表格图片按照表格框线分割和识别
Oct 30 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
Pytorch之contiguous的用法
Dec 31 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 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新手上路(三)
2006/10/09 PHP
php5数字型字符串加解密代码
2008/04/24 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
英国精品买手店:Browns Fashion
2016/09/29 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
局域网标准
2016/09/10 面试题
一年级家长会邀请函
2014/01/25 职场文书
环保建议书600字
2014/05/14 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
幼儿园教师教学反思
2016/03/02 职场文书