zoukankan      html  css  js  c++  java
  • day13

    函数的嵌套定义

    就是函数内部在定义一个新的函数

    函数fn2 想使用函数fn1 内部定义的局部变量 直接把函数fn2 定义在函数fn1 内部 这样函数fn2 可以直接访问 函数fn1内部的变量

    如果函数fn2 被定义在函数fn1 中 就成为了函数fn1中的局部变量  fn2与函数地址的对应关系就存放在 函数fn1建立起来的 局部名称空间中 外部是无法调用函数fn2 的  只能在函数fn1中 把他return fn2 作为函数fn1函数的返回值 这样外部才能调用 fn2   也就是一个函数对象可以作为另个函数的返回值

    在外部也可以用fn2变量来接受fn1的返回值 fn2 与返回值的对应关系存放在全局名称空间中  返回值就等于赋值给了外部的fn2 外部fn2 与函数内部的fn2指向同一个函数地址那么函数内部的fn2 就能被外部调用了

    global关键字

    ·将局部变量提升为全局变量 如果与全局变量有重名 就统一全局与局部变量如果想更改全局变量的值发生地址的变化可用global声明该变量  全局没有同名变量 直接提升局部变量为全局变量

    nonlocal

    将局部的变量提升为嵌套局部变量  必须要有同名嵌套的局部变量 就是统一嵌套局部与局部的同名变量

          如果局部想改变嵌套局部变量的值(发生地址的变化),可以用nonlocal声明该变量

    开放封闭原则

    在不修改原代码与调用方式的情况下 为原函数添加新的功能

    弊端 当修改源代码的情况下  会使其函数不具备特有的功能 而且调用方式也会随着改变 加载后期维护的难度

    装饰器

    # 装饰器:满足开放封闭原则的一个闭包应用
    # @outer语法来调用outer,规定传入被装饰的函数对象,所以参数固定为一个,接受被装饰的函数对象
    def outer(func): 
        # 不能确定被装饰的函数的参数:来者不拒,用可边长来接受
        def inner(*args, **kwargs):
            pass  # 新功能位
            res = func(*args, **kwargs)  # 解压带给原功能
            pass  # 新功能位
            return res
        return inner

    # 使用装饰器(outer),得到新功能(inner)
    # 用被装饰的函数名去接受装饰器的执行结果,调用装饰器时传入被装饰的函数对象
    @outer  # fn = outer(fn) = inner
    def fn(): pass

    # 表面感觉调用的是原函数,本质调用的是闭包(inner),使用fn调用和fn定义及inner需要参数统一
    fn()
  • 相关阅读:
    Windows 2003上配置Autodesk授权管理器ADLM (Autodesk License Manager)
    Autodesk 2010年GIS培训意愿调查正在进行…
    MapGuide应用开发系列(四) 如何运行第一个.net实例代码
    MapGuide应用开发系列(三)MapGuide 数据包管理及Maestro亮点功能介绍
    c语言动态指针"数组"一种伪二维数组
    c语言链表实现一元多项式的加减乘运算
    (转)D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别
    (转)DirectX图象中设备支持的原基类型D3D入门
    通过动态内存分配来实现类似于动态数组的功能
    DirectX9.0教程之ID3DXSprite篇[转载]
  • 原文地址:https://www.cnblogs.com/huikejie/p/10785639.html
Copyright © 2011-2022 走看看