• 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 '
    ------------------
    '
    
    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会是一个更加优雅简洁的解决方案。

  • 相关阅读:
    SharePoint 2007中的Permission Level与Permission之间的关系
    如何确定一个SharePoint列表的ID?
    经典线程死锁
    SharePoint的Workflow History列表在哪里?
    SharePoint Designer中设计的workflow出错了, 怎么办?
    清除MOSS的Timer Job Cache的方法 Clear the SharePoint Configuration Cache
    sp_MSforeachtable和sp_MSforeachdb
    sa安全
    几个排名函数的区别
    递归限制
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/4772001.html
Copyright © 2020-2023  润新知