对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解

本文深入解析了Python中reduce函数的工作原理,通过实例说明其如何处理函数列表来创建复合函数。探讨了reduce与lambda表达式的结合使用,以及在YoloV3代码中的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题 对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解

参考文献:https://ask.youkuaiyun.com/questions/698225

一、先看一下reduce():
参考文献:https://www.cnblogs.com/863652104kai/p/11826421.html
通俗解释:reduce(function, sequence): function是一个函数,sequence是一个数据集合(元组、列表等)。先将集合里的第1,2个参数参入函数执行,再将执行结果和第3个参数传入函数执行…,最终得到最后一个结果
比如:reduce(lambda x, y: x + y,[1,2,3,4])执行步骤:
先将1,2传入:1+2 = 3
再将3,3传入:3+3 = 6
再将6,4传入:6+4 = 10
最终结果为:10

二、首先研究简化一点的:

def add(x):
    x = x + 1
    return x

def mut(x):
    x = 2 ** x
    return x

print(reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])(1))

32 #运行,输出结果为32

算法原理分析:
1、lambda f, g: lambda *a, **kw: g(f(*a, **kw))
此函数等价于:

def func1(f,g):
	def func2(*a,**kw):
		return g(f(*a,**kw))
	return func2

分析一下func1(),输入参数是f,g,(f,g的意义是对函数f、g的引用,不是调用,调用是f()、g()),返回的是函数func2的引用,func2的输入参数是(*a, **kw),因此可以对func1(f,g)进行调用,即func1(f,g)(*a, **kw)

2、reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])
此函数式编程采用了reduce(),等价于:
func1(func1(func1(add,mut),add),mut) (再进一步分析,等价于: mut(add(mut(add))) 。) ,这是一个复合函数。
func1(func1(func1(add,mut),add),mut)的输出结果是函数func2的引用,因此可以对其进行调用,看下面第3步。

3、reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])(1)
该式是对reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])的调用,等价于func1(func1(func1(add,mut),add),mut) (1),即mut(add(mut(add(1)))

回到reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs),funcs是一个函数列表,整个式子实现的是复合函数的功能。
在yolov3的代码中(keras-yolo3-master\yolo3\utils.py),有相关的应用。

def compose(*funcs):
    """Compose arbitrarily many functions, evaluated left to right.
    Reference: https://mathieularose.com/function-composition-in-python/
    """
    # return lambda x: reduce(lambda v, f: f(v), funcs, x)
    if funcs:
        return reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs)
    else:
        raise ValueError('Composition of empty sequence not supported.')
这行Python代码是通过使用`reduce`函数和一个`lambda`表达式来计算从1到n的所有整数的乘积,其中`n`是一个已经定义好的正整数。`reduce`函数是Python内置的`functools`模块中的一个函数,它会对参数序列中元素进行累积。`lambda`表达式是一个小型匿名函数。 这里是代码的逐步解释: - `range(1, n + 1)`:生成一个从1到n(包含n)的整数序列。 - `lambda x, y: x * y`:这是一个匿名函数,它接受两个参数`x`和`y`,返回它们的乘积。 - `reduce(lambda x, y: x * y, range(1, n + 1))`:`reduce`函数将`lambda`函数应用于`range`生成的序列的所有元素。它从序列的第一个元素开始,逐个将`lambda`函数应用于当前的累加值和下一个序列元素,从而将序列元素累积成一个单一的值。 - `a += ...`:这行代码实际上是`a = a + ...`的简写形式,它将`reduce`函数的结果添加到变量`a`当前的值上,并更新`a`的值。 如果你想要使用这段代码,你需要在代码中定义变量`a`和`n`,并且导入`reduce`函数。例如: ```python from functools import reduce # 定义变量a和n a = 1 # 或者任何你想要开始的整数值 n = 5 # 这里的5可以替换为任何正整数 # 使用reducelambda来计算乘积,并将结果加到变量a上 a += reduce(lambda x, y: x * y, range(1, n + 1)) ``` 在上面的例子中,`a`初始值为1,`n`设置为5。这段代码计算从1到5的整数乘积(1 * 2 * 3 * 4 * 5),然后将这个乘积加到`a`的初始值上。最终,`a`的值将会是151(因为1 * 2 * 3 * 4 * 5 = 120,加上初始值1得到121,但是由于初始值是1,所以最终结果是120)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值