装饰器与高阶函数
发布时间:2023-06-29 14:08:52 所属栏目:教程 来源:
导读:我们本节课的重点装饰器本质上其实就是一个特殊的高阶函数,那么它特殊在哪里呢?
通过上面的两个例子我们可以了解到高阶函数有两个特性:
输入参数是函数;
输出返回值是函数。
而装饰器(decorate)则是两
通过上面的两个例子我们可以了解到高阶函数有两个特性:
输入参数是函数;
输出返回值是函数。
而装饰器(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 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |