Lambda(InlineAnonymous) 函数

lambda 关键字创建包含单个表达式的内联函数。此表达式的值是函数在调用时返回的值。

考虑功能:

def greeting():
    return "Hello"

当被称为:

print(greeting())

打印:

Hello

这可以写成 lambda 函数,如下所示:

greet_me = lambda: "Hello"

请参阅本节底部关于将 lambdas 赋值给变量的注释。一般来说,不要这样做。

这将创建一个名为 greet_me 的内联函数,该函数返回 Hello。请注意,在使用 lambda 创建函数时,不要编写 return:之后的值会自动返回。

一旦分配给变量,它就像常规函数一样使用:

print(greet_me())

打印:

Hello

lambdas 也可以参数:

strip_and_upper_case = lambda s: s.strip().upper()

strip_and_upper_case("  Hello   ")

返回字符串:

HELLO

它们也可以使用任意数量的参数/关键字参数,就像普通函数一样。

greeting = lambda x, *args, **kwargs: print(x, args, kwargs)
greeting('hello', 'world', world='world')

打印:

hello ('world',) {'world': 'world'}

lambdas 通常用于短函数,这些函数便于在调用它们时定义(通常使用 sortedfiltermap)。

例如,这一行对一个字符串列表进行排序,忽略它们的大小写并忽略开头和结尾处的空格:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip().upper())
# Out:
# ['    bAR', 'BaZ    ', ' foo ']

排序列表只是忽略空格:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip())
# Out:
# ['BaZ    ', '    bAR', ' foo ']

map 的例子:

sorted( map( lambda s: s.strip().upper(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BAR', 'BAZ', 'FOO']

sorted( map( lambda s: s.strip(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BaZ', 'bAR', 'foo']

数字列表的示例:

my_list = [3, -4, -2, 5, 1, 7]
sorted( my_list, key=lambda x: abs(x))
# Out:
# [1, -2, 3, -4, 5, 7]

list( filter( lambda x: x>0, my_list))
# Out:
# [3, 5, 1, 7]

list( map( lambda x: abs(x), my_list))
# Out:
[3, 4, 2, 5, 1, 7]

可以从 lambda 函数内部调用其他函数(带/不带参数)。

def foo(msg):
    print(msg)

greet = lambda x = "hello world": foo(x)
greet()

打印:

hello world

这很有用,因为 lambda 可能只包含一个表达式,并且通过使用辅助函数,可以运行多个语句。

注意

请记住, PEP-8 (官方 Python 样式指南)不建议将 lambda 赋给变量(正如我们在前两个示例中所做的那样):

始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。

是:

def `f(x)`: return 2*x

没有:

f = lambda x: 2*x

第一种形式意味着生成的函数对象的名称特别是 f 而不是通用的 <lambda>。这对于一般的回溯和字符串表示更有用。赋值语句的使用消除了 lambda 表达式对显式 def 语句提供的唯一好处(即它可以嵌入在更大的表达式中)。