zoukankan      html  css  js  c++  java
  • Python3-内部函数 和 闭包

     一、内部函数 特点:
        1.可以访问外部函数的变量
        2.内部函数可以修改外部函数的可变类型的变量,比如:list
        3.内部函数修改全局的不可变变量时,需要在内部函数声明 global  变量名
          ............外部函数..........,......声明:nonlocal 变量名
        4.locals()查看本地变量有哪些,以字典的形式输出
        5.globals()内置函数查看全局变量有哪些,以字典的形式输出(注意里面会有一些系统的键值对存在)
     
    示例:
       
     1  a = 100
     2 print(globals())
     3  
     4 def func():
     5     # 声明变量
     6     b = 99
     7     # 声明函数
     8     def inner_func():
     9         c = 88
    10         print(a,b,c)
    11     inner_func()
    12     print(locals())
    13     # 使用locals()内置函数进行查看,可以看到在当前函数中声明的内容有哪些
    14 func()
    结果:
    1 {'__name__': '__main__', '__spec__': None, 'a': 100, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002BB5BE49A58>, '__package__': None, '__doc__': None, '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'F:/SakuraUMR/function/demo.py'}
    2 100 99 88
    3 {'inner_func': <function func.<locals>.inner_func at 0x000002B53A26A598>, 'b': 99}

     

     
    二、闭包条件:
            1.外部函数中定义了内部函数
            2.外部函数是有返回值
            3.返回的值是:内部函数名
            4.内部函数引用了外部函数的变量
     
            格式:        
    1 def 外部函数():
    2     ...
    3      def 内部函数():
    4         ...
    5      return 内部函数
            示例:
    1 def func():
    2     a = 100
    3     def inner_func():
    4         print(a)
    5     return inner_func
    6  
    7 f = func()
    8 f()

     

            结果:100
     
    三、闭包-----缺点:
            1.作用域没有那么直观
            2.因为变量不会被垃圾回收,所以有一定的内存占用问题
     
    四、闭包-----作用
            1.可以使用同级的作用域
            2.读取其他元素的内部变量
            3.延长作用域
     
    五、闭包-----总结:
            1.闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成
            2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
            3.必报的好处,使代码变得简洁,便于阅读代码
            4.闭包是理解装饰器的基础
     
  • 相关阅读:
    java之集合Collection 3个例子
    利用 ssh 的用户配置文件 config 管理 ssh 会话
    angularJS--apply() 、digest()和watch()方法
    37.创业团队不是天堂
    Android DiskLruCache 源码解析 硬盘缓存的绝佳方案
    sublime安装AngularJS插件
    angularJS 服务--$provide里factory、service方法
    angularJS--多个控制器之间的数据共享
    angularJS---自定义过滤器
    依赖反转
  • 原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/12997198.html
Copyright © 2011-2022 走看看