ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python闭包函数及装饰器简介

2022-07-05 22:05:01  阅读:169  来源: 互联网

标签:闭包 函数 get python 简介 func time print def


  • 目录:

    • 闭包函数简介

    • 闭包函数的实际应用

    • 装饰器简介

    • 装饰器初期-完整版

    • 装饰器语法糖

 

  • 闭包函数简介

  1.定义在函数内部的函数(函数的嵌套)

  2.内部函数运用外部函数局部名称空间中的变量名

  注:函数名还可以当做函数的返回值
  如何接收返回值(统一语法):变量名 = 函数()
  函数名也可以被用来多次赋值

def func(username):
    # username = 'jason'
    def name():
        print(username)
    return name
res = func('jason')
print(res)
res()
  • 闭包函数的实际应用

  • 1.给函数体代码传值方式

    1.1 通过形参传值:在函数定义时定义形参,调用时临时绑定形参与实参完成传值
    def func(username):
        print(username)
    func('jason')       # jason
    1.2 通过闭包函数传值:通过返回值内部函数函数名,通过接收返回值完成传值
    def func(username):
        def name():
            print(username)
        return name
    res = func('jason')
    res()               # jason
    res1 = func('kevin')
    res1()              # kevin
  • 装饰器简介

  • 1.本质:不改变'内部代码'及'调用方式'添加新功能

  • 2.原则:对修改封闭,对扩展开放

  • 3.扩展知识:时间戳

    3.1时间戳:截至目前至1970年1月1日0时0分0秒的秒数
    import time
    print(time.time())      # 1657008257.5792694   
    3.2可以统计代码运行的时间(打印0-1000所需秒数)
    import time
    start_time = time.time()
    for i in range(0, 1000):
        print(i)
    end_time = time.time()
    print('%s'%(end_time-start_time))   # 0.027039527893066406
    3.3睡眠时间 time.sleep(2)括号里的数字代表几秒
    import time
    time.sleep(2)
    print('快睡着了')
  • 装饰器初期-完整版

  • 1.装饰器初期

    1.1 缺陷:如果有多个func函数统计执行时间,则需要多次写代码(统计func函数的执行时间)
    import time
    def func():
        time.sleep(2)
        print('快睡着了')
    start_time = time.time()
    func()
    end_time = time.time()
    print(end_time-start_time)      # 2.002647638320923
    1.2 缺陷:只能统计func函数的执行时间,不能统计其他函数(将多次需要写的代码封装成函数)
    import time
    def func():
        time.sleep(2)
        print('快睡着了')
    def get_time():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time-start_time)
    get_time()      # 2.0140273571014404
    get_time()      # 2.008859157562256
    1.3 定义的函数存在形参,调用时必须传实参(可以统计多个函数的执行时间)
    import time
    def func():
        time.sleep(2)
        print('快睡着了')
    def username():
        time.sleep(2)
        print('他的名字是kevin')
    def get_time(xxx):
        start_time = time.time()
        xxx()
        end_time = time.time()
        print(end_time-start_time)
    get_time(func)      # 快睡着了   2.005340099334717
    get_time(username)  # 他的名字是kevin  2.0011959075927734
    注:暂无法解决
    import time
    def func1(a):
        time.sleep(2)
        print('我是存在形参的a')
    def get_time(xxx):
        start_time = time.time()
        xxx(*args, **kwargs)  # 暂无法解决
        end_time = time.time()
        print(end_time-start_time)
    get_time(func)
    get_time(username)
    get_time(func1)
    1.4 缺陷:调用函数名发生变化(解决办法:装饰器)
    # 传值方式-参数传值不能改变调用函数方式
    import time
    def get_time(xxx):
        start_time = time.time()
        xxx()
        end_time = time.time()
        print(end_time-start_time)
    get_time(func)
    get_time(username)
    # 传值方式-闭包函数(缺陷:只能计算func函数执行时间)
    def func2():
        xxx = func
        def get_time():
            start_time = time.time()
            xxx()
            end_time = time.time()
            print(end_time-start_time)
        return get_time
    res = func2()
    res()        # 快睡着了   2.0147109031677246
    1.5 所有函数执行时间(可以统计多个函数执行时间、不改变调用函数名,使用闭包函数)
    import time
    def func():
        time.sleep(2)
        print('快睡着了')
    def username():
        time.sleep(2)
        print('他的名字是kevin')
    def func2(xxx):
        # xxx = func
        def get_time():
            start_time = time.time()
            xxx()
            end_time = time.time()
            print(end_time-start_time)
        return get_time
    func = func2(func)
    func()                  # 快睡着了 2.0079562664031982
    username = func2(username)
    username()                 # 他的名字是kevin  2.001535177230835
  • 2.装饰器优化版本(可以统计多个函数执行时间、并且有参无参都可以使用,不改变调用函数名,使用闭包函数)

    import time
    def func(xxx):
        def get_time(*args, **kwargs):   # 形参
            start_time = time.time()
            xxx(*args, **kwargs)      # 实参
            end_time = time.time()
            print(end_time-start_time)
        return get_time
    func2 = func(func2)
  • 3.装饰器完整版本

    import time
    def func(xxx):
        def get_time(*args, **kwargs):   # 形参
            start_time = time.time()
            res = xxx(*args, **kwargs)      # 实参
            end_time = time.time()
            print(end_time-start_time)
            return res
        return get_time
  • 4.装饰器最终版本

    from functools import wraps
    def outer(func_name):
        @wraps(func_name)  # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
        def inner(*args, **kwargs):
            print('执行被装饰对象之前可以做的额外操作')
            res = func_name(*args, **kwargs)
            print('执行被装饰对象之后可以做的额外操作')
            return res
        return inner
  • 装饰器语法糖

    import time
    @outer  #  home = outer(真正的函数名home)
    def home():
        '''我是home函数 我要热死了!!!'''
        time.sleep(1)
        print('from home')
        return 'home返回值'

     

 

 

标签:闭包,函数,get,python,简介,func,time,print,def
来源: https://www.cnblogs.com/040714zq/p/16448355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有