闭包

【学习笔记】python字典、函数和闭包

╄→гoц情女王★ 提交于 2020-01-18 13:41:54
小整数对象池 在终端编译时,python中存在一个范围为[-5,256]的小整数对象池,这些整数对象是提前建立好的,不会被垃圾回收 所以,将同一个小整数赋值给不同变量,这些变量指向的内存地址都是一样的 例: >> > age = 8 >> > other_age = 8 >> > print ( age is other_age ) # True 而大整数不存在对象池,将同一个大整数赋值给不同变量,这些变量指向的内存地址是不一样的 例: >> > money = 2000000 >> > salary = 2000000 >> > print ( money is salary ) # False 这个时候,如果直接打开一个文本编辑器去尝试,你会发现,咦,怎么print(money is salary)打印出来的值为True啊,不是应该是False吗? 这是因为在文本编辑器编译时,python解析器会逐行编译,当发现两个变量引用的同一个整数值为一样,则会将这些变量指向同一个内存地址,最后编译完成后,再统一回收,而我们上述代码,都是在终端下执行的,终端是每次执行一次,执行一次就创建一次内存地址,所以打印出来的值为False 对称差集 list1 = [ 5 , 1 , 2 , 9 , 0 , 3 ] list2 = [ 7 , 2 , 5 , 7 , 9 ] set1 = set (

迭代 装饰器 闭包

给你一囗甜甜゛ 提交于 2020-01-18 11:16:28
迭代器: 包含yield表达式的函数是特殊的函数,叫做生成器函数(generator function),被调用时将返回一个迭代器(iterator),调用时可以使用next或send(msg)。它的用法与return相似,区别在于它会记住上次迭代的状态,继续执行。 send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。初始调用时必须先next()或send(None),否则会报错。 举个例子: 首先生成一个迭代器f,f.next()会使生成器函数执行到yield,生成一个值然后挂起。 然后f.next()或f.send(msg)会在生成器函数内部返回值,执行到下一个yield,生成值后挂起 然后f.next()或f.send(msg)会在生成器函数内部返回值,意图执行到下一个yield,但是后面没有yield了,所以抛出异常。 使用yield可以有效简化代码,并减少空间浪费。 举个简单例子:列表中的每个元素+1 传统写法: Python代码 def addlist(alist): r = [] for i in alist: r.append(i+1) return r 复制代码 yield写法: Python代码 def addlist(alist): for i in

Python作用域-->闭包函数-->装饰器

独自空忆成欢 提交于 2020-01-18 10:33:46
1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域。  全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。  关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改)  下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1   如果局部没有定义变量x,那么函数内部会从内往外开始查找x,如果没有找到,就会报错 x = 1 def funx(): print(x) # 打印出1 funx() print(x) # 打印出1 x = 1 def funx(): def func1(): print(x) # 打印出1 func1() funx() print(x) # 打印出1  因此,关于作用域的问题,只需要记住两点就行:全局变量能够被文件任何地方引用,但修改只能在全局进行操作;如果局部没有找到所需的变量,就会往外进行查找,没有找到就会报错。 2.关于高级函数 我们知道,函数名其实就是指向一段内存空间的地址,既然是地址,那么我们可以利用这种特性来。  2.1函数名可以作为一个值 def delete(ps): import os filename =

Python之闭包

雨燕双飞 提交于 2020-01-18 10:32:02
Python之闭包 我们知道,在 装饰器 中,可以在函数体内创建另外一个函数,例如: def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>" return wrapped def makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped @makebold @makeitalic def hello(): return "hello world" print hello() 内部函数的特点在于其整个函数体都在外部函数的作用域之内,除了在函数体内,任何地方都不能对其进行调用。 如果内部函数的定义包括了在外部函数里定义的对象的引用,内部函数会变成闭包。 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 闭包的一个例子: def counter(start_at=0): count = [start_at] def incr(): count[0] += 1 return count[0] return incr cnt =

Python中的闭包和装饰器

非 Y 不嫁゛ 提交于 2020-01-18 10:30:46
1.闭包 专业解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 通俗解释:简单说,闭包就是根据不同的配置信息得到不同的结果 例子: def make_adder(addend): def adder(augend): return augend + addend return adder p = make_adder(23) q = make_adder(44) print p(100) print q(100) 执行结果: 123 144 2.装饰器 概念:对函数(参数,返回值等)进行加工处理,生成一个功能增强版的一个函数。 例子: def log(text): def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print '2013-12-25' 执行结果: >>> now()

JavaScript闭包

