zoukankan      html  css  js  c++  java
  • Python闭包和装饰器

    (1)python的LEGB:
        LEGB是指:按照L>E>G>B 的顺序优先级进行变量查找。
            L:local函数内部作用域,是最底层的单个函数里面;
            E:enclosing函数内部与内嵌函数之间,是有内部函数的函数里面;
            G:global 全局作用域,是一个.py文件中;
            B:build-in内置作用域,比如:tuple,list,元组。是所有.py文件中。
    (2)闭包
        闭包是指:一个函数中内嵌了另一个函数,这个内嵌的函数会使用外部函数的参数变量,作为判决内嵌函数的不同运行模式的参考。最后外部函数会返回它的内嵌函数,即返回了函数对象地址,而这个内嵌函数就是我们说的闭包。用下面这个例子来说明:
    def set_passline(passline):
        def cmp(val):
            if val >= passerine:
               print('Pass')
           else:
               print('failed')
        return cmp
    
    f_100 = set_passline(60)
    f_100(89)
    f_150 = set_passline(96)
    f_150(89)
      set_passline返回的是内嵌函数cmp这个函数对象,不同的实参passline决定不同的cmp函数对象,这个内嵌函数cmp也就是闭包。
         总之,闭包就是指引用外部函数的内嵌函数, 它的主要作用是:(1)封装;(2)代码复用
         此外,闭包中引用的外部函数参数也可以是函数,此时作用是:将多个不同函数中相同的处理部分抽象出来,放入闭包进行封装,而闭包又传入函数对象,这样,闭包中运行完相同处理部分后,就可以运行不同函数的特定代码。例子如下:
    def my_sum(*arg):
        print('my_sum')
        return sum(arg)
    
    def my_average(*arg):
        print('my_average')
        return sum(arg) / len(arg)
    
    def dec(func):
        # 闭包
        def in_dec(*arg): 
            print('in_dec()=', arg)
            # 将相同的处理部门进行封装
            if len(arg) == 0:
                return 0
            for val in arg:
                if not isinstance(val, int):
                    return 0
            # 处理完相同部门,返回不同函数的特定处理
            return func(*arg)
        return in_dec
    
    my_sum = dec(my_sum)
    print(my_sum(1, 2, 3, 4, 5, 6))
    print(my_sum(1, 2, 3, 4, 5, '6'))
    
    my_average = dec(my_average)
    print(my_average(1, 2, 3, 4, 5, 6))
    print(my_average(1, 2, 3, 4, 5, '6'))
        运行结果为:
    (3)装饰器
       装饰器实质上就是对闭包的使用,通过封装相同部分的代码或者一些装饰代码,从而进行代码重用(有点类似于设计模式中的"装饰模式")。通过python解释器的装饰器语法糖(@dec,dec是闭包的外部函数名字)来显示地使用闭包,将函数作为实参传入闭包,最后装饰器将闭包装饰过的函数返回给被装饰函数,即:bar = dec(bar)。使用例子如下:
    def deco(func):
        print("this is deco")
        def in_deco(x,y):
            print('this is closure')
            func(x,y)
        return in_deco
    
    @deco #装饰器的语法糖,会将其下面的函数当做函数对象实参func传入deco, 相当于调用了bar = dec(bar)
    def bar(x,y):
        print("this is bar")
        print("%d+%d=%d" % (x,y,x+y))
    
    bar(2,4)
            运行结果如下:
  • 相关阅读:
    CF44G Shooting Gallery KDtree
    UVA12297 Super Poker 矩阵快速幂
    一些刷题的OJ
    关于博客园里的代码那些事
    Linux高并发网络编程开发——epoll-udp
    Linux高并发网络编程开发——tcp状态转换-select-poll
    Linux高并发网络编程开发——tcp三次握手-并发
    Linux高并发网络编程开发——网络编程基础-socket
    Linux系统编程——线程同步
    Linux系统编程——守护进程+线程
  • 原文地址:https://www.cnblogs.com/ladawn/p/8918558.html
Copyright © 2011-2022 走看看