Python闭包思想与用法浅析


Posted in Python onDecember 27, 2018

本文实例讲述了Python闭包思想与用法。分享给大家供大家参考,具体如下:

浅谈 python 的闭包思想

首先 python的闭包使用方法是:在方法A内添加方法B,然后return 方法B 注意,return的时候不要添加任何参数,包括()

这样,通过调用方法A 返回的是一个function 对象,如 demo=方法A 可以直接使用 demo(参数) 将调用方法B 这里不用关注方法B的方法名,

只需要关注参数就可以了,demo(参数) 这里的参数其实就是闭包的方法B的参数,可以多个参数或者元祖一起使用。

其次 在Python中创建一个闭包可以归结为以下三点:

  • 闭包函数必须有内嵌函数
  • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  • 闭包函数必须返回内嵌函数

对,没错,python的装饰器就是使用了闭包。

好吧,最后再举个栗子:

def test1(prefix):
  def test2(name):
    print('test2闭包内:',name)
  def test3(*name1):
    print('test3 闭包内:',name1)
  return test3
m = test1('prefix')
m("haha",'heihei')

打印结果:

D:\python\python.exe D:/Python_day/day1.py
test3 闭包内: ('haha', 'heihei')

这个例子说明,当函数 test1 的生命周期结束之后,test1('prefix') 中的参数 prefix 这个变量依然存在,生命周期不会随着函数调用结束而消失。

为啥要用闭包呢? 感觉这个功能一般啊,毕竟回调函数是死的,只能回调一个,但是有个函数就是能生成无数个对象,嗯,是的,这玩意和类的功能有点相似。闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口,这就牵扯到的另一个特性:惰性求值

如:

# 伪代码示意
class QuerySet(object):
  def __init__(self, sql):
    self.sql = sql
    self.db = Mysql.connect().corsor() # 伪代码
  def __call__(self):
    return db.execute(self.sql)
  def query(sql):
    return QuerySet(sql)
result = query("select name from user_app")
if time > now:
  print result # 这时才执行数据库访问

上面这个不太恰当的例子展示了通过闭包完成惰性求值的功能,但是上面query返回的结果并不是函数,而是具有函数功能的类。有兴趣的可以去看看Django的queryset的实现,原理类似。

还有另一种用处:需要对某个函数的参数提前赋值的情况,当然在Python中已经有了很好的解决访问 functools.parial,但是用闭包也能实现。

如:

def partial(**outer_kwargs):
  def wrapper(func):
    def inner(*args, **kwargs):
      for k, v in outer_kwargs.items():
        kwargs[k] = v
      return func(*args, **kwargs)
    return inner
  return wrapper
@partial(age=15)
def say(name=None, age=None):
  print name, age
say(name="the5fire")
# 当然用functools比这个简单多了
# 只需要: functools.partial(say, age=15)(name='the5fire')

对于工厂函数的理解,感觉和闭包类似,在创建主函数后返回的对象,可以直接传参使用,其实这里返回的对象,就是一个类。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python代码调试的几种方法总结
Apr 15 Python
Python工程师面试题 与Python基础语法相关
Jan 14 Python
Python使用gensim计算文档相似性
Apr 10 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
python实现Adapter模式实例代码
Feb 09 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
如何对python的字典进行排序
Jun 19 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
Python包argparse模块常用方法
Jun 04 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 #Python
python消费kafka数据批量插入到es的方法
Dec 27 #Python
Python通过paramiko远程下载Linux服务器上的文件实例
Dec 27 #Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 #Python
python 读取Linux服务器上的文件方法
Dec 27 #Python
Python 脚本获取ES 存储容量的实例
Dec 27 #Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 #Python
You might like
使用adodb lite解决问题
2006/12/31 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
Python PO设计模式的具体使用
2019/08/16 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
工厂保洁员岗位职责
2013/12/04 职场文书
管道维修工岗位职责
2013/12/27 职场文书
商务英语广告词大全
2014/03/18 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
党员个人公开承诺书
2014/08/29 职场文书
校本课程教学计划
2015/01/19 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS