python中的闭包用法实例详解

作者:ma6174 时间:2022-01-06 00:47:07 

本文实例讲述了python中的闭包用法。分享给大家供大家参考。具体分析如下:

什么是闭包?

简单说,闭包就是根据不同的配置信息得到不同的结果

再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

python实例:

看概念总是让人摸不着头脑,看几个python小例子就会了

例1


def make_adder(addend):
 def adder(augend):
   return augend + addend
 return adder
p = make_adder(23)
q = make_adder(44)
print p(100)
print q(100)

运行结果:


123
144

分析一下:

我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数.

再看看运行结果,我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包.

例2


def hellocounter (name):
 count=[0]
 def counter():
   count[0]+=1
   print 'Hello,',name,',',str(count[0])+' access!'
 return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

执行结果


Hello, ysisl , 1 access!
Hello, ysisl , 2 access!
Hello, ysisl , 3 access!

分析一下

这个程序比较有趣,我们可以把这个程序看做统计一个函数调用次数的函数.count[0]可以看做一个计数器,没执行一次hello函数,count[0]的值就加1。也许你会有疑问:为什么不直接写count而用一个列表?这是python2的一个bug,如果不用列表的话,会报这样一个错误:

UnboundLocalError: local variable 'count' referenced before assignment.

什么意思?就是说conut这个变量你没有定义就直接引用了,我不知道这是个什么东西,程序就崩溃了.于是,再python3里面,引入了一个关键字:nonlocal,这个关键字是干什么的?就是告诉python程序,我的这个count变量是再外部定义的,你去外面找吧.然后python就去外层函数找,然后就找到了count=0这个定义和赋值,程序就能正常执行了.

python3 代码


def hellocounter (name):
 count=0
 def counter():
   nonlocal count
   count+=1
   print 'Hello,',name,',',str(count[0])+' access!'
 return counter
hello = hellocounter('ma6174')
hello()
hello()
hello()

例3


def makebold(fn):
 def wrapped():
   return "<b>" + fn() + "</b>"
 return wrapped
def makeitalic(fn):
 def wrapped():
   return "<i>" + fn() + "</i>"
 return wrapped
@makebold
@makeitalic
def hello():
 return "hello world"
print hello()

执行结果


<b><i>hello world</i></b>

简单分析

怎么样?这个程序熟悉吗?这不是传说的的装饰器吗?对,这就是装饰器,其实,装饰器就是一种闭包,我们再回想一下装饰器的概念:对函数(参数,返回值等)进行加工处理,生成一个功能增强版的一个函数。再看看闭包的概念,这个增强版的函数不就是我们配置之后的函数吗?区别在于,装饰器的参数是一个函数或类,专门对类或函数进行加工处理。

python里面的好多高级功能,比如装饰器,生成器,列表推到,闭包,匿名函数等,开发中用一下,可能会达到事半功倍的效果!

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

标签:python,闭包
0
投稿

猜你喜欢

  • 用户体验设计中用到的统计学方法

    2009-07-12 08:26:00
  • Python处理excel与txt文件详解

    2021-12-13 20:38:20
  • python实现的自动发送消息功能详解

    2021-12-09 20:45:18
  • 分析Python中设计模式之Decorator装饰器模式的要点

    2021-12-06 12:04:01
  • Python变量和数据类型和数据类型的转换

    2023-09-28 07:44:34
  • 网页开发中的容易忽略的问题 javascript HTML中的table

    2023-09-04 20:43:52
  • python使用PIL和matplotlib获取图片像素点并合并解析

    2021-09-07 15:41:45
  • python自动化调用百度api解决验证码

    2023-03-18 19:21:27
  • django 连接数据库 sqlite的例子

    2023-08-03 19:03:15
  • Navicat for MySQL 与 MySQL-Front比较

    2009-02-12 17:33:00
  • CSS布局之浮动(二)三列浮动

    2008-08-19 12:47:00
  • django创建超级用户时指定添加其它字段方式

    2022-08-13 17:24:18
  • python递归打印某个目录的内容(实例讲解)

    2021-02-13 00:54:27
  • Python中的np.random.seed()随机数种子问题及解决方法

    2023-01-15 20:14:02
  • Python对象的属性访问过程详解

    2023-09-02 13:40:04
  • 快速了解Python开发中的cookie及简单代码示例

    2023-05-29 11:04:05
  • 基于Python实现千图成像工具的示例代码

    2022-03-14 12:19:21
  • 分享四个python接口常用封装函数

    2021-11-15 16:33:45
  • 使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例

    2023-05-19 13:05:18
  • python实现21点小游戏

    2023-11-21 08:58:27
  • asp之家 网络编程 m.aspxhome.com