闭包

python的装饰器总结

丶灬走出姿态 提交于 2020-01-13 06:34:36
前面碰到了装饰器的一些内容,这里总结一下。 要想对python更深入理解一些,装饰器是必须要掌握的内容。 闭包 必须说一下闭包这个概念,python的装饰器是python的闭包实现。 说一个通俗的理解,闭包就是能够读取其他函数的内部变量的函数,闭包是函数内部和外部链接的一个桥梁(这句话是百度百科摘过来的,我觉得不错)。我们也都知道python的的命名空间LEGB:查找顺序 L:local, 局部变量,函数结束,L也就没了 E:encolosing,这就是闭包的函数域 G:global,全局的变量 B:build in的内嵌的,比如系统关键字,type,int之类的 global num1 num1 = 1 # 全局 def test(): num1 = 2 # 局部 print num1 num2 = 3 # enclosing num3 = 4 # local def func(): print num2 return func fun = test() fun() print num1 print int # build in 装饰器 装饰器对函数或类进行“装饰”包裹,然后给对应的函数一些附加的功能,可以极大增加复用。 比如我们说一个add的函数,如果我们要在add中增加log,我们可以这么实现 def add(x, y): print "add operation"

[Node.js] 闭包和高阶函数

风格不统一 提交于 2020-01-13 05:15:23
原文地址: http://www.moye.me/2014/12/29/closure_higher-order-function/ 引子 最近发现一个问题:一部分写JS的人,其实对于 函数式编程 的概念并不是太了解。如下的代码片断,常常让他们觉得不可思议: OAuth2Server.prototype.authCodeGrant = function (check) { var self = this; return function (req, res, next) { new AuthCodeGrant(self, req, res, next, check); }; }; 上述片断来自开源项目 node-oauth2-server ,这个authCodeGrant原型函数涉及到JS编程中经常用到的两个概念:闭包 和 高阶函数(check变量在这个函数中被闭包,authCodeGrant能返回函数,因此是一个高阶函数。 闭包 闭包 就是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。 如何来理解这个自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量 什么样的变量是自由变量呢?如下片断中的freeVar对 inner() 来说就是个自由变量: function wrapper() { var

js学习小记-----闭包

