Python_基础个人理解_闭包

闭包

                       ———— 个人理解简述

闭包在某种含义上其本身其实也是一个函数。

定义的格式简单来说为在一个函数内部再创建一个函数,

也就是一个外函数包裹了一个内函数,

在内函数里使用了外函数的临时变量,

外函数的“return”返回值为内函数的引用(函数名)。

在形式上与循环嵌套有些相似,

暂且也可称之为函数嵌套。

闭包的使用可以有效的隐藏函数内部的工作细节,

只给外部使用者提供一个可以执行的内部函数的应用。

如果在外函数里自定义了变量并且需要在内函数中对其进行修改,

需要将变量声明为 “nonlocal” ,nonlocal 声明变量为非本地变量,

如果确定在程序要修改外部变量,那么建议将 nonlocal 写在内部函数的第一行。

举个栗子:

如图:

在这段代码中,在实际开发中并没有实际意义,只是简单示意了函数可以被当做参数和返回值使用。

有两点需要注意:

   1>  尽量不要使用全局变量,因为全局变量会破坏程序的封装性。

     2>  如果 show 函数不想被 callFunc 以外的函数进行访问时,是无法控制的

基于以上两点,图中代码可以进行优化修改:

代码进行优化后,去不再使用全局变量。而且将 show 函数封装在了 callFunc 函数内部,使外部不可见,不能使用 show 函数,隐藏了实现细节

程序在执行时,callFunc 函数返回了内部定义的 show 函数,并且 在 show 函数内部使用了外部函数的变量。

在 show 函数返回时,保存了当前的执行环境,也就是会在 show 函数中使用的外部变量 n 。

因为 n 是一个 callFunc 函数中的局部变量,正常情况下 callFunc 函数执行结束后,n 就会被释放。

但是现在因为 callFunc 函数中返回了 show 函数,show 函数在外部还会再执行,所以程序会将 show 函数所需的执行环境保存下来。

水平一般,能力有限,如有不足,加以改正。

  

原文地址:https://www.cnblogs.com/sly-666/p/9638182.html

时间: 2024-10-08 06:12:04

Python_基础个人理解_闭包的相关文章

Swift语法基础入门三(函数, 闭包)

Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 { 函数实现部分 } 没有参数没有返回值 可以写为 ->Void 可以写为 ->() 可以省略 Void.它其实是一个空的元组(tuple),没有任何元素,可以写成() func say() -> V

【javascript基础】8、闭包

原文:[javascript基础]8.闭包 前言 函数和作用域啥的我们前面已经了解了,现在就要学习闭包了,这是一个挺晦涩的知识点,初学者可能会感觉不好理解,但是高手都不不以为然了,高手就给我提点意见吧,我和新手一起来学习什么是闭包. 例子 先不说定义,先看一个题,看看大家能得出正确的结果不, function test(){ var arr = []; for(var i = 0;i<10;i++){ arr[i] = function(){ return i; } } return arr;

轻松理解JavaScript闭包

摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数.下面列举出常见的闭包实现方式,以例子讲解闭包概念 function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 f1是

理解JAVASCRIPT 闭包

最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念"闭包". 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这句话是我自己总结的,或许不太准确. 你能看到的多少这句话该如何理解呢? 下面随便丢一段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var name="Peter"; funct

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关引用环境组成的实体. 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量. Java中闭包实现 关键点: 如何用变量去存储方法? java中能够保存方法的变量指的就是普通的对象 如何让这个普通对象能够访问所在类的自由变量?

理解js闭包原理

各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁. 闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中. 怎么来理解这句话呢?请看下面的

Java基础之理解Annotation(与@有关,即是注释)

Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中.

javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

深入理解Javascript闭包概念

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数