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 相关文章推荐
详解python3实现的web端json通信协议
Dec 29 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
python画图的函数用法以及技巧
Jun 28 Python
Python数据存储之 h5py详解
Dec 26 Python
python isinstance函数用法详解
Feb 13 Python
Python @property及getter setter原理详解
Mar 31 Python
python3发送request请求及查看返回结果实例
Apr 30 Python
基于python实现生成指定大小txt文档
Jul 20 Python
Python访问Redis的详细操作
Jun 26 Python
如何基于python实现单目三维重建详解
Jun 25 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
JS中去掉array中重复元素的方法
2017/05/26 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
微信小程序签到功能
2018/10/31 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
python实现的一个火车票转让信息采集器
2014/07/09 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
python求pi的方法
2014/10/08 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
tensorflow常用函数API介绍
2020/04/19 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
资产评估专业学生的自我鉴定
2013/11/14 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android