闭包

Lambda函数及其用法

隐身守侯 提交于 2019-12-02 17:08:09
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 lambda使用场景: #1.函数式编程: 例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列 >>> list1 = [3,5,-4,-1,0,-2,-6] >>> sorted(list1, key=lambda x: abs(x)) [0, -1, -2, 3, -4, 5

Lambda函数及其用法

我怕爱的太早我们不能终老 提交于 2019-12-02 17:06:34
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 lambda使用场景: #1.函数式编程: 例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列 >>> list1 = [3,5,-4,-1,0,-2,-6] >>> sorted(list1, key=lambda x: abs(x)) [0, -1, -2, 3, -4, 5

chapter 11 function

心不动则不痛 提交于 2019-12-02 16:39:48
第十一章,函数 #coding: utf-8 from operator import add,sub from random import randint, choice ops={'+':add,'-':sub} MAXTRIES=2 def doprob(): op=choice('+-') nums=[randint(1,40) fori in range(2)] nums.sort(reverse=True) ans=ops[op](*nums) pr='%d%s%d='%(nums[0],op,nums ) oops=0 while True: try: ifint(raw_input(pr))==ans: print '马思尧correct' break ifoops==MAXTRIES: print'answer\n%s%d'%(pr,ans) else: print'马思尧你算错了,incorrect...try again' oops=oops+1 except(KeyBoardInterrupt,EOFError,ValueError): print'invalid input... try again' def main(): while True: doprob() try: opt=raw_input('again? ').lower() if opt

原生JS的闭包详解~~

