Excel不相邻列如何打印在一起-英雄云拓展知识分享
148
2023-11-07
【摘要】 本书摘自《Python学习笔记 从入门到实战》一书中第9章,第4节,由张学建编著。
9.4.1 什么是闭包
根据字面意思,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数,当 然还有函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以随着包裹到处游 荡。当然还得有个前提,这个包裹是被创建出来的。在 Python 语言中, 一个闭包就是你调 用了一个函数A, 这个函数A 返回了一个函数B 给你。这个返回的函数B 就叫作闭包。你 在调用函数A 的时候,传递的参数就是一个自由变量。
例如在下面的实例代码中,演示了生成一个闭包的具体过程。
实例9- 13:打印教练的信息
源码路径:下载包\daima\9\9-13
在上述实例代码中,当调用函数 func() 的时候就产生了一个闭包: inner_func(), 并且该
闭包拥有自由变量“name”。这表示当函数funcO的生命周期结束之后,变量name 会依然存在, 因为它被闭包引用了,所以不会被回收。执行后会输出:
name: 希丁克age:72
注意:闭包并不是Python语言所特有的概念,所有把函数作为“一等公民”的语言均 有闭包这一概念。不过像Java这样以 class 为“一等公民”的语言中也可以使用闭包,只是 它得用类或接口来实现。
另外,如果从表现形式上来讲解 Python中的闭包,表示如果在一个内部函数里,对外 部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。这种解 释非常容易理解,不像其他定义那样有一堆陌生名词,不适合初学者。
注意:闭包和类的异同
基于前面内容的介绍,相信读者已经发现闭包和类有点相似,相似点在于它们都提供了 对数据的封装。不同的是闭包本身就是个方法。和类一样,我们在编程时经常会把通用的东 西抽象成类(当然,还有对现实世界 业务的建模),以复用通用的功能。闭包也是一样, 当我们需要函数粒度的抽象时,闭包就是一个很好的选择。在这点上闭包可以被理解为一个 只读对象,你可以给它传递一个属性,但它只能提供给你一个执行的接口。因此在程序中我 们经常需要这样的一个函数对象——闭包来帮我们完成一个通用的功能,比如本书前面讲解 的装饰器。
9.4.2 闭包和嵌套函数
在 Python语言中,闭包是指将组成函数的语句和这些语句的执行环境打包到一起所得到 的对象。当使用嵌套函数(函数中定义函数)时,闭包将捕获内部函数执行所需的整个环境。 此外,嵌套函数可以使用被嵌套函数中的任何变量,就像普通函数可以引用全局变量一样,而 不需要通过参数引入。
例如在下面的实例代码中,演示了嵌套函数可以使用被嵌套函数中的任何变量的过程。
实例9-14:使用被嵌套函数中的变量
源码路径:下载包\daimal9\9-14
在上述实例代码中定义了一个全局变量x, 在嵌套函数的外层函数foo) 中也定义了一个 变量x; 在嵌套的内层函数bar) 中引用的变量x 应该是fooO 中定义的x 。因为嵌套函数可以 直接引用其外层的函数中定义的变量x 的 值 并 输 出 , 所 以 输 出 的 值 为 3 , 而 不 是 全 局 变 量x 的值14。执行后会输出:
x的值是:3
希丁克的计划是干3年
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~