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 相关文章推荐
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
Python Pillow Image Invert
Jan 22 Python
django表单的Widgets使用详解
Jul 22 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
Python函数基本使用原理详解
Mar 19 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 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
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
flexigrid 参数说明
2010/11/23 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
jquery延迟对象解析
2016/10/26 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
财务人员求职自荐书范文
2014/02/10 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
新员工辞职信范文
2015/05/12 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
初中历史教学反思
2016/02/19 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
python获取带有返回值的多线程
2022/05/02 Python