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实现博客文章爬虫示例
Feb 26 Python
Python使用chardet判断字符编码
May 09 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
python 性能提升的几种方法
Jul 15 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
VSCode下好用的Python插件及配置
Apr 06 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
Puppet的一些技巧
2018/09/17 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
JS实现滑动插件
2020/01/15 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
Python读取mp3中ID3信息的方法
2015/03/05 Python
python中Apriori算法实现讲解
2017/12/10 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
甜品店的创业计划书范文
2014/01/02 职场文书
党支部公开承诺书
2014/03/28 职场文书
学雷锋标语
2014/06/25 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
安全教育片观后感
2015/06/17 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python