python 闭包(closure)

闭包的定义:

闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中。

来一个例子:

def happy_add(a):
    print ‘id(a): %x‘ % id(a)
    def do_add(b):
        return a + b
    print ‘id(do_add): %x‘ % id(do_add)
    return do_add

test_one = happy_add(1)
test_one(9)
print repr(test_one)

print ‘\n------------------\n‘

test_other = happy_add(3)
del happy_add
test_other(16)
print repr(test_other)

执行结果是:

id(a): 7fae91d05788
id(do_add): 10a94a0c8
<function do_add at 0x10a94a0c8>

------------------

id(a): 7fae91d05758
id(do_add): 10a94a6e0
<function do_add at 0x10a94a6e0>

分析:

首先id(x)是求出x在内存中的地址。

两次id(a)不同,说明变量绑定到各自的嵌套函数对象。

每次调用happy_add()会产生不同的对象,会存储在不同的地方。

封闭命名空间删除(del happy_add)也不会影响闭包函数的执行。

就这么一个函数写成class:

class happy_add:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

test_one = happy_add(1, 9)
print test_one.add()

是不是很不美观,有种小题大做的感觉。

闭包的判断:

(1)一个嵌套函数(函数里面的函数)

(2)嵌套函数用到封闭函数里定义的一个或多个值

(3)封闭函数的返回值是嵌套函数

什么时候用闭包:

闭包的好处是避免使用全局变量和提供了数据隐藏的一种可选形式。问题是这些都可以通过class来实现,为什么还要有closure呢?通常,当属性和方法很多的时候用类。反之(大多数情况一个方法),则选择closure,closure会是一个更加优雅简洁的解决方案。

时间: 2024-10-08 10:28:54

python 闭包(closure)的相关文章

Python闭包Closure

Python的闭包和Python的内部函数 1 Python内部函数 def out(x): def inner(y): return "inner use % s" % y return inner(x) print out("jeapedu") 在out里定义了一个inner函数,out的返回值是调用inner(x)的值 2 python的闭包Closure def closure(x): def inner(y): return "closure u

python 闭包 Closure 函数作为返回值

一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 1 >>> def lazy_sum(*args): 2 ... def sum(): 3 ... ax = 0 4 ... for n in args: 5 ... ax = ax + n 6 ... return ax 7 ... return sum 8 ... 9 >>> f = lazy_sum(1, 3, 5, 7, 9) 10 >>> f 11 <

Python闭包与函数对象

1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (also lexical closures or function closures) are a technique for implementing lexically scoped name binding in languages with first-class functions. Ope

Python闭包的学习

Python闭包的学习 什么是闭包? 借用维基上解释:在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体.闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例. 好吧,看了这段定义的确不是还不能立即理解闭包到底是什么.不过,闭包并不是很难理解,往下看几个小例子就能明

【Rollo的Python之路】Python 闭包:Colsure

Python 闭包:Closure. 定义: python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 闭包是由函数及其相关的引用环境组合而成的实体. 函 数是一等公民(First class value:第一类对象,我们不需要像命令式语言中那样借助函数指针,委托操作函数),函数可以作为另一个函数的参数或返回值,可以赋给一个变量.函数可 以嵌套定义,即在一个函数内部可以定义另一个函数,

javascript 闭包(closure)

<script type="text/javascript">    //闭包(closure):内层函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经结束    //注意内层函数引用的外层函数内的变量是外层函数执行结束后的最终值    test(1);    function test(a) { //外层函数        alert(a+' 外层函数开始执行');        setTimeout(function(){//内层函数           

Swift语言精要-闭包(Closure)

闭包(Closure)这个概念如果没学过Swift的人应该也不会陌生. 学过Javascript的朋友应该知道,在Javascript中我们经常会讨论闭包,很多前端工程师的面试题也会问到什么是闭包. 那么,什么是闭包呢? 让我们看下在Javascript中闭包的解释: Closures are functions that have access to variables from another function’s scope. (This is often accomplished by

Swift中使用typealias定义一个闭包closure

在OC中我们定义一个Blocks是这样定义的: typedef void (^ZWProgressHUDCompletionBlock)(); 在Swift中定义一个闭包是这样的: typealias ZWProgressHUDCompletionBlock=()->Void 转载请注明!!!欢迎大家加入交流群:爱疯.爱Coding:209476515 Swift中使用typealias定义一个闭包closure,布布扣,bubuko.com

深入理解JavaScript闭包(closure)

最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目. 一.什么是闭包? “官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个