匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
形式: p=lambda a,b,c:f(a,b,c)
即:函数输入参数为a,b,c,函数输出为:之后的表达式f(a,b,c)
例1:传入多个参数的lambda函数
def sum(x,y):
return x+y
用lambda来实现:
p = lambda x,y:x+y
print(p(4,6))#4+6=10
例2:传入一个参数的lambda函数
a=lambda x:x*x
print(a(3)) #9
例3:多个参数的lambda形式:
a = lambda x,y,z:(x+8)*y-z
print(a(5,6,8))#返回(5+8)*6-8=70
嵌套使用,yolo中,多个层综合到一起时会用到下面的和reduce结合起来
from functools import reduce
func=lambda x:x+1
# print(func(1))#2
func=lambda x,y,z:x+1 #匿名函数,返回第一个参数自增1
# print(func(1,2,3))#2
func=lambda x,y:lambda z:z+1
print(func(1,2)(8))#9,第一个括号对应最外层lambda,第一个括号写入两个,只是传参,实例化了一个lambda对象,第二次才会调用函数并传参数8给z,并计算值z+1。
# reduce与lambda合用的那一层,只能传入两个参数,会合并传入的序列,所以传入两个值就够了
print(reduce(lambda a,b: a+b ,[1,2,5,9]))#10,可以正常计算值,将传入的序列合并,先传1,2,计算可得1+2=3,把3与下一个传入值5计算3+5=8, 再8+9=17
# print(reduce(lambda a: a+1 ,[1,2,3,4]))#<lambda>() takes 1 positional argument but 2 were given
# print(reduce(lambda a, b, c: a + b + c, [1, 2, 3]))# <lambda>() missing 1 required positional argument: 'c'
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])(5))#26
#*a, **kw:表示传入的参数,个数,类型都任意,一种通配的表示方法
# 按照传入顺序操作,先对传入参数执行 step1: 5+1=6, step2: 2*6=12, step3:12+1=13. step4: 2*13=26
print(reduce(lambda f, g: lambda *a, **kw: f(g(*a, **kw)),[add,mut,add,mut])(5))#23, 函数是如何执行的
# 按照传入逆序操作,先对传入参数执行 step1: 2*5=10, step2: 10+1=11, step3:2*11=22. step4: 22+1=23
yolo中的使用例子
def tiny_yolo_body(inputs, num_anchors, num_classes):
x1 = compose(
DarknetConv2D_BN_Leaky(16, (3,3)),
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
DarknetConv2D_BN_Leaky(32, (3,3)),
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
DarknetConv2D_BN_Leaky(64, (3,3)),
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
DarknetConv2D_BN_Leaky(128, (3,3)),
MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
DarknetConv2D_BN_Leaky(256, (3,3)))(inputs)
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.')