这篇文章主要介绍了Python闭包思想与用法,结合实例形式简单分析了Python闭包的概念、原理、使用方法与相关操作注意事项,需要的朋友可以参考下

本文实例讲述了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数总结》、《Python数据结构与算法教程》、《Python字符串操作汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

最新资讯
与富士康打擂台?立讯精密前三季度营收595亿,创始人身家910亿

与富士康打擂台?立讯精

通过与苹果深度捆绑,立讯精密业绩再获丰收。
科学好故事|如何建造一艘拯救地球的航天器?

科学好故事|如何建造

明年夏天,NASA将通过一个立方体航天器撞击一颗较小的小
微软高管解读2021第一财季财报 纳德拉:用户开始更愿意选择Azure

微软高管解读2021第一

开发者方面,无论是直接迁移(lift-and-shift)还是新应用,他
已故三星会长李健熙任内公司资产增长约5万亿元

已故三星会长李健熙任

已故三星集团会长李健熙任内三星总资产增长逾76倍,增加
杨元庆:联想5G标准必要专利突破千件 新技术架构“春山可望”

杨元庆:联想5G标准必要

联想集团董事长兼CEO杨元庆今日表示,联想在5G领域申请
爱彼迎称计划在纳斯达克交易所上市

爱彼迎称计划在纳斯达

房屋短租初创公司爱彼迎(Airbnb)周二表示,计划在纳斯达克
最新文章
在pycharm中为项目导入anacodna环境的操作方法

在pycharm中为项目导

这篇文章主要介绍了在pycharm中为项目导入anacodna环
tensorflow的ckpt及pb模型持久化方式及转化详解

tensorflow的ckpt及pb

今天小编就为大家分享一篇tensorflow的ckpt及pb模型持
PyTorch笔记之scatter()函数的使用

PyTorch笔记之scatter

这篇文章主要介绍了PyTorch笔记之scatter()函数的使用
python3实现网页版raspberry pi(树莓派)小车控制

python3实现网页版ras

这篇文章主要为大家详细介绍了python3实现网页版raspb
完美解决pycharm导入自己写的py文件爆红问题

完美解决pycharm导入

今天小编就为大家分享一篇完美解决pycharm导入自己写
pycharm内无法import已安装的模块问题解决

pycharm内无法import

今天小编就为大家分享一篇pycharm内无法import已安装