python lambda函数

匿名函数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.')

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值