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 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
python线程中的同步问题及解决方法
Aug 29 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
Python 实现数组相减示例
Dec 27 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
通过实例解析Python return运行原理
Mar 04 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 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
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
react-native之ART绘图方法详解
2017/08/08 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
python生成日历实例解析
2014/08/21 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python文件拆分与重组实例
2018/12/10 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python中删除某个元素的方法解析
2019/11/05 Python
简单的Python人脸识别系统
2020/07/14 Python
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
市场营销专业自荐书
2014/06/10 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
TV动画《间谍过家家》公开PV
2022/03/20 日漫