闭包

闭包函数

…衆ロ難τιáo~ 提交于 2020-03-21 00:32:03
闭包函数 一、理解闭包须知 1、闭包函数=名称空间与作用域+函数嵌套+函数对象 2、 核心点: 名字的查找关系是以函数定义阶段为准 二、什么是闭包函数 “ 闭”的概念: 闭函数指的是该函数是内嵌函数;打个比方:笼子内放一个小白鼠,小白鼠就是相对于笼子的比函数。 “包的概念:” 包函数指的是该函数包含对外层函数作用域名字的引用(注意:不是对全局的作用域,只是局部的作用域):打个比方:笼子的小白鼠要吃东西,只能在笼子找。 闭包函数:名称空间于作用域的应用+函数的嵌套 def f2(): x = 11111 def f1(): print(x) f1() #f2与f1就是闭包函数,借上述的比喻,f1是相对于f2的闭函数相当于 #笼子的小白鼠,f2是相对于f1的包函数相当于笼子,f1名称的查找只会去 #f2函数体内查找,于其他任何函数定义于调用无关,因为它们都不是f1函数的 #包 x = 22222 def f3(): x = 33333 f2() def f4(): x = 44444 f3() f4() #打印1111 三、闭包函数:函数对象 def f1(): x = 33333333333333333333 def f2(): print('函数f2:',x) return f2 f=f1() print(f) x=4444 f() def foo(): x=5555 f()

【2020Python修炼记18】Python语法入门—函数对象+函数的嵌套+闭包函数

a 夏天 提交于 2020-03-20 21:34:58
目录 1、函数对象 2、函数嵌套 3、闭包函数 3.1 什么是闭包函数 3.2 如何定义闭包函数 3.3 为何要有闭包函数——闭包函数的应用场景 1、函数对象 函数对象:指的是函数可以被当做’数据’来处理。 # func=内存地址 def func(): print('from func')func()输出结果: from func 具体可以分为四个方面的使用: (1)函数可以 被引用 # func=内存地址 def func(): print('from func') f=func # 将func的内存地址传给 f print(f,func) #输出的是 f func 的内存地址 f() #调用函数 f输出结果:<function func at 0x000001CF11CCA0D0> <function func at 0x000001CF11CCA0D0>from func (2)函数可以 作为容器类型的元素 # func=内存地址 def func(): print('from func') l=[func,] print(l) l[0]() dic={'k1':func} print(dic) dic['k1']() 输出结果: [<function func at 0x000001B6BC12A0D0>] from func {'k1': <function func

函数对象和闭包

你。 提交于 2020-03-18 18:05:56
函数对象和闭包 一.函数对象 1.函数可以被引用 >>> def add(x,y): ... return x+y ... >>> func=add >>> func(1,2) 3 2.函数可以作为容器类型的元素 >>> dic={'add':add,'max':max} >>> dic {'add': <function add at 0x100661e18>, 'max': <built-in function max>} >>> dic['add'](1,2) 3 3.函数可以作为参数传入另外一个函数 >>> def foo(x,y,func): ... return func(x,y) ... >>> foo(1,2,add) 3 4.函数的返回值可以是一个函数 def bar(): return add func=bar() func(1,2) 3 二.闭包函数 1.闭与包 基于函数对象的概念,可以将函数返回到任意位置去调用,但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。 x=1 def f1(): def f2(): print(x) return f2 def f3(): x=3 f2=f1() #调用f1()返回函数f2 f2() #需要按照函数定义时的作用关系去执行,与调用位置无关 f3() #结果为1 也就是说函数被当做数据处理时

Lua语言面向对象之函数闭包的方式面向对象

ε祈祈猫儿з 提交于 2020-03-17 04:16:00
function People(name) local self = {} local function init() self.name = name end self.sayHi = function () print("Hello "..self.name) end init() return self end --local p = People("ZhangSan") --p:sayHi() function Man(name) local self = People(name) -- local function init() -- -- end self.sayHello = function () print("Hi "..self.name) end return self end local m = Man("Lisi") --m:sayHello() m:sayHi() 来源: CSDN 作者: INGNIGHT 链接: https://blog.csdn.net/INGNIGHT/article/details/104884862

【Node.js】匿名函数-闭包-Promise

删除回忆录丶 提交于 2020-03-17 03:17:07
javascript中, 匿名函数多用于实现回调函数和闭包 闭包=函数+引用环境, promise 是 ES6 中语言标准,保存着某个未来才会结束的事件(通常是一个异步操作)的结果. const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }); 0.引言 工作中,有一个业务功能:周期扫描任务,每一个周期会扫描出数据,然后按照周期数存到 elasticsearch ,现在需要每个周期之间的数据是否有重叠关联的数据去支撑 周期快照功能 ,通过 Query DSL +kibana 可视化查询,或可通过肉眼比对,未免劳心劳力。 kibana 也是通过 http post 请求,然后返回数据 json ,那么我们完全可以模拟 kibana 请求,获取数据,再通过代码比对相邻周期数据,输出文件,一个小爬虫兼数据分析的小工具构想浮现在脑海中。 1.第一个index.js 由于真实代码在公司,示例代码做了修改, url 替换成了百度 , post 替换为 get const http = require('https'); function spider() { for (i = 0;

循环引用

不想你离开。 提交于 2020-03-16 06:39:06
1.解决实例之间的循环强引用 (1) 弱引用 : 声明属性或者变量时,在前面加上 weak 关键字 (2) 无主引用 : 和弱引用类似 ,和弱引用不同的是,无主引用在其他实例有相同或者更长 的生命周期时使用 ,在关键字前加 unowned 注意: 使用无主引用,你必须确保引用始终指向一个未销毁的实例。 如果你试图在实例被销毁后,访问该实例的无主引用,会触发运行时错误。 class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } deinit { print("\(name) is being deinitialized") } } class CreditCard { let number: UInt64 unowned let customer: Customer init(number: UInt64, customer: Customer) { self.number = number self.customer = customer } deinit { print("Card #\(number) is being deinitialized") } } 总结: weak常用在可选类型( 两个属性的值都允许为 nil )

