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读取oracle函数返回值
Jul 18 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python简单读取json文件功能示例
Nov 30 Python
Python实现分段线性插值
Dec 17 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python实现程序重启和系统重启方式
Apr 16 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
德生9700DX电路分析
2021/03/02 无线电
PHP实现今天是星期几的几种写法
2013/09/26 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
javascript内存分配原理实例分析
2017/04/10 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
2014元旦晚会策划方案
2014/02/19 职场文书
迎国庆横幅标语
2014/10/08 职场文书
大学生暑假实习总结
2015/07/13 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers