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

  1. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

    文章目录 一.闭包类 Closure 简介 二. 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 三. 完整代码示例 一.闭包类 Closure ...

  2. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  3. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  4. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  5. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  6. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  7. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

    文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...

  8. 什么是闭包?闭包有啥作用?闭包的应用有啥?内存优化?

    什么是闭包?闭包的应用有哪些? 是不是很多人一开始所了解的闭包是一个函数套着另一个函数,然后其他的函数可以引用里面的函数的变量(很久之前俺就是这么理解的)?看完这篇文章后,球球泥们不要再这么回答了好嘛 ...

  9. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一.闭包中调用 Groovy 脚本中的方法 二.owner 与 delegate 区别 三.闭包中调用 Groovy 对象中的方法 一.闭包中调用 Groovy 脚本中的方法 在 Groov ...

最新文章

  1. AngularJS中实现无限级联动菜单(使用demo)
  2. in的绑定 mysql_MySQL IN语句的PDO绑定值
  3. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数
  4. java输出一副扑克牌_JAVA编一副扑克牌
  5. Dvsdk 下的CMEM学习
  6. 【转】ASCII码表
  7. TypeScript 2.8下的终极React组件模式
  8. CSS 居中 可随着浏览器变大变小而居中
  9. jquery-weui的学习与使用
  10. 怎样用python录音_python实现录音功能(可随时停止录音)
  11. 人工智能基础入门——神经网络讲解
  12. matlab样本标准差,关于样本标准差(SD)与样本标准误差(SE)
  13. VM虚拟机BT5下对usb无线网卡的配置
  14. 朱晔的互联网架构实践心得S1E10:数据的权衡和折腾【系列完】
  15. 在线招聘风起,周伯通怎么玩社区招聘?
  16. 在线作图丨微生物分析——alpha多样性指数分析
  17. markdownpad2 行内公式
  18. 使用电子签章确立在线医疗电子病历的法律地位
  19. ArcGIS教程 - 3 ArcGIS快速入门
  20. 2020年拼多多校招面试题及答案-最全最新-持续更新中

热门文章

  1. Leetcode 58 之反向迭代器的使用
  2. dynamic image
  3. Git 时光穿梭鸡 管理修改
  4. SAP B1 9.1 跟踪某个查询的执行
  5. Mispelling4
  6. poj 1562 简单 bfs
  7. UVa 1292 - Strategic game
  8. 第 13 章 MEncoder的基础用法
  9. linux高亮 查日志
  10. Linux监控工具Spotlight on Unix