首页 / 知识
关于函数式编程:你能解释一下闭包(因为它们与Python有关)吗?
2023-04-12 09:06:00

Can you explain closures (as they relate to Python)?我已经读了很多关于闭包的文章,我想我理解它们,但是我希望有人能尽可能简洁、清晰地解释闭包,而不会给自己和其他人的印象蒙上阴影。我正在寻找一个简单的解释,可以帮助我理解在哪里和为什么我要使用它们。 关闭时关闭
这很简单:一个引用包含范围中变量的函数,可能是在控制流离开该范围之后。最后一位非常有用:
请注意,12和4分别在f和g中"消失",这一特性使f和g正确关闭。 老实说,我完全理解闭包,只是我从来没有弄清楚什么是"闭包",什么是"闭包"。我建议你放弃寻找术语选择背后的逻辑。 不管怎样,我的解释是:
这里的一个关键思想是,从foo返回的函数对象保留了对局部变量"x"的一个钩子,即使"x"已经超出范围,应该是无效的。这个钩子指向var本身,而不仅仅是var当时的值,所以当调用bar时,它打印5而不是3。 同样要清楚的是,python 2.x的闭包是有限的:我无法在"bar"中修改"x",因为写入"x=bla"将在bar中声明一个本地的"x",而不是分配给foo的"x"。这是python的assignment=声明的副作用。为了解决这个问题,python 3.0引入了非本地关键字:
我喜欢这个粗略、简洁的定义:
我会添加
接受参数的修饰符是闭包的常见用法。闭包是那种"函数工厂"的一种常见实现机制。当策略在运行时被数据修改时,我经常选择在策略模式中使用闭包。 在一种允许匿名块定义的语言中——例如Ruby、C——闭包可以用来实现(多少)新的控制结构。缺少匿名块是Python中闭包的限制之一。 我从来没有听说过事务与解释什么是闭包在同一个上下文中使用,这里实际上没有任何事务语义。 它之所以被称为闭包,是因为它"关闭"了外部变量(常量),也就是说,它不仅是一个函数,而且是创建函数的环境的一个外壳。 在下面的示例中,更改x后调用闭包g也将更改g中x的值,因为g关闭x:
这里是一个典型的闭包用例——对GUI元素的回调(这是对button类进行子类化的一种替代方法)。例如,您可以构造一个函数,该函数将在按钮按下时被调用,并"关闭"父作用域中处理单击所必需的相关变量。这样,您就可以从相同的初始化函数连接非常复杂的接口,将所有依赖项构建到闭包中。 下面是python3闭包的示例
在Python中,闭包是一个函数的实例,该函数的变量是固定绑定的。 事实上,数据模型在其对函数的
为了证明这一点:
很明显,我们知道现在有一个函数指向变量名 实际上,字符串"foo"与函数的实例绑定在一起,我们可以通过访问
顺便提一句,cell对象在C API文档中进行了描述:
我们可以演示闭包的用法,注意到
没有什么可以改变它:
部分函数 给出的示例使用闭包作为部分函数,但是如果这是我们唯一的目标,那么使用
还有一些更复杂的闭包不适合部分函数示例,我将在时间允许的情况下进一步演示它们。 我想分享我的例子和一个关于闭包的解释。我做了一个Python示例,并用两个数字来演示堆栈状态。
此代码的输出如下:
这里有两个图显示堆栈和附加到函数对象的闭包。 当函数从maker返回时 稍后调用函数时 当通过参数或非局部变量调用函数时,代码需要局部变量绑定,如Margin_Top、Padding以及a、b、n。为了确保函数代码正常工作,很久以前就不存在的maker函数的堆栈框架应该是可访问的,它备份在闭包中,我们可以通过h'消息的函数对象。 我们都在python中使用了装饰器。这些示例很好地展示了什么是Python中的闭包函数。
这里的最终值是12 在这里,包装器函数能够访问func对象,因为包装器是"词汇闭包",它可以访问它的父属性。这就是为什么,它能够访问func对象。
关闭要满足的标准是:
对于我来说,"闭包"是能够记住创建环境的函数。此功能允许您在闭包wich中使用变量或方法,换句话说,您将无法使用它们,因为它们不再存在,或者由于作用域而无法访问。让我们看看Ruby中的代码:
即使"乘法"方法和"x"变量都不存在,它也能工作。所有这些都是因为关闭功能需要记住。 我见过的最好的解释就是解释这个机制。就像这样: 将程序堆栈想象为一个退化树,其中每个节点只有一个子节点,而单个叶节点是当前执行过程的上下文。 现在放松约束,每个节点只能有一个子节点。 如果这样做,您可以有一个构造("yield"),它可以从过程返回而不丢弃本地上下文(即返回时它不会从堆栈中弹出)。下一次调用过程时,调用会拾取旧的堆栈(树)帧,并在停止的地方继续执行。 |
最新内容
相关内容
python闭包函数怎么用
python闭包函数怎么用,代码,工作,函数,培训,程序,外部,个数,变量,嵌套,赋值,python闭包函数:闭包,又称闭包函数或者闭合函数,类似于嵌套函数,不同python闭包函数是什么
python闭包函数是什么,培训,环境,代码,地方,函数,变量,自由,包裹,例子,局部,函数身为第一类对象,它可以作为函数的返回值返回,现在我们来考虑如pythoninput怎么解释
pythoninput怎么解释,培训,函数,版本,字符串,以后,以上,提示,原因,功能,更多,python中input函数有类似c中的scanf函数的功能。Python2中inputpythonpython是函数式编程吗?
pythonpython是函数式编程吗?,培训,代码,函数,指数,状态,概念,变量,语言,计算机,程度,函数是Python内建支持的一种封装,我们通过把大段代码拆python闭包的特点
python闭包的特点,培训,函数,外部,内部,特点,变量,生命周期,实例,定义,以上,python闭包的特点1、在外部函数中定义内部函数,内部函数包含访问python解释器的多种使用
python解释器的多种使用,培训,文件,多种,脚本,后面,目录,终端,文件名,文件夹,路径,python解释器的多种使用1、在终端输入python就可以运行Pytpython解释器有哪几种
python解释器有哪几种,代码,平台,网络,技术,培训,提示符,字节,不是,独立性,绝大部分,python解释器有哪几种1、CPython是使用最广的Python解释python函数式编程如何理解
python函数式编程如何理解,概念,代码,函数,预期,培训,科技,变量,可能会,赋值,副作用,python函数式编程如何理解我们可能或多或少都听说过函数python解释器有几种
python解释器有几种,代码,技术,培训,语言,字节,速度,教程,内核,虚拟机,外观,python解释器有几种1、CPythonCPython这个解释器是用C语言开发的如何配置tomcat绑定到单个IP地址(
如何配置tomcat绑定到单个IP地址(本地主机)而不是所有地址?,如何配置tomcat绑定到单个IP地址(本地主机)而不是所有地址?,地址,配置,绑关于xml:将XmlNodeList加载到XmlDoc
关于xml:将XmlNodeList加载到XmlDocument中而不循环?,关于xml:将XmlNodeList加载到XmlDocument中而不循环?,没有任何,这个问题,问了,最关于c ++:要从Windows标题栏中删除
关于c ++:要从Windows标题栏中删除图标而不放弃关闭按钮或系统菜单?,关于c ++:要从Windows标题栏中删除图标而不放弃关闭按钮或系统菜