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的socket编程入门教程
Apr 23 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
Python编程中的异常处理教程
Aug 21 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python内置random模块生成随机数的方法
May 31 Python
Django分页功能的实现代码详解
Jul 29 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
python中pop()函数的语法与实例
Dec 01 Python
Python时间操作之pytz模块使用详解
Jun 14 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
9个PHP开发常用功能函数小结
2011/07/15 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python数据结构之链表详解
2017/09/12 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
详解【python】str与json类型转换
2019/04/29 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python爬虫工具例举说明
2020/11/30 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
兴趣小组活动总结
2014/05/05 职场文书
学习经验交流会总结
2015/11/02 职场文书
导游词之扬州大明寺
2019/10/09 职场文书