美文网首页
day6、闭包,装饰器,回调

day6、闭包,装饰器,回调

作者: 是东东 | 来源:发表于2018-08-22 00:39 被阅读0次
    #请解释下什么是闭包?
    """
    在一些解释性语言中,(比如python,JavaScript、php等),在函数中可以嵌套另外一个函数,如果内部函数引用了外部函数的变量,则构成了产生闭包的条件
    闭包产生的三个条件:
    1)必须有函数的嵌套
    2)内部函数引用外部函数的变量
    3)外部函数返回内部函数
    """
    #在python这样的解释性语言中我们可以把函数看成一个特殊的变量,这个变量中保存的是函数的入口地址
    def func1():
        a = 100
        def func2():
            b = 200
            nonlocal a #如果想把外面的a变量引过来并且可以赋值,需要用nonlocal来引入
            a = 101
            print(a)
        func2()
        print(a)
        return func2 #返回的是func2的函数名,即返回该函数的入口地址
    f = func1()#func1返回的是func2的入口地址
    #调用f
    f() #101
    
    #闭包的应用
    # 什么是装饰器?
    #是一种设计模式,在不改变原来模块的基础上,可以用装饰器给模块额外的新增功能,这些新增功能在该装饰器下生效,离开了该装饰器无效
    #装饰器好处:
    '''
    降低代码耦合度,有利于代码版本的迭代,功能的升级等
    '''
    #装饰器的本质是一个闭包,用另外一个函数作为其参数
    def outer(func):
        def inner():
            print("0")
            func()
            print("1")
        return inner
    #此时这个闭包的参数就是一个函数,就形成了一个装饰器
    
    #定义一个普通函数
    def myfunc():
        print("Hi")
    myfunc()
    
    #给myfunc加装饰器
    f = outer(myfunc)   #此时的f 就是给myfunc加完装饰器以后的函数
    
    #在python2.4以后,装饰器可以如下写:
    @outer
    def hello():
        print("hello")
    hello()
    
    #相当于这种写法
    hello = outer(hello)
    
    #回调
    #主调函数
    def funcA(a, b , c):
        p = a * b
        c(p) #在这里调用了回调函数fancB并且把funcA内部的变量传给了funcB
    
    #定义一个函数,回调函数
    def funcB(p):
        print("你好!,我是函数B", p)
    
    funcA(10, 20, funcB)
    

    相关文章

      网友评论

          本文标题:day6、闭包,装饰器,回调

          本文链接:https://www.haomeiwen.com/subject/gpasiftx.html