加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

装饰器与高阶函数

发布时间:2023-06-29 14:08:52 所属栏目:教程 来源:
导读:我们本节课的重点装饰器本质上其实就是一个特殊的高阶函数,那么它特殊在哪里呢?

通过上面的两个例子我们可以了解到高阶函数有两个特性:

输入参数是函数;
输出返回值是函数。
而装饰器(decorate)则是两
我们本节课的重点装饰器本质上其实就是一个特殊的高阶函数,那么它特殊在哪里呢?

通过上面的两个例子我们可以了解到高阶函数有两个特性:

输入参数是函数;
输出返回值是函数。
而装饰器(decorate)则是两种特性都具备,也就是说装饰器函数的参数是一个函数,返回值也是一个函数。

函数 decorate 对函数 input 的功能进行扩充,生成并返回一个新的函数 output,新的函数 output 的功能基于函数 input。装饰器的中装饰的含义是指:对函数 input 的功能进行装饰 (扩充功能),得到一个新函数 output。

装饰器的用途
既然我们已经知道了装饰器本质上就是一个函数,只不过比较特殊而已,下面我们就一起来看下装饰器可以用在什么地方:

需求
使用 Python 编写了 3 种排序算法:

quick_sort,快速排序;
bubble_sort,冒泡排序;
select_sort,选择排序。
现在需要对这 3 个算法进行性能评测,记录并打印每个排序算法的执行时间。

import time
def quick_sort():
    time.sleep()
def bubble_sort():
    time.sleep()
def select_sort():
    time.sleep()
引入 time 模块,使用 time.sleep () 模拟函数的执行时间;使用 time.sleep (1) 模拟 quick_sort 的执行时间为 1 秒;使用 time.sleep (2) 模拟 bubble_sort 的执行时间为 2 秒;使用 time.sleep (3) 模拟 select_sort 的执行时间为 3 秒。

不使用装饰器
对于这个需求,我们先不使用装饰器,仅使用 Python 的基础语法完成任务,如下所示:

import time
def quick_sort():
    start_time = time.time()
    time.sleep()
    end_time = time.time()
    print('%.2f seconds' % (end_time - start_time))
引入 time 模块,需要使用 sleep 方法;在函数的头部,记录开始时间 start_time; 在函数的尾部,记录结束时间 end_time;打印开始时间和结束时间的差,即函数的执行时间。

def bubble_sort():
    start_time = time.time()
    time.sleep()
    end_time = time.time()
    print('%.2f seconds' % (end_time - start_time))
def select_sort():
    start_time = time.time()
    time.sleep()
    end_time = time.time()
    print('%.2f seconds' % (end_time - start_time))
使用同样的方法,对 bubble_sort 和 select_sort 进行修改。

quick_sort()
bubble_sort()
select_sort()
依次调用 quick_sort、bubble_sort、select_sort,打印它们各自的运行时间,程序输出如下:

1.00 seconds
2.00 seconds
3.00 seconds

使用装饰器
在上一个小节中,我们没有使用装饰器同样完成了需求,但是这样做存在一个明显的问题:

quick_sort、bubble_sort、select_sort 存在代码重复;
在函数头部记录开始时间、在函数尾部记录结束时间,逻辑是完全相同的。
而通过使用装饰器,可以消除代码重复,代码如下:

import time
def quick_sort():
    time.sleep()
def bubble_sort():
    time.sleep()
def select_sort():
    time.sleep()
在上一节的例子中,需要对 quick_sort、bubble_sort 和 select_sort 进行修改。在本节的例子中,不对 quick_sort、bubble_sort 和 select_sort 进行任何修改。

def decorate(input_sort):
    def output_sort():
        start_time = time.time()
        input_sort()
        end_time = time.time()
        print('%.2f seconds' % (end_time - start_time))
    return output_sort
装饰器 decorate 是一个高阶函数,输入参数 input_sort 是一个排序函数,返回值是 output_sort 一个功能增强的排序函数。

在第 3 行,在 output_sort 函数的头部,记录开始时间,调用原排序函数 input_sort;在第 5 行,在 output_sort 函数的尾部,记录结束时间。

quick_sort = decorate(quick_sort)
bubble_sort = decorate(bubble_sort)
select_sort = decorate(select_sort)
使用 decorate (quick_sort),生成一个功能增强的 quick_sort,并替换原有的 quick_sort;使用 decorate (bubble_sort),生成一个功能增强的 bubble_sort,并替换原有的 bubble_sort;使用 decorate (select_sort),生成一个功能增强的 select_sort,并替换原有的 select_sort。

quick_sort()
bubble_sort()
select_sort()
依次调用 quick_sort、bubble_sort、select_sort,打印它们各自的运行时间,程序输出如下:

1.00 seconds
2.00 seconds
3.00 seconds

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章