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脚本实现格式化css文件
Apr 08 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
浅谈django中的认证与登录
Oct 31 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
python如何读写json数据
Mar 21 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
python numpy元素的区间查找方法
Nov 14 Python
python 定时器,轮询定时器的实例
Feb 20 Python
浅谈Selenium+Webdriver 常用的元素定位方式
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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
iView框架问题整理小结
2018/10/16 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Python处理文本换行符实例代码
2018/02/03 Python
Sanic框架路由用法实例分析
2018/07/16 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python的json包位置及用法总结
2020/06/21 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
英文简历中的自我评价
2013/10/06 职场文书
护理专业个人求职简历的自我评价
2013/10/13 职场文书
人事任命通知书
2015/04/21 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python