本文实例讲述了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闭包思想与用法浅析