• Python函数名做参数,闭包,装饰器


    简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数。就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数。

    请看下面的代码,注意标红的位置,猜猜看结果

    def a(func):
    
            def inner():
    
                    print("验证中")
    
                    func()
    
            return inner
    
    def f2():
    
            print("--------2-----")
    
    
    f2 = a(f2)
    
    f2()

    结果如下:

    验证中

    --------2------

    讲一下闭包的意思,就是像第一个函数a,有一个参数func(可以是任意参数),然后a函数体的内部又定义了一个函数,这个函数可以有参数可以没有,这个里面的函数内部用到了外部函数a的参数,此时就称为闭包。这种应用场景一般是在外部的函数的参数不经常变,但是里面的参数经常需要变的时候,比如:

    def test(a,b):

            def inner(x):

                    return a*x+b

            return inner

    上面这个例子,a、b是两个常量,x经常变化,就可以这样调用:

    c = test(2,3)          #只需要调用一次test,调用inner的时候可以多次使用a、b的值

    inner(5)-------------------------à结果就是2*5+3

    inner(6) -------------------------à结果就是2*6+3

    ……

    然后我讲解一下为什么上面会出现那个的结果,讲一下程序执行的步骤:

    1. 先执行def a(func):这一行,是一个定义函数,不做操作
    2. 接着往下,执行def f1():这行仍然不做操作
    3. 接着往下,执行def f2():这行仍然不做操作
    4. 再往下执行一直f2=a(f2),执行句话的时候,先执行右侧,a(f2)调用函数a参数f2f2一个函数名注意哦,f2后面没有()意思就是说这里只是f2这个引用传递给了函数a的参数func),此时func指向了f2函数体。进入到a函数里面,执行def inner()这句话仍然不做操作,然后执行return inner这里也要注意inner后面没有()执行return这句话就是把inner返回给了等号左边f2变量,可以理解为f2=inner
    5. f2(),这句话4的时候把inner的引用给了f2,意味f2现在指向的是inner这个函数体,也就是执行inner函数了
    6. Inner函数第一句打印一句话,第二句func(),还记得func指向哪里吗?注意4的执行右部分的时候,把f2这个函数体的引用给了func,所以此时的func()就是执行f2函数体的内容啦

    上面这种情况呢就是假如说你执行f1()f2()等等函数的时候需要先执行一些一样的操作,本例中是print("验证")就可以这样用

    上面说的理解了以后,装饰器就容易理解了:

    def a(func):
            def inner():
                    print("验证中")
                    func()
    
            return inner
    
    
    def f1():
            print("--------1-----")
     
    @a        #这句话就是使用装饰器,等同于 f2 = a(f2),装饰器也可以有多个(注意参数中的f2不加括号)
    def f2():
            print("--------2-----")
    
    #f2 = a(f2)               #上面写了@a,这句话就可以省略了
    
    f2()
    

    如果你代码有大量重复的,就可以这样使用装饰器,把重复的代码放到a函数体内,需要用到重复代码的地方用a装饰一下。

  • 相关阅读:
    Html页中使用OCX控件
    Delphi 7 升级到 Delphi 2010 总结
    Delphi2010下的FillChar
    机器学习之基于朴素贝叶斯文本分类算法
    JDBC对MySQL数据库存储过程的调用
    HDU1788 Chinese remainder theorem again【中国剩余定理】
    Hadoop分布式文件系统--HDFS结构分析
    【php学习笔记】ticks篇
    怎样退出App之前唤醒还有一个App?
    Java 实现策略(Strategy)模式
  • 原文地址:https://www.cnblogs.com/sy_test/p/12054027.html
Copyright © 2020-2023  润新知