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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
浅谈Python NLP入门教程
Dec 25 Python
python实现二叉查找树实例代码
Feb 08 Python
windows下python和pip安装教程
May 25 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
python实现批量文件重命名
Oct 31 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 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
初品cakephp 入门基础
2012/02/16 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
Python实现修改IE注册表功能示例
2018/05/10 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
运动会方阵解说词
2014/02/12 职场文书
个人委托书怎么写
2014/04/04 职场文书
物业消防安全责任书
2014/07/23 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
会计工作检讨书
2015/02/19 职场文书
交通事故案件代理词
2015/05/23 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang