zoukankan      html  css  js  c++  java
  • python闭包小例子

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

    首先根据实例, 体会一下闭包的效果

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

          

    定义闭包:

    def foo(x):  

        a = [0]  

        def bar(y):  

            a[0] = a[0]*x + y

            print(a[0])        

            return a[0]

            

        return bar  

        

        

    使用闭包

    f=foo(1)

    f(2) #print 2

    f(2) #print 4

    f(2) #print 6

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

    闭包要达到的目的

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

    普通函数, 输入给定后, 输出总是一定的, 比如add(1,2), 无论调用多少次, 结果永远是3。

    闭包则不同, 在函数在执行后, 有能力保持函数执行后的环境, 为下次闭包的执行营造一个新的环境. 

    典型的为了闭包而闭包的情形有:

    1. 看起来像闭包, 实际上并不具持久化的代码,. 

    2. 看起来像闭包, 实际上却使用了global变量来支持持久化. 

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

    闭包的意义

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

    一句话,类是包含行为的数据,闭包是有数据的行为。一般情况下,我们完全可以使用全局变量+函数来实现持久化,或者写个类,可读性比闭包好多了。

    闭包的作用, 摘自http://www.gracecode.com/posts/2385.html

        setTimeout/setInterval

        回调函数(callback)

        事件句柄(event handle)

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

    闭包模板

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

    ##闭包的定义模板

    def foo(x):   

        a = [0]                 #声明一个local变量来支持持久化, 因为python2不支持nonlocal, 所以这里用了list, 而不是a=0

        def bar(y):

    a[0] = a[0]*x + y   #修改local变量的值, 因为python2不支持nonlocal, 所以赋值给了a[0]而不是a

            print(a[0])         

            return a[0]         #内部函数一定要返回持久化变量, 这里可返回a[0]或a

            

        return bar              #外部函数一定是返回内部函数

        

    ##闭包的使用模板

    f=foo(1)  #定义一个闭包, 就像实例化一个类一样, 参数要符合外部函数签名

    f(2)      #执行闭包, 就像调用某个函数一样, 参数要符合内部函数签名

     
  • 相关阅读:
    一篇好文,以在迷茫时阅读
    [转]EeeBox 安裝 Debian 後驅動 Wireless 筆記
    SVN内外网版本库同步手册
    Android小试牛刀之1——对话框应用和SharedPeferences存储
    关于Lucene.net 2.9.2.2 中删除索引的若干问题
    提高SQL SERVER并发能力
    Entity Framework 4 Poco开发之旅 part 2
    在linux下安装dropbox
    Windows平台高性能站点手册
    利用java反射原理写了一个简单赋值和取值通用类【改】
  • 原文地址:https://www.cnblogs.com/harrychinese/p/python_closure.html
Copyright © 2011-2022 走看看