て烟熏妆下的殇ゞ 提交于 2020-01-18 03:24:09
产生一个闭包 创建闭包最常见方式,就是在一个函数内部创建另一个函数。 下面例子中的 closure 就是一个闭包: function func ( ) { var a = 1 , b = 2 ; function closure ( ) { return a + b ; } return closure ; } 闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域。 闭包的注意事项 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止。 function makeAdder ( x ) { return function ( y ) { return x + y ; } ; } var add5 = makeAdder ( 5 ) ; var add10 = makeAdder ( 10 ) ; console . log ( add5 ( 2 ) ) ; // 7 console . log ( add10 ( 2 ) ) ; // 12 // 释放对闭包的引用 add5 = null ; add10 = null ; add5 和 add10 都是闭包。它们共享相同的函数定义,但是保存了不同的环境。在 add5 的环境中,x 为 5。而在 add10 中,x 则为 10。最后通过

js知识点小结

你。 提交于 2020-01-18 03:16:54
文章目录 1、原始值和引用值类型及区别 2、判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor 3、类数组与数组的区别与转换 4、 数组的常见API 5、bind、call、apply的区别 6、new的原理 7、如何正确判断this(区别箭头函数) 8、严格模式与非严格模式的区别 9、原型和原型链 10、prototype与__proto__的关系与区别 11、继承的实现方式及比较 12、作用域和作用域链、执行上下文 13、闭包及其作用 14、深拷贝与浅拷贝 15、防抖和节流 16、Js事件绑定时,函数名加括号和不加括号区别 17、DOM常见的操作方式 18、 Array.sort()方法与实现机制 19、 Ajax的请求过程 20、JS的垃圾回收机制 21、JS中的String、Array和Math方法 22、addEventListener(DOM2级事件处理程序)和onClick()(DOM0级事件处理程序)的区别 23、立即执行函数 24、整个HTML解析过程与JS脚本解析和执行顺序 25、new和Object.create的区别 26、DOM的location对象 27、浏览器从输入URL到页面渲染的整个流程 28、跨域、同源策略及跨域实现方式和原理 29、浏览器的回流(Reflow

Python装饰器与闭包

狂风中的少年 提交于 2020-01-17 15:36:37
python装饰器利用了函数闭包和函数可以当做参数进行传递的特性,函数闭包指在一个函数中嵌套一个函数,同时外层函数返回内层函数 user = { "is_login": False } def edit_user(): print('用户名修改成功') def add_article(): print('添加文章成功') def login_required(func): def wrapper(): if user['is_login'] == True: func() else: print('跳转到登录页面') return wrapper login_required(edit_user)() login_required(add_article)() #利用语法糖可以简化调用 user = { "is_login": False } def login_required(func): def wrapper(): if user['is_login'] == True: func() else: print('跳转到登录页面') return wrapper @login_required def edit_user(): print('用户名修改成功') @login_required def add_article(): print('添加文章成功') #调用时,由于

闭包

纵然是瞬间 提交于 2020-01-17 09:44:26
闭包 闭包就是能够读取其他函数内部变量的函数; 由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解为“定义在一个函数内部的函数”,所以在本质上闭包就是把函数内部和外部连接起来的一座桥梁; 闭包的用途 闭包有很多用途,最大的用途有两个,一是读取其他函数内部的变量,二是把这些变量的值始终保存在内存中,例如:朋友圈点赞和计时器 优点:可重用变量,不会造成全局污染 缺点:过多使用闭包,会造成内存泄漏 简单的闭包 < script > //闭包3步: //1. 用外层函数包裹要保护的变量和内层函数 function parent ( ) { var total = 1000 ; //总零花钱数 //2. 外层函数将内层函数返回到外部,让别人可以使用。 return function ( money ) { total -= money ; console . log ( `花了 ${ money } 元,还剩 ${ total } 元` ) } } //3. 调用外层函数获得返回的内部函数对象 var pay = parent ( ) ; //pay:function(money){...} pay ( 100 ) ; //900; total = 0 ; //试图篡改total pay ( 100 ) ; //800; total = 0 ; /

Scala 闭包

旧巷老猫 提交于 2020-01-15 17:48:30
Scala 闭包 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。 闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。 如下面这段匿名的函数: val multiplier = (i:Int) => i * 10 函数体内有一个变量 i,它作为函数的一个参数。如下面的另一段代码: val multiplier = (i:Int) => i * factor 在 multiplier 中有两个变量:i 和 factor。其中的一个 i 是函数的形式参数,在 multiplier 函数被调用时,i 被赋予一个新的值。然而,factor不是形式参数,而是自由变量,考虑下面代码: var factor = 3 val multiplier = (i:Int) => i * factor 这里我们引入一个自由变量 factor,这个变量定义在函数外面。 这样定义的函数变量 multiplier 成为一个"闭包",因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。 完整实例 object Test { def main(args: Array[String]) { println( "muliplier(1) value = " + multiplier(1) ) println( "muliplier(2)