Python编程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模块创建修改的高阶函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python中functools模块函数解析

    Python自带的 functools 模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数.换言之,就是能使用该模块对可调用对象进行处理. functools模块函数概览 functools.cmp_to_key(func) functools.total_ordering(cls) functools.reduce(function, iterable[, initializer]) functools.partial(func[, args][, *keywords]) func

  • Python函数式编程指南(二):从函数开始

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: 复制代码 代码如下: def add(x, y):     return x + y 关于参数和返回值的语法细节可以参考其他文档,这里就略过了. 使用lambda可以定义简单的单行匿名函数.lambda的语法是: 复制代码 代码如下: lambda args: expression 参数(args)的语法与普通函数一样,同时表达式(expression)的值就是匿名函数调用的返回值:而lambda表达式返回这个匿名函数.如果我们

  • Python使用functools模块中的partial函数生成偏函数

    python 中提供一种用于对函数固定属性的函数(与数学上的偏函数不一样) # 通常会返回10进制 int('12345') # print 12345 # 使用参数 返回 8进制 int('11111', 8) # print 4681 每次都得添加参数比较麻烦, functools提供了partial的方法 import functools foo = functools.partial(int, base=8) foo('11111') # print 4681 通过这种方法生成一个固定参

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

    partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的部分参数提前绑定为指定值,然后再进行计算. 由于偏函数的可变参数少,因此函数调用的难度低. 直接展示代码: from functools import partial # 原函数声明 def show(name, level): print("name:", name, "level:", level) # 定义偏函数,封装 show() 函数,并为 na

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

    目录 partial 函数 装饰器 @lru_cache reduce 函数 partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的部分参数提前绑定为指定值,然后再进行计算. 由于偏函数的可变参数少,因此函数调用的难度低. 直接展示代码: from functools import partial # 原函数声明 def show(name, level): print("name:", name, "level:&q

  • 详解Python中的普通函数和高阶函数

    目录 什么是函数 函数的嵌套调用 高阶函数 我们思考一下计算圆形和方形的面积 为何高阶函数能够降低维度 总结 什么是函数 每个语言都有函数,甚至大家用的Excel里面也有函数,我们以前学习的数学也很多各种各样的函数. Python中的函数也是一样的. def f(x): print("参数为:",x) return x 这里的函数 y = f(x), 在数学中表示为一条斜率为1的直线. 函数的嵌套调用 def z(x): pass def f(x): print("参数为:&

  • Python技巧匿名函数、回调函数和高阶函数

    目录 1.定义匿名或内联函数 2.在匿名函数中绑定变量的值 3.让带有n个参数的可调用对象以较少的参数调用 4.在回调函数中携带额外的状态 1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数. 如下图所示: add = lambda x, y: x + y print(add(2, 3)) # 5 print(add("hello", &

  • Python常见内置高阶函数即高阶函数用法

    目录 1.什么是高阶函数? 2.高阶函数-map.filter.reduce 2.1map函数 2.2filter函数 2.3reduce函数 1.什么是高阶函数? 高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数. 参数为函数: #参数为函数 def bar(): print("in the bar..") def foo(func): func() print("in the foo

  • 详解python内置常用高阶函数(列出了5个常用的)

    高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数. python内置常用高阶函数: 一.函数式编程 •函数本身可以赋值给变量,赋值后变量为函数: •允许将函数本身作为参数传入另一个函数: •允许返回一个函数. 1.map()函数 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回 def add(x): ret

  • python 高阶函数简单介绍

    把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现.函数式编程就是指这种高度抽象的编程范式. 1.体验高阶函数 在Python中,abs()函数可以完成对数字求绝对值计算. abs(-10) # 10 round()函数可以完成对数字的四舍五入计算. round(1.2) # 1 round(1.9) # 2 需求:任意两个数字,按照指定要求整理数字后再进行求和计算. 方法1 def add_num(a, b): return abs(a) + abs(b) result =

  • Javascript中的高阶函数介绍

    这是一个有趣的东西,这或许也在说明Javascript对象的强大.我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数. 高阶函数 高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以上面的Hello,World作为一个简单的例子. 复制代码 代码如下: var Moqi = func

  • C#中的高阶函数介绍

    介绍 我们都知道函数是程序中的基本模块,代码段.那高阶函数呢?听起来很好理解吧,就是函数的高阶(级)版本.它怎么高阶了呢?我们来看下它的基本定义: 1:函数自身接受一个或多个函数作为输入 2:函数自身能输出一个函数.  //函数生产函数   满足其中一个就可以称为高阶函数.高阶函数在函数式编程中大量应用.c#在3.0推出Lambda表达式后,也开始慢慢使用了.   目录 1:接受函数 2:输出函数 3:Currying(科里化) 一.接受函数 为了方便理解,都用了自定义. 代码中TakeWhil

随机推荐