• Python基础(7)_闭包函数、装饰器


    一、闭包函数

    闭包函数:1、函数内部定义函数,成为内部函数,
         2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
    那么该内部函数成为闭包函数

     1 #最简单的无参闭包函数
     2 def func1()
     3     name='ares'
     4     def func2()
     5         print(name)
     6 
     7 #有参和返回值的闭包函数
     8 def timmer(func):
     9     def wrapper(*args,**kwargs):
    10         start_time = time.time()
    11         res=func(*args,**kwargs)
    12         stop_time=time.time()
    13         print('run time is %s' %(stop_time-start_time))
    14         return res
    15     return wrapper

    二、高阶函数

      1)函数接收的参数是一个函数名

      2)函数的返回值是一个函数名

      3)满足上述条件任意一个,都可称之为高阶函数

     1 #高阶函数应用1:把函数当做参数传给高阶函数
     2 import time
     3 def foo():
     4     print('from the foo')
     5 
     6 def timmer(func):
     7     start_time=time.time()
     8     func()
     9     stop_time=time.time()
    10     print('函数%s 运行时间是%s' %(func,stop_time-start_time))
    11 timmer(foo)
    12 #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
    13 
    14 #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
    15 import time
    16 def foo():
    17     print('from the foo')
    18 
    19 def timmer(func):
    20     start_time=time.time()
    21     return func
    22     stop_time=time.time()
    23     print('函数%s 运行时间是%s' %(func,stop_time-start_time))
    24 foo=timmer(foo)
    25 foo()
    26 #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

    高阶函数总结

    1.函数接收的参数是一个函数名

      作用:在不修改函数源代码的前提下,为函数添加新功能,
      不足:会改变函数的调用方式
    2.函数的返回值是一个函数名
      作用:不修改函数的调用方式
      不足:不能添加新功能

    三、函数嵌套

     1 #函数的嵌套定义
     2 def f1():
     3     def f2():
     4         def f3():
     5             print('from f3')
     6         print('from f2')
     7         f3()
     8     print('from f1')
     9     f2()
    10 # print(f1)
    11 f1()
    12 
    13 '''
    14 from f1
    15 from f2
    16 from f3
    17 
    18 '''

    四、装饰器

    1、定义:

    器即函数

    装饰即修饰,意指为其他函数添加新功能

    装饰器定义:本质就是函数,功能是为其他函数添加新功能

    2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)

      即、1)不修改被装饰函数的源代码

        2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式

    3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
      装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能

     

    装饰器=高阶函数+函数嵌套+闭包

    基本框架

    1 #这就是一个实现一个装饰器最基本的架子
    2 def timer(func):
    3     def wrapper():
    4         func()
    5     return wrapper

    统计一个函数运行时间的装饰器

    # import time
    # import random
    # #装饰器
    # def timmer(func):
    #     # func=index
    #     def wrapper():
    #         start_time = time.time()
    #         func() #index()
    #         stop_time=time.time()
    #         print('run time is %s' %(stop_time-start_time))
    #     return wrapper
    # #被装饰函数
    # def index():
    #     time.sleep(random.randrange(1,5))
    #     print('welecome to index page')
    #
    # def home():
    #     time.sleep(random.randrange(1,3))
    #     print('welecome to HOME page')
    #
    # index=timmer(index) #index=wrapper
    # home=timmer(home)
    #
    # index() #wrapper()
    # home()

    装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=timmer(index)

    import time
    import random
    #装饰器
    def timmer(func):
        def wrapper():
            start_time = time.time()
            func()
            stop_time=time.time()
            print('run time is %s' %(stop_time-start_time))
        return wrapper
    #被装饰函数
    @timmer             #index=timmer(index)
    def index():
        time.sleep(random.randrange(1,5))
        print('welecome to index page')
    # @timmer #home=timmer(home)
    # def home():
    #     time.sleep(random.randrange(1,3))
    #     print('welecome to HOME page')
    
    index() #wrapper()
    # home()

    加多个装饰器:

     1 #加多个装饰器
     2 import time
     3 import random
     4 #装饰器
     5 def timmer(func):
     6     def wrapper():
     7         start_time = time.time()
     8         func()
     9         stop_time=time.time()
    10         print('run time is %s' %(stop_time-start_time))
    11     return wrapper
    12 def auth(func):
    13     def deco():
    14         name=input('name: ')
    15         password=input('password: ')
    16         if name == 'egon' and password == '123':
    17             print('login successful')
    18             func() #wrapper()
    19         else:
    20             print('login err')
    21     return deco
    22 
    23 #被装饰函数  #多个装饰函数,从上往下添加,调用时从下往上
    24 @auth                 #index=auth(wrapper) #index=deco                      #index=auth(wrapper) #index=deco
    25 @timmer                #index=timmer(index) #index=wrapper 
    26 def index():
    27     # time.sleep(random.randrange(1,5))
    28     time.sleep(3)
    29     print('welecome to index page')
    30 
    31 
    32 def home():
    33     time.sleep(random.randrange(1,3))
    34     print('welecome to HOME page')
    35 
    36 # index() #deco()
    37 # home()

    装饰器修订

     1 #装饰器修订
     2 import time
     3 import random
     4 #装饰器
     5 def timmer(func):
     6     def wrapper(*args,**kwargs):
     7         start_time = time.time()
     8         res=func(*args,**kwargs)  #接收参数
     9         stop_time=time.time()
    10         print('run time is %s' %(stop_time-start_time))
    11         return res    #增加返回值
    12     return wrapper
    13 #被装饰函数
    14 
    15 @timmer
    16 def index():
    17     time.sleep(random.randrange(1,5))
    18     print('welecome to index page')
    19 @timmer
    20 def home(name):
    21     time.sleep(random.randrange(1,3))
    22     print('welecome to %s HOME page' %name)
    23     return 123123123123123123123123123123123123123123
    24 index()
    25 
    26 res1=index()
    27 print('index return %s' %res1)
    28 res2=home('egon') #wraper()
    29 print('home return %s' %res2)
  • 相关阅读:
    利用FlashPaper实现类似百度文库功能
    浅谈Oracle函数返回Table集合
    Oracle 触发器在日志管理开发中的应用
    Putty 工具 保存配置的 小技巧
    java.util.Date转java.sql.Date丢失时间问题
    java String和Date转换
    springboot项目使用拦截器修改/添加前端传输到后台header和cookie参数
    Spring的使用及Spring3.2控制器增强@ControllerAdvice
    使用fastjson统一序列化响应格式
    【转】Elastic-Job
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7009315.html
Copyright © 2020-2023  润新知