1、简单使用:
func=lambda x : x+2
func(2) # 输出 4
2、复杂使用
(1)闭包
def get_y(a,b):
return lambda x:ax+b
y1 = get_y(1,1)
y1(1) # 结果为2
当然,也可以用常规函数实现闭包,如下:
def get_y(a,b):
def func(x):
return ax+b
return func
y1 = get_y(1,1)
y1(1) # 结果为2
(2)别掉进生成器的陷阱
最简单的生成器
li.append(lambda :x for x in range(10))
print(next(li[0])()) # 0
print(next(li[0])()) # 1
print(next(li[1])()) # IndexError: list index out of range
3、嵌套使用
注意使用顺序,先把参数传递给外部,再给内部
def test(N):
return lambda x:x*N
func=test(2)
func(2) # 输出 4
使用lambda也可以实现上述的效果
y=lambda N:(lambda x:N*x)
func=y(2)
func(2) # 输出 4
func(3) # 输出 6
yolo中复杂的使用
def DarknetConv2D(*args, **kwargs):
“”“Wrapper to set Darknet parameters for Convolution2D.”""
darknet_conv_kwargs = {‘kernel_regularizer’: l2(5e-4)}
darknet_conv_kwargs[‘padding’] = ‘valid’ if kwargs.get(‘strides’)==(2,2) else ‘same’
darknet_conv_kwargs.update(kwargs)
return Conv2D(*args, **darknet_conv_kwargs)
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.’)
使用
def DarknetConv2D_BN_Leaky(*args, **kwargs):
“”“Darknet Convolution2D followed by BatchNormalization and LeakyReLU.”""
no_bias_kwargs = {‘use_bias’: False}
no_bias_kwargs.update(kwargs)
return compose(
DarknetConv2D(*args, **no_bias_kwargs),
BatchNormalization(),
LeakyReLU(alpha=0.1))
x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2))(x)