zoukankan      html  css  js  c++  java
  • Python 的装饰器

           在日常的代码编写中定义一个函数反复使用之后,就会发现代码不够完善或者是想给函数增加一些功能,

    又想让代码看上去很直观不复杂,而且还能不改变原来的调用方式我们就会用到装饰器,下面就一步一

    步的来了解下python装饰器吧!

    一般情况下,我们要给原来的代码增加功能,最直接的办法就是侵入代码里面修改,例如:

    er = 5
    def temp(er):
        print("功能1")
        er+=er
        print("功能2")
        er+=1

     好接下来在看一个例子

    def prime_nums():
        for i in range(1,1000):
            if i%2==0:
                print(i)
    prime_nums()

    这个函数的作用是打印出1到1000之间的偶数,那如果我们要测试这段代码的运行时间该怎么办呢?

    import time
    def prime_nums():
        t1 = time.time()
        for i in range(1,1000):
            if i%2==0:
                print(i)
        t2 = time.time()
        print("运行时间为:%s"%(t2-t1))
    prime_nums()
    View Code

     因为这段代码既有逻辑的部分有包含有计时的部分所以整段代码的可读性很低,那要怎么将逻辑和计时分开来呢?

    import time
    
    def display_time(func):
        def wrapper():
            t1 = time.time()
            func()
            t2 = time.time()
            print("运行时间为:%s" % (t2 - t1))
        return wrapper
    View Code

    现在我们就写好了一个装饰器那我们要怎么运用这个装饰器呢?

    import time
    
    def display_time(func):
        def wrapper():
            t1 = time.time()
            func()
            t2 = time.time()
            print("运行时间为:%s" % (t2 - t1))
        return wrapper
    @display_time
    def prime_nums():
        for i in range(1,1000):
            if i%2==0:
                print(i)
    prime_nums()
    View Code

    只需要在要用装饰器的函数上面加一个@符号然后写上装饰器的名字就行了。可以知道他跟上面的代码运行结果是一样的,那这样一个简单的装饰器就完成了

    那如果prime_nums()函数有返回值该怎么办呢?比如我们要统计1到1000之间有多少个偶数

    import time
    
    def display_time(func):
        def wrapper():
            t1 = time.time()
            result = func()
            t2 = time.time()
            print("运行时间为:%s" % (t2 - t1))
            return result
        return wrapper
    @display_time
    def prime_nums():
        count = 0
        for i in range(1,1000):
            if i%2==0:
                count+=1
        return count
    
    count = prime_nums()
    print(count)
    View Code

    我们应当将prime_nums()函数的返回值用一个变量来接收,并在装饰器里面吧结果同时返回出去。

    那这时候还有一个问题如果prims_nums()里面有参数怎么办?

    import time
    
    def display_time(func):
        def wrapper(*args):
            t1 = time.time()
            result = func(*args)
            t2 = time.time()
            print("运行时间为:%s" % (t2 - t1))
            return result
        return wrapper
    @display_time
    def prime_nums(maxnum):
        count = 0
        for i in range(1,maxnum):
            if i%2==0:
                count+=1
        return count
    
    count = prime_nums(1000)
    print(count)
    View Code

    我们需要在wapper里面再加一个参数如果我们不知道这个参数一共有多少个的话就可以使用  *args 写进去之后在运行这个函数的时候我们也需要把参数带进去,从而完成整段代码。

  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/shudu/p/11840949.html
Copyright © 2011-2022 走看看