<python全栈开发基础>学习过程笔记【16d】装饰器(含time模块),,1.如何计算一个函数


1.如何计算一个函数运行的时间

import time  #导入time模块start=time.time() #返回从unix诞生到现在为止的时间,单位是秒print(start)  def haha():    print("希望你开心")end=time.time()print(end)print(end-start)

输出:

==================== RESTART: C:/Users/dell1/Desktop/1.py ====================1502417496.9814571502417496.98846150.007004499435424805

2.如何让程序停1s?

import timestart=time.time()time.sleep(1)end=time.time()print(end-start)

输出:

==================== RESTART: C:/Users/dell1/Desktop/1.py ====================1.0009336471557617

3.对函数的修改是封闭的因为函数在投入生产中,可能被很多企业使用

但对源代码的扩展是开放的

4.将一个函数作为另一个函数的参数传进来

import timedef shijian(f):   #f表示函数名    start=time.time()    f()   #调用函数    end=time.time()    print(end-start)def like():    print("我喜欢吃香蕉")def dislike():    print("我不喜欢吃凉皮")    print("QAQ")shijian(like) #传函数名shijian(dislike)

输出:

==================== RESTART: C:/Users/dell1/Desktop/1.py ====================我喜欢吃香蕉0.007992744445800781我不喜欢吃凉皮QAQ0.008003711700439453

5.

import time#我们有一个这样的函数def f1():    print("哈哈哈")#现在我们的要求是计算函数的运行时间    #于是我们有了下面的代码    def f1(): #把函数的时间计算语句写在函数内部是因为在大的程序里函数花费的时间集中在函数内容上    start=time.time()    print("哈哈哈")    end=time.time()    print(end-start)#但是如果我们有多个这种需要计算函数内容时间的函数#用这种方法我们需要依次为每个函数加上这三行代码,这很心累#于是我们放弃了前面的方案,有了下面这个方法def shijian(f):    start=time.time()    f()    end=time.time()    print(end-start)shijian(f1)#这样我们可以通过调用函数名来计算不同函数的运行时间#但是在生产中,各个企业用的都是f1()#给我们的要求是依旧使用f1()来调用函数,此f1()为在原f1()上添加计算时间功能的函数#但此时我们把它改成shijian(f1)#这导致多个企业程序出现问题#现在的问题是如何使用f1() 调用函数shijian(f1)#于是我们有了下面这个方法
import timedef f1():    print("哈哈哈")def shijian(f):  #这个函数就是一个装饰器    def g():        start=time.time()        f()        end=time.time()        print(end-start)    return g  #返回函数g,此时g是个完整的函数,函数f()已经有实际的内容f1=shijian(f1)f1()
#这样我们就可以做到在不改变函数名的情况下为多个函数增添同一功能

输出:

==================== RESTART: C:/Users/dell1/Desktop/1.py ====================哈哈哈0.034518718719482420.04903674125671387
==================== RESTART: C:/Users/dell1/Desktop/1.py ====================哈哈哈0.03201723098754883import timedef f1():
print("哈哈哈")def shijian(f):      def g():        start=time.time()        f()        end=time.time()        print(end-start)    return g  f1=shijian(f1)f1()



这段代码可以写成这种形式:

import time

def shijian(f):
def g():
start=time.time()
f()
end=time.time()
print(end-start)
return g


@shijian #必须写在f1的上面
def f1():
print("哈哈哈")

f1()

运行结果:

==================== RESTART: C:/Users/dell1/Desktop/1.py ====================
哈哈哈
0.028023719787597656

6.

#现在我们有这样一个函数def add(a,b):    print(a+b)#组织给我们的要求是用聪明的方法计算这个函数的运行时间#且修改后仍用add(a,b)来调用新写的函数#于是我们有了下面的代码import timedef jisuan(f,a,b):    start=time.time()    f(a,b)    end=time.time()    print(end-start)jisuan(add,1,2)#运行结果是OK的#但是这不符合我们的要求#所以我们有了下面的修改def jisuan(f):    def g(a,b):        start=time.time()        f(a,b)        end=time.time()        print(end-start)    return gadd=jisuan(add)add(1,2)#运行结果是正确的#但是这样写不突出我们的逼格#于是我们有了下面的代码def jisuan(f):    def g(a,b):        start=time.time()        f(a,b)        end=time.time()        print(end-start)    return g@jisuandef add(a,b):    print(a+b)add(1,2)#计算结果是正确的#我们很愉快的完成了任务

7.
#现在我们又有一个任务#刚刚的add只能求两个数的和,现在我们需要它能求任意多个数的和#首先我们先把add这个函数写出来def add(*x):       sum=0    for i in x:  #生成的x是一个元组        sum=sum+i    print(sum)    add(1,2,3,4,5)#结果是正确的#然后我们需要为这个函数做前面的操作#于是我们有了下面的尝试import timedef jisuan(f,*x):    start=time.time()    f(*x)    end=time.time()    print(end-start)jisuan(add,1,2,3,4,5)#计算结果是正确的#我们进而将它进行优化import timedef jisuan(f):    def g(*x):        start=time.time()        f(*x)        end=time.time()        print(end-start)    return gadd=jisuan(add)add(1,2,3,4,5)#计算结果是正确的#现在我们把它写的更简洁import timedef jisuan(f):    def g(*x):        start=time.time()        f(*x)        end=time.time()        print(end-start)    return g@jisuandef add(*x):    sum=0    for i in x:        sum=sum+i    print(sum)    add(1,2,3,4,5)#计算结果是正确的

注意!再用@jisuan时,这个jisuan()只能有一个参数,这是规定

<python全栈开发基础>学习过程笔记【16d】装饰器(含time模块)

评论关闭