对于yolo3源码中utils.compose中reduce(lambda f,g:lambda *a, **kw:g(f(*a,**kw)),funcs)这句的理解

最近一直在学习yolo3的,当看到源码第一句的时候,人就蒙了。这是什么?

reduce(lambda f,g:lambda *a, **kw:g(f(*a,**kw)),funcs)

然后就开始学习,学了一晚,也算是理解了。(不过这样写,太复杂了,也太难维护了,不建议这样写)

首先,先要了解rudece是干嘛的,这个在我之前的博文有提过,这里只是简要介绍一下。

redece()函数会对参数序列中元素进行累计。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

举个栗子:

print(reduce(lambda:x,y:x+y,[1,2,3]))

>>> 6

相当于:(1+2) + 3 = 6

知道了reduce这句是干嘛的,我们再进一步分析这句话:

reduce(lambda f,g:lambda *a, **kw:g(f(*a,**kw)),funcs)

为了方便起见,这里定义两个函数,来解释这句话:

def add(x):
	x = x + 1
	return x
def mcl(x):
	x = 3 * x
	return x
	
print(reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mcl,add,mcl])(1))

>>> 21

wow,神奇的数字产生了。
我们来分析一下这个21的计算过程:
首先,分析一下reduce()内的这句话:
lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mcl,add,mcl]
很明显,这句话的意思就是:

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

所以带入[add,mcl,add,mcl]后,函数变为:
mcl(add(mcl(add(x))))

reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mcl,add,mcl])

这句话返回的是一个函数:mcl(add(mcl(add(x))))
再将最后的(1)加入,就变成了
mcl(add(mcl(add(1)))) = 21

用了这个简单的解释方法,相信大家都可以理解这句话。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值