闭包

python 13---17

大兔子大兔子 提交于 2020-01-15 07:07:09
第十三章 一. 匿名函数 匿名函数 lambda,也叫一句话函数。 现在有一个需求:你们写一个函数,此函数接收两个int参数,返回和值。 def func(a,b): return a+b print(func(3,4)) 那么接下来我们用匿名函数完成上面的需求: func = lambda a,b: a+b print(func(3, 4)) # 7 我们分析一下上面的代码: 语法: 函数名 = lambda 参数:返回值 1)此函数不是没有名字,他是有名字的,他的名字就叫做lambda 2)lambda 是定义匿名函数的关键字,相当于函数的def. 3)lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。 func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs print(func(3, 4,c=666,name='alex')) # {'name': 'alex'} # 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。 4)返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。(但是想要返回多个元素要以容器的形式返回) 5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据 接下来做几个匿名函数的小题: 写匿名函数:接收一个可切片的数据

javascript 闭包的理解(二)

扶醉桌前 提交于 2020-01-15 05:42:03
// 定义一个User构造函数 function User(properties){ //遍历对象属性,确保它作用域正确 for(var i in properties){ (function(which){ var p = i; //为属性创建获取器 which["get"+i] = function(){ return properties[p]; }; //为属性创建设置器 which["set"+i] = function(val){ properties[p] = val; //return properties[p]; }; })(this); } } // 创建一个User实例 var user = new User({ name:"Bob", age:44, islive:true, money:50000, earn:5000, nation:"china", job:"web Dev" }); user.getname(); // 返回 "Bob" user.getage(); // 返回 "44" user.getage.call(window); // 依然返回44 user.getage.call({age: 23}); // 还是返回44 上面的这段代码 (我们叫它代码段A吧) 里, user.getage.call(window) 和 user

Python基础15-函数闭包与装饰器

你说的曾经没有我的故事 提交于 2020-01-15 05:00:40
目录 装饰器概念 装饰器的实现 修改被装饰函数的代码(非装饰器实现) 修改被装饰函数的调用方式(非装饰器实现) 装饰器的实现(不完整的实现level1) 装饰器实现的语法糖(不完整的实现level2) 函数闭包加上返回值和参数(基本完整的装饰器实现) 过渡内容 带参数的装饰器 装饰器概念 装饰器本质就是函数,功能是为其他函数添加附加功能。装饰器的原则如下 不修改被装饰函数的源代码 不修改被装饰函数的调用方式 装饰器的实现 要实现装饰器,就是遵循装饰器的原则来实现装饰器,具体做法就是 装饰器=高阶函数+函数嵌套/闭包。 我们用一个例子来实现以下功能。有个函数foo,执行时间较长,我们在不修改foo函数的源代码、不修改foo函数的调用方式的前提下,显示foo函数执行的时间。这个需求就用装饰器来实现,我们一点一点接近装饰器的完整实现。 import time def foo(): """ 模拟foo函数运行了3秒左右 :return: """ time.sleep(3) print('from foo') pass # foo函数的调用方式就是直接调用 foo() 修改被装饰函数的代码(非装饰器实现) 我们可以选择在foo函数开始执行的时候记下时间,在foo结束执行的时候再记下时间,从而得到foo函数的执行时间。但是这样就必须修改foo函数的源代码,这在大型项目里面很可能会引发连锁反应

闭包原理和作用

。_饼干妹妹 提交于 2020-01-15 04:10:43
闭包原理: 闭包是指在一个函数可以把自己内部的语句和声明时所在的作用域形形成一个密封的坏境,在函数外部可以访问到函数内部的局部变量。 在js执行状态中一般函数执行完毕之后函数会被销毁,但闭包不会进行销毁,会始终保存在内存之中 function fu(){ var str = '你好' return function name() { return str } } let a = fu() a() // console.log(a()) 打印 '你好' 闭包的特性: 持久性 不会随机函数就是销毁 封闭性 没有提供接口 不能访问函数内部语句 function fu(){ var num=1 return function name() { return num++ } } let a = fu() a() // console.log(a()) 打印 '1' a() // 2 a() // 3 闭包对页面的影响 过多使用闭包会导致内存造成溢出 占有内存资源过多 来源: CSDN 作者: HWSss 链接: https://blog.csdn.net/HWSss/article/details/103747256

《JavaScript Ninja》之闭包

允我心安 提交于 2020-01-15 00:30:01
闭包 闭包是什么,它们是如何工作的 闭包 是一个函数在创建时允许该自身函数访问并操作该自身函数之外的变量时所创建的 作用域 。 即:闭包可以让函数访问所有的变量和函数,只要这些变量和函数存在于该函数声明时的作用域内就行。 一个简单的闭包: /* 分析:在同一个作用域内声明一个变量和函数,`outerFunction`可以看到并访问`outerValue`。 * 此处是全局作用域,该作用域实际上就是一个闭包,从未消失过(因为页面已经被加载了)。 */ var outerValue = "ninja"; function outerFunction() { alert(outerValue); } outerFunction(); // ninja 更深入的闭包: var outerValue = "ninja"; var later; // 声明一个全局变量 function outerFunction() { // 在函数内部声明一个值。该变量的作用域是限制在该函数内部,并且在函数外部访问不到 var innerValue = "samurai"; // 在外部函数内,声明一个内部函数。注意,声明该函数时,innerValue是在作用域内的。 function innerFunction() { alert(outerValue); alert(innerValue); }

JavaScript 闭包工作原理

