Python闭包思想与用法浅析

作者:今天老子来巡山 时间:2021-08-13 03:54:54 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/guoxinjie17/article/details/77838851

标签:Python,闭包
0
投稿

猜你喜欢

  • Python光学仿真学习衍射算法初步理解

    2021-01-07 13:54:46
  • 鼠标放在图片上显示大图的JS代码

    2024-04-28 10:20:08
  • Mybatis多表查询与动态SQL特性详解

    2024-01-22 20:54:44
  • 简单谈谈python中的语句和语法

    2023-03-03 12:03:13
  • Django 接收Post请求数据,并保存到数据库的实现方法

    2024-01-13 08:18:56
  • 15行Python代码实现免费发送手机短信推送消息功能

    2023-11-01 10:20:51
  • python 获取毫秒级时间问题的解决

    2022-01-06 15:27:30
  • python3判断IP地址的方法

    2023-11-11 01:59:29
  • Javascript怎样使用SessionStorage和LocalStorage

    2023-09-01 03:49:49
  • 分析Python中解析构建数据知识

    2022-01-12 10:23:48
  • 在python中bool函数的取值方法

    2021-10-06 00:47:37
  • python 边缘扩充方式的实现示例

    2021-03-30 23:28:17
  • GOLANG版的冒泡排序和快速排序分享

    2023-07-05 05:31:09
  • Windows 下 MySQL 8.X 的安装教程

    2024-01-14 03:05:33
  • 解决TensorFlow训练内存不断增长,进程被杀死问题

    2021-02-09 17:14:34
  • Python实现批量读取图片并存入mongodb数据库的方法示例

    2021-03-25 01:51:53
  • 基于Three.js插件制作360度全景图

    2023-08-06 14:43:10
  • python中的Pytorch建模流程汇总

    2022-04-26 19:02:14
  • numpy 产生随机数的几种方法

    2021-08-28 02:33:54
  • SQL"不能为新插入的行确定标识"错误的解决方法

    2011-04-07 11:05:00
  • asp之家 网络编程 m.aspxhome.com