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也是基于每一次的基础上进行运算。
  • 相关阅读:
    集合类的相关之区别
    String,实例,变量
    Java集合类详解
    英语飙升的好方法[网上转来的]
    jstl标签常用标签(全)
    Android 菜单(OptionMenu)大全 建立你自己的菜单
    持久层封装 JDBC
    SQL Sever 常用语句总结
    异常:数据库没有有效所有者,因此无法安装数据库关系图支持对象
    Log4j配置详解
  • 原文地址:https://www.cnblogs.com/themost/p/6359114.html
Copyright © 2011-2022 走看看