自作多情 提交于 2020-01-14 14:53:06
如果是新手 JavaScript 开发人员,你可能已经听说过闭包这个关键字,但是大多数人可能还没有。或者,你是正在寻找新机会的开发人员,并且以前从未用过闭包,但是你知道这对于 JavaScript 开发人员职位的面试至关重要。 通常要了解闭包,仅阅读一篇文章是不够的。但在本文中,你将学习所有用到的概念来进行解释它,以及这些概念如何一清二楚地协同工作。 闭包存储一个 函数 中的当前 定义 以及 作用域信息 ,将其传递给 外层作用域 。通常内层作用域无法从 词法作用域 环境中的 外层作用域 访问。 这个定义一开始可能看起来很吓人,但现在只关注关键字。首先让我从 作用域 关键字开始,它还将告诉你有关 词法作用域 的信息。 作用域 在编程中,作用域是一个基础概念,负责命名绑定。当在一个代码块中声明一个函数或者变量时,这些命名绑定从代码的其它部分可以访问或者不能访问。我们通常称之为作用域。 编程语言是在这个作用域概念的基础上创建的,以支持开发人员的安全性和持久性。 有两种常见的作用域方法,即 词法(静态)作用域 和 动态作用域 。 大多数已知的编程语言都在使用词法作用域,也称为静态作用域。这些编程语言是 C、C++、Java、JavaScript、Python 等。 在 Perl 和 Lisp 中,你可能更愿意用动态作用域。而且 Logo 作为一种编程语言也建立在动态作用域的基础上。 因此

Swift 入门之简单语法(六)

陌路散爱 提交于 2020-01-14 02:21:40
KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [String: AnyObject]) { setValuesForKeysWithDictionary(dict) } 以上代码编译就会报错! 原因: KVC 是 OC 特有的,KVC 本质上是在 运行时 ,动态向对象发送 setValue:ForKey: 方法,为对象的属性设置数值 因此,在使用 KVC 方法之前,需要确保对象已经被正确 实例化 添加 super.init() 同样会报错 原因: 必选属性 必须在调用父类构造函数之前完成初始化分配工作 将必选参数修改为可选参数,调整后的代码如下: /// 个人模型 class Person: NSObject { /// 姓名 var name: String? /// 年龄 var age: Int? /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [String: AnyObject]) { super.init() setValuesForKeysWithDictionary(dict) } } 运行测试,仍然会报错

关于swift中的只读属性

你说的曾经没有我的故事 提交于 2020-01-14 02:20:10
getter & setter 在 Swift 中 getter & setter 很少用,以下代码仅供了解 private var _name: String? var name: String? { get { return _name } set { _name = newValue } } 存储型属性 & 计算型属性 存储型属性 - 需要开辟空间,以存储数据 计算型属性 - 执行函数返回其他内存地址 var title: String { get { return "Mr " + (name ?? "") } } 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性 计算型属性本身不占用内存空间 不可以给计算型属性设置数值 计算型属性可以使用以下代码简写 var title: String { return "Mr " + (name ?? "") } 计算型属性与懒加载的对比 计算型属性 不分配独立的存储空间保存计算结果 每次调用时都会被执行 更像一个函数,不过不能接收参数,同时必须有返回值 var title2: String { return "Mr" + (name ?? "") } 懒加载属性 在第一次调用时,执行闭包并且分配空间存储闭包返回的数值 会分配独立的存储空间 与 OC 不同的是,lazy 属性即使被设置为 nil

swift只读属性

这一生的挚爱 提交于 2020-01-14 02:19:15
只读属性 getter & setter 在 Swift 中 getter & setter 很少用,以下代码仅供了解 private var _name: String? var name: String? { get { return _name } set { _name = newValue } } 存储型属性 & 计算型属性 存储型属性 - 需要开辟空间,以存储数据 计算型属性 - 执行函数返回其他内存地址 var title: String { get { return "Mr " + (name ?? "") } } 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性 计算型属性本身不占用内存空间 不可以给计算型属性设置数值 计算型属性可以使用以下代码简写 var title: String { return "Mr " + (name ?? "") } 计算型属性与懒加载的对比 计算型属性 不分配独立的存储空间保存计算结果 每次调用时都会被执行 更像一个函数,不过不能接收参数,同时必须有返回值 var title2: String { return "Mr" + (name ?? "") } 懒加载属性 在第一次调用时,执行闭包并且分配空间存储闭包返回的数值 会分配独立的存储空间 与 OC 不同的是,lazy

JS高级---复习

这一生的挚爱 提交于 2020-01-13 11:20:43
apply和call方法的使用和区别 都可以改变this指向的 使用方式: 函数名.apply (对象,[参数1,参数2,参数3,...]); 函数名.cal (对象,参数1,参数2,参数3,....); 我想要使用其他对象的某个方法, 其他对象.方法名.apply(当前对象,参数,...); 这个方法就会被当前的对象所使用,同时这个方法中的this就是当前的对象,在调用方法的时候改变了this的指向 bind方法的使用和区别 复制一个方法或者是函数,是在复制的同时改变了this的指向 使用方式: 函数名.bind(对象,参数1,参数2,...);------>返回值是复制之后的这个函数 高阶函数---->函数的使用的方式:函数作为参数使用,函数作为返回值使用 函数作为参数使用的时候,这个函数可以是匿名函数,也可以是命名函数 作用域和作用域链及预解析 闭包: 函数中有另一个函数, 或者是一个函数中有另一个对象, 里面的函数或者是对象都可以使用外面函数中定义的变量或者数据, 此时形成闭包 function f1(num){ return function(){ console.log(num); } } f1(20) 闭包模式: 函数模式闭包, 对象模式的闭包 闭包的作用: 缓存数据, 延长作用域链, 同时也是缺点, 函数中的变量不能及时的释放 沙箱: 就是一个环境, 也可以叫黑盒,