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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
python提示No module named images的解决方法
Sep 29 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
Django ORM 查询管理器源码解析
Aug 05 Python
pyinstaller还原python代码过程图解
Jan 08 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
Python把图片转化为pdf代码实例
Jul 28 Python
Python 使用生成器代替线程的方法
Aug 04 Python
python 如何引入协程和原理分析
Nov 30 Python
Python 绘制多因子柱状图
May 11 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函数解决SQL injection
2006/10/09 PHP
php字符集转换
2017/01/23 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
indexOf 和 lastIndexOf 使用示例介绍
2014/09/02 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python生成随机数的方法
2014/01/14 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
担保书格式
2015/01/20 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
三八节祝酒词
2015/08/11 职场文书
导游词之桂林山水
2019/09/20 职场文书
MySQL 服务和数据库管理
2021/11/11 MySQL
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis