python装饰器学习笔记

来源:互联网 发布:mindmap for mac 编辑:程序博客网 时间:2024/05/22 16:50

    装饰器,顾名思义:就是利用装饰功能的函数来装饰函数,在python的世界中秉承着“玩物皆对象”的理念,所以在这里可以将函数作为参数传递给装饰器达到简化机械性的操作的目的,比如在每个函数的首部我都要打印出来正在执行的函数的名字,那么我们可以在每一个定义过的函数的下面输入这么一句话:

print func.__name__ 以此来获取正在执行的函数的名字属性,其中func为自己定义的函数的名字

    这样的操作的确是可以达到想要的目的,但是如果我们的项目代码中有几百个函数甚至更多等待执行的话,那么我们采取这样的操作方式无疑是增加了代码的混乱程度以及冗余程度,这肯定不是每一个程序员想看到的。在这里就可以使用装饰器来完成这样的任务,比如我们可以定义这样一个装饰器:

def deco(func):def wrapper():func()print "正在运行的函数是------>", func.__name__return wrapper
仅仅几行的代码就可以实现这样的功能,在我们需要执行的函数上面一行需要加上语法糖来修饰需要执行的函数,即将这个语句“@deco”放在函数上面即可,如下:

@deco
def run():print'888888888'
run()

这样就可以了

在这里就不再过多的讲解装饰器的功能和作用了,毕竟网上有很多的资料,在这里主要是利用装饰器实现我前面的排序算法的时间输出,之前的代码都是一个一个调用time模块来输出时间的,很没有条理,代码如下:

# !/usr/bin/python#-*-coding:utf-8-*-import timeimport random
#随机序列生成器def randomnumber_generate(total_num=100, max_num=1000):    num_list = []    n = 1 #得到1000以内的100个随机数    while n <= total_num:        lin = random.randint(0, max_num)        num_list.append(lin)        n += 1    return num_list#装饰器def deco(func):def wrapper(num_list):start_time = time.time()func(num_list)end_time = time.time()ms = (end_time - start_time) * 1000print func.__name__, "--->运行时间:%f ms" %msreturn wrapper@decodef Bubble_Sort(num_list):    for i in range(len(num_list)):        for j in range(0,len(num_list)-1-i):            if num_list[j] > num_list[j+1]:                num_list[j],num_list[j+1]=num_list[j+1],num_list[j]    print num_list@decodef insertsort(num_list):    if num_list != None:        if len(num_list) == 1:            pass        else:            for i in range(1,len(num_list)):                temp = num_list[i]                for j in range(i):                    if num_list[j]>num_list[i]:                        for k in range(i,j):#在这里采用向后移位的方法,即a[i+1]=a[i]                            num_list[k+1]= num_list[k]                        num_list[j] = temp    return num_list@decodef selectionsort(num_list):    if num_list != None:        for i in range(len(num_list)):            min_num = i            for j in range(i+1,len(num_list)):                if num_list[min_num] > num_list[j]:                    min_num = j            if min_num != i:                num_list[min_num],num_list[i] = num_list[i],num_list[min_num]    return num_listif __name__ == '__main__':num_list = randomnumber_generate()Bubble_Sort(num_list)selectionsort(num_list)insertsort(num_list)
对实现进行了三次的测试,得到如下的结果
第一次结果如下:

[2, 4, 17, 19, 26, 42, 76, 117, 155, 166, 167, 168, 197, 227, 230, 234, 239, 259, 268, 269, 274, 278, 314, 317, 318, 325, 326, 327, 331, 336, 341, 360, 380, 381, 383, 391, 400, 409, 413, 430, 437, 442, 446, 455, 456, 456, 465, 468, 469, 470, 471, 479, 511, 514, 519, 524, 531, 572, 579, 586, 593, 594, 597, 607, 625, 627, 642, 670, 670, 693, 701, 721, 725, 729, 729, 730, 734, 735, 742, 745, 756, 760, 811, 812, 816, 837, 879, 888, 890, 907, 908, 910, 933, 939, 950, 953, 958, 971, 975, 988]
Bubble_Sort --->运行时间:1.276016 ms
selectionsort --->运行时间:0.491142 ms
insertsort --->运行时间:0.460863 ms

第二次结果如下:

[7, 9, 18, 35, 36, 41, 46, 47, 81, 84, 86, 87, 108, 113, 126, 126, 145, 158, 169, 177, 196, 216, 218, 222, 232, 255, 267, 284, 286, 287, 306, 348, 351, 364, 392, 404, 405, 421, 424, 459, 474, 477, 508, 512, 524, 541, 551, 552, 573, 590, 593, 594, 600, 602, 604, 622, 622, 636, 647, 648, 663, 665, 691, 691, 696, 705, 714, 724, 728, 747, 753, 759, 760, 765, 788, 805, 815, 819, 829, 839, 847, 872, 876, 882, 901, 908, 913, 922, 931, 935, 949, 950, 951, 955, 964, 973, 975, 981, 984, 991]
Bubble_Sort --->运行时间:1.276016 ms
selectionsort --->运行时间:0.460148 ms
insertsort --->运行时间:0.446081 ms

第三次结果如下:

[10, 16, 24, 25, 38, 54, 68, 73, 74, 82, 103, 107, 134, 142, 158, 159, 195, 198, 208, 230, 233, 236, 248, 255, 304, 306, 312, 335, 350, 358, 366, 379, 383, 385, 385, 393, 394, 413, 418, 424, 438, 449, 453, 464, 475, 495, 519, 530, 545, 550, 553, 568, 574, 575, 599, 602, 626, 630, 632, 635, 645, 656, 660, 667, 683, 690, 691, 702, 703, 711, 711, 715, 744, 750, 758, 760, 760, 763, 774, 810, 812, 827, 828, 831, 849, 852, 861, 864, 869, 869, 870, 871, 889, 893, 896, 897, 926, 979, 985, 990]
Bubble_Sort --->运行时间:1.276970 ms
selectionsort --->运行时间:0.499010 ms
insertsort --->运行时间:0.447989 ms

可以发现:

总体上三者的排序时间性能并没有发生太大的波动,尽管序列在改变,但是排序所需的时间波动很小。

0 0
原创粉丝点击