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之类的细节
Oct 13 Python
Python中文件操作简明介绍
Apr 13 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
python 5个顶级异步框架推荐
Sep 09 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
Python读取pdf表格写入excel的方法
Jan 22 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 验证码制作(网树注释思想)
2009/07/20 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
Javascript 布尔型分析
2008/12/22 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
详解javascript new的运行机制
2016/01/26 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
Vue表单控件绑定图文详解
2019/02/11 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
python 自动重连wifi windows的方法
2018/12/18 Python
python字符串判断密码强弱
2020/03/18 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
汽车机修工岗位职责
2014/03/06 职场文书
2014年节能工作总结
2014/12/18 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
预备党员半年考察意见
2015/06/01 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript