zoukankan      html  css  js  c++  java
  • 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会是一个更加优雅简洁的解决方案。

  • 相关阅读:
    Educational Codeforces Round 69 D E
    洛谷P2325 [SCOI2005]王室联邦
    洛谷P1494 [国家集训队]小Z的袜子
    洛谷P4514 上帝造题的七分钟
    POJ3321Apple Tree
    满血复活前的记录(持续更新ing)
    各位2019见
    LuoguP3338 [ZJOI2014]力
    Codeforces Round #478 Div2 975A 975B 975C 975D
    Codeforces Round #479 (Div. 3) 题解 977A 977B 977C 977D 977E 977F
  • 原文地址:https://www.cnblogs.com/HpuAcmer/p/4772001.html
Copyright © 2011-2022 走看看