不羁岁月 提交于 2020-01-12 09:35:33
难道是因为别的同学都出去跨年了所以我学习的心被打乱了吗,我竟然把我闭包的笔记删掉了。。。当看到的时候,脑壳一阵昏,下面给他补上。 在我们学习js的过程中肯定都接触过闭包,所以大家也都知道闭包的重要性,那么什么是闭包呢? 闭包就是在一个函数的内部定义了另外一个函数,并且把它拿到了外部来执行,这就是闭包,并且这个被抛出来的函数还会一直拿着父级函数的作用域中的值,正常情况下一个函数执行完就会被销毁,但是因为闭包的原因,他的作用域并不会被销毁,所以就造成了内存泄漏。内存泄漏这个名词需要好好理解的。(setTimeout()中写的是一个字符串而不是一个函数也会造成内存泄漏) 请看下面这个经典的for循环中产生闭包的例子: for ( var i = 0 ; i < 10 ; i ++ ) { setTimeout ( function ( ) { console . log ( i ) ; } , 1000 ) ; } 这个循环应该输出什么呢? 这个循环我们写出他就是想让他输出0-9这十个数字,但是他并不会满足我们的愿望,因为他输出了十个10,大家是不是很好奇,为什么会是十个10呢,怎么说也应该十个9吧。这是因为i的最后一个值是10,当i= 10时就不在进行循环,所以i最后的值等于10,那么肯定也就输出十个10了,像这种情况就是形成了闭包,还有一种情况也是闭包: function fn (

关系模式分解

时光总嘲笑我的痴心妄想 提交于 2020-01-11 08:10:46
模式分解 模式S-C-M (S 学号,C 班级,M 班主任) 该模式设计不好,存在数据冗余、插入异常、删除异常和更新异常 p1 = {S-C(学号,班级),C-M(班级,班主任)} p2 = {S-C(学号,班级),C-M(学号,班主任)} p3 = {S-C(学号,班主任),C-M(班级,班主任)} 规范化理论: 检测是否在一个表中聚集了过多的属性的过程 模式分解来消除违反范式规则而带来的影响(插入、更新、删除异常,冗余大),构造合适的(更好的)数据模式 概念建模过程中规范化用于检验却总是很有帮助 数据依赖 一个关系内部属性与属性之间的一种约束关系(属性值时候相同) 现实世界属性间相互联系的抽象 数据内在性质 语义的体现 函数依赖FD Sno Sname Ssex Sage a value b1 value c value d value a2 value b2 value c2 value d2 value … … … … an value bn value cn value dn value 定义: 设 R(U) 是一个属性集 U 上的关系模式, X 和 Y 是 U 的子集。若对于 R(U) 的任意一个可能的关系 r , r 中不可能存在两个元组在 X 上的属性值相等, 而在 Y 上的属性值不等, 则称“ X 函数确定 Y ”或“ Y 函数依赖于 X ”,记作 X → Y 若

【Gradle】Groovy的语法详解(下篇)

不羁岁月 提交于 2020-01-11 00:14:58
上文介绍了Groovy的一般省略规则,以及字符串、列表、Map的使用方式,然而在Groovy中,闭包是其中的一大杀器,可以对代码的结构和逻辑带来的优化显而易见。本博文主要对Groovy闭包的使用、文件IO的使用进行讲解。 本文实例源码github地址 : https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q1/20200110 。 闭包 闭包,是一个代码块,或可以理解成一个匿名函数。在外部方法调用时,可以将其作为方法的实参传递给方法的形参,并在方法内部回调此匿名函数,且回调此匿名函数时可以传递实参给到匿名函数的内部去接收,并执行此匿名函数 。 同时,此代码块或匿名函数也可以赋值给一个变量,使其具有自执行的能力,且最后一行的执行语句作为匿名函数的返回。 闭包基础 可能乍一读并不太能够理解这段话的含义,可以先看几个例子: def b1 = { println "hello world" } b1 ( ) //此处也可以写成b1.call() 运行后,输出结果为: hello world 可以看出,所谓闭包,其实就是一段代码块(用大括号包括起来了)。它可以被赋值给一个闭包对象,如果查看此时b1的类型,其实是 Closure 。 既然存在闭包对象,那么很显然,也可以将其作为方法的实参传递给某个方法。例如: def b1 =

11.Python迭代器

北城余情 提交于 2020-01-10 23:02:28
⼀. 函数名的运⽤ 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量. 1. 函数名的内存地址 2. 函数名可以赋值给其他变量 3. 函数名可以当做容器类的元素 4. 函数名可以当做函数的参数 5. 函数名可以作为函数的返回值 ⼆. 闭包 什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引⽤. 叫闭包 我们可以使⽤__closure__来检测函数是否是闭包. 使⽤函数名.__closure__返回cell就是 闭包. 返回None就不是闭包 问题, 如何在函数外边调⽤内部函数呢? 那如果多层嵌套呢? 很简单, 只需要⼀层⼀层的往外层返回就⾏了 由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函 数访问的时间和时机就不⼀定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这 个时候. 想⼀想. 我们之前说过, 如果⼀个函数执⾏完毕. 则这个函数中的变量以及局部命名 空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执⾏. 所 以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡. 将会常驻在内存中. 也就是说. 使⽤闭包, 可以保证外层函数中的变量在内存中常驻. 这样做 有什么好处呢? 非常⼤的好处. 我们来看⼀个关于爬⾍的代码: 综上,

JS高级---闭包案例,点赞

試著忘記壹切 提交于 2020-01-10 12:01:08
闭包案例,点赞 //获取所有的按钮 //根据标签名字获取元素 function my$(tagName) { return document.getElementsByTagName(tagName); } //闭包缓存数据 function getValue() { var value = 2; return function () { //每一次点击的时候,都应该改变当前点击按钮的value值 this.value = "赞(" + (value++) + ")"; } } //获取所有的按钮 var btnObjs = my$("input"); //循环遍历每个按钮,注册点击事件 for (var i = 0; i < btnObjs.length; i++) { //注册事件 btnObjs[i].onclick = getValue(); } 来源: https://www.cnblogs.com/jane-panyiyun/p/12175321.html

函数对象、函数嵌套、名称空间与作用域、装饰器

爷,独闯天下 提交于 2020-01-10 03:44:50
---恢复内容开始--- 一、函数对象 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 利用该特性,优雅的取代多分支的if 二、函数嵌套 函数的嵌套调用 def max(x,y): return x if x > y else y def max4(a,b,c,d): res1=max(a,b) res2=max(res1,c) res3=max(res2,d) return res3 print(max4(1,2,3,4)) 函数的嵌套定义 def f1(): def f2(): def f3(): print('from f3') f3() f2() f1() 三、命名空间与作用域 什么是命名空间 #命名空间:存放名字的地方,三种命名空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?命名空间正是存放名字x与1绑定关系的地方) 命名空间的加载顺序 python test.py #1、python解释器先启动,因而首先加载的是:内置命名空间 #2、执行test.py文件,然后以文件为基础,加载全局命名空间 #3、在执行文件的过程中如果调用函数,则临时产生局部命名空间 名字的查找顺序 局部命名空间--->全局命名空间--->内置命名空间 #需要注意的是:在全局无法查看局部的

JS高级---闭包小案例

…衆ロ難τιáo~ 提交于 2020-01-09 18:56:02
闭包小案例 普通的函数 //普通的函数 function f1() { var num = 10; num++; return num; } console.log(f1()); //11 console.log(f1()); //11 console.log(f1()); //11 函数模式的闭包 //函数模式的闭包 function f2() { var num = 10; return function () { num++; return num; } } var ff = f2(); console.log(ff());//11 console.log(ff());//12 console.log(ff());//13 来源: https://www.cnblogs.com/jane-panyiyun/p/12172936.html

JS高级---闭包

*爱你&永不变心* 提交于 2020-01-09 18:55:48
闭包 闭包的概念: 函数A中, 有一个函数B, 函数B中可以访问函数A中定义的变量或者是数据, 此时形成了闭包(这句话暂时不严谨) 闭包的模式: 函数模式的闭包, 对象模式的闭包 闭包的作用: 缓存数据, 延长作用域链 闭包的优点和缺点: 缓存数据 闭包的应用 函数模式的闭包: 在一个函数中有一个函数 //函数模式的闭包:在一个函数中有一个函数 function f1() { var num = 10; //函数的声明 function f2() { console.log(num); } //函数调用 f2(); } f1(); function f1() { var num = 10; return function () { console.log(num); //10 return num; } } var ff = f1(); var result = ff(); console.log(result); //10 对象模式的闭包:函数中有一个对象 function f3() { var num = 10; var obj = { age: num }; console.log(obj.age);//10 } f3(); function f2() { var num = 100; return { age: num } } var obj = f2(); console