Python编程functools模块创建修改的高阶函数解析

 更新时间:2021年09月13日 15:59:36   作者:梦想橡皮擦  
本篇文章主要为大家介绍functools模块中用于创建、修改函数的高阶函数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

partial 函数

partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的部分参数提前绑定为指定值,然后再进行计算。

由于偏函数的可变参数少,因此函数调用的难度低。

直接展示代码:

from functools import partial
# 原函数声明
def show(name, level):
    print("name:", name, "level:", level)
# 定义偏函数,封装 show() 函数,并为 name 参数设置了默认参数
show_level = partial(show, name='橡皮擦')
# 由于 name 参数已经有默认值,调用偏函数时,name 可以不指定
show_level(level="9级")

上述代码就是使用 partial 函数,将一个函数的某些参数(案例中是 name)进行了固定(相当于提供了默认值),然后再返回一个新的函数,新函数参数也进行了减少。

还有一点是上述代码在调用 show_level 函数时,必须使用关键字参数形式给 level 进行传值,否则会出现 TypeError 错误,如下所示:

# 代码写成下述内容
show_level("9级")
# 异常如下
TypeError: show() got multiple values for argument 'name'

偏函数也可以通过匿名函数实现,例如下述代码:

# 代码写成下述内容
show_level("9级")
# 异常如下
TypeError: show() got multiple values for argument 'name'

使用 timeit 运行 10 万次,测试一下二者的时间基本没有太大差异,所以可以互通使用,不过匿名函数还是实现一些相对简单的函数。

装饰器 @lru_cache

给函数添加 @lru_cache 装饰器,可以加快函数的运行,lru 指最近使用的计算结果会保留在缓存中。

该装饰器的原型如下:

@functools.lru_cache(maxsize=None, typed=False)

maxsize:最多缓存的次数,如果为 None,则无限制,设置为 2n 时,性能最佳;

typed:如果设置为 True(注意,在 functools32 中没有此参数),则不同参数类型的调用将分别缓存,例如 f(3) 和 f(3.0)。

接下来通过菲波那切数列的递归展示有无 lru_cache 的区别。

from functools import lru_cache
import timeit
@lru_cache()
def factorial(n):
    return 1 if n <= 1 else n * factorial(n - 1)
a = timeit.timeit(stmt="factorial(20)", setup='from __main__ import factorial', number=100000)
print(a)
  • 不带 lru_cache 耗时:0.2;
  • 带 耗时:0.06

差异明显,这是因为每次执行 factorial 时,都会检查由装饰器维护的缓存池,如果值存在,直接获取对应的结果,避免重复计算。

一般的结论是,对于需要重复计算同一组值的应用,使用装饰器 @lru_cache 可以大幅度提升性能。

reduce 函数

reduce 函数也是高阶函数,它可以将可迭代对象中相邻的两个值通过指定函数结合在一起,因此 sumlenmaxmin 都可以看做是 reduce 函数的特殊形式。

reduce 函数的定义:

reduce(function, sequence [, initial] ) -> value

function参数:是一个有两个参数的函数,reduce 依次从 sequence 中取一个元素,和上一次调用 function 的结果做参数再次调用 function

如果第一次没有指定 initial,则默认使用 sequence 的第一个元素与下一个元素一同传入二元 function 函数中去执行。

读起来有点绕,直接看案例即可。

from functools import reduce
def add(x, y):
    return x + y
a = reduce(add, [1, 2, 3, 4])
print(a)

initial 参数表示初始值,默认情况下是使用序列的第一个值。

from functools import reduce
a = reduce(lambda x, y: x + y, [1, 2, 3, 4], 2)
print(a)

下面为大家展示如何使用 reduce 实现 sumlen 等函数。

from functools import reduce
data = [1, 2, 3, 4]
sum = lambda data: reduce(lambda x, y: x + y, data, 0)
count = lambda data: reduce(lambda x, y: x + 1, data, 0)
min = lambda data: reduce(lambda x, y: x if x < y else y, data)
a = sum(data)
b = count(data)
c = min(data)
print(a, b, c)

还可以使用 reduce 函数与 partical 函数实现 sum 函数,代码如下:

from functools import reduce, partial
data = [1, 2, 3, 4]
sum = partial(reduce, lambda x, y: x + y)
a = sum(data)
print(a)

以上就是Python编程functools模块中创建修改函数的高阶函数解析的详细内容,更多关于Python编程functools模块创建修改的高阶函数的资料请关注脚本之家其它相关文章!

相关文章

  • python解析html开发库pyquery使用方法

    python解析html开发库pyquery使用方法

    PyQuery是一个类似于jQuery的Python库,也可以说是jQuery在Python上的实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好
    2014-02-02
  • Pandas中GroupBy具体用法详解

    Pandas中GroupBy具体用法详解

    pandas中的DF数据类型可以像数据库表格一样进行groupby操作。通常来说groupby操作可以分为三部分:分割数据,应用变换和和合并数据。本文就详细的来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • Python实现快速排序算法及去重的快速排序的简单示例

    Python实现快速排序算法及去重的快速排序的简单示例

    quick sort快速排序是一种再基础不过的排序算法,使用Python代码写起来相当简洁,这里我们就来看一下Python实现快速排序算法及去重的快速排序的简单示例:
    2016-06-06
  • Python input输入超时选择默认值自动跳过问题

    Python input输入超时选择默认值自动跳过问题

    这篇文章主要介绍了Python input输入超时选择默认值自动跳过问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python并发之多进程的方法实例代码

    Python并发之多进程的方法实例代码

    这篇文章主要介绍了Python并发之多进程的方法实例代码,文中也提到了进程与线程的共同点,需要的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • python Pexpect 实现输密码 scp 拷贝的方法

    python Pexpect 实现输密码 scp 拷贝的方法

    今天小编就为大家分享一篇python Pexpect 实现输密码 scp 拷贝的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python Django教程之实现待办事项应用程序

    Python Django教程之实现待办事项应用程序

    Django是一个基于Python Web框架的高级Web框架,允许快速开发和干净,务实的设计。本文将创建一个待办事项应用程序,以了解Django的基础知识,感兴趣的可以尝试一下
    2022-10-10
  • python实现屏保计时器的示例代码

    python实现屏保计时器的示例代码

    这篇文章主要介绍了python实现屏保计时器的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 浅谈如何重构冗长的Python代码

    浅谈如何重构冗长的Python代码

    这篇文章主要介绍了浅谈如何重构冗长的Python代码,编写干净的 Pythonic 代码就是尽可能使其易于理解,但又简洁,过长的代码如何做到简洁高效,需要的朋友可以参考下
    2023-04-04
  • python区块链简易版交易实现示例

    python区块链简易版交易实现示例

    这篇文章主要为大家介绍了python区块链简易版交易实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论