彻头彻尾的随笔

跟風遠走 提交于 2020-03-15 07:36:54
辞了职,转魔都 同学问我为什么要过来,答:想感受一下IT精英的感觉,emmmmm 其实就是觉得自己太菜了,向往广阔的天空,想要跟着水涨船高提升一下下自己的水平 不过打脸的是,被offer冲昏头脑的加入了驻场开发,听说和外包也没什么太大的区别...... 不过眼见为实,努力工作模式还是要开启的然后自己去了解感受 万一进步神速呢 然后立一个flag 五年后已加入bat 1. 订阅发布模式 2. vue中data内初始的数据和在mounted中使用this.a = 1这种赋值方式添加的数据有什么不一样   vue实例的数据对象,vue在初始化实例时会递归将data的属性转换为getter/setter,从而让data的属性能够响应数据变化。对象必须是纯粹的对象(key-value)   对于在实例创建后想要添加的数据,可以使用$set(key, value)这种方式实现 (耳闻一个push方法,还未测试) 3. 闭包这个情况,我是真的了解很少,是的这很丢人....有关作用域的处理可以使用let,有关命名冲突的解决可以用闭包    来源: https://www.cnblogs.com/yl179578605/p/10824016.html

js 闭包原理

☆樱花仙子☆ 提交于 2020-03-12 22:15:50
闭包的定义: 闭包是指有权访问另一个函数作用域中的变量的函数 -- 《JavaScript 高级程序设计》。 如何理解这句话:其实就是指 在函数a外面能够访问函数a里面的函数b 。 例如: 1 function a () { 2 var v = 123; 3 function b() { 4 console.log(v); 5 } 6 return b; 7 } 8 9 var b = a(); 10 b(); // 123 执行函数a时把函数b返回,此时函数b就保存到了a的外面,这时候就可以在a函数的外部对b进行访问。 相关知识点: js作用域链 执行原理: 1、首先在预编译全局代码时,生成GO   GO {     a: function a() {...},     b: undefined   } 2、执行 var b = a(); 此时对a函数进行预编译并创建a 函数的AO   AO {     v: undefined,     a: undefined,     b: function b() {...}   } 3、创建a函数的作用域链   a.[[Scopes]] = [AO, GO]; 4、由于函数的提升,会在a函数进行预编译的时候创建b函数的AO   b AO {}   b.[[Scopes]] = [AO(b), AO(a), GO] 5、执行 var v

二、Groovy语法(二):闭包

久未见 提交于 2020-03-12 08:56:50
1、Groovy中闭包基础 1.1 闭包的概念 闭包是被包装成 对象 的代码块,可以通过一个变量引用到它,页可以传递给别人进行处理(像处理一个对象一样处理闭包,比如作为参数传递、作为一个方法的返回值等) 1.2 闭包的定义和调用 //定义一个闭包(闭包是一些代码组成的代码块对象,用{}括起来的一段代码) def closure = { println 'Hello groovy!'} //调用(类似定义了一个方法,然后可以去调用这个方法,可与方法对比着来理解闭包) closure.call() //Hello groovy! closure() //Hello groovy! 1.3闭包参数(普通参数和隐式参数) //定义一个有参数的闭包 利用->区分参数和具体执行代码 def closure = { String name -> println "Hello $name!"} //调用 closure('groovy') //Hello groovy! //多个参数由逗号隔开 def closure2 = { String name,int age -> println "Hello $name! My age is $age"} //调用 closure2('groovy',6) //Hello groovy! My age is 6 //当没有声明参数时

build.gradle文件介绍

烈酒焚心 提交于 2020-03-12 04:43:48
对于以前用Eclipse开发安卓的小伙伴来说,Gradle文件是陌生的。 不同于Eclipse,而Android Studio 是采用Gradle来构建项目的。 先来介绍最外层目录下的build.gradle文件,代码如下: buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' } } allprojects { repositories { jcenter() } } 在repositories闭包中: jcenter() :它是一个代码托管仓库,很多的Android开源项目都会选择将代码托管到jcenter上,声明了这行配置后,我们就可以在项目中轻松使用任何的jcenter上的开源项目了 在repositories闭包中: classpath 'com.android.tools.build:gradle:2.2.2' 声明了一个Gradle插件。 gradle:2.2.2 为Gradle插件的版本号。 下面来介绍app目录下的build.gradle文件,代码如下: apply plugin: 'com.android.application' android { compileSdkVersion 24