zoukankan      html  css  js  c++  java
  • 闭包

    闭包:函数式编程重要的语法结构
    
    如果在一个内部函数里,对外部作用域(但不是全局变量)的变量进行引用,那么内部函数就被称为闭包,举例如下
    
    >>> def funX(x):
         def funY(y):
            return x * y #这里的内部函数funY对外部作用的变量x进行了引用,就成内部函数funY为闭包
         return funY
    
    >>> i = funX(5)
    >>> i(8)
    40
    >>> funX(5)(8)
    40
    #同样的,闭包中外部函数的变量与内部函数的变量相当于全局变量与局部变量的关系,一旦走出函数,就不能再调用内部函数
    
    #pyhton3有一种新的解决方案可以在闭包中改变外部作用域的值,关键字是 nonlocal,举例如下
    
    例1:
    
    >>> def myfun():
          x = 5
          def myfun2():
            x += 5 #这里试图改变外部作用域的变量,产生了错误
          return myfun1()
    
    >>> myfun()
    Traceback (most recent call last):
    File "<pyshell#53>", line 1, in <module>
    myfun()
    File "<pyshell#52>", line 5, in myfun
    return myfun1()
    NameError: name 'myfun1' is not defined
    
    
    例2:
    
    >>> def myfun():
          x = 5
          def myfun2():
            nonlocal x #这里使用nonlocal关键字通知python将会改变外部区域的变量
            x+=5
            print(x)
          return myfun2()
    
    >>> myfun()
    10
    
    例3:
    
    def funX():
      x = 5
      def funY():
        nonlocal x
        x += 1
        return x
      return funY
    
    a = funX()
    
    print(a())
    print(a())
    print(a())
    print(a())
    
    6
    7
    8
    9
    
    正常来讲全局变量每一次循环都会重新开始,但是这里a的值一直没有被释放,变量x也是基于每一次的基础上进行运算。
  • 相关阅读:
    写多了博客,就想沽名钓誉
    中医与DBA
    关于OneProxy推广
    使用分布式数据库集群做大数据分析之OneProxy
    不能使用tpcc-mysql测试OneProxy
    下三滥
    建立自己的客户关系网
    编译spock proxy
    胆子还是小了
    主流语言的异常处理对比
  • 原文地址:https://www.cnblogs.com/themost/p/6359114.html
Copyright © 2011-2022 走看看