本秂侑毒 提交于 2019-12-02 16:27:02
了解闭包之前我们需要懂的东西:需要知道JS的作用域链以及预解析。 进入话题,作用域链上面的东西是存在哪里的呢。 是一个栈结构,最底层是window对象。 栈就是类似一个桶装结构,如图1: 图一 : 栈结构具有的特点就是先入后出。 好比你放进桶里的东西,你需要从最上面开始拿出来。 JS代码的解析过程中:例如JS代码里有一个函数foo. <script>                    var a = 1; function foo() { }                    foo(); </script> 预解析:那么预解析到这个函数时,发生了如下的事情: 由于函数是引用类型的对象,实际数据存在堆里,那么在栈里只存放了地址。0x1101这个地址指向堆的实际数据。 运行到这个函数时,它会创建一个foo的作用域链对象。然后存入一个栈里,这个栈底层永远是window. 函数执行=>foo() 又会发生的事情:栈里面的foo创建了一个活动对象。即执行了这个函数。 当函数执行完毕:foo的作用域链出栈,没有被指向的活动对象即销毁。但是window不会被销毁。 (PS:橡皮擦太小了,没擦干净) 闭包是什么呢? 官方解答是有权去访问函数内的变量。 我们现在来写一个函数: function foo(){ var n = 0;   //返回了一个函数。 这个函数的n 是从foo里面找的n

闭包和垃圾回收机制

被刻印的时光 ゝ 提交于 2019-12-02 16:26:34
function a(){ var i=0; function b(){ alert(++i); } return b; } var c=a(); c(); // 1 c(); // 2 c(); // 3 这段代码有两个特点: 1、 函数b嵌套在函数a内部 ; 2、 函数a返回函数b。 这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。 这段代码其实就创建了一个闭包,这是因为函数a外的变量c引用了函数a内的函数b。 也就是说,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。 function foo() { var a = 1 function fn() { a++; console.log(a) } return fn() } console.log(foo); foo(); foo(); function fn1() { var a = 1; var b = 2; function fn() { a++; console.log(a) } return fn; } var x = fn1(); x(); x(); var x = fn1(); x(); 通常, 函数的作用域及其所有变量都会在函数执行结束后被销毁。 但是, 在创建了一个闭包以后,

重学JavaScript之匿名函数

梦想的初衷 提交于 2019-12-02 14:58:25
1. 什么是匿名函数? 匿名函数就是没有名字的函数,有时候也称为《 拉姆达函数 》。匿名函数是一种强大的令人难以置信的工具。如下: function a(a1, a2, a3) { // 函数体 } ==其他函数表达式== var a = function(a1, a2, a3) { // 函数体 } 以上两个例子在逻辑上等价,其主要的区别是: 前者会在代码执行前被加载到作用域中,而后者则是在代码执行到那一行的时候才会有定义。另一个重要的区别就是: 函数声明会给函数一个指定的名字 ,而函数表达式则是: 创建一个匿名函数,然后将这个匿名函数赋给一个变量。 function(a1, a2, a3) { // 函数体 } 上面例子也是完全可以的,但是却无法调用这个函数,因为没有指向这个函数的指针,但是可以将这个函数作为参数传入另外一个函数,或者从一个函数中返回另一个函数时就可以使用这种形式来定义匿名函数。 2. 递归 递归函数是在一个函数通过名字调用自身的情况下构成的 function f(num) { if (num <= 1) { retrun 1 } else { return num * f(num - 1) } } 以上,这是一个经典的递归阶乘函数,表面上没有任何问题,但是却会被以下代码导致出错: var a = f f = null console.log(a(4) //

python学习笔记之---装饰器

≯℡__Kan透↙ 提交于 2019-12-02 14:58:21
装饰器:也是一种设计模式 decorator 核心作用:给不同的函数(方法用),可以增加不同的公用的功能。 装饰器的标志:带@符号的,如: @classmethod @staticmethod 闭包:函数对象+函数部分所需要使用的一个外部变量=函数 返回的整体。 例子1: #函数对象可以做为返回值返回 def pri(): return sum #函数执行后返回了另外一个函数对象sum print(type(pri())) D:\>py -3 a.py <class 'builtin_function_or_method'> 函数对象:就是函数不加()----sum,如果加()就是函数调用----sum() 例子2: #函数的参数可以使用函数对象 def func1(func): return func([1,2,3]) func1(sum) ''' func1(sum) #--->6 #sum->sum([1,2,3]) #pri-->pri([1,2,3])--->不符合函数定义,会报错 ''' 执行结果: D:\>py -3 a.py <class 'builtin_function_or_method'> Traceback (most recent call last): File "a.py", line 11, in <module> func1(pri) File

图论--传递闭包(Floyd模板)

十年热恋 提交于 2019-12-02 14:37:23
#include<iostream> #include<cstring> #include<cmath> using namespace std; int dp[105][105],in[105],out[105]; int init() { for(int i=1;i<=105;i++) { in[i]=0; out[i]=0; for(int j=1;j<=100;j++) { dp[i][j]=0; } } } int main() { long long t; cin>>t; while(t--) { init(); long long n,m; cin>>n>>m; long long flag=0; for(int i=1;i<=m;i++) { long long l,r; cin>>l>>r; dp[l][r]=1; if(l==r) flag=1; //自己排在自己前面是不可能的,直接按题意输出0 } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=(dp[i][k]&&dp[k][j]);//floyd 讨论图的连通性 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(dp[i][j]==1&&dp[j][i]==1)

Python二次元世界-Lisp的帝国斜阳 lambda与closure

吃可爱长大的小学妹 提交于 2019-12-02 14:21:55
Python 二次元世界 - 函数式编程 Function , lambda 与 closure 本章讲述 Python 语言自 Lisp 语言演变而来的一些高级函数编程技巧 如闭包 (closure) 匿名函数( lambda ) 生成器 (yield) 嵌套作用域 (nested scope) 好的 Python 程序员 必须熟练掌握这几种特性 能快速地将代码移植到类 Lisp 语言 如 scheme Emacs-Lisp JavaScript Java8 中 特别提示∶在您浏览本教程时,不要强行记忆。记住一点∶在使用中学习。 1. Function Python 的函数的本质是对象方法和模块属性 声明 / 定义一个函数 def foo(): print “bar” 函数作用于对象 object/reference foo 函数的调用 foo() or obj.foo() 如果没有 return 语句 Python 函数默认返回值是 None >>> def hello(): ... print 'hello world' >>> >>> res = hello() hello world >>> res >>> print res None >>> type(res) <type 'None'> 不同其他编程语言 Python 不可以拥有多个返回值 但是你可以返回一个 类型为

深入理解Javascript闭包

自古美人都是妖i 提交于 2019-12-02 14:21:27
最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业。对于初学者来说别说理解闭包了,就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目。   一、什么是闭包?   “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。   相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段代码: function a(){ var i=0; function b(){ alert(++i); } return b; } var c = a(); c();   这段代 来源: oschina 链接: https://my.oschina.net/u/49703/blog/2409