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单线程实现多个定时器示例
Mar 30 Python
python使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
一文总结学习Python的14张思维导图
Oct 17 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
django主动抛出403异常的方法详解
Jan 04 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
Tensorflow: 从checkpoint文件中读取tensor方式
Feb 10 Python
Python中Selenium库使用教程详解
Jul 23 Python
Node.js 和 Python之间该选择哪个?
Aug 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
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
js类式继承与原型式继承详解
2016/04/07 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Python字符串详细介绍
2015/05/09 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
在python中做正态性检验示例
2019/12/09 Python
在python image 中实现安装中文字体
2020/05/16 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
Yahoo-PHP面试题3
2012/01/14 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
应聘教师求职信
2014/07/19 职场文书
教师岗位职责范本
2015/04/02 职场文书
鸦片战争观后感
2015/06/09 职场文书
孔繁森观后感
2015/06/10 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
《青山不老》教学反思
2016/02/22 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript