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()

 

posted @ 2019-04-28 19:02  huikejie  阅读(85)  评论(0编辑  收藏  举报