闭包

Python——lambda函数

扶醉桌前 提交于 2019-12-03 13:10:25
Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。 好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。 先来看个简单 lambda 函数 >>> lambda x, y : x+y <function <lambda> at 0x102bc1c80> x 和 y 是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能 >>> add = lambda x, y : x+y >>> add <function <lambda> at 0x102bc2140> >>> add(1,2) 3 它等同于常规函数 >>> def add2(x, y): ... return x+y ... >>> add2 <function add2 at 0x102bc1c80> >>> add2(1,2) 3 如果定义匿名函数,还要给它绑定一个名字的话,有点画蛇添足

Go语言的函数06---闭包函数

放肆的年华 提交于 2019-12-03 13:04:13
package main import "fmt" /* 李逵和武松的Study方法的逻辑是几乎一模一样的 然而为了分别保存两人的学习进度,需要开辟两个全局变量,函数内部的需要使用两条分支结构才能完成业务逻辑 如果是108将都来学习。。。 此时代码的可复用性很差 */ var progress int func Study(name string, hours int) ( int) { fmt.Printf("%s学习了%d小时",name,hours) progress += hours return hours } func main081() { progress := Study("黑旋风",5) fmt.Printf("李逵的学习进度%d/10000",progress) } /* 使用闭包函数优化Study 每个人有不同的学习进度,将这个进度保存在【各自的闭包】中 */ /* 闭包函数:返回函数的函数 闭包函数的好处:使用同一份内层函数的代码,创建出任意多个不同的函数对象,这些对象各自的状态都被保存在函数闭包(外层函数)中,各行其道,互不干扰 */ func GetStudy(name string) func(int) int{ var progress int study := func(hours int) int { fmt.Printf("%s学习了%d小时

闭包

我的未来我决定 提交于 2019-12-03 11:14:21
(1)内外函数   如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。 (2)闭包定义   在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量 #闭包函数的实例 # outer是外部函数 a和b都是外函数的临时变量 def outer( a ): b = 10 # inner是内函数 def inner(): #在内函数中 用到了外函数的临时变量 print(a+b) # 外函数的返回值是内函数的引用 return inner if __name__ == '__main__': # 在这里我们调用外函数传入参数5 #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo #

11.3 写些东西吧

独自空忆成欢 提交于 2019-12-03 09:52:29
  因为自己最近也在准备面试,就打算写一些有关面试的东西,也算加深记忆; 1.meta标签的定义   meta标签是head部的一个辅助性标签,提供关于HTML文档的元数据,他并不会显示在页面上,但对于机器是可读的,可用于浏览器(如何显示内容或重新加载页面),SEO或其他web服务。 作用   seo优化,定义页面使用语言,自动刷新并指向新的页面,实现网页转换的动态效果,控制页面缓冲,网页定级评价,控制网页显示的窗口。 2.ajax的过程   (1)创建XHR对象,也就是创建一个异步调用对象。   (2)创建一个新的http请求,并指定请求的方法,url及验证信息   (3)设置响应http请求状态变化的函数   (4)发送http请求   (5)获取返回的数据   (6)使用dom和js实现局部刷新 3.什么是闭包   闭包其实相对于比较难理解一些,不过它基本可以解释为是在另一个作用域内创建一个封闭的词法范围。   闭包另一个应用是创建私有变量和方法。   在JS中没有明确的方法来创建私有方法,但闭包可以有私有方法。 4.this关键字   this一般表示当前所在对象。   js中的This关键字由函数的调用者决定,谁调用this就指向哪个,如果找不到调用者,this将指向windows对象。 5.js如何处理同步和异步   js是一种只有一个调用堆栈的单线程编程语言

Swift3.0带来的变化汇总系列三——函数和闭包写法上的微调

拈花ヽ惹草 提交于 2019-12-03 09:34:22
Swift3.0带来的变化汇总系列三——函数写法上的微调 一、函数方面 Swift3.0相比Swift2.2的版本在API上做了大量的修改,代码风格也更加统一。在函数方面,Swift3.0中做的最大修改是修改了内部名称与外部名称的默认规则。 在Swift2.2中,函数参数列表的第一个参数如果开发者不手动设置外部名称,默认是匿名的,除第一个参数以外的其他参数,开发者如果不设置外部名称,默认外部名称是和内部名称相同的,因此在调用函数时,代码常常是这样的: //多参数函数Swift2.2中 第一个参数默认匿名,其他参数默认内部命名与外部命名相同 func myFunc5(param1: Int,param2: Int,param3: Int) { //这里使用的param1,param2,param3是参数的内部命名 param1+param2+param3 } //调用函数的参数列表中使用的param2和param3为外部命名 myFunc5(1, param2: 2, param3: 3) Swift3.0中将这一规则修改为:如果开发者不设置函数中参数的外部名称,则全部参数都默认外部名称和内部名称相同,上面相同的代码,在Swift3.0的环境下是下面这样的: //多参数函数 默认内部命名与外部命名相同 func myFunc5(param1: Int,param2: Int

python 闭包

夙愿已清 提交于 2019-12-03 07:59:33
python 闭包 1. 函数引用 def test1(): print("--- in test1 func----") #调用函数 test1() #引用函数 ret = test1 print(id(ret)) print(id(test1)) #通过引用调用函数 ret() 运行结果: --- in test1 func---- 140212571149040 140212571149040 --- in test1 func---- 2. 什么是闭包 #定义一个函数 def test(number): #在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(number_in): print("in test_in 函数, number_in is %d"%number_in) return number+number_in #其实这里返回的就是闭包的结果 return test_in #给test函数赋值,这个20就是给参数number ret = test(20) #注意这里的100其实给参数number_in print(ret(100)) #注意这里的200其实给参数number_in print(ret(200)) 运行结果: in test_in 函数, number_in is 100

20 闭包

夙愿已清 提交于 2019-12-03 07:24:47
闭包 闭包存在的条件: 闭包就是能够读取其他函数内部变量的函数 python里一切皆对象,你甚至可以返回一个函数,把函数赋值给一个变量等。。。 闭包 = 函数+环境变量(函数外部的变量) 例子: def curve_pre(): a = 25 # 此为环境变量,它在被返回的函数的外面 def cureve(x): return a*x return cureve f = curve_pre() # 此时调用curve_pre返回的是一个闭包(函数+环境变量) print(f(2))结果:50    __closure__闭包方法:返回当前对象的函数的闭包对象: print(curve_pre().__closure__)或print(f.__closure__)结果:(<cell at 0x0000000000A73078: int object at 0x000000005273D1F0>,)    打印闭包中的环境变量: print(f.__closure__[0].cell_contents)结果:25    闭包的意义: 闭包保存的是一个函数现场,它返回的不止是函数,还返回了该函数使用需要的环境变量。 来源: https://www.cnblogs.com/scopicat/p/11783024.html

闭包的理解和应用场景

北慕城南 提交于 2019-12-03 07:07:44
1.什么是 闭包 ?? 在了解闭包之前,我们要清楚js的另一个知识,那就是 作用域链 。什么是作用域链,比如一个函数里面包含着另一个函数,里面的函数在使用一个变量的时候会在函数自己的作用域内去查找这个变量,如果没有,就会沿着作用域链向上级函数的作用域去查找, 这样的一个过程我们就叫做作用域链。 作用域链是可以有函数内部向外部去查找使用需要的变量,但是无法从上到下去查找函数内部的变量,所以这时候就出现了闭包,闭包就是解决这一问题。简单来说, 闭包就是一个可以访问另一个函数内部变量的函数。 1 function f1(){ 2 var n = 100 3 function f2(){ 4 n=n+100 5 console.log(n); 6 } 7 return f2 8 } 9 var temp = f1() 10 temp() // 200 在上述代码中创建了一个函数f1(),并在其内部创建了一个函数f2(),在正常情况下,在f2中可以访问f1中的变量n,但是f1不能访问f2中定义的变量,但是通过return将f2作为参数返回给f1,通过f2闭包来建立起与f1的联系,这样就可以访问f1中的变量 例子2. var aaa = (function(){ var a = 1; function bbb(){ a++; console.log(a); } function ccc(){

闭包

佐手、 提交于 2019-12-03 07:07:25
1.什么是闭包?   闭包的概念: 闭包就是函数嵌套时,让局部变量变成自由变量的环境,是一种让局部变量进化的方式;闭包定义在一个函数内部的函数   垃圾回收机制:用过一次的东西,先放在一个内存中,不立即删掉,可以随时进行还原或再次使用,直到没有任何作用的时候再清除,如家用电器,电脑回收站 2.闭包的应用场景    for循环之中:   for循环之中的i变量会因为for的循环次数被覆盖,所以在for循环内部存在函数时,而且这个函数内会调用i变量,这种情况下就需要用到闭包。  for (var i = 0; i < 10; i++) { console.log(i); //可以访问到每次的i } 必须满足两个条件: 1.在for循环内存在函数 2.函数内会调用这个变量 var ali = document.getElementsByTagName("li"); for(var i=0;i<10;i++){ ali[i].onclick = function(){ console.log(i); //在函数内部就无法访问到外部变量 } } 如何形成闭包 var ali = document.getElementsByTagName("li"); for(var i=0;i<10;i++){ (function(a){ ali[a].onclick = function(){

装饰器

妖精的绣舞 提交于 2019-12-03 06:49:19
#_author:Xing#date:2019/11/2# 装饰器(函数)# 1.作用域:L_E_G_B# 2.高阶函数# (1)函数名可以作为参数输入# (2)函数名可以作为返回值# 3.闭包# 关于闭包:闭包=内部函数+定义函数时的环境def outer(): x=10 def inner():#条件1:内部函数 print(x)#条件2:x为外部环境的一个变量 return inner#结论:内部函数inner就是一个闭包outer()()#10#inner局部变量,全局不能调用#关于闭包:#闭包=内部函数+定义函数时的环境print('-------------')def outer(x): def inner():#条件1:内部函数 print(x)#条件2:x为外部环境的一个变量 return inner#结论:内部函数inner就是一个闭包f=outer(8)f()#8print('-------------')# import time# start=time.time()# time.sleep(1)# end=time.time()# print(end - start)#1.016906499862671print('-------------')#遵守开放封闭原则# def showtime(f):# start = time.time()# f()#