最近一直在学习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
用了这个简单的解释方法,相信大家都可以理解这句话。