文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python闭包的概念、形式与应用方式

2023-06-17 14:45

关注

本篇内容主要讲解“Python闭包的概念、形式与应用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python闭包的概念、形式与应用方式”吧!

闭包(Closure)是词法闭包(Lexical Closure)的简称。对闭包的具体定义有很多种说法,这些说法大体可以分为两类:

◆一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变量的函数。

◆另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。

这两种定义在某种意义上是对立的,一个认为闭包是函数,另一个认为闭包是函数和引用环境组成的整体。虽然有些咬文嚼字,但可以肯定第二种说法更确切。闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。

闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合。其中的约束是指一个变量的名字和其所代表的对象之间的联系。那么为什么要把引用环境与函数组合起来呢?这主要是因为在支持嵌套作用域的语言中,有时不能简单直接地确定函数的引用环境。

闭包和函数对象本质上是同一种东西,闭包是函数对象的简化。闭包将环境数据保存在func_closure中,函数对象则将相关数据保存在对象中。二者均可用于filter、map、reduce等函数中。

下面分别使用闭包和函数对象来做同一件事情,感觉二者非常相似。

?[Copy to clipboard]View Code PYTHONIn [68]: class counter_class():      def __init__(self, start_at):          self.start_at = start_at      def __call__(self):          self.start_at += 1          return self.start_at     ....:          ....:          In [74]:      In [75]: c1 = counter_class(5)     In [76]: c1()  Out[76]: 6     In [77]: c1()  Out[77]: 7  In [78]: c1()  Out[78]: 8
In [80]: def counter_closure(start_at = 0):      count = [start_at]      def incr():          count[0] += 1          return count[0]      return incr     ....:      In [86]: c2 = counter_closure(5)     In [87]: c2()  Out[87]: 6  In [88]: c2()  Out[88]: 7     In [89]: c2()  Out[89]: 8

支持闭包的语言有这样的特性:

函数是一阶值(First-class value),即函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值。

函数可以嵌套定义,即在一个函数内部可以定义另一个函数。

显然Python对这两个特性支持都非常好,Java要想支持闭包改动就有点大了。在Python中函数同类差不多,而在Java中类是最小的组织单元,目前JDK 6.0上面两个特性一个都不支持。至于C++这样更底层的语言要支持闭包估计是不可能的。

Python中的闭包

Python因其简单易学、功能强大而拥有很多拥护者,很多企业和组织在使用这种语言。Python使用缩进来区分作用域的做法也十分有特点。下面是一个Python的例子:

清单 6. Python 1  def addx(x):  def adder (y): return x + y  return adder   add8 = addx(8)  add9 = addx(9)   print add8(100)  print add9(100)

在Python中使用def来定义函数时,是必须有名字的,要想使用匿名函数,则需要使用lambda语句,象下面的代码这样:

清单 7. Python 2  def addx(x):  return lambda y: x + y   add8 = addx(8)  add9 = addx(9)   print add8(100)  print add9(100)

到此,相信大家对“Python闭包的概念、形式与应用方式”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