• 闭包


    闭包:函数式编程重要的语法结构
    
    如果在一个内部函数里,对外部作用域(但不是全局变量)的变量进行引用,那么内部函数就被称为闭包,举例如下
    
    >>> 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也是基于每一次的基础上进行运算。
  • 相关阅读:
    怎样跟老板提加薪,来看看自己值多少钱
    leetcode-204-Count Primes
    Atitit. 异常的使用总结最佳实践java .net php Vo8f
    设计模式——第一课
    linux svn命令具体解释
    BTrace介绍和生产环境样例
    5.3.5 namedtuple() 创建命名字段的元组结构
    linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
    hrtimer高精度定时器的简单使用【学习笔记】
    Linux时间子系统之(一):时间的基本概念【转】
  • 原文地址:https://www.cnblogs.com/themost/p/6359114.html
Copyright © 2020-2023  润新知