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的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python的常用模块之collections模块详解
Dec 06 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
Numpy一维线性插值函数的用法
Apr 22 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
python-地图可视化组件folium的操作
Dec 14 Python
Python jieba库分词模式实例用法
Jan 13 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
深入密码加salt原理的分析
2013/06/06 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
JavaScript触发器详解
2007/03/10 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
大学生应聘求职信
2014/05/26 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
2014年督导工作总结
2014/11/19 职场文书
司考复习计划
2015/01/19 职场文书
python爬虫--selenium模块
2021/03/31 Python
go语言中fallthrough的用法说明
2021/05/06 Golang
Java 在线考试云平台的实现
2021/11/23 Java/Android