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

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.981457
1502417496.9884615
0.007004499435424805

 

2.如何让程序停1s?

import time

start=time.time()
time.sleep(1)
end=time.time()

print(end-start)

输出:

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

 

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

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

 

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

import time

def 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
我不喜欢吃凉皮
QAQ
0.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 time
def 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.03451871871948242
0.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 time

def 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 g
add=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

@jisuan
def 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 time
def jisuan(f,*x):
    start=time.time()
    f(*x)
    end=time.time()
    print(end-start)

jisuan(add,1,2,3,4,5)

#计算结果是正确的
#我们进而将它进行优化

import time
def jisuan(f):
    def g(*x):
        start=time.time()
        f(*x)
        end=time.time()
        print(end-start)
    return g

add=jisuan(add)
add(1,2,3,4,5)

#计算结果是正确的
#现在我们把它写的更简洁

import time
def jisuan(f):
    def g(*x):
        start=time.time()
        f(*x)
        end=time.time()
        print(end-start)
    return g

@jisuan
def add(*x):
    sum=0
    for i in x:
        sum=sum+i
    print(sum)
    
add(1,2,3,4,5)
#计算结果是正确的

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

 

posted on 2017-08-12 01:01  我是蒟蒻  阅读(132)  评论(0编辑  收藏  举报

导航