Python闭包思想与用法浅析

  

本文实例讲述了Python闭包思想与用法。分享给大家供大家参考,具体如下:

  

<强>浅谈python的闭包思想

  

首先python的闭包使用方法是:在方法一个内添加方法B,然后<代码> 返回方法B注意,<代码> 返回的时候不要添加任何参数,包括()

  

这样,通过调用方法一个返回的是一个函数对象,如演示=方法一个可以直接使用演示(参数)将调用方法B这里不用关注方法B的方法名,

  

只需要关注参数就可以了,演示(参数)这里的参数其实就是闭包的方法B的参数,可以多个参数或者元祖一起使用。

  

其次在Python中创建一个闭包可以归结为以下三点:

  
      <李>闭包函数必须有内嵌函数   <李>内嵌函数需要引用该嵌套函数上一级名称空间中的变量   <李>闭包函数必须返回内嵌函数   
  

对,没错,python的装饰器就是使用了闭包。

  

好吧,最后再举个栗子:

        def test1(前缀):   def test2(名称):   打印(“test2闭包内:“,名称)   def test3 (* name1):   打印(“test3闭包内:“,name1)   返回test3   m=test1(前缀)   (“哈哈”、“heihei”)      之前      

打印结果:

  
  

D: \ python \ python。exe D:/Python_day/俊。py
  test3闭包内:('哈哈',' heihei ')

     

这个例子说明,当函数test1的生命周期结束之后,<代码> test1(前缀)中的参数前缀这个变量依然存在,生命周期不会随着函数调用结束而消失。

  

为啥要用闭包呢?感觉这个功能一般啊,毕竟回调函数是死的,只能回调一个,但是有个函数就是能生成无数个对象,嗯,是的,这玩意和类的功能有点相似,闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口,这就牵扯到的另一个特性:惰性求值

  如:

        #伪代码示意   类QuerySet(对象):   def __init__(自我、sql):   自我。sql=sql   自我。db=Mysql.connect () .corsor() #伪代码   def __call__(自我):   返回db.execute (self.sql)   def查询(sql):   返回QuerySet (sql)   结果=查询(“从user_app选择名称”)   如果时间比;现在:   打印结果#这时才执行数据库访问      之前      

上面这个不太恰当的例子展示了通过闭包完成惰性求值的功能,但是上面查询返回的结果并不是函数,而是具有函数功能的类。有兴趣的可以去看看Django的queryset的实现,原理类似。

  

还有另一种用处:需要对某个函数的参数提前赋值的情况,当然在Python中已经有了很好的解决访问<代码> functools.parial>   如:

        def部分(* * outer_kwargs):   def包装器(函数):   def内部(* args, * * kwargs):   k、v outer_kwargs.items ():   kwargs [k]=v   返回func (* args, * * kwargs)   回归内心的   返回包装   @partial(年龄=15)   def说(name=None,年龄=None):   打印的姓名、年龄   说(name=" the5fire ")   #当然用functools比这个简单多了   #只需要:functools。部分(比如年龄=15)(name=' the5fire ')      之前      

对于工厂函数的理解,感觉和闭包类似,在创建主函数后返回的对象,可以直接传参使用,其实这里返回的对象,就是一个类。

  

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》,《Python数学运算技巧总结》,《Python数据结构与算法教程》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

  

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

Python闭包思想与用